diff --git a/blocklynukkit.zip b/blocklynukkit.zip new file mode 100644 index 0000000..54caaba Binary files /dev/null and b/blocklynukkit.zip differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..2414f2a --- /dev/null +++ b/index.html @@ -0,0 +1,405 @@ + + + + + BlocklyNukkit + + + + + + + + + + + + +
+
+ +
+ + + + + diff --git a/js/.eslintignore b/js/.eslintignore new file mode 100644 index 0000000..c884c6b --- /dev/null +++ b/js/.eslintignore @@ -0,0 +1,18 @@ +*_compressed*.js +*_uncompressed*.js +gulpfile.js +/msg/* +/core/utils/global.js +/tests/blocks/* +/tests/compile/* +/tests/jsunit/* +/tests/generators/* +/tests/mocha/run_mocha_tests_in_browser.js +/tests/screenshot/* +/tests/test_runner.js +/tests/workspace_svg/* +/generators/* +/demos/* +/appengine/* +/externs/* +/closure/* diff --git a/js/.eslintrc.json b/js/.eslintrc.json new file mode 100644 index 0000000..63bfb43 --- /dev/null +++ b/js/.eslintrc.json @@ -0,0 +1,89 @@ +{ + "rules": { + "curly": ["error"], + "eol-last": ["error"], + "_comment": "Blockly/Google use 2-space indents", + "_comment": "Blockly/Google uses +4 space indents for line continuations.", + "_comment": "Ignore default rules for ternary expressions.", + "indent": [ + "error", 2, + { + "SwitchCase": 1, + "MemberExpression": 2, + "ObjectExpression": 1, + "FunctionDeclaration": { + "body": 1, + "parameters": 2 + }, + "FunctionExpression": { + "body": 1, + "parameters": 2 + }, + "CallExpression": { + "arguments": 2 + }, + "ignoredNodes": ["ConditionalExpression"] + } + ], + "keyword-spacing": ["error"], + "linebreak-style": ["error", "unix"], + "max-len": [ + "error", + { + "code": 100, + "tabWidth": 4, + "ignoreStrings": true, + "ignoreRegExpLiterals": true, + "ignoreUrls": true + } + ], + "no-trailing-spaces": ["error", { "skipBlankLines": true }], + "no-unused-vars": [ + "error", + { + "args": "after-used", + "_comment": "Ignore vars starting with an underscore.", + "varsIgnorePattern": "^_", + "_comment": "Ignore arguments starting with an underscore.", + "argsIgnorePattern": "^_" + } + ], + "no-use-before-define": ["error"], + "_comment":"Blockly uses for exporting symbols. no-self-assign added in eslint 5.", + "no-self-assign": ["off"], + "_comment": "Blockly uses single quotes except for JSON blobs, which must use double quotes.", + "quotes": ["off"], + "semi": ["error", "always"], + "_comment": "Blockly doesn't have space before function paren when defining functions", + "space-before-function-paren": ["error", "never"], + "_comment": "Blocklydoesn't have space before function paren when calling functions", + "func-call-spacing": ["error", "never"], + "space-infix-ops": ["error"], + "_comment": "Blockly uses 'use strict' in files", + "strict": ["off"], + "_comment": "Closure style allows redeclarations", + "no-redeclare": ["off"], + "valid-jsdoc": ["error", {"requireReturn": false}], + "no-console": ["off"], + "no-multi-spaces": ["error", { "ignoreEOLComments": true }], + "operator-linebreak": ["error", "after"], + "spaced-comment": ["error", "always", { + "block": { + "balanced": true + }, + "exceptions": ["*"] + }], + "es5/no-es6-methods": ["warn"] + }, + "env": { + "browser": true + }, + "globals": { + "Blockly": true, + "goog": true + }, + "extends": [ + "eslint:recommended", + "plugin:es5/no-es2015" + ] +} diff --git a/js/.gitignore b/js/.gitignore new file mode 100644 index 0000000..87aa424 --- /dev/null +++ b/js/.gitignore @@ -0,0 +1,19 @@ +node_modules +npm-debug.log +build-debug.log +.DS_Store +.settings +.project +*.gz +*.pyc +*.komodoproject +/nbproject/private/ + +tests/compile/main_compressed.js +tests/compile/*compiler*.jar +tests/screenshot/outputs/* +local_build/*compiler*.jar +local_build/local_*_compressed.js +chromedriver +typings/tmp/* +dist/ diff --git a/js/.jshintignore b/js/.jshintignore new file mode 100644 index 0000000..9cc9627 --- /dev/null +++ b/js/.jshintignore @@ -0,0 +1,6 @@ +node_modules/ +tests/ +demos/ +**/*_compressed.js +**/*_uncompressed.js +**/*_test.js \ No newline at end of file diff --git a/js/.npmrc b/js/.npmrc new file mode 100644 index 0000000..214c29d --- /dev/null +++ b/js/.npmrc @@ -0,0 +1 @@ +registry=https://registry.npmjs.org/ diff --git a/js/.travis.yml b/js/.travis.yml new file mode 100644 index 0000000..643c96a --- /dev/null +++ b/js/.travis.yml @@ -0,0 +1,25 @@ +language: node_js +os: linux +dist: xenial +node_js: + - 8 + - 10 + - 12 +addons: + chrome: stable + firefox: latest + # TODO (#2114): reenable osx build. + # - os: osx + # node_js: stable + # osx_image: xcode8.3 + # addons: + # firefox: latest +env: + - TRAVIS_CI=true +before_script: + - export DISPLAY=:99.0 + - if [ "${TRAVIS_OS_NAME}" == "linux" ]; then ( tests/scripts/setup_linux_env.sh ) fi + - if [ "${TRAVIS_OS_NAME}" == "osx" ]; then ( tests/scripts/setup_osx_env.sh ) fi + - sleep 2 +script: + - npm run test:run diff --git a/js/LICENSE b/js/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/js/LICENSE @@ -0,0 +1,202 @@ + + 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/js/README.md b/js/README.md new file mode 100644 index 0000000..999f96b --- /dev/null +++ b/js/README.md @@ -0,0 +1,56 @@ +# Blockly [![Build Status]( https://travis-ci.org/google/blockly.svg?branch=master)](https://travis-ci.org/google/blockly) + + +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. + +**The project page is https://developers.google.com/blockly/** + +![](https://developers.google.com/blockly/images/sample.png) + +Blockly has an active [developer forum](https://groups.google.com/forum/#!forum/blockly). Please drop by and say hello. Show us your prototypes early; collectively we have a lot of experience and can offer hints which will save you time. We actively monitor the forums and typically respond to questions within 2 working days. + +Help us focus our development efforts by telling us [what you are doing with +Blockly](https://developers.google.com/blockly/registration). The questionnaire only takes +a few minutes and will help us better support the Blockly community. + +Cross-browser Testing Platform and Open Source <3 Provided by [Sauce Labs](https://saucelabs.com) + +Want to contribute? Great! First, read [our guidelines for contributors](https://developers.google.com/blockly/guides/modify/contributing). + +## Releases + +We release by pushing the latest code to the master branch, followed by updating our [docs](https://developers.google.com/blockly) and [demo pages](https://blockly-demo.appspot.com). We typically release a new version of Blockly once a quarter (every 3 months). If there are breaking bugs, such as a crash when performing a standard action or a rendering issue that makes Blockly unusable, we will cherry-pick fixes to master between releases to fix them. The [releases page](https://github.com/google/blockly/releases) has a list of all releases. + +Releases are tagged by the release date (YYYYMMDD) with a leading '2.' and a trailing '.0' in case we ever need a major or minor version (such as [2.20190722.1](https://github.com/google/blockly/tree/2.20190722.1)). If you're using npm, you can install the ``blockly`` package on npm: +```bash +npm install blockly +``` + +### New APIs + +Once a new API is merged into master it is considered beta until the following release. We generally try to avoid changing an API after it has been merged to master, but sometimes we need to make changes after seeing how an API is used. If an API has been around for at least two releases we'll do our best to avoid breaking it. + +Unreleased APIs may change radically. Anything that is in `develop` but not `master` is subject to change without warning. + +### Branches + +There are two main branches for Blockly. + +**[master](https://github.com/google/blockly)** - This is the (mostly) stable current release of Blockly. + +**[develop](https://github.com/google/blockly/tree/develop)** - This is where most of our work happens. Pull requests should always be made against develop. This branch will generally be usable, but may be less stable than the master branch. Once something is in develop we expect it to merge to master in the next release. + +**other branches:** - Larger changes may have their own branches until they are good enough for people to try out. These will be developed separately until we think they are almost ready for release. These branches typically get merged into develop immediately after a release to allow extra time for testing. + +## Issues and Milestones + +We typically triage all bugs within 2 working days, which includes adding any appropriate labels and assigning it to a milestone. Please keep in mind, we are a small team so even feature requests that everyone agrees on may not be prioritized. + +### Milestones + +**Upcoming release** - The upcoming release milestone is for all bugs we plan on fixing before the next release. This typically has the form of `year_quarter_release` (such as `2019_q2_release`). Some bugs will be added to this release when they are triaged, others may be added closer to a release. + +**Bug Bash Backlog** - These are bugs that we're still prioritizing. They haven't been added to a specific release yet, but we'll consider them for each release depending on relative priority and available time. + +**Icebox** - These are bugs that we do not intend to spend time on. They are either too much work or minor enough that we don't expect them to ever take priority. We are still happy to accept pull requests for these bugs. diff --git a/js/appengine/.gcloudignore b/js/appengine/.gcloudignore new file mode 100644 index 0000000..83d812a --- /dev/null +++ b/js/appengine/.gcloudignore @@ -0,0 +1,23 @@ +# Do not upload these files. +.* +deploy +*.soy +static/appengine/ +static/closure/ +static/demos/plane/soy/*.jar +static/demos/plane/xlf/ +static/externs/ +static/i18n/ +static/msg/json/ +static/node_modules/ +static/package/ +static/theme_scripts/ +static/typings/ + +static/build.py +static/gulpfile.js +static/jsconfig.json +static/LICENSE +static/package-lock.json +static/package.json +static/README.md diff --git a/js/appengine/README.txt b/js/appengine/README.txt new file mode 100644 index 0000000..6ba262b --- /dev/null +++ b/js/appengine/README.txt @@ -0,0 +1,44 @@ + + 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 + |- lua_compressed.js + |- php_compressed.js + `- python_compressed.js + +Instructions for fetching the optional Closure library may be found here: + https://developers.google.com/blockly/guides/modify/web/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/js/appengine/app.yaml b/js/appengine/app.yaml new file mode 100644 index 0000000..2fd93c4 --- /dev/null +++ b/js/appengine/app.yaml @@ -0,0 +1,53 @@ +runtime: python37 + +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 + +# Blockly files. +- url: /static + static_dir: static + secure: always + +# Storage API. +- url: /storage\.js + static_files: storage.js + upload: storage\.js + 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 + +# Dynamic content. +- url: /.* + script: auto + secure: always + \ No newline at end of file diff --git a/js/appengine/apple-touch-icon.png b/js/appengine/apple-touch-icon.png new file mode 100644 index 0000000..38dc7ba Binary files /dev/null and b/js/appengine/apple-touch-icon.png differ diff --git a/js/appengine/deploy b/js/appengine/deploy new file mode 100644 index 0000000..7fb5e6c --- /dev/null +++ b/js/appengine/deploy @@ -0,0 +1,16 @@ +#!/bin/bash + +# Script to deploy on GAE. + +APP=./app.yaml +if ! [ -f $APP ] ; then + echo $APP not found 1>&2 + exit 1 +fi + +PROJECT=blockly-demo +VERSION=37 + +echo 'Beginning deployment...' +gcloud app deploy --project $PROJECT --version $VERSION --no-promote +echo 'Deployment finished.' diff --git a/js/appengine/favicon.ico b/js/appengine/favicon.ico new file mode 100644 index 0000000..683ec6d Binary files /dev/null and b/js/appengine/favicon.ico differ diff --git a/js/appengine/index.yaml b/js/appengine/index.yaml new file mode 100644 index 0000000..a3b9e05 --- /dev/null +++ b/js/appengine/index.yaml @@ -0,0 +1,11 @@ +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/js/appengine/main.py b/js/appengine/main.py new file mode 100644 index 0000000..349c4f0 --- /dev/null +++ b/js/appengine/main.py @@ -0,0 +1,36 @@ +""" +Copyright 2020 Google LLC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +""" + +import storage + + +# Route to requested handler. +def app(environ, start_response): + if environ["PATH_INFO"] == "/": + return redirect(environ, start_response) + if environ["PATH_INFO"] == "/storage": + return storage.app(environ, start_response) + start_response("404 Not Found", []) + return [b"Page not found."] + + +# Redirect for root directory. +def redirect(environ, start_response): + headers = [ + ("Location", "static/demos/index.html") + ] + start_response("301 Found", headers) + return [] diff --git a/js/appengine/redirect.html b/js/appengine/redirect.html new file mode 100644 index 0000000..9c29bac --- /dev/null +++ b/js/appengine/redirect.html @@ -0,0 +1,68 @@ + + + + + + diff --git a/js/appengine/requirements.txt b/js/appengine/requirements.txt new file mode 100644 index 0000000..99d5d11 --- /dev/null +++ b/js/appengine/requirements.txt @@ -0,0 +1 @@ +google-cloud-ndb diff --git a/js/appengine/robots.txt b/js/appengine/robots.txt new file mode 100644 index 0000000..428c409 --- /dev/null +++ b/js/appengine/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: /storage diff --git a/js/appengine/storage.js b/js/appengine/storage.js new file mode 100644 index 0000000..dc62a00 --- /dev/null +++ b/js/appengine/storage.js @@ -0,0 +1,200 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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(xml, workspace); + } +}; + +/** + * 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, true); + // Remove x/y coordinates from XML if there's only one block stack. + // There's no reason to store this, removing it helps with anonymity. + if (workspace.getTopBlocks(false).length == 1 && xml.querySelector) { + var block = xml.querySelector('block'); + if (block) { + block.removeAttribute('x'); + block.removeAttribute('y'); + } + } + 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(change); + } + } + 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(xml, workspace); +}; + +/** + * 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/js/appengine/storage.py b/js/appengine/storage.py new file mode 100644 index 0000000..a3d351c --- /dev/null +++ b/js/appengine/storage.py @@ -0,0 +1,95 @@ +"""Blockly Demo: Storage + +Copyright 2012 Google LLC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +""" + +"""Store and retrieve XML with App Engine. +""" + +__author__ = "q.neutron@gmail.com (Quynh Neutron)" + +import cgi +import hashlib +from random import randint +from google.cloud import ndb + + +class Xml(ndb.Model): + # A row in the database. + xml_hash = ndb.IntegerProperty() + xml_content = ndb.TextProperty() + + +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)]) + + +def xmlToKey(xml_content): + # Store XML and return a generated key. + xml_hash = int(hashlib.sha1(xml_content.encode("utf-8")).hexdigest(), 16) + xml_hash = int(xml_hash % (2 ** 64) - (2 ** 63)) + lookup_query = Xml.query(Xml.xml_hash == xml_hash) + client = ndb.Client() + with client.context(): + lookup_result = lookup_query.get() + if lookup_result: + xml_key = lookup_result.key.string_id() + 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 = Xml.get_by_id(xml_key) + row = Xml(id = xml_key, xml_hash = xml_hash, xml_content = xml_content) + row.put() + return xml_key + + +def keyToXml(key_provided): + # Retrieve stored XML based on the provided key. + # Normalize the string. + key_provided = key_provided.lower().strip() + # Check datastore for a match. + client = ndb.Client() + with client.context(): + result = Xml.get_by_id(key_provided) + if not result: + xml = "" + else: + xml = result.xml_content + return xml + + +def app(environ, start_response): + forms = cgi.FieldStorage(fp=environ['wsgi.input'], environ=environ) + if "xml" in forms: + out = xmlToKey(forms["xml"].value) + elif "key" in forms: + out = keyToXml(forms["key"].value) + else: + out = "" + + headers = [ + ("Content-Type", "text/plain") + ] + start_response("200 OK", headers) + return [out.encode("utf-8")] diff --git a/js/blockly_compressed.js b/js/blockly_compressed.js new file mode 100644 index 0000000..c21c79d --- /dev/null +++ b/js/blockly_compressed.js @@ -0,0 +1,1367 @@ +// Do not edit this file; automatically generated by gulp. +'use strict';var Blockly={constants:{},LINE_MODE_MULTIPLIER:40,PAGE_MODE_MULTIPLIER:125,DRAG_RADIUS:5,FLYOUT_DRAG_RADIUS:10,SNAP_RADIUS:28};Blockly.CONNECTING_SNAP_RADIUS=Blockly.SNAP_RADIUS;Blockly.CURRENT_CONNECTION_PREFERENCE=8;Blockly.INSERTION_MARKER_COLOUR="#000000";Blockly.BUMP_DELAY=250;Blockly.BUMP_RANDOMNESS=10;Blockly.COLLAPSE_CHARS=30;Blockly.LONGPRESS=750;Blockly.SOUND_LIMIT=100;Blockly.DRAG_STACK=!0;Blockly.HSV_SATURATION=.45;Blockly.HSV_VALUE=.65; +Blockly.SPRITE={width:96,height:124,url:"sprites.png"};Blockly.INPUT_VALUE=1;Blockly.OUTPUT_VALUE=2;Blockly.NEXT_STATEMENT=3;Blockly.PREVIOUS_STATEMENT=4;Blockly.DUMMY_INPUT=5;Blockly.ALIGN_LEFT=-1;Blockly.ALIGN_CENTRE=0;Blockly.ALIGN_RIGHT=1;Blockly.DRAG_NONE=0;Blockly.DRAG_STICKY=1;Blockly.DRAG_BEGIN=1;Blockly.DRAG_FREE=2;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.TOOLBOX_AT_TOP=0;Blockly.TOOLBOX_AT_BOTTOM=1;Blockly.TOOLBOX_AT_LEFT=2;Blockly.TOOLBOX_AT_RIGHT=3;Blockly.DELETE_AREA_NONE=null;Blockly.DELETE_AREA_TRASH=1;Blockly.DELETE_AREA_TOOLBOX=2;Blockly.VARIABLE_CATEGORY_NAME="VARIABLE";Blockly.VARIABLE_DYNAMIC_CATEGORY_NAME="VARIABLE_DYNAMIC";Blockly.PROCEDURE_CATEGORY_NAME="PROCEDURE"; +Blockly.RENAME_VARIABLE_ID="RENAME_VARIABLE_ID";Blockly.DELETE_VARIABLE_ID="DELETE_VARIABLE_ID";Blockly.utils={};Blockly.utils.global=function(){return"object"===typeof self?self:"object"===typeof window?window:"object"===typeof global?global:this}();Blockly.Msg={};Blockly.utils.global.Blockly||(Blockly.utils.global.Blockly={});Blockly.utils.global.Blockly.Msg||(Blockly.utils.global.Blockly.Msg=Blockly.Msg);Blockly.utils.colour={}; +Blockly.utils.colour.parse=function(a){a=String(a).toLowerCase().trim();var b=Blockly.utils.colour.names[a];if(b)return b;b="0x"==a.substring(0,2)?"#"+a.substring(2):a;b="#"==b[0]?b:"#"+b;if(/^#[0-9a-f]{6}$/.test(b))return b;if(/^#[0-9a-f]{3}$/.test(b))return["#",b[1],b[1],b[2],b[2],b[3],b[3]].join("");var c=a.match(/^(?:rgb)?\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/);return c&&(a=Number(c[1]),b=Number(c[2]),c=Number(c[3]),0<=a&&256>a&&0<=b&&256>b&&0<=c&&256>c)?Blockly.utils.colour.rgbToHex(a,b, +c):null};Blockly.utils.colour.rgbToHex=function(a,b,c){b=a<<16|b<<8|c;return 16>a?"#"+(16777216|b).toString(16).substr(1):"#"+b.toString(16)};Blockly.utils.colour.hexToRgb=function(a){a=Blockly.utils.colour.parse(a);if(!a)return[0,0,0];a=parseInt(a.substr(1),16);return[a>>16,a>>8&255,a&255]}; +Blockly.utils.colour.hsvToHex=function(a,b,c){var d=0,e=0,f=0;if(0==b)f=e=d=c;else{var g=Math.floor(a/60),h=a/60-g;a=c*(1-b);var k=c*(1-b*h);b=c*(1-b*(1-h));switch(g){case 1:d=k;e=c;f=a;break;case 2:d=a;e=c;f=b;break;case 3:d=a;e=k;f=c;break;case 4:d=b;e=a;f=c;break;case 5:d=c;e=a;f=k;break;case 6:case 0:d=c,e=b,f=a}}return Blockly.utils.colour.rgbToHex(Math.floor(d),Math.floor(e),Math.floor(f))}; +Blockly.utils.colour.blend=function(a,b,c){a=Blockly.utils.colour.parse(a);if(!a)return null;b=Blockly.utils.colour.parse(b);if(!b)return null;a=Blockly.utils.colour.hexToRgb(a);b=Blockly.utils.colour.hexToRgb(b);return Blockly.utils.colour.rgbToHex(Math.round(b[0]+c*(a[0]-b[0])),Math.round(b[1]+c*(a[1]-b[1])),Math.round(b[2]+c*(a[2]-b[2])))}; +Blockly.utils.colour.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00"};Blockly.utils.Coordinate=function(a,b){this.x=a;this.y=b};Blockly.utils.Coordinate.equals=function(a,b){return a==b?!0:a&&b?a.x==b.x&&a.y==b.y:!1};Blockly.utils.Coordinate.distance=function(a,b){var c=a.x-b.x;a=a.y-b.y;return Math.sqrt(c*c+a*a)};Blockly.utils.Coordinate.magnitude=function(a){return Math.sqrt(a.x*a.x+a.y*a.y)};Blockly.utils.Coordinate.difference=function(a,b){return new Blockly.utils.Coordinate(a.x-b.x,a.y-b.y)}; +Blockly.utils.Coordinate.sum=function(a,b){return new Blockly.utils.Coordinate(a.x+b.x,a.y+b.y)};Blockly.utils.Coordinate.prototype.scale=function(a){this.x*=a;this.y*=a;return this};Blockly.utils.Coordinate.prototype.translate=function(a,b){this.x+=a;this.y+=b;return this};Blockly.utils.string={};Blockly.utils.string.startsWith=function(a,b){return 0==a.lastIndexOf(b,0)};Blockly.utils.string.shortestStringLength=function(a){return a.length?a.reduce(function(a,c){return a.lengthb&&(b=c[d].length);d=-Infinity;var e=1;do{var f=d;var g=a;a=[];var h=c.length/e,k=1;for(d=0;df);return g}; +Blockly.utils.string.wrapScore_=function(a,b,c){for(var d=[0],e=[],f=0;fd&&(d=h,e=g)}return e?Blockly.utils.string.wrapMutate_(a,e,c):b};Blockly.utils.string.wrapToText_=function(a,b){for(var c=[],d=0;d=h?(e=2,f=h,(h=a.join(""))&&c.push(h),a.length=0):"{"==h?e=3:(a.push("%",h),e=0):2==e?"0"<=h&&"9">=h?f+=h:(c.push(parseInt(f,10)),g--,e=0):3==e&&(""==h?(a.splice(0,0,"%{"),g--,e=0):"}"!=h?a.push(h):(e=a.join(""),/[A-Z]\w*/i.test(e)?(h=e.toUpperCase(), +(h=Blockly.utils.string.startsWith(h,"BKY_")?h.substring(4):null)&&h in Blockly.Msg?(e=Blockly.Msg[h],"string"==typeof e?Array.prototype.push.apply(c,Blockly.utils.tokenizeInterpolation_(e,b)):b?c.push(String(e)):c.push(e)):c.push("%{"+e+"}")):c.push("%{"+e+"}"),e=a.length=0))}(h=a.join(""))&&c.push(h);b=[];for(g=a.length=0;gc;c++)b[c]=Blockly.utils.genUid.soup_.charAt(Math.random()*a);return b.join("")};Blockly.utils.genUid.soup_="!#$%()*+,-./:;=?@[]^_`{|}~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; +Blockly.utils.is3dSupported=function(){if(void 0!==Blockly.utils.is3dSupported.cached_)return Blockly.utils.is3dSupported.cached_;if(!Blockly.utils.global.getComputedStyle)return!1;var a=document.createElement("p"),b="none",c={webkitTransform:"-webkit-transform",OTransform:"-o-transform",msTransform:"-ms-transform",MozTransform:"-moz-transform",transform:"transform"};document.body.insertBefore(a,null);for(var d in c)if(void 0!==a.style[d]){a.style[d]="translate3d(1px,1px,1px)";b=Blockly.utils.global.getComputedStyle(a); +if(!b)return document.body.removeChild(a),!1;b=b.getPropertyValue(c[d])}document.body.removeChild(a);Blockly.utils.is3dSupported.cached_="none"!==b;return Blockly.utils.is3dSupported.cached_};Blockly.utils.runAfterPageLoad=function(a){if("object"!=typeof document)throw Error("Blockly.utils.runAfterPageLoad() requires browser document.");if("complete"==document.readyState)a();else var b=setInterval(function(){"complete"==document.readyState&&(clearInterval(b),a())},10)}; +Blockly.utils.getViewportBBox=function(){var a=Blockly.utils.style.getViewportPageOffset();return{right:document.documentElement.clientWidth+a.x,bottom:document.documentElement.clientHeight+a.y,top:a.y,left:a.x}};Blockly.utils.arrayRemove=function(a,b){b=a.indexOf(b);if(-1==b)return!1;a.splice(b,1);return!0}; +Blockly.utils.getDocumentScroll=function(){var a=document.documentElement,b=window;return Blockly.utils.userAgent.IE&&b.pageYOffset!=a.scrollTop?new Blockly.utils.Coordinate(a.scrollLeft,a.scrollTop):new Blockly.utils.Coordinate(b.pageXOffset||a.scrollLeft,b.pageYOffset||a.scrollTop)};Blockly.utils.getBlockTypeCounts=function(a,b){var c=Object.create(null),d=a.getDescendants(!0);b&&(a=a.getNextBlock())&&(a=d.indexOf(a),d.splice(a,d.length-a));for(a=0;b=d[a];a++)c[b.type]?c[b.type]++:c[b.type]=1;return c}; +Blockly.utils.screenToWsCoordinates=function(a,b){var c=b.x;b=b.y;var d=a.getInjectionDiv().getBoundingClientRect();c=new Blockly.utils.Coordinate(c-d.left,b-d.top);b=a.getOriginOffsetInPixels();return Blockly.utils.Coordinate.difference(c,b).scale(1/a.scale)}; +Blockly.utils.parseBlockColour=function(a){var b="string"==typeof a?Blockly.utils.replaceMessageReferences(a):a,c=Number(b);if(!isNaN(c)&&0<=c&&360>=c)return{hue:c,hex:Blockly.utils.colour.hsvToHex(c,Blockly.HSV_SATURATION,255*Blockly.HSV_VALUE)};if(c=Blockly.utils.colour.parse(b))return{hue:null,hex:c};c='Invalid colour: "'+b+'"';a!=b&&(c+=' (from "'+a+'")');throw Error(c);};Blockly.Events={};Blockly.Events.group_="";Blockly.Events.recordUndo=!0;Blockly.Events.disabled_=0;Blockly.Events.CREATE="create";Blockly.Events.BLOCK_CREATE=Blockly.Events.CREATE;Blockly.Events.DELETE="delete";Blockly.Events.BLOCK_DELETE=Blockly.Events.DELETE;Blockly.Events.CHANGE="change";Blockly.Events.BLOCK_CHANGE=Blockly.Events.CHANGE;Blockly.Events.MOVE="move";Blockly.Events.BLOCK_MOVE=Blockly.Events.MOVE;Blockly.Events.VAR_CREATE="var_create";Blockly.Events.VAR_DELETE="var_delete"; +Blockly.Events.VAR_RENAME="var_rename";Blockly.Events.UI="ui";Blockly.Events.COMMENT_CREATE="comment_create";Blockly.Events.COMMENT_DELETE="comment_delete";Blockly.Events.COMMENT_CHANGE="comment_change";Blockly.Events.COMMENT_MOVE="comment_move";Blockly.Events.FINISHED_LOADING="finished_loading";Blockly.Events.BUMP_EVENTS=[Blockly.Events.BLOCK_CREATE,Blockly.Events.BLOCK_MOVE,Blockly.Events.COMMENT_CREATE,Blockly.Events.COMMENT_MOVE];Blockly.Events.FIRE_QUEUE_=[]; +Blockly.Events.fire=function(a){Blockly.Events.isEnabled()&&(Blockly.Events.FIRE_QUEUE_.length||setTimeout(Blockly.Events.fireNow_,0),Blockly.Events.FIRE_QUEUE_.push(a))};Blockly.Events.fireNow_=function(){for(var a=Blockly.Events.filter(Blockly.Events.FIRE_QUEUE_,!0),b=Blockly.Events.FIRE_QUEUE_.length=0,c;c=a[b];b++)if(c.workspaceId){var d=Blockly.Workspace.getById(c.workspaceId);d&&d.fireChangeListener(c)}}; +Blockly.Events.filter=function(a,b){a=a.slice();b||a.reverse();for(var c=[],d=Object.create(null),e=0,f;f=a[e];e++)if(!f.isNull()){var g=[f.type,f.blockId,f.workspaceId].join(" "),h=d[g],k=h?h.event:null;if(!h)d[g]={event:f,index:e},c.push(f);else if(f.type==Blockly.Events.MOVE&&h.index==e-1)k.newParentId=f.newParentId,k.newInputName=f.newInputName,k.newCoordinate=f.newCoordinate,h.index=e;else if(f.type==Blockly.Events.CHANGE&&f.element==k.element&&f.name==k.name)k.newValue=f.newValue;else if(f.type!= +Blockly.Events.UI||"click"!=f.element||"commentOpen"!=k.element&&"mutatorOpen"!=k.element&&"warningOpen"!=k.element)d[g]={event:f,index:1},c.push(f)}a=c.filter(function(a){return!a.isNull()});b||a.reverse();for(e=1;f=a[e];e++)f.type==Blockly.Events.CHANGE&&"mutation"==f.element&&a.unshift(a.splice(e,1)[0]);return a};Blockly.Events.clearPendingUndo=function(){for(var a=0,b;b=Blockly.Events.FIRE_QUEUE_[a];a++)b.recordUndo=!1};Blockly.Events.disable=function(){Blockly.Events.disabled_++}; +Blockly.Events.enable=function(){Blockly.Events.disabled_--};Blockly.Events.isEnabled=function(){return 0==Blockly.Events.disabled_};Blockly.Events.getGroup=function(){return Blockly.Events.group_};Blockly.Events.setGroup=function(a){Blockly.Events.group_="boolean"==typeof a?a?Blockly.utils.genUid():"":a};Blockly.Events.getDescendantIds=function(a){var b=[];a=a.getDescendants(!1);for(var c=0,d;d=a[c];c++)b[c]=d.id;return b}; +Blockly.Events.fromJson=function(a,b){switch(a.type){case Blockly.Events.CREATE:var c=new Blockly.Events.Create(null);break;case Blockly.Events.DELETE:c=new Blockly.Events.Delete(null);break;case Blockly.Events.CHANGE:c=new Blockly.Events.Change(null,"","","","");break;case Blockly.Events.MOVE:c=new Blockly.Events.Move(null);break;case Blockly.Events.VAR_CREATE:c=new Blockly.Events.VarCreate(null);break;case Blockly.Events.VAR_DELETE:c=new Blockly.Events.VarDelete(null);break;case Blockly.Events.VAR_RENAME:c= +new Blockly.Events.VarRename(null,"");break;case Blockly.Events.UI:c=new Blockly.Events.Ui(null,"","","");break;case Blockly.Events.COMMENT_CREATE:c=new Blockly.Events.CommentCreate(null);break;case Blockly.Events.COMMENT_CHANGE:c=new Blockly.Events.CommentChange(null,"","");break;case Blockly.Events.COMMENT_MOVE:c=new Blockly.Events.CommentMove(null);break;case Blockly.Events.COMMENT_DELETE:c=new Blockly.Events.CommentDelete(null);break;case Blockly.Events.FINISHED_LOADING:c=new Blockly.Events.FinishedLoading(b); +break;default:throw Error("Unknown event type.");}c.fromJson(a);c.workspaceId=b.id;return c}; +Blockly.Events.disableOrphans=function(a){if((a.type==Blockly.Events.MOVE||a.type==Blockly.Events.CREATE)&&a.workspaceId){var b=Blockly.Workspace.getById(a.workspaceId);if(a=b.getBlockById(a.blockId)){var c=a.getParent();if(c&&c.isEnabled())for(b=a.getDescendants(!1),a=0;c=b[a];a++)c.setEnabled(!0);else if((a.outputConnection||a.previousConnection)&&!b.isDragging()){do a.setEnabled(!1),a=a.getNextBlock();while(a)}}}};Blockly.Events.Abstract=function(){this.workspaceId=void 0;this.group=Blockly.Events.getGroup();this.recordUndo=Blockly.Events.recordUndo};Blockly.Events.Abstract.prototype.toJson=function(){var a={type:this.type};this.group&&(a.group=this.group);return a};Blockly.Events.Abstract.prototype.fromJson=function(a){this.group=a.group};Blockly.Events.Abstract.prototype.isNull=function(){return!1};Blockly.Events.Abstract.prototype.run=function(a){}; +Blockly.Events.Abstract.prototype.getEventWorkspace_=function(){if(this.workspaceId)var a=Blockly.Workspace.getById(this.workspaceId);if(!a)throw Error("Workspace is null. Event must have been generated from real Blockly events.");return a};Blockly.utils.object={};Blockly.utils.object.inherits=function(a,b){a.superClass_=b.prototype;a.prototype=Object.create(b.prototype);a.prototype.constructor=a};Blockly.utils.object.mixin=function(a,b){for(var c in b)a[c]=b[c]};Blockly.utils.object.values=function(a){return Object.values?Object.values(a):Object.keys(a).map(function(b){return a[b]})};Blockly.Events.Ui=function(a,b,c,d){Blockly.Events.Ui.superClass_.constructor.call(this);this.blockId=a?a.id:null;this.workspaceId=a?a.workspace.id:void 0;this.element=b;this.oldValue=c;this.newValue=d;this.recordUndo=!1};Blockly.utils.object.inherits(Blockly.Events.Ui,Blockly.Events.Abstract);Blockly.Events.Ui.prototype.type=Blockly.Events.UI; +Blockly.Events.Ui.prototype.toJson=function(){var a=Blockly.Events.Ui.superClass_.toJson.call(this);a.element=this.element;void 0!==this.newValue&&(a.newValue=this.newValue);this.blockId&&(a.blockId=this.blockId);return a};Blockly.Events.Ui.prototype.fromJson=function(a){Blockly.Events.Ui.superClass_.fromJson.call(this,a);this.element=a.element;this.newValue=a.newValue;this.blockId=a.blockId};Blockly.utils.dom={};Blockly.utils.dom.SVG_NS="http://www.w3.org/2000/svg";Blockly.utils.dom.HTML_NS="http://www.w3.org/1999/xhtml";Blockly.utils.dom.XLINK_NS="http://www.w3.org/1999/xlink";Blockly.utils.dom.Node={ELEMENT_NODE:1,TEXT_NODE:3,COMMENT_NODE:8,DOCUMENT_POSITION_CONTAINED_BY:16};Blockly.utils.dom.cacheWidths_=null;Blockly.utils.dom.cacheReference_=0;Blockly.utils.dom.canvasContext_=null; +Blockly.utils.dom.createSvgElement=function(a,b,c){a=document.createElementNS(Blockly.utils.dom.SVG_NS,a);for(var d in b)a.setAttribute(d,b[d]);document.body.runtimeStyle&&(a.runtimeStyle=a.currentStyle=a.style);c&&c.appendChild(a);return a};Blockly.utils.dom.addClass=function(a,b){var c=a.getAttribute("class")||"";if(-1!=(" "+c+" ").indexOf(" "+b+" "))return!1;c&&(c+=" ");a.setAttribute("class",c+b);return!0}; +Blockly.utils.dom.removeClass=function(a,b){var c=a.getAttribute("class");if(-1==(" "+c+" ").indexOf(" "+b+" "))return!1;c=c.split(/\s+/);for(var d=0;db||b>this.getChildCount())throw Error(Blockly.Component.Error.CHILD_INDEX_OUT_OF_BOUNDS);this.childIndex_[a.getId()]=a;if(a.getParent()==this){var d=this.children_.indexOf(a);-1>>/g,a),a=document.createElement("style"),a.id="blockly-common-style",c=document.createTextNode(c),a.appendChild(c),document.head.insertBefore(a,document.head.firstChild))}};Blockly.Css.setCursor=function(a){console.warn("Deprecated call to Blockly.Css.setCursor. See https://github.com/google/blockly/issues/981 for context")}; +Blockly.Css.CONTENT=[".blocklySvg {","background-color: #fff;","outline: none;","overflow: hidden;","position: absolute;","display: block;","}",".blocklyWidgetDiv {","display: none;","position: absolute;","z-index: 99999;","}",".injectionDiv {","height: 100%;","position: relative;","overflow: hidden;","touch-action: none;","}",".blocklyNonSelectable {","user-select: none;","-ms-user-select: none;","-webkit-user-select: none;","}",".blocklyWsDragSurface {","display: none;","position: absolute;","top: 0;", +"left: 0;","}",".blocklyWsDragSurface.blocklyOverflowVisible {","overflow: visible;","}",".blocklyBlockDragSurface {","display: none;","position: absolute;","top: 0;","left: 0;","right: 0;","bottom: 0;","overflow: visible !important;","z-index: 50;","}",".blocklyBlockCanvas.blocklyCanvasTransitioning,",".blocklyBubbleCanvas.blocklyCanvasTransitioning {","transition: transform .5s;","}",".blocklyTooltipDiv {","background-color: #ffffc7;","border: 1px solid #ddc;","box-shadow: 4px 4px 20px 1px rgba(0,0,0,.15);", +"color: #000;","display: none;","font-family: sans-serif;","font-size: 9pt;","opacity: .9;","padding: 2px;","position: absolute;","z-index: 100000;","}",".blocklyDropDownDiv {","position: absolute;","left: 0;","top: 0;","z-index: 1000;","display: none;","border: 1px solid;","border-color: #dadce0;","background-color: #fff;","border-radius: 2px;","padding: 4px;","box-shadow: 0px 0px 3px 1px rgba(0,0,0,.3);","}",".blocklyDropDownDiv.focused {","box-shadow: 0px 0px 6px 1px rgba(0,0,0,.3);","}",".blocklyDropDownContent {", +"max-height: 300px;","overflow: auto;","overflow-x: hidden;","}",".blocklyDropDownArrow {","position: absolute;","left: 0;","top: 0;","width: 16px;","height: 16px;","z-index: -1;","background-color: inherit;","border-color: inherit;","}",".blocklyDropDownButton {","display: inline-block;","float: left;","padding: 0;","margin: 4px;","border-radius: 4px;","outline: none;","border: 1px solid;","transition: box-shadow .1s;","cursor: pointer;","}",".blocklyArrowTop {","border-top: 1px solid;","border-left: 1px solid;", +"border-top-left-radius: 4px;","border-color: inherit;","}",".blocklyArrowBottom {","border-bottom: 1px solid;","border-right: 1px solid;","border-bottom-right-radius: 4px;","border-color: inherit;","}",".blocklyResizeSE {","cursor: se-resize;","fill: #aaa;","}",".blocklyResizeSW {","cursor: sw-resize;","fill: #aaa;","}",".blocklyResizeLine {","stroke: #515A5A;","stroke-width: 1;","}",".blocklyHighlightedConnectionPath {","fill: none;","stroke: #fc3;","stroke-width: 4px;","}",".blocklyPathLight {", +"fill: none;","stroke-linecap: round;","stroke-width: 1;","}",".blocklySelected>.blocklyPathLight {","display: none;","}",".blocklyDraggable {",'cursor: url("<<>>/handopen.cur"), auto;',"cursor: grab;","cursor: -webkit-grab;","}",".blocklyDragging {",'cursor: url("<<>>/handclosed.cur"), auto;',"cursor: grabbing;","cursor: -webkit-grabbing;","}",".blocklyDraggable:active {",'cursor: url("<<>>/handclosed.cur"), auto;',"cursor: grabbing;","cursor: -webkit-grabbing;","}",".blocklyBlockDragSurface .blocklyDraggable {", +'cursor: url("<<>>/handclosed.cur"), auto;',"cursor: grabbing;","cursor: -webkit-grabbing;","}",".blocklyDragging.blocklyDraggingDelete {",'cursor: url("<<>>/handdelete.cur"), auto;',"}",".blocklyDragging>.blocklyPath,",".blocklyDragging>.blocklyPathLight {","fill-opacity: .8;","stroke-opacity: .8;","}",".blocklyDragging>.blocklyPathDark {","display: none;","}",".blocklyDisabled>.blocklyPath {","fill-opacity: .5;","stroke-opacity: .5;","}",".blocklyDisabled>.blocklyPathLight,",".blocklyDisabled>.blocklyPathDark {", +"display: none;","}",".blocklyInsertionMarker>.blocklyPath,",".blocklyInsertionMarker>.blocklyPathLight,",".blocklyInsertionMarker>.blocklyPathDark {","fill-opacity: .2;","stroke: none","}",".blocklyMultilineText {","font-family: monospace;","}",".blocklyNonEditableText>text {","pointer-events: none;","}",".blocklyBubbleText {","fill: #000;","}",".blocklyFlyout {","position: absolute;","z-index: 20;","}",".blocklyText text {","cursor: default;","}",".blocklySvg text, .blocklyBlockDragSurface text {", +"user-select: none;","-ms-user-select: none;","-webkit-user-select: none;","cursor: inherit;","}",".blocklyHidden {","display: none;","}",".blocklyFieldDropdown:not(.blocklyHidden) {","display: block;","}",".blocklyIconGroup {","cursor: default;","}",".blocklyIconGroup:not(:hover),",".blocklyIconGroupReadonly {","opacity: .6;","}",".blocklyIconShape {","fill: #00f;","stroke: #fff;","stroke-width: 1px;","}",".blocklyIconSymbol {","fill: #fff;","}",".blocklyMinimalBody {","margin: 0;","padding: 0;", +"}",".blocklyHtmlInput {","border: none;","border-radius: 4px;","height: 100%;","margin: 0;","outline: none;","padding: 0;","width: 100%;","text-align: center;","display: block;","box-sizing: border-box;","}",".blocklyHtmlInput::-ms-clear {","display: none;","}",".blocklyMainBackground {","stroke-width: 1;","stroke: #c6c6c6;","}",".blocklyMutatorBackground {","fill: #fff;","stroke: #ddd;","stroke-width: 1;","}",".blocklyFlyoutBackground {","fill: #ddd;","fill-opacity: .8;","}",".blocklyMainWorkspaceScrollbar {", +"z-index: 20;","}",".blocklyFlyoutScrollbar {","z-index: 30;","}",".blocklyScrollbarHorizontal, .blocklyScrollbarVertical {","position: absolute;","outline: none;","}",".blocklyScrollbarBackground {","opacity: 0;","}",".blocklyScrollbarHandle {","fill: #ccc;","}",".blocklyScrollbarBackground:hover+.blocklyScrollbarHandle,",".blocklyScrollbarHandle:hover {","fill: #bbb;","}",".blocklyFlyout .blocklyScrollbarHandle {","fill: #bbb;","}",".blocklyFlyout .blocklyScrollbarBackground:hover+.blocklyScrollbarHandle,", +".blocklyFlyout .blocklyScrollbarHandle:hover {","fill: #aaa;","}",".blocklyInvalidInput {","background: #faa;","}",".blocklyContextMenu {","border-radius: 4px;","max-height: 100%;","}",".blocklyDropdownMenu {","border-radius: 2px;","padding: 0 !important;","}",".blocklyWidgetDiv .blocklyDropdownMenu .goog-menuitem,",".blocklyDropDownDiv .blocklyDropdownMenu .goog-menuitem {","padding-left: 28px;","}",".blocklyWidgetDiv .blocklyDropdownMenu .goog-menuitem.goog-menuitem-rtl,",".blocklyDropDownDiv .blocklyDropdownMenu .goog-menuitem.goog-menuitem-rtl {", +"padding-left: 5px;","padding-right: 28px;","}",".blocklyVerticalMarker {","stroke-width: 3px;","fill: rgba(255,255,255,.5);","}",".blocklyWidgetDiv .goog-option-selected .goog-menuitem-checkbox,",".blocklyWidgetDiv .goog-option-selected .goog-menuitem-icon,",".blocklyDropDownDiv .goog-option-selected .goog-menuitem-checkbox,",".blocklyDropDownDiv .goog-option-selected .goog-menuitem-icon {","background: url(<<>>/sprites.png) no-repeat -48px -16px;","}",".blocklyWidgetDiv .goog-menu {","background: #fff;", +"border-color: transparent;","border-style: solid;","border-width: 1px;","cursor: default;","font: normal 13px Arial, sans-serif;","margin: 0;","outline: none;","padding: 4px 0;","position: absolute;","overflow-y: auto;","overflow-x: hidden;","max-height: 100%;","z-index: 20000;","box-shadow: 0px 0px 3px 1px rgba(0,0,0,.3);","}",".blocklyWidgetDiv .goog-menu.focused {","box-shadow: 0px 0px 6px 1px rgba(0,0,0,.3);","}",".blocklyDropDownDiv .goog-menu {","cursor: default;",'font: normal 13px "Helvetica Neue", Helvetica, sans-serif;', +"outline: none;","z-index: 20000;","}",".blocklyWidgetDiv .goog-menuitem,",".blocklyDropDownDiv .goog-menuitem {","color: #000;","font: normal 13px Arial, sans-serif;","list-style: none;","margin: 0;","min-width: 7em;","border: none;","padding: 6px 15px;","white-space: nowrap;","cursor: pointer;","}",".blocklyWidgetDiv .goog-menu-nocheckbox .goog-menuitem,",".blocklyWidgetDiv .goog-menu-noicon .goog-menuitem,",".blocklyDropDownDiv .goog-menu-nocheckbox .goog-menuitem,",".blocklyDropDownDiv .goog-menu-noicon .goog-menuitem {", +"padding-left: 12px;","}",".blocklyWidgetDiv .goog-menuitem-content,",".blocklyDropDownDiv .goog-menuitem-content {","font-family: Arial, sans-serif;","font-size: 13px;","}",".blocklyWidgetDiv .goog-menuitem-content {","color: #000;","}",".blocklyDropDownDiv .goog-menuitem-content {","color: #000;","}",".blocklyWidgetDiv .goog-menuitem-disabled,",".blocklyDropDownDiv .goog-menuitem-disabled {","cursor: inherit;","}",".blocklyWidgetDiv .goog-menuitem-disabled .goog-menuitem-content,",".blocklyDropDownDiv .goog-menuitem-disabled .goog-menuitem-content {", +"color: #ccc !important;","}",".blocklyWidgetDiv .goog-menuitem-disabled .goog-menuitem-icon,",".blocklyDropDownDiv .goog-menuitem-disabled .goog-menuitem-icon {","opacity: .3;","filter: alpha(opacity=30);","}",".blocklyWidgetDiv .goog-menuitem-highlight ,",".blocklyDropDownDiv .goog-menuitem-highlight {","background-color: rgba(0,0,0,.1);","}",".blocklyWidgetDiv .goog-menuitem-checkbox,",".blocklyWidgetDiv .goog-menuitem-icon,",".blocklyDropDownDiv .goog-menuitem-checkbox,",".blocklyDropDownDiv .goog-menuitem-icon {", +"background-repeat: no-repeat;","height: 16px;","left: 6px;","position: absolute;","right: auto;","vertical-align: middle;","width: 16px;","}",".blocklyWidgetDiv .goog-menuitem-rtl .goog-menuitem-checkbox,",".blocklyWidgetDiv .goog-menuitem-rtl .goog-menuitem-icon,",".blocklyDropDownDiv .goog-menuitem-rtl .goog-menuitem-checkbox,",".blocklyDropDownDiv .goog-menuitem-rtl .goog-menuitem-icon {","left: auto;","right: 6px;","}",".blocklyWidgetDiv .goog-option-selected .goog-menuitem-checkbox,",".blocklyWidgetDiv .goog-option-selected .goog-menuitem-icon,", +".blocklyDropDownDiv .goog-option-selected .goog-menuitem-checkbox,",".blocklyDropDownDiv .goog-option-selected .goog-menuitem-icon {","position: static;","float: left;","margin-left: -24px;","}",".blocklyWidgetDiv .goog-menuitem-rtl .goog-menuitem-checkbox,",".blocklyWidgetDiv .goog-menuitem-rtl .goog-menuitem-icon,",".blocklyDropDownDiv .goog-menuitem-rtl .goog-menuitem-checkbox,",".blocklyDropDownDiv .goog-menuitem-rtl .goog-menuitem-icon {","float: right;","margin-right: -24px;","}",".blocklyComputeCanvas {", +"position: absolute;","width: 0;","height: 0;","}",".blocklyNoPointerEvents {","pointer-events: none;","}"];Blockly.utils.math={};Blockly.utils.math.toRadians=function(a){return a*Math.PI/180};Blockly.utils.math.toDegrees=function(a){return 180*a/Math.PI};Blockly.utils.math.clamp=function(a,b,c){if(ce.top?Blockly.DropDownDiv.getPositionAboveMetrics_(c,d,e,f):b+f.heightdocument.documentElement.clientTop?Blockly.DropDownDiv.getPositionAboveMetrics_(c, +d,e,f):Blockly.DropDownDiv.getPositionTopOfPageMetrics_(a,e,f)};Blockly.DropDownDiv.getPositionBelowMetrics_=function(a,b,c,d){a=Blockly.DropDownDiv.getPositionX(a,c.left,c.right,d.width);return{initialX:a.divX,initialY:b,finalX:a.divX,finalY:b+Blockly.DropDownDiv.PADDING_Y,arrowX:a.arrowX,arrowY:-(Blockly.DropDownDiv.ARROW_SIZE/2+Blockly.DropDownDiv.BORDER_SIZE),arrowAtTop:!0,arrowVisible:!0}}; +Blockly.DropDownDiv.getPositionAboveMetrics_=function(a,b,c,d){a=Blockly.DropDownDiv.getPositionX(a,c.left,c.right,d.width);return{initialX:a.divX,initialY:b-d.height,finalX:a.divX,finalY:b-d.height-Blockly.DropDownDiv.PADDING_Y,arrowX:a.arrowX,arrowY:d.height-2*Blockly.DropDownDiv.BORDER_SIZE-Blockly.DropDownDiv.ARROW_SIZE/2,arrowAtTop:!1,arrowVisible:!0}}; +Blockly.DropDownDiv.getPositionTopOfPageMetrics_=function(a,b,c){a=Blockly.DropDownDiv.getPositionX(a,b.left,b.right,c.width);return{initialX:a.divX,initialY:0,finalX:a.divX,finalY:0,arrowVisible:!1}};Blockly.DropDownDiv.getPositionX=function(a,b,c,d){var e=a;a=Blockly.utils.math.clamp(b,a-d/2,c-d);e-=Blockly.DropDownDiv.ARROW_SIZE/2;b=Blockly.DropDownDiv.ARROW_HORIZONTAL_PADDING;d=Blockly.utils.math.clamp(b,e-a,d-b-Blockly.DropDownDiv.ARROW_SIZE);return{arrowX:d,divX:a}}; +Blockly.DropDownDiv.isVisible=function(){return!!Blockly.DropDownDiv.owner_};Blockly.DropDownDiv.hideIfOwner=function(a,b){return Blockly.DropDownDiv.owner_===a?(b?Blockly.DropDownDiv.hideWithoutAnimation():Blockly.DropDownDiv.hide(),!0):!1}; +Blockly.DropDownDiv.hide=function(){var a=Blockly.DropDownDiv.DIV_;a.style.transform="translate(0, 0)";a.style.opacity=0;Blockly.DropDownDiv.animateOutTimer_=setTimeout(function(){Blockly.DropDownDiv.hideWithoutAnimation()},1E3*Blockly.DropDownDiv.ANIMATION_TIME);Blockly.DropDownDiv.onHide_&&(Blockly.DropDownDiv.onHide_(),Blockly.DropDownDiv.onHide_=null)}; +Blockly.DropDownDiv.hideWithoutAnimation=function(){if(Blockly.DropDownDiv.isVisible()){Blockly.DropDownDiv.animateOutTimer_&&clearTimeout(Blockly.DropDownDiv.animateOutTimer_);var a=Blockly.DropDownDiv.DIV_;a.style.transform="";a.style.left="";a.style.top="";a.style.opacity=0;a.style.display="none";a.style.backgroundColor="";a.style.borderColor="";Blockly.DropDownDiv.onHide_&&(Blockly.DropDownDiv.onHide_(),Blockly.DropDownDiv.onHide_=null);Blockly.DropDownDiv.clearContent();Blockly.DropDownDiv.owner_= +null;Blockly.DropDownDiv.rendererClassName_&&(Blockly.utils.dom.removeClass(a,Blockly.DropDownDiv.rendererClassName_),Blockly.DropDownDiv.rendererClassName_=null);Blockly.DropDownDiv.themeClassName_&&(Blockly.utils.dom.removeClass(a,Blockly.DropDownDiv.themeClassName_),Blockly.DropDownDiv.themeClassName_=null);Blockly.getMainWorkspace().markFocused()}}; +Blockly.DropDownDiv.positionInternal_=function(a,b,c,d){a=Blockly.DropDownDiv.getPositionMetrics_(a,b,c,d);a.arrowVisible?(Blockly.DropDownDiv.arrow_.style.display="",Blockly.DropDownDiv.arrow_.style.transform="translate("+a.arrowX+"px,"+a.arrowY+"px) rotate(45deg)",Blockly.DropDownDiv.arrow_.setAttribute("class",a.arrowAtTop?"blocklyDropDownArrow blocklyArrowTop":"blocklyDropDownArrow blocklyArrowBottom")):Blockly.DropDownDiv.arrow_.style.display="none";b=Math.floor(a.initialX);c=Math.floor(a.initialY); +d=Math.floor(a.finalX);var e=Math.floor(a.finalY),f=Blockly.DropDownDiv.DIV_;f.style.left=b+"px";f.style.top=c+"px";f.style.display="block";f.style.opacity=1;f.style.transform="translate("+(d-b)+"px,"+(e-c)+"px)";return a.arrowAtTop}; +Blockly.DropDownDiv.repositionForWindowResize=function(){if(Blockly.DropDownDiv.owner_){var a=Blockly.DropDownDiv.owner_,b=Blockly.DropDownDiv.owner_.getSourceBlock();a=Blockly.DropDownDiv.positionToField_?Blockly.DropDownDiv.getScaledBboxOfField_(a):Blockly.DropDownDiv.getScaledBboxOfBlock_(b);b=a.left+(a.right-a.left)/2;Blockly.DropDownDiv.positionInternal_(b,a.bottom,b,a.top)}else Blockly.DropDownDiv.hide()};Blockly.Grid=function(a,b){this.gridPattern_=a;this.spacing_=b.spacing;this.length_=b.length;this.line2_=(this.line1_=a.firstChild)&&this.line1_.nextSibling;this.snapToGrid_=b.snap};Blockly.Grid.prototype.scale_=1;Blockly.Grid.prototype.dispose=function(){this.gridPattern_=null};Blockly.Grid.prototype.shouldSnap=function(){return this.snapToGrid_};Blockly.Grid.prototype.getSpacing=function(){return this.spacing_};Blockly.Grid.prototype.getPatternId=function(){return this.gridPattern_.id}; +Blockly.Grid.prototype.update=function(a){this.scale_=a;var b=this.spacing_*a||100;this.gridPattern_.setAttribute("width",b);this.gridPattern_.setAttribute("height",b);b=Math.floor(this.spacing_/2)+.5;var c=b-this.length_/2,d=b+this.length_/2;b*=a;c*=a;d*=a;this.setLineAttributes_(this.line1_,a,c,d,b,b);this.setLineAttributes_(this.line2_,a,b,b,c,d)}; +Blockly.Grid.prototype.setLineAttributes_=function(a,b,c,d,e,f){a&&(a.setAttribute("stroke-width",b),a.setAttribute("x1",c),a.setAttribute("y1",e),a.setAttribute("x2",d),a.setAttribute("y2",f))};Blockly.Grid.prototype.moveTo=function(a,b){this.gridPattern_.setAttribute("x",a);this.gridPattern_.setAttribute("y",b);(Blockly.utils.userAgent.IE||Blockly.utils.userAgent.EDGE)&&this.update(this.scale_)}; +Blockly.Grid.createDom=function(a,b,c){a=Blockly.utils.dom.createSvgElement("pattern",{id:"blocklyGridPattern"+a,patternUnits:"userSpaceOnUse"},c);0b.indexOf(d))throw Error(d+" is not a valid modifier key.");};Blockly.user.keyMap.createSerializedKey=function(a,b){var c="",d=Blockly.utils.object.values(Blockly.user.keyMap.modifierKeys);Blockly.user.keyMap.checkModifiers_(b,d);for(var e=0,f;f=d[e];e++)-1");b.domToMutation(d)}Blockly.Events.fire(new Blockly.Events.Change(b,"mutation",null,c,a));break;default:console.warn("Unknown change type: "+this.element)}else console.warn("Can't change non-existent block: "+this.blockId)}; +Blockly.Events.Create=function(a){a&&(Blockly.Events.Create.superClass_.constructor.call(this,a),this.xml=a.workspace.rendered?Blockly.Xml.blockToDomWithXY(a):Blockly.Xml.blockToDom(a),this.ids=Blockly.Events.getDescendantIds(a))};Blockly.utils.object.inherits(Blockly.Events.Create,Blockly.Events.BlockBase);Blockly.Events.BlockCreate=Blockly.Events.Create;Blockly.Events.Create.prototype.type=Blockly.Events.CREATE; +Blockly.Events.Create.prototype.toJson=function(){var a=Blockly.Events.Create.superClass_.toJson.call(this);a.xml=Blockly.Xml.domToText(this.xml);a.ids=this.ids;return a};Blockly.Events.Create.prototype.fromJson=function(a){Blockly.Events.Create.superClass_.fromJson.call(this,a);this.xml=Blockly.Xml.textToDom(a.xml);this.ids=a.ids}; +Blockly.Events.Create.prototype.run=function(a){var b=this.getEventWorkspace_();if(a)a=Blockly.utils.xml.createElement("xml"),a.appendChild(this.xml),Blockly.Xml.domToWorkspace(a,b);else{a=0;for(var c;c=this.ids[a];a++){var d=b.getBlockById(c);d?d.dispose(!1):c==this.blockId&&console.warn("Can't uncreate non-existent block: "+c)}}}; +Blockly.Events.Delete=function(a){if(a){if(a.getParent())throw Error("Connected blocks cannot be deleted.");Blockly.Events.Delete.superClass_.constructor.call(this,a);this.oldXml=a.workspace.rendered?Blockly.Xml.blockToDomWithXY(a):Blockly.Xml.blockToDom(a);this.ids=Blockly.Events.getDescendantIds(a)}};Blockly.utils.object.inherits(Blockly.Events.Delete,Blockly.Events.BlockBase);Blockly.Events.BlockDelete=Blockly.Events.Delete;Blockly.Events.Delete.prototype.type=Blockly.Events.DELETE; +Blockly.Events.Delete.prototype.toJson=function(){var a=Blockly.Events.Delete.superClass_.toJson.call(this);a.ids=this.ids;return a};Blockly.Events.Delete.prototype.fromJson=function(a){Blockly.Events.Delete.superClass_.fromJson.call(this,a);this.ids=a.ids}; +Blockly.Events.Delete.prototype.run=function(a){var b=this.getEventWorkspace_();if(a){a=0;for(var c;c=this.ids[a];a++){var d=b.getBlockById(c);d?d.dispose(!1):c==this.blockId&&console.warn("Can't delete non-existent block: "+c)}}else a=Blockly.utils.xml.createElement("xml"),a.appendChild(this.oldXml),Blockly.Xml.domToWorkspace(a,b)}; +Blockly.Events.Move=function(a){a&&(Blockly.Events.Move.superClass_.constructor.call(this,a),a=this.currentLocation_(),this.oldParentId=a.parentId,this.oldInputName=a.inputName,this.oldCoordinate=a.coordinate)};Blockly.utils.object.inherits(Blockly.Events.Move,Blockly.Events.BlockBase);Blockly.Events.BlockMove=Blockly.Events.Move;Blockly.Events.Move.prototype.type=Blockly.Events.MOVE; +Blockly.Events.Move.prototype.toJson=function(){var a=Blockly.Events.Move.superClass_.toJson.call(this);this.newParentId&&(a.newParentId=this.newParentId);this.newInputName&&(a.newInputName=this.newInputName);this.newCoordinate&&(a.newCoordinate=Math.round(this.newCoordinate.x)+","+Math.round(this.newCoordinate.y));return a}; +Blockly.Events.Move.prototype.fromJson=function(a){Blockly.Events.Move.superClass_.fromJson.call(this,a);this.newParentId=a.newParentId;this.newInputName=a.newInputName;a.newCoordinate&&(a=a.newCoordinate.split(","),this.newCoordinate=new Blockly.utils.Coordinate(Number(a[0]),Number(a[1])))};Blockly.Events.Move.prototype.recordNew=function(){var a=this.currentLocation_();this.newParentId=a.parentId;this.newInputName=a.inputName;this.newCoordinate=a.coordinate}; +Blockly.Events.Move.prototype.currentLocation_=function(){var a=this.getEventWorkspace_().getBlockById(this.blockId),b={},c=a.getParent();if(c){if(b.parentId=c.id,a=c.getInputWithBlock(a))b.inputName=a.name}else b.coordinate=a.getRelativeToSurfaceXY();return b};Blockly.Events.Move.prototype.isNull=function(){return this.oldParentId==this.newParentId&&this.oldInputName==this.newInputName&&Blockly.utils.Coordinate.equals(this.oldCoordinate,this.newCoordinate)}; +Blockly.Events.Move.prototype.run=function(a){var b=this.getEventWorkspace_(),c=b.getBlockById(this.blockId);if(c){var d=a?this.newParentId:this.oldParentId,e=a?this.newInputName:this.oldInputName;a=a?this.newCoordinate:this.oldCoordinate;var f=null;if(d&&(f=b.getBlockById(d),!f)){console.warn("Can't connect to non-existent block: "+d);return}c.getParent()&&c.unplug();if(a)e=c.getRelativeToSurfaceXY(),c.moveBy(a.x-e.x,a.y-e.y);else{c=c.outputConnection||c.previousConnection;if(e){if(b=f.getInput(e))var g= +b.connection}else c.type==Blockly.PREVIOUS_STATEMENT&&(g=f.nextConnection);g?c.connect(g):console.warn("Can't connect to non-existent input: "+e)}}else console.warn("Can't move non-existent block: "+this.blockId)};Blockly.Events.FinishedLoading=function(a){this.workspaceId=a.id;this.group=Blockly.Events.getGroup();this.recordUndo=!1};Blockly.utils.object.inherits(Blockly.Events.FinishedLoading,Blockly.Events.Ui);Blockly.Events.FinishedLoading.prototype.type=Blockly.Events.FINISHED_LOADING;Blockly.Events.FinishedLoading.prototype.toJson=function(){var a={type:this.type};this.group&&(a.group=this.group);this.workspaceId&&(a.workspaceId=this.workspaceId);return a}; +Blockly.Events.FinishedLoading.prototype.fromJson=function(a){this.workspaceId=a.workspaceId;this.group=a.group};Blockly.Events.VarBase=function(a){Blockly.Events.VarBase.superClass_.constructor.call(this);this.varId=a.getId();this.workspaceId=a.workspace.id};Blockly.utils.object.inherits(Blockly.Events.VarBase,Blockly.Events.Abstract);Blockly.Events.VarBase.prototype.toJson=function(){var a=Blockly.Events.VarBase.superClass_.toJson.call(this);a.varId=this.varId;return a};Blockly.Events.VarBase.prototype.fromJson=function(a){Blockly.Events.VarBase.superClass_.toJson.call(this);this.varId=a.varId}; +Blockly.Events.VarCreate=function(a){a&&(Blockly.Events.VarCreate.superClass_.constructor.call(this,a),this.varType=a.type,this.varName=a.name)};Blockly.utils.object.inherits(Blockly.Events.VarCreate,Blockly.Events.VarBase);Blockly.Events.VarCreate.prototype.type=Blockly.Events.VAR_CREATE;Blockly.Events.VarCreate.prototype.toJson=function(){var a=Blockly.Events.VarCreate.superClass_.toJson.call(this);a.varType=this.varType;a.varName=this.varName;return a}; +Blockly.Events.VarCreate.prototype.fromJson=function(a){Blockly.Events.VarCreate.superClass_.fromJson.call(this,a);this.varType=a.varType;this.varName=a.varName};Blockly.Events.VarCreate.prototype.run=function(a){var b=this.getEventWorkspace_();a?b.createVariable(this.varName,this.varType,this.varId):b.deleteVariableById(this.varId)};Blockly.Events.VarDelete=function(a){a&&(Blockly.Events.VarDelete.superClass_.constructor.call(this,a),this.varType=a.type,this.varName=a.name)}; +Blockly.utils.object.inherits(Blockly.Events.VarDelete,Blockly.Events.VarBase);Blockly.Events.VarDelete.prototype.type=Blockly.Events.VAR_DELETE;Blockly.Events.VarDelete.prototype.toJson=function(){var a=Blockly.Events.VarDelete.superClass_.toJson.call(this);a.varType=this.varType;a.varName=this.varName;return a};Blockly.Events.VarDelete.prototype.fromJson=function(a){Blockly.Events.VarDelete.superClass_.fromJson.call(this,a);this.varType=a.varType;this.varName=a.varName}; +Blockly.Events.VarDelete.prototype.run=function(a){var b=this.getEventWorkspace_();a?b.deleteVariableById(this.varId):b.createVariable(this.varName,this.varType,this.varId)};Blockly.Events.VarRename=function(a,b){a&&(Blockly.Events.VarRename.superClass_.constructor.call(this,a),this.oldName=a.name,this.newName=b)};Blockly.utils.object.inherits(Blockly.Events.VarRename,Blockly.Events.VarBase);Blockly.Events.VarRename.prototype.type=Blockly.Events.VAR_RENAME; +Blockly.Events.VarRename.prototype.toJson=function(){var a=Blockly.Events.VarRename.superClass_.toJson.call(this);a.oldName=this.oldName;a.newName=this.newName;return a};Blockly.Events.VarRename.prototype.fromJson=function(a){Blockly.Events.VarRename.superClass_.fromJson.call(this,a);this.oldName=a.oldName;this.newName=a.newName};Blockly.Events.VarRename.prototype.run=function(a){var b=this.getEventWorkspace_();a?b.renameVariableById(this.varId,this.newName):b.renameVariableById(this.varId,this.oldName)};Blockly.Xml={};Blockly.Xml.workspaceToDom=function(a,b){var c=Blockly.utils.xml.createElement("xml"),d=Blockly.Xml.variablesToDom(Blockly.Variables.allUsedVarModels(a));d.hasChildNodes()&&c.appendChild(d);var e=a.getTopComments(!0);d=0;for(var f;f=e[d];d++)c.appendChild(f.toXmlWithXY(b));a=a.getTopBlocks(!0);for(d=0;e=a[d];d++)c.appendChild(Blockly.Xml.blockToDomWithXY(e,b));return c}; +Blockly.Xml.variablesToDom=function(a){for(var b=Blockly.utils.xml.createElement("variables"),c=0,d;d=a[c];c++){var e=Blockly.utils.xml.createElement("variable");e.appendChild(Blockly.utils.xml.createTextNode(d.name));d.type&&e.setAttribute("type",d.type);e.id=d.getId();b.appendChild(e)}return b}; +Blockly.Xml.blockToDomWithXY=function(a,b){var c;a.workspace.RTL&&(c=a.workspace.getWidth());b=Blockly.Xml.blockToDom(a,b);var d=a.getRelativeToSurfaceXY();b.setAttribute("x",Math.round(a.workspace.RTL?c-d.x:d.x));b.setAttribute("y",Math.round(d.y));return b};Blockly.Xml.fieldToDom_=function(a){if(a.isSerializable()){var b=Blockly.utils.xml.createElement("field");b.setAttribute("name",a.name||"");return a.toXml(b)}return null}; +Blockly.Xml.allFieldsToDom_=function(a,b){for(var c=0,d;d=a.inputList[c];c++)for(var e=0,f;f=d.fieldRow[e];e++)(f=Blockly.Xml.fieldToDom_(f))&&b.appendChild(f)}; +Blockly.Xml.blockToDom=function(a,b){var c=Blockly.utils.xml.createElement(a.isShadow()?"shadow":"block");c.setAttribute("type",a.type);b||c.setAttribute("id",a.id);if(a.mutationToDom){var d=a.mutationToDom();d&&(d.hasChildNodes()||d.hasAttributes())&&c.appendChild(d)}Blockly.Xml.allFieldsToDom_(a,c);if(d=a.getCommentText()){var e=a.commentModel.size,f=a.commentModel.pinned,g=Blockly.utils.xml.createElement("comment");g.appendChild(Blockly.utils.xml.createTextNode(d));g.setAttribute("pinned",f);g.setAttribute("h", +e.height);g.setAttribute("w",e.width);c.appendChild(g)}a.data&&(d=Blockly.utils.xml.createElement("data"),d.appendChild(Blockly.utils.xml.createTextNode(a.data)),c.appendChild(d));for(e=0;f=a.inputList[e];e++){var h;g=!0;if(f.type!=Blockly.DUMMY_INPUT){var k=f.connection.targetBlock();f.type==Blockly.INPUT_VALUE?h=Blockly.utils.xml.createElement("value"):f.type==Blockly.NEXT_STATEMENT&&(h=Blockly.utils.xml.createElement("statement"));d=f.connection.getShadowDom();!d||k&&k.isShadow()||h.appendChild(Blockly.Xml.cloneShadow_(d, +b));k&&(h.appendChild(Blockly.Xml.blockToDom(k,b)),g=!1);h.setAttribute("name",f.name);g||c.appendChild(h)}}void 0!=a.inputsInline&&a.inputsInline!=a.inputsInlineDefault&&c.setAttribute("inline",a.inputsInline);a.isCollapsed()&&c.setAttribute("collapsed",!0);a.isEnabled()||c.setAttribute("disabled",!0);a.isDeletable()||a.isShadow()||c.setAttribute("deletable",!1);a.isMovable()||a.isShadow()||c.setAttribute("movable",!1);a.isEditable()||c.setAttribute("editable",!1);if(e=a.getNextBlock())h=Blockly.utils.xml.createElement("next"), +h.appendChild(Blockly.Xml.blockToDom(e,b)),c.appendChild(h);d=a.nextConnection&&a.nextConnection.getShadowDom();!d||e&&e.isShadow()||h.appendChild(Blockly.Xml.cloneShadow_(d,b));return c}; +Blockly.Xml.cloneShadow_=function(a,b){for(var c=a=a.cloneNode(!0),d;c;)if(b&&"shadow"==c.nodeName&&c.removeAttribute("id"),c.firstChild)c=c.firstChild;else{for(;c&&!c.nextSibling;)d=c,c=c.parentNode,d.nodeType==Blockly.utils.dom.Node.TEXT_NODE&&""==d.data.trim()&&c.firstChild!=d&&Blockly.utils.dom.removeNode(d);c&&(d=c,c=c.nextSibling,d.nodeType==Blockly.utils.dom.Node.TEXT_NODE&&""==d.data.trim()&&Blockly.utils.dom.removeNode(d))}return a}; +Blockly.Xml.domToText=function(a){a=Blockly.utils.xml.domToText(a);var b=/(<[^/](?:[^>]*[^/])?>[^<]*)\n([^<]*<\/)/;do{var c=a;a=a.replace(b,"$1 $2")}while(a!=c);return a};Blockly.Xml.domToPrettyText=function(a){a=Blockly.Xml.domToText(a).split("<");for(var b="",c=1;c"!=d.slice(-2)&&(b+=" ")}a=a.join("\n");a=a.replace(/(<(\w+)\b[^>]*>[^\n]*)\n *<\/\2>/g,"$1");return a.replace(/^\n/,"")}; +Blockly.Xml.textToDom=function(a){var b=Blockly.utils.xml.textToDomDocument(a);if(!b||!b.documentElement||b.getElementsByTagName("parsererror").length)throw Error("textToDom was unable to parse: "+a);return b.documentElement};Blockly.Xml.clearWorkspaceAndLoadFromXml=function(a,b){b.setResizesEnabled(!1);b.clear();a=Blockly.Xml.domToWorkspace(a,b);b.setResizesEnabled(!0);return a}; +Blockly.Xml.domToWorkspace=function(a,b){if(a instanceof Blockly.Workspace){var c=a;a=b;b=c;console.warn("Deprecated call to Blockly.Xml.domToWorkspace, swap the arguments.")}var d;b.RTL&&(d=b.getWidth());c=[];Blockly.utils.dom.startTextWidthCache();var e=Blockly.Events.getGroup();e||Blockly.Events.setGroup(!0);b.setResizesEnabled&&b.setResizesEnabled(!1);var f=!0;try{for(var g=0,h;h=a.childNodes[g];g++){var k=h.nodeName.toLowerCase(),l=h;if("block"==k||"shadow"==k&&!Blockly.Events.recordUndo){var m= +Blockly.Xml.domToBlock(l,b);c.push(m.id);var n=l.hasAttribute("x")?parseInt(l.getAttribute("x"),10):10,p=l.hasAttribute("y")?parseInt(l.getAttribute("y"),10):10;isNaN(n)||isNaN(p)||m.moveBy(b.RTL?d-n:n,p);f=!1}else{if("shadow"==k)throw TypeError("Shadow block cannot be a top-level block.");if("comment"==k)b.rendered?Blockly.WorkspaceCommentSvg?Blockly.WorkspaceCommentSvg.fromXml(l,b,d):console.warn("Missing require for Blockly.WorkspaceCommentSvg, ignoring workspace comment."):Blockly.WorkspaceComment? +Blockly.WorkspaceComment.fromXml(l,b):console.warn("Missing require for Blockly.WorkspaceComment, ignoring workspace comment.");else if("variables"==k){if(f)Blockly.Xml.domToVariables(l,b);else throw Error("'variables' tag must exist once before block and shadow tag elements in the workspace XML, but it was found in another location.");f=!1}}}}finally{e||Blockly.Events.setGroup(!1),Blockly.utils.dom.stopTextWidthCache()}b.setResizesEnabled&&b.setResizesEnabled(!0);Blockly.Events.fire(new Blockly.Events.FinishedLoading(b)); +return c};Blockly.Xml.appendDomToWorkspace=function(a,b){var c;b.hasOwnProperty("scale")&&(c=b.getBlocksBoundingBox());a=Blockly.Xml.domToWorkspace(a,b);if(c&&c.top!=c.bottom){var d=c.bottom;var e=b.RTL?c.right:c.left;var f=Infinity,g=-Infinity,h=Infinity;for(c=0;cg&&(g=k.x)}d=d-h+10;e=b.RTL?e-g:e-f;for(c=0;c document.");}else a=null;return a};Blockly.Touch={};Blockly.Touch.TOUCH_ENABLED="ontouchstart"in Blockly.utils.global||!!(Blockly.utils.global.document&&document.documentElement&&"ontouchstart"in document.documentElement)||!(!Blockly.utils.global.navigator||!Blockly.utils.global.navigator.maxTouchPoints&&!Blockly.utils.global.navigator.msMaxTouchPoints);Blockly.Touch.touchIdentifier_=null;Blockly.Touch.TOUCH_MAP={}; +Blockly.utils.global.PointerEvent?Blockly.Touch.TOUCH_MAP={mousedown:["pointerdown"],mouseenter:["pointerenter"],mouseleave:["pointerleave"],mousemove:["pointermove"],mouseout:["pointerout"],mouseover:["pointerover"],mouseup:["pointerup","pointercancel"],touchend:["pointerup"],touchcancel:["pointercancel"]}:Blockly.Touch.TOUCH_ENABLED&&(Blockly.Touch.TOUCH_MAP={mousedown:["touchstart"],mousemove:["touchmove"],mouseup:["touchend","touchcancel"]});Blockly.longPid_=0; +Blockly.longStart=function(a,b){Blockly.longStop_();a.changedTouches&&1!=a.changedTouches.length||(Blockly.longPid_=setTimeout(function(){a.changedTouches&&(a.button=2,a.clientX=a.changedTouches[0].clientX,a.clientY=a.changedTouches[0].clientY);b&&b.handleRightClick(a)},Blockly.LONGPRESS))};Blockly.longStop_=function(){Blockly.longPid_&&(clearTimeout(Blockly.longPid_),Blockly.longPid_=0)};Blockly.Touch.clearTouchIdentifier=function(){Blockly.Touch.touchIdentifier_=null}; +Blockly.Touch.shouldHandleEvent=function(a){return!Blockly.Touch.isMouseOrTouchEvent(a)||Blockly.Touch.checkTouchIdentifier(a)};Blockly.Touch.getTouchIdentifierFromEvent=function(a){return void 0!=a.pointerId?a.pointerId:a.changedTouches&&a.changedTouches[0]&&void 0!==a.changedTouches[0].identifier&&null!==a.changedTouches[0].identifier?a.changedTouches[0].identifier:"mouse"}; +Blockly.Touch.checkTouchIdentifier=function(a){var b=Blockly.Touch.getTouchIdentifierFromEvent(a);return void 0!==Blockly.Touch.touchIdentifier_&&null!==Blockly.Touch.touchIdentifier_?Blockly.Touch.touchIdentifier_==b:"mousedown"==a.type||"touchstart"==a.type||"pointerdown"==a.type?(Blockly.Touch.touchIdentifier_=b,!0):!1};Blockly.Touch.setClientFromTouch=function(a){if(Blockly.utils.string.startsWith(a.type,"touch")){var b=a.changedTouches[0];a.clientX=b.clientX;a.clientY=b.clientY}}; +Blockly.Touch.isMouseOrTouchEvent=function(a){return Blockly.utils.string.startsWith(a.type,"touch")||Blockly.utils.string.startsWith(a.type,"mouse")||Blockly.utils.string.startsWith(a.type,"pointer")};Blockly.Touch.isTouchEvent=function(a){return Blockly.utils.string.startsWith(a.type,"touch")||Blockly.utils.string.startsWith(a.type,"pointer")}; +Blockly.Touch.splitEventByTouches=function(a){var b=[];if(a.changedTouches)for(var c=0;c=c+this.handleLength_&&(d+= +e);this.setHandlePosition(this.constrainHandle_(d));this.onScroll_();a.stopPropagation();a.preventDefault()}}; +Blockly.Scrollbar.prototype.onMouseDownHandle_=function(a){this.workspace_.markFocused();this.cleanUp_();Blockly.utils.isRightButton(a)?a.stopPropagation():(this.startDragHandle=this.handlePosition_,this.workspace_.setupDragSurface(),this.startDragMouse_=this.horizontal_?a.clientX:a.clientY,Blockly.Scrollbar.onMouseUpWrapper_=Blockly.bindEventWithChecks_(document,"mouseup",this,this.onMouseUpHandle_),Blockly.Scrollbar.onMouseMoveWrapper_=Blockly.bindEventWithChecks_(document,"mousemove",this,this.onMouseMoveHandle_), +a.stopPropagation(),a.preventDefault())};Blockly.Scrollbar.prototype.onMouseMoveHandle_=function(a){this.setHandlePosition(this.constrainHandle_(this.startDragHandle+((this.horizontal_?a.clientX:a.clientY)-this.startDragMouse_)));this.onScroll_()};Blockly.Scrollbar.prototype.onMouseUpHandle_=function(){this.workspace_.resetDragSurface();Blockly.Touch.clearTouchIdentifier();this.cleanUp_()}; +Blockly.Scrollbar.prototype.cleanUp_=function(){Blockly.hideChaff(!0);Blockly.Scrollbar.onMouseUpWrapper_&&(Blockly.unbindEvent_(Blockly.Scrollbar.onMouseUpWrapper_),Blockly.Scrollbar.onMouseUpWrapper_=null);Blockly.Scrollbar.onMouseMoveWrapper_&&(Blockly.unbindEvent_(Blockly.Scrollbar.onMouseMoveWrapper_),Blockly.Scrollbar.onMouseMoveWrapper_=null)}; +Blockly.Scrollbar.prototype.constrainHandle_=function(a){return a=0>=a||isNaN(a)||this.scrollViewSize_Blockly.Tooltip.RADIUS_OK&&Blockly.Tooltip.hide()}else Blockly.Tooltip.poisonedElement_!=Blockly.Tooltip.element_&&(clearTimeout(Blockly.Tooltip.showPid_),Blockly.Tooltip.lastX_=a.pageX,Blockly.Tooltip.lastY_=a.pageY,Blockly.Tooltip.showPid_=setTimeout(Blockly.Tooltip.show_, +Blockly.Tooltip.HOVER_MS))};Blockly.Tooltip.hide=function(){Blockly.Tooltip.visible&&(Blockly.Tooltip.visible=!1,Blockly.Tooltip.DIV&&(Blockly.Tooltip.DIV.style.display="none"));Blockly.Tooltip.showPid_&&clearTimeout(Blockly.Tooltip.showPid_)};Blockly.Tooltip.block=function(){Blockly.Tooltip.hide();Blockly.Tooltip.blocked_=!0};Blockly.Tooltip.unblock=function(){Blockly.Tooltip.blocked_=!1}; +Blockly.Tooltip.show_=function(){if(!Blockly.Tooltip.blocked_&&(Blockly.Tooltip.poisonedElement_=Blockly.Tooltip.element_,Blockly.Tooltip.DIV)){Blockly.Tooltip.DIV.innerHTML="";for(var a=Blockly.Tooltip.element_.tooltip;"function"==typeof a;)a=a();a=Blockly.utils.string.wrap(a,Blockly.Tooltip.LIMIT);a=a.split("\n");for(var b=0;bc+window.scrollY&&(e-=Blockly.Tooltip.DIV.offsetHeight+2*Blockly.Tooltip.OFFSET_Y);a?d=Math.max(Blockly.Tooltip.MARGINS-window.scrollX, +d):d+Blockly.Tooltip.DIV.offsetWidth>b+window.scrollX-2*Blockly.Tooltip.MARGINS&&(d=b-Blockly.Tooltip.DIV.offsetWidth-2*Blockly.Tooltip.MARGINS);Blockly.Tooltip.DIV.style.top=e+"px";Blockly.Tooltip.DIV.style.left=d+"px"}};Blockly.WorkspaceDragSurfaceSvg=function(a){this.container_=a;this.createDom()};Blockly.WorkspaceDragSurfaceSvg.prototype.SVG_=null;Blockly.WorkspaceDragSurfaceSvg.prototype.dragGroup_=null;Blockly.WorkspaceDragSurfaceSvg.prototype.container_=null; +Blockly.WorkspaceDragSurfaceSvg.prototype.createDom=function(){this.SVG_||(this.SVG_=Blockly.utils.dom.createSvgElement("svg",{xmlns:Blockly.utils.dom.SVG_NS,"xmlns:html":Blockly.utils.dom.HTML_NS,"xmlns:xlink":Blockly.utils.dom.XLINK_NS,version:"1.1","class":"blocklyWsDragSurface blocklyOverflowVisible"},null),this.container_.appendChild(this.SVG_))}; +Blockly.WorkspaceDragSurfaceSvg.prototype.translateSurface=function(a,b){a=a.toFixed(0);b=b.toFixed(0);this.SVG_.style.display="block";Blockly.utils.dom.setCssTransform(this.SVG_,"translate3d("+a+"px, "+b+"px, 0px)")};Blockly.WorkspaceDragSurfaceSvg.prototype.getSurfaceTranslation=function(){return Blockly.utils.getRelativeXY(this.SVG_)}; +Blockly.WorkspaceDragSurfaceSvg.prototype.clearAndHide=function(a){if(!a)throw Error("Couldn't clear and hide the drag surface: missing new surface.");var b=this.SVG_.childNodes[0],c=this.SVG_.childNodes[1];if(!(b&&c&&Blockly.utils.dom.hasClass(b,"blocklyBlockCanvas")&&Blockly.utils.dom.hasClass(c,"blocklyBubbleCanvas")))throw Error("Couldn't clear and hide the drag surface. A node was missing.");null!=this.previousSibling_?Blockly.utils.dom.insertAfter(b,this.previousSibling_):a.insertBefore(b,a.firstChild); +Blockly.utils.dom.insertAfter(c,b);this.SVG_.style.display="none";if(this.SVG_.childNodes.length)throw Error("Drag surface was not cleared.");Blockly.utils.dom.setCssTransform(this.SVG_,"");this.previousSibling_=null}; +Blockly.WorkspaceDragSurfaceSvg.prototype.setContentsAndShow=function(a,b,c,d,e,f){if(this.SVG_.childNodes.length)throw Error("Already dragging a block.");this.previousSibling_=c;a.setAttribute("transform","translate(0, 0) scale("+f+")");b.setAttribute("transform","translate(0, 0) scale("+f+")");this.SVG_.setAttribute("width",d);this.SVG_.setAttribute("height",e);this.SVG_.appendChild(a);this.SVG_.appendChild(b);this.SVG_.style.display="block"};Blockly.ASTNode=function(a,b,c){if(!b)throw Error("Cannot create a node without a location.");this.type_=a;this.isConnection_=Blockly.ASTNode.isConnectionType_(a);this.location_=b;this.processParams_(c||null)};Blockly.ASTNode.types={FIELD:"field",BLOCK:"block",INPUT:"input",OUTPUT:"output",NEXT:"next",PREVIOUS:"previous",STACK:"stack",WORKSPACE:"workspace"};Blockly.ASTNode.NAVIGATE_ALL_FIELDS=!1;Blockly.ASTNode.DEFAULT_OFFSET_Y=-20;Blockly.ASTNode.isConnectionType_=function(a){switch(a){case Blockly.ASTNode.types.PREVIOUS:case Blockly.ASTNode.types.NEXT:case Blockly.ASTNode.types.INPUT:case Blockly.ASTNode.types.OUTPUT:return!0}return!1}; +Blockly.ASTNode.createFieldNode=function(a){return a?new Blockly.ASTNode(Blockly.ASTNode.types.FIELD,a):null}; +Blockly.ASTNode.createConnectionNode=function(a){return a?a.type==Blockly.INPUT_VALUE||a.type==Blockly.NEXT_STATEMENT&&a.getParentInput()?Blockly.ASTNode.createInputNode(a.getParentInput()):a.type==Blockly.NEXT_STATEMENT?new Blockly.ASTNode(Blockly.ASTNode.types.NEXT,a):a.type==Blockly.OUTPUT_VALUE?new Blockly.ASTNode(Blockly.ASTNode.types.OUTPUT,a):a.type==Blockly.PREVIOUS_STATEMENT?new Blockly.ASTNode(Blockly.ASTNode.types.PREVIOUS,a):null:null}; +Blockly.ASTNode.createInputNode=function(a){return a&&a.connection?new Blockly.ASTNode(Blockly.ASTNode.types.INPUT,a.connection):null};Blockly.ASTNode.createBlockNode=function(a){return a?new Blockly.ASTNode(Blockly.ASTNode.types.BLOCK,a):null};Blockly.ASTNode.createStackNode=function(a){return a?new Blockly.ASTNode(Blockly.ASTNode.types.STACK,a):null};Blockly.ASTNode.createWorkspaceNode=function(a,b){return b&&a?new Blockly.ASTNode(Blockly.ASTNode.types.WORKSPACE,a,{wsCoordinate:b}):null}; +Blockly.ASTNode.prototype.processParams_=function(a){a&&a.wsCoordinate&&(this.wsCoordinate_=a.wsCoordinate)};Blockly.ASTNode.prototype.getLocation=function(){return this.location_};Blockly.ASTNode.prototype.getType=function(){return this.type_};Blockly.ASTNode.prototype.getWsCoordinate=function(){return this.wsCoordinate_};Blockly.ASTNode.prototype.isConnection=function(){return this.isConnection_}; +Blockly.ASTNode.prototype.findNextForInput_=function(){var a=this.location_.getParentInput(),b=a.getSourceBlock();a=b.inputList.indexOf(a)+1;for(var c;c=b.inputList[a];a++){for(var d=c.fieldRow,e=0,f;f=d[e];e++)if(f.isClickable()||Blockly.ASTNode.NAVIGATE_ALL_FIELDS)return Blockly.ASTNode.createFieldNode(f);if(c.connection)return Blockly.ASTNode.createInputNode(c)}return null}; +Blockly.ASTNode.prototype.findNextForField_=function(){var a=this.location_,b=a.getParentInput(),c=a.getSourceBlock(),d=c.inputList.indexOf(b);for(a=b.fieldRow.indexOf(a)+1;b=c.inputList[d];d++){for(var e=b.fieldRow;ac)){var d=b.getSvgXY(a.getSvgRoot());a.outputConnection?(d.x+=(a.RTL?3:-3)*c,d.y+=13*c):a.previousConnection&&(d.x+=(a.RTL?-23:23)*c,d.y+=3*c);a=Blockly.utils.dom.createSvgElement("circle",{cx:d.x,cy:d.y,r:0,fill:"none",stroke:"#888","stroke-width":10},b.getParentSvg());Blockly.blockAnimations.connectionUiStep_(a,new Date,c)}}; +Blockly.blockAnimations.connectionUiStep_=function(a,b,c){var d=(new Date-b)/150;1a.workspace.scale)){var b=a.getHeightWidth().height;b=Math.atan(10/b)/Math.PI*180;a.RTL||(b*=-1);Blockly.blockAnimations.disconnectUiStep_(a.getSvgRoot(),b,new Date)}}; +Blockly.blockAnimations.disconnectUiStep_=function(a,b,c){var d=(new Date-c)/200;1b-Blockly.CURRENT_CONNECTION_PREFERENCE)}if(this.localConnection_||this.closestConnection_)console.error("Only one of localConnection_ and closestConnection_ was set."); +else return!0}else return!(!this.localConnection_||!this.closestConnection_);console.error("Returning true from shouldUpdatePreviews, but it's not clear why.");return!0};Blockly.InsertionMarkerManager.prototype.getCandidate_=function(a){for(var b=this.getStartRadius_(),c=null,d=null,e=0;ethis.remainingCapacityOfType(c))return!1;b+=a[c]}return b>this.remainingCapacity()?!1:!0};Blockly.Workspace.prototype.hasBlockLimits=function(){return Infinity!=this.options.maxBlocks||!!this.options.maxInstances}; +Blockly.Workspace.prototype.undo=function(a){var b=a?this.redoStack_:this.undoStack_,c=a?this.undoStack_:this.redoStack_,d=b.pop();if(d){for(var e=[d];b.length&&d.group&&d.group==b[b.length-1].group;)e.push(b.pop());for(b=0;d=e[b];b++)c.push(d);e=Blockly.Events.filter(e,a);Blockly.Events.recordUndo=!1;try{for(b=0;d=e[b];b++)d.run(a)}finally{Blockly.Events.recordUndo=!0}}};Blockly.Workspace.prototype.clearUndo=function(){this.undoStack_.length=0;this.redoStack_.length=0;Blockly.Events.clearPendingUndo()}; +Blockly.Workspace.prototype.addChangeListener=function(a){this.listeners_.push(a);return a};Blockly.Workspace.prototype.removeChangeListener=function(a){Blockly.utils.arrayRemove(this.listeners_,a)};Blockly.Workspace.prototype.fireChangeListener=function(a){if(a.recordUndo)for(this.undoStack_.push(a),this.redoStack_.length=0;this.undoStack_.length>this.MAX_UNDO&&0<=this.MAX_UNDO;)this.undoStack_.shift();for(var b=0,c;c=this.listeners_[b];b++)c(a)}; +Blockly.Workspace.prototype.getBlockById=function(a){return this.blockDB_[a]||null};Blockly.Workspace.prototype.setBlockById=function(a,b){this.blockDB_[a]=b};Blockly.Workspace.prototype.removeBlockById=function(a){delete this.blockDB_[a]};Blockly.Workspace.prototype.getCommentById=function(a){return this.commentDB_[a]||null};Blockly.Workspace.prototype.allInputsFilled=function(a){for(var b=this.getTopBlocks(!1),c=0,d;d=b[c];c++)if(!d.allInputsFilled(a))return!1;return!0}; +Blockly.Workspace.prototype.getPotentialVariableMap=function(){return this.potentialVariableMap_};Blockly.Workspace.prototype.createPotentialVariableMap=function(){this.potentialVariableMap_=new Blockly.VariableMap(this)};Blockly.Workspace.prototype.getVariableMap=function(){return this.variableMap_};Blockly.Workspace.prototype.setVariableMap=function(a){this.variableMap_=a};Blockly.Workspace.WorkspaceDB_=Object.create(null); +Blockly.Workspace.getById=function(a){return Blockly.Workspace.WorkspaceDB_[a]||null};Blockly.Workspace.getAll=function(){var a=[],b;for(b in Blockly.Workspace.WorkspaceDB_)a.push(Blockly.Workspace.WorkspaceDB_[b]);return a};Blockly.Bubble=function(a,b,c,d,e,f){this.workspace_=a;this.content_=b;this.shape_=c;this.onMouseDownResizeWrapper_=this.onMouseDownBubbleWrapper_=this.moveCallback_=this.resizeCallback_=null;this.disposed=!1;c=Blockly.Bubble.ARROW_ANGLE;this.workspace_.RTL&&(c=-c);this.arrow_radians_=Blockly.utils.math.toRadians(c);a.getBubbleCanvas().appendChild(this.createDom_(b,!(!e||!f)));this.setAnchorLocation(d);e&&f||(a=this.content_.getBBox(),e=a.width+2*Blockly.Bubble.BORDER_WIDTH,f=a.height+2*Blockly.Bubble.BORDER_WIDTH); +this.setBubbleSize(e,f);this.positionBubble_();this.renderArrow_();this.rendered_=!0};Blockly.Bubble.BORDER_WIDTH=6;Blockly.Bubble.ARROW_THICKNESS=5;Blockly.Bubble.ARROW_ANGLE=20;Blockly.Bubble.ARROW_BEND=4;Blockly.Bubble.ANCHOR_RADIUS=8;Blockly.Bubble.onMouseUpWrapper_=null;Blockly.Bubble.onMouseMoveWrapper_=null; +Blockly.Bubble.unbindDragEvents_=function(){Blockly.Bubble.onMouseUpWrapper_&&(Blockly.unbindEvent_(Blockly.Bubble.onMouseUpWrapper_),Blockly.Bubble.onMouseUpWrapper_=null);Blockly.Bubble.onMouseMoveWrapper_&&(Blockly.unbindEvent_(Blockly.Bubble.onMouseMoveWrapper_),Blockly.Bubble.onMouseMoveWrapper_=null)};Blockly.Bubble.bubbleMouseUp_=function(a){Blockly.Touch.clearTouchIdentifier();Blockly.Bubble.unbindDragEvents_()};Blockly.Bubble.prototype.rendered_=!1;Blockly.Bubble.prototype.anchorXY_=null; +Blockly.Bubble.prototype.relativeLeft_=0;Blockly.Bubble.prototype.relativeTop_=0;Blockly.Bubble.prototype.width_=0;Blockly.Bubble.prototype.height_=0;Blockly.Bubble.prototype.autoLayout_=!0; +Blockly.Bubble.prototype.createDom_=function(a,b){this.bubbleGroup_=Blockly.utils.dom.createSvgElement("g",{},null);var c={filter:"url(#"+this.workspace_.getRenderer().getConstants().embossFilterId+")"};Blockly.utils.userAgent.JAVA_FX&&(c={});c=Blockly.utils.dom.createSvgElement("g",c,this.bubbleGroup_);this.bubbleArrow_=Blockly.utils.dom.createSvgElement("path",{},c);this.bubbleBack_=Blockly.utils.dom.createSvgElement("rect",{"class":"blocklyDraggable",x:0,y:0,rx:Blockly.Bubble.BORDER_WIDTH,ry:Blockly.Bubble.BORDER_WIDTH}, +c);b?(this.resizeGroup_=Blockly.utils.dom.createSvgElement("g",{"class":this.workspace_.RTL?"blocklyResizeSW":"blocklyResizeSE"},this.bubbleGroup_),b=2*Blockly.Bubble.BORDER_WIDTH,Blockly.utils.dom.createSvgElement("polygon",{points:"0,x x,x x,0".replace(/x/g,b.toString())},this.resizeGroup_),Blockly.utils.dom.createSvgElement("line",{"class":"blocklyResizeLine",x1:b/3,y1:b-1,x2:b-1,y2:b/3},this.resizeGroup_),Blockly.utils.dom.createSvgElement("line",{"class":"blocklyResizeLine",x1:2*b/3,y1:b-1,x2:b- +1,y2:2*b/3},this.resizeGroup_)):this.resizeGroup_=null;this.workspace_.options.readOnly||(this.onMouseDownBubbleWrapper_=Blockly.bindEventWithChecks_(this.bubbleBack_,"mousedown",this,this.bubbleMouseDown_),this.resizeGroup_&&(this.onMouseDownResizeWrapper_=Blockly.bindEventWithChecks_(this.resizeGroup_,"mousedown",this,this.resizeMouseDown_)));this.bubbleGroup_.appendChild(a);return this.bubbleGroup_};Blockly.Bubble.prototype.getSvgRoot=function(){return this.bubbleGroup_}; +Blockly.Bubble.prototype.setSvgId=function(a){this.bubbleGroup_.dataset&&(this.bubbleGroup_.dataset.blockId=a)};Blockly.Bubble.prototype.bubbleMouseDown_=function(a){var b=this.workspace_.getGesture(a);b&&b.handleBubbleStart(a,this)};Blockly.Bubble.prototype.showContextMenu=function(a){};Blockly.Bubble.prototype.isDeletable=function(){return!1}; +Blockly.Bubble.prototype.resizeMouseDown_=function(a){this.promote();Blockly.Bubble.unbindDragEvents_();Blockly.utils.isRightButton(a)||(this.workspace_.startDrag(a,new Blockly.utils.Coordinate(this.workspace_.RTL?-this.width_:this.width_,this.height_)),Blockly.Bubble.onMouseUpWrapper_=Blockly.bindEventWithChecks_(document,"mouseup",this,Blockly.Bubble.bubbleMouseUp_),Blockly.Bubble.onMouseMoveWrapper_=Blockly.bindEventWithChecks_(document,"mousemove",this,this.resizeMouseMove_),Blockly.hideChaff()); +a.stopPropagation()};Blockly.Bubble.prototype.resizeMouseMove_=function(a){this.autoLayout_=!1;a=this.workspace_.moveDrag(a);this.setBubbleSize(this.workspace_.RTL?-a.x:a.x,a.y);this.workspace_.RTL&&this.positionBubble_()};Blockly.Bubble.prototype.registerResizeEvent=function(a){this.resizeCallback_=a};Blockly.Bubble.prototype.registerMoveEvent=function(a){this.moveCallback_=a}; +Blockly.Bubble.prototype.promote=function(){var a=this.bubbleGroup_.parentNode;return a.lastChild!==this.bubbleGroup_?(a.appendChild(this.bubbleGroup_),!0):!1};Blockly.Bubble.prototype.setAnchorLocation=function(a){this.anchorXY_=a;this.rendered_&&this.positionBubble_()}; +Blockly.Bubble.prototype.layoutBubble_=function(){var a=this.workspace_.getMetrics();a.viewLeft/=this.workspace_.scale;a.viewWidth/=this.workspace_.scale;a.viewTop/=this.workspace_.scale;a.viewHeight/=this.workspace_.scale;var b=this.getOptimalRelativeLeft_(a),c=this.getOptimalRelativeTop_(a),d=this.shape_.getBBox(),e={x:b,y:-this.height_-this.workspace_.getRenderer().getConstants().MIN_BLOCK_HEIGHT},f={x:-this.width_-30,y:c};c={x:d.width,y:c};var g={x:b,y:d.height};b=d.widtha.viewWidth)return b;if(this.workspace_.RTL)var c=this.anchorXY_.x-b,d=c-this.width_,e=a.viewLeft+a.viewWidth,f=a.viewLeft+Blockly.Scrollbar.scrollbarThickness/this.workspace_.scale;else d=b+this.anchorXY_.x,c=d+this.width_,f=a.viewLeft,e=a.viewLeft+a.viewWidth-Blockly.Scrollbar.scrollbarThickness/this.workspace_.scale;this.workspace_.RTL?de&&(b=-(e-this.anchorXY_.x)): +de&&(b=e-this.anchorXY_.x-this.width_);return b};Blockly.Bubble.prototype.getOptimalRelativeTop_=function(a){var b=-this.height_/4;if(this.height_>a.viewHeight)return b;var c=this.anchorXY_.y+b,d=c+this.height_,e=a.viewTop;a=a.viewTop+a.viewHeight-Blockly.Scrollbar.scrollbarThickness/this.workspace_.scale;var f=this.anchorXY_.y;ca&&(b=a-f-this.height_);return b}; +Blockly.Bubble.prototype.positionBubble_=function(){var a=this.anchorXY_.x;a=this.workspace_.RTL?a-(this.relativeLeft_+this.width_):a+this.relativeLeft_;this.moveTo(a,this.relativeTop_+this.anchorXY_.y)};Blockly.Bubble.prototype.moveTo=function(a,b){this.bubbleGroup_.setAttribute("transform","translate("+a+","+b+")")};Blockly.Bubble.prototype.setDragging=function(a){!a&&this.moveCallback_&&this.moveCallback_()}; +Blockly.Bubble.prototype.getBubbleSize=function(){return new Blockly.utils.Size(this.width_,this.height_)}; +Blockly.Bubble.prototype.setBubbleSize=function(a,b){var c=2*Blockly.Bubble.BORDER_WIDTH;a=Math.max(a,c+45);b=Math.max(b,c+20);this.width_=a;this.height_=b;this.bubbleBack_.setAttribute("width",a);this.bubbleBack_.setAttribute("height",b);this.resizeGroup_&&(this.workspace_.RTL?this.resizeGroup_.setAttribute("transform","translate("+2*Blockly.Bubble.BORDER_WIDTH+","+(b-c)+") scale(-1 1)"):this.resizeGroup_.setAttribute("transform","translate("+(a-c)+","+(b-c)+")"));this.autoLayout_&&this.layoutBubble_(); +this.positionBubble_();this.renderArrow_();this.resizeCallback_&&this.resizeCallback_()}; +Blockly.Bubble.prototype.renderArrow_=function(){var a=[],b=this.width_/2,c=this.height_/2,d=-this.relativeLeft_,e=-this.relativeTop_;if(b==d&&c==e)a.push("M "+b+","+c);else{e-=c;d-=b;this.workspace_.RTL&&(d*=-1);var f=Math.sqrt(e*e+d*d),g=Math.acos(d/f);0>e&&(g=2*Math.PI-g);var h=g+Math.PI/2;h>2*Math.PI&&(h-=2*Math.PI);var k=Math.sin(h),l=Math.cos(h),m=this.getBubbleSize();h=(m.width+m.height)/Blockly.Bubble.ARROW_THICKNESS;h=Math.min(h,m.width,m.height)/4;m=1-Blockly.Bubble.ANCHOR_RADIUS/f;d=b+ +m*d;e=c+m*e;m=b+h*l;var n=c+h*k;b-=h*l;c-=h*k;k=g+this.arrow_radians_;k>2*Math.PI&&(k-=2*Math.PI);g=Math.sin(k)*f/Blockly.Bubble.ARROW_BEND;f=Math.cos(k)*f/Blockly.Bubble.ARROW_BEND;a.push("M"+m+","+n);a.push("C"+(m+f)+","+(n+g)+" "+d+","+e+" "+d+","+e);a.push("C"+d+","+e+" "+(b+f)+","+(c+g)+" "+b+","+c)}a.push("z");this.bubbleArrow_.setAttribute("d",a.join(" "))};Blockly.Bubble.prototype.setColour=function(a){this.bubbleBack_.setAttribute("fill",a);this.bubbleArrow_.setAttribute("fill",a)}; +Blockly.Bubble.prototype.dispose=function(){this.onMouseDownBubbleWrapper_&&Blockly.unbindEvent_(this.onMouseDownBubbleWrapper_);this.onMouseDownResizeWrapper_&&Blockly.unbindEvent_(this.onMouseDownResizeWrapper_);Blockly.Bubble.unbindDragEvents_();Blockly.utils.dom.removeNode(this.bubbleGroup_);this.disposed=!0}; +Blockly.Bubble.prototype.moveDuringDrag=function(a,b){a?a.translateSurface(b.x,b.y):this.moveTo(b.x,b.y);this.relativeLeft_=this.workspace_.RTL?this.anchorXY_.x-b.x-this.width_:b.x-this.anchorXY_.x;this.relativeTop_=b.y-this.anchorXY_.y;this.renderArrow_()};Blockly.Bubble.prototype.getRelativeToSurfaceXY=function(){return new Blockly.utils.Coordinate(this.workspace_.RTL?-this.relativeLeft_+this.anchorXY_.x-this.width_:this.anchorXY_.x+this.relativeLeft_,this.anchorXY_.y+this.relativeTop_)}; +Blockly.Bubble.prototype.setAutoLayout=function(a){this.autoLayout_=a};Blockly.Events.CommentBase=function(a){this.commentId=a.id;this.workspaceId=a.workspace.id;this.group=Blockly.Events.getGroup();this.recordUndo=Blockly.Events.recordUndo};Blockly.utils.object.inherits(Blockly.Events.CommentBase,Blockly.Events.Abstract);Blockly.Events.CommentBase.prototype.toJson=function(){var a=Blockly.Events.CommentBase.superClass_.toJson.call(this);this.commentId&&(a.commentId=this.commentId);return a}; +Blockly.Events.CommentBase.prototype.fromJson=function(a){Blockly.Events.CommentBase.superClass_.fromJson.call(this,a);this.commentId=a.commentId};Blockly.Events.CommentChange=function(a,b,c){a&&(Blockly.Events.CommentChange.superClass_.constructor.call(this,a),this.oldContents_=b,this.newContents_=c)};Blockly.utils.object.inherits(Blockly.Events.CommentChange,Blockly.Events.CommentBase);Blockly.Events.CommentChange.prototype.type=Blockly.Events.COMMENT_CHANGE; +Blockly.Events.CommentChange.prototype.toJson=function(){var a=Blockly.Events.CommentChange.superClass_.toJson.call(this);a.newContents=this.newContents_;return a};Blockly.Events.CommentChange.prototype.fromJson=function(a){Blockly.Events.CommentChange.superClass_.fromJson.call(this,a);this.newContents_=a.newValue};Blockly.Events.CommentChange.prototype.isNull=function(){return this.oldContents_==this.newContents_}; +Blockly.Events.CommentChange.prototype.run=function(a){var b=this.getEventWorkspace_().getCommentById(this.commentId);b?b.setContent(a?this.newContents_:this.oldContents_):console.warn("Can't change non-existent comment: "+this.commentId)};Blockly.Events.CommentCreate=function(a){a&&(Blockly.Events.CommentCreate.superClass_.constructor.call(this,a),this.xml=a.toXmlWithXY())};Blockly.utils.object.inherits(Blockly.Events.CommentCreate,Blockly.Events.CommentBase); +Blockly.Events.CommentCreate.prototype.type=Blockly.Events.COMMENT_CREATE;Blockly.Events.CommentCreate.prototype.toJson=function(){var a=Blockly.Events.CommentCreate.superClass_.toJson.call(this);a.xml=Blockly.Xml.domToText(this.xml);return a};Blockly.Events.CommentCreate.prototype.fromJson=function(a){Blockly.Events.CommentCreate.superClass_.fromJson.call(this,a);this.xml=Blockly.Xml.textToDom(a.xml)}; +Blockly.Events.CommentCreate.prototype.run=function(a){Blockly.Events.CommentCreateDeleteHelper(this,a)};Blockly.Events.CommentCreateDeleteHelper=function(a,b){var c=a.getEventWorkspace_();b?(b=Blockly.utils.xml.createElement("xml"),b.appendChild(a.xml),Blockly.Xml.domToWorkspace(b,c)):(c=c.getCommentById(a.commentId))?c.dispose(!1,!1):console.warn("Can't uncreate non-existent comment: "+a.commentId)}; +Blockly.Events.CommentDelete=function(a){a&&(Blockly.Events.CommentDelete.superClass_.constructor.call(this,a),this.xml=a.toXmlWithXY())};Blockly.utils.object.inherits(Blockly.Events.CommentDelete,Blockly.Events.CommentBase);Blockly.Events.CommentDelete.prototype.type=Blockly.Events.COMMENT_DELETE;Blockly.Events.CommentDelete.prototype.toJson=function(){return Blockly.Events.CommentDelete.superClass_.toJson.call(this)}; +Blockly.Events.CommentDelete.prototype.fromJson=function(a){Blockly.Events.CommentDelete.superClass_.fromJson.call(this,a)};Blockly.Events.CommentDelete.prototype.run=function(a){Blockly.Events.CommentCreateDeleteHelper(this,!a)};Blockly.Events.CommentMove=function(a){a&&(Blockly.Events.CommentMove.superClass_.constructor.call(this,a),this.comment_=a,this.oldCoordinate_=a.getXY(),this.newCoordinate_=null)};Blockly.utils.object.inherits(Blockly.Events.CommentMove,Blockly.Events.CommentBase); +Blockly.Events.CommentMove.prototype.recordNew=function(){if(!this.comment_)throw Error("Tried to record the new position of a comment on the same event twice.");this.newCoordinate_=this.comment_.getXY();this.comment_=null};Blockly.Events.CommentMove.prototype.type=Blockly.Events.COMMENT_MOVE;Blockly.Events.CommentMove.prototype.setOldCoordinate=function(a){this.oldCoordinate_=a}; +Blockly.Events.CommentMove.prototype.toJson=function(){var a=Blockly.Events.CommentMove.superClass_.toJson.call(this);this.newCoordinate_&&(a.newCoordinate=Math.round(this.newCoordinate_.x)+","+Math.round(this.newCoordinate_.y));return a};Blockly.Events.CommentMove.prototype.fromJson=function(a){Blockly.Events.CommentMove.superClass_.fromJson.call(this,a);a.newCoordinate&&(a=a.newCoordinate.split(","),this.newCoordinate_=new Blockly.utils.Coordinate(Number(a[0]),Number(a[1])))}; +Blockly.Events.CommentMove.prototype.isNull=function(){return Blockly.utils.Coordinate.equals(this.oldCoordinate_,this.newCoordinate_)};Blockly.Events.CommentMove.prototype.run=function(a){var b=this.getEventWorkspace_().getCommentById(this.commentId);if(b){a=a?this.newCoordinate_:this.oldCoordinate_;var c=b.getXY();b.moveBy(a.x-c.x,a.y-c.y)}else console.warn("Can't move non-existent comment: "+this.commentId)};Blockly.BubbleDragger=function(a,b){this.draggingBubble_=a;this.workspace_=b;this.deleteArea_=null;this.wouldDeleteBubble_=!1;this.startXY_=this.draggingBubble_.getRelativeToSurfaceXY();this.dragSurface_=Blockly.utils.is3dSupported()&&b.getBlockDragSurface()?b.getBlockDragSurface():null};Blockly.BubbleDragger.prototype.dispose=function(){this.dragSurface_=this.workspace_=this.draggingBubble_=null}; +Blockly.BubbleDragger.prototype.startBubbleDrag=function(){Blockly.Events.getGroup()||Blockly.Events.setGroup(!0);this.workspace_.setResizesEnabled(!1);this.draggingBubble_.setAutoLayout(!1);this.dragSurface_&&this.moveToDragSurface_();this.draggingBubble_.setDragging&&this.draggingBubble_.setDragging(!0);var a=this.workspace_.getToolbox();if(a){var b=this.draggingBubble_.isDeletable()?"blocklyToolboxDelete":"blocklyToolboxGrab";a.addStyle(b)}}; +Blockly.BubbleDragger.prototype.dragBubble=function(a,b){b=this.pixelsToWorkspaceUnits_(b);b=Blockly.utils.Coordinate.sum(this.startXY_,b);this.draggingBubble_.moveDuringDrag(this.dragSurface_,b);this.draggingBubble_.isDeletable()&&(this.deleteArea_=this.workspace_.isDeleteArea(a),this.updateCursorDuringBubbleDrag_())}; +Blockly.BubbleDragger.prototype.maybeDeleteBubble_=function(){var a=this.workspace_.trashcan;this.wouldDeleteBubble_?(a&&setTimeout(a.close.bind(a),100),this.fireMoveEvent_(),this.draggingBubble_.dispose(!1,!0)):a&&a.close();return this.wouldDeleteBubble_}; +Blockly.BubbleDragger.prototype.updateCursorDuringBubbleDrag_=function(){this.wouldDeleteBubble_=this.deleteArea_!=Blockly.DELETE_AREA_NONE;var a=this.workspace_.trashcan;this.wouldDeleteBubble_?(this.draggingBubble_.setDeleteStyle(!0),this.deleteArea_==Blockly.DELETE_AREA_TRASH&&a&&a.setOpen(!0)):(this.draggingBubble_.setDeleteStyle(!1),a&&a.setOpen(!1))}; +Blockly.BubbleDragger.prototype.endBubbleDrag=function(a,b){this.dragBubble(a,b);a=this.pixelsToWorkspaceUnits_(b);a=Blockly.utils.Coordinate.sum(this.startXY_,a);this.draggingBubble_.moveTo(a.x,a.y);this.maybeDeleteBubble_()||(this.dragSurface_&&this.dragSurface_.clearAndHide(this.workspace_.getBubbleCanvas()),this.draggingBubble_.setDragging&&this.draggingBubble_.setDragging(!1),this.fireMoveEvent_());this.workspace_.setResizesEnabled(!0);this.workspace_.getToolbox()&&(a=this.draggingBubble_.isDeletable()? +"blocklyToolboxDelete":"blocklyToolboxGrab",this.workspace_.getToolbox().removeStyle(a));Blockly.Events.setGroup(!1)};Blockly.BubbleDragger.prototype.fireMoveEvent_=function(){if(this.draggingBubble_.isComment){var a=new Blockly.Events.CommentMove(this.draggingBubble_);a.setOldCoordinate(this.startXY_);a.recordNew();Blockly.Events.fire(a)}}; +Blockly.BubbleDragger.prototype.pixelsToWorkspaceUnits_=function(a){a=new Blockly.utils.Coordinate(a.x/this.workspace_.scale,a.y/this.workspace_.scale);this.workspace_.isMutator&&a.scale(1/this.workspace_.options.parentWorkspace.scale);return a};Blockly.BubbleDragger.prototype.moveToDragSurface_=function(){this.draggingBubble_.moveTo(0,0);this.dragSurface_.translateSurface(this.startXY_.x,this.startXY_.y);this.dragSurface_.setBlocksAndShow(this.draggingBubble_.getSvgRoot())};Blockly.WorkspaceDragger=function(a){this.workspace_=a;this.startScrollXY_=new Blockly.utils.Coordinate(a.scrollX,a.scrollY)};Blockly.WorkspaceDragger.prototype.dispose=function(){this.workspace_=null};Blockly.WorkspaceDragger.prototype.startDrag=function(){Blockly.selected&&Blockly.selected.unselect();this.workspace_.setupDragSurface()};Blockly.WorkspaceDragger.prototype.endDrag=function(a){this.drag(a);this.workspace_.resetDragSurface()}; +Blockly.WorkspaceDragger.prototype.drag=function(a){a=Blockly.utils.Coordinate.sum(this.startScrollXY_,a);this.workspace_.scroll(a.x,a.y)};Blockly.FlyoutDragger=function(a){Blockly.FlyoutDragger.superClass_.constructor.call(this,a.getWorkspace());this.scrollbar_=a.scrollbar_;this.horizontalLayout_=a.horizontalLayout_};Blockly.utils.object.inherits(Blockly.FlyoutDragger,Blockly.WorkspaceDragger);Blockly.FlyoutDragger.prototype.drag=function(a){a=Blockly.utils.Coordinate.sum(this.startScrollXY_,a);this.horizontalLayout_?this.scrollbar_.set(-a.x):this.scrollbar_.set(-a.y)};Blockly.Action=function(a,b){this.name=a;this.desc=b};Blockly.navigation={};Blockly.navigation.loggingCallback=null;Blockly.navigation.STATE_FLYOUT=1;Blockly.navigation.STATE_WS=2;Blockly.navigation.STATE_TOOLBOX=3;Blockly.navigation.WS_MOVE_DISTANCE=40;Blockly.navigation.currentState_=Blockly.navigation.STATE_WS; +Blockly.navigation.actionNames={PREVIOUS:"previous",NEXT:"next",IN:"in",OUT:"out",INSERT:"insert",MARK:"mark",DISCONNECT:"disconnect",TOOLBOX:"toolbox",EXIT:"exit",TOGGLE_KEYBOARD_NAV:"toggle_keyboard_nav",MOVE_WS_CURSOR_UP:"move workspace cursor up",MOVE_WS_CURSOR_DOWN:"move workspace cursor down",MOVE_WS_CURSOR_LEFT:"move workspace cursor left",MOVE_WS_CURSOR_RIGHT:"move workspace cursor right"};Blockly.navigation.MARKER_NAME="local_marker_1";Blockly.navigation.getMarker=function(){return Blockly.getMainWorkspace().getMarker(Blockly.navigation.MARKER_NAME)}; +Blockly.navigation.focusToolbox_=function(){var a=Blockly.getMainWorkspace().getToolbox();a&&(Blockly.navigation.currentState_=Blockly.navigation.STATE_TOOLBOX,Blockly.navigation.resetFlyout_(!1),Blockly.navigation.getMarker().getCurNode()||Blockly.navigation.markAtCursor_(),a.selectFirstCategory())}; +Blockly.navigation.focusFlyout_=function(){Blockly.navigation.currentState_=Blockly.navigation.STATE_FLYOUT;var a=Blockly.getMainWorkspace();var b=a.getToolbox();a=b?b.flyout_:a.getFlyout();Blockly.navigation.getMarker().getCurNode()||Blockly.navigation.markAtCursor_();a&&a.getWorkspace()&&(a=a.getWorkspace().getTopBlocks(!0),0(this.flyout_?Blockly.FLYOUT_DRAG_RADIUS:Blockly.DRAG_RADIUS)}; +Blockly.Gesture.prototype.updateIsDraggingFromFlyout_=function(){return this.targetBlock_&&this.flyout_.isBlockCreatable_(this.targetBlock_)?!this.flyout_.isScrollable()||this.flyout_.isDragTowardWorkspace(this.currentDragDeltaXY_)?(this.startWorkspace_=this.flyout_.targetWorkspace_,this.startWorkspace_.updateScreenCalculationsIfScrolled(),Blockly.Events.getGroup()||Blockly.Events.setGroup(!0),this.startBlock_=null,this.targetBlock_=this.flyout_.createBlock(this.targetBlock_),this.targetBlock_.select(), +!0):!1:!1};Blockly.Gesture.prototype.updateIsDraggingBubble_=function(){if(!this.startBubble_)return!1;this.isDraggingBubble_=!0;this.startDraggingBubble_();return!0};Blockly.Gesture.prototype.updateIsDraggingBlock_=function(){if(!this.targetBlock_)return!1;this.flyout_?this.isDraggingBlock_=this.updateIsDraggingFromFlyout_():this.targetBlock_.isMovable()&&(this.isDraggingBlock_=!0);return this.isDraggingBlock_?(this.startDraggingBlock_(),!0):!1}; +Blockly.Gesture.prototype.updateIsDraggingWorkspace_=function(){if(this.flyout_?this.flyout_.isScrollable():this.startWorkspace_&&this.startWorkspace_.isDraggable())this.workspaceDragger_=this.flyout_?new Blockly.FlyoutDragger(this.flyout_):new Blockly.WorkspaceDragger(this.startWorkspace_),this.isDraggingWorkspace_=!0,this.workspaceDragger_.startDrag()}; +Blockly.Gesture.prototype.updateIsDragging_=function(){if(this.calledUpdateIsDragging_)throw Error("updateIsDragging_ should only be called once per gesture.");this.calledUpdateIsDragging_=!0;this.updateIsDraggingBubble_()||this.updateIsDraggingBlock_()||this.updateIsDraggingWorkspace_()}; +Blockly.Gesture.prototype.startDraggingBlock_=function(){this.blockDragger_=new Blockly.BlockDragger(this.targetBlock_,this.startWorkspace_);this.blockDragger_.startBlockDrag(this.currentDragDeltaXY_,this.healStack_);this.blockDragger_.dragBlock(this.mostRecentEvent_,this.currentDragDeltaXY_)}; +Blockly.Gesture.prototype.startDraggingBubble_=function(){this.bubbleDragger_=new Blockly.BubbleDragger(this.startBubble_,this.startWorkspace_);this.bubbleDragger_.startBubbleDrag();this.bubbleDragger_.dragBubble(this.mostRecentEvent_,this.currentDragDeltaXY_)}; +Blockly.Gesture.prototype.doStart=function(a){Blockly.utils.isTargetInput(a)?this.cancel():(this.hasStarted_=!0,Blockly.blockAnimations.disconnectUiStop(),this.startWorkspace_.updateScreenCalculationsIfScrolled(),this.startWorkspace_.isMutator&&this.startWorkspace_.resize(),Blockly.hideChaff(!!this.flyout_),this.startWorkspace_.markFocused(),this.mostRecentEvent_=a,Blockly.Tooltip.block(),this.targetBlock_&&(!this.targetBlock_.isInFlyout&&a.shiftKey&&this.targetBlock_.workspace.keyboardAccessibilityMode? +this.creatorWorkspace_.getCursor().setCurNode(Blockly.navigation.getTopNode(this.targetBlock_)):this.targetBlock_.select()),Blockly.utils.isRightButton(a)?this.handleRightClick(a):("touchstart"!=a.type.toLowerCase()&&"pointerdown"!=a.type.toLowerCase()||"mouse"==a.pointerType||Blockly.longStart(a,this),this.mouseDownXY_=new Blockly.utils.Coordinate(a.clientX,a.clientY),this.healStack_=a.altKey||a.ctrlKey||a.metaKey,this.bindMouseEvents(a)))}; +Blockly.Gesture.prototype.bindMouseEvents=function(a){this.onMoveWrapper_=Blockly.bindEventWithChecks_(document,"mousemove",null,this.handleMove.bind(this));this.onUpWrapper_=Blockly.bindEventWithChecks_(document,"mouseup",null,this.handleUp.bind(this));a.preventDefault();a.stopPropagation()}; +Blockly.Gesture.prototype.handleMove=function(a){this.updateFromEvent_(a);this.isDraggingWorkspace_?this.workspaceDragger_.drag(this.currentDragDeltaXY_):this.isDraggingBlock_?this.blockDragger_.dragBlock(this.mostRecentEvent_,this.currentDragDeltaXY_):this.isDraggingBubble_&&this.bubbleDragger_.dragBubble(this.mostRecentEvent_,this.currentDragDeltaXY_);a.preventDefault();a.stopPropagation()}; +Blockly.Gesture.prototype.handleUp=function(a){this.updateFromEvent_(a);Blockly.longStop_();this.isEnding_?console.log("Trying to end a gesture recursively."):(this.isEnding_=!0,this.isDraggingBubble_?this.bubbleDragger_.endBubbleDrag(a,this.currentDragDeltaXY_):this.isDraggingBlock_?this.blockDragger_.endBlockDrag(a,this.currentDragDeltaXY_):this.isDraggingWorkspace_?this.workspaceDragger_.endDrag(this.currentDragDeltaXY_):this.isBubbleClick_()?this.doBubbleClick_():this.isFieldClick_()?this.doFieldClick_(): +this.isBlockClick_()?this.doBlockClick_():this.isWorkspaceClick_()&&this.doWorkspaceClick_(a),a.preventDefault(),a.stopPropagation(),this.dispose())}; +Blockly.Gesture.prototype.cancel=function(){this.isEnding_||(Blockly.longStop_(),this.isDraggingBubble_?this.bubbleDragger_.endBubbleDrag(this.mostRecentEvent_,this.currentDragDeltaXY_):this.isDraggingBlock_?this.blockDragger_.endBlockDrag(this.mostRecentEvent_,this.currentDragDeltaXY_):this.isDraggingWorkspace_&&this.workspaceDragger_.endDrag(this.currentDragDeltaXY_),this.dispose())}; +Blockly.Gesture.prototype.handleRightClick=function(a){this.targetBlock_?(this.bringBlockToFront_(),Blockly.hideChaff(!!this.flyout_),this.targetBlock_.showContextMenu(a)):this.startBubble_?this.startBubble_.showContextMenu(a):this.startWorkspace_&&!this.flyout_&&(Blockly.hideChaff(),this.startWorkspace_.showContextMenu(a));a.preventDefault();a.stopPropagation();this.dispose()}; +Blockly.Gesture.prototype.handleWsStart=function(a,b){if(this.hasStarted_)throw Error("Tried to call gesture.handleWsStart, but the gesture had already been started.");this.setStartWorkspace_(b);this.mostRecentEvent_=a;this.doStart(a);this.startWorkspace_.keyboardAccessibilityMode&&Blockly.navigation.setState(Blockly.navigation.STATE_WS)}; +Blockly.Gesture.prototype.handleFlyoutStart=function(a,b){if(this.hasStarted_)throw Error("Tried to call gesture.handleFlyoutStart, but the gesture had already been started.");this.setStartFlyout_(b);this.handleWsStart(a,b.getWorkspace())};Blockly.Gesture.prototype.handleBlockStart=function(a,b){if(this.hasStarted_)throw Error("Tried to call gesture.handleBlockStart, but the gesture had already been started.");this.setStartBlock(b);this.mostRecentEvent_=a}; +Blockly.Gesture.prototype.handleBubbleStart=function(a,b){if(this.hasStarted_)throw Error("Tried to call gesture.handleBubbleStart, but the gesture had already been started.");this.setStartBubble(b);this.mostRecentEvent_=a};Blockly.Gesture.prototype.doBubbleClick_=function(){this.startBubble_.setFocus&&this.startBubble_.setFocus();this.startBubble_.select&&this.startBubble_.select()};Blockly.Gesture.prototype.doFieldClick_=function(){this.startField_.showEditor(this.mostRecentEvent_);this.bringBlockToFront_()}; +Blockly.Gesture.prototype.doBlockClick_=function(){this.flyout_&&this.flyout_.autoClose?this.targetBlock_.isEnabled()&&(Blockly.Events.getGroup()||Blockly.Events.setGroup(!0),this.flyout_.createBlock(this.targetBlock_).scheduleSnapAndBump()):Blockly.Events.fire(new Blockly.Events.Ui(this.startBlock_,"click",void 0,void 0));this.bringBlockToFront_();Blockly.Events.setGroup(!1)}; +Blockly.Gesture.prototype.doWorkspaceClick_=function(a){var b=this.creatorWorkspace_;a.shiftKey&&b.keyboardAccessibilityMode?(a=new Blockly.utils.Coordinate(a.clientX,a.clientY),a=Blockly.utils.screenToWsCoordinates(b,a),a=Blockly.ASTNode.createWorkspaceNode(b,a),b.getCursor().setCurNode(a)):Blockly.selected&&Blockly.selected.unselect()};Blockly.Gesture.prototype.bringBlockToFront_=function(){this.targetBlock_&&!this.flyout_&&this.targetBlock_.bringToFront()}; +Blockly.Gesture.prototype.setStartField=function(a){if(this.hasStarted_)throw Error("Tried to call gesture.setStartField, but the gesture had already been started.");this.startField_||(this.startField_=a)};Blockly.Gesture.prototype.setStartBubble=function(a){this.startBubble_||(this.startBubble_=a)};Blockly.Gesture.prototype.setStartBlock=function(a){this.startBlock_||this.startBubble_||(this.startBlock_=a,a.isInFlyout&&a!=a.getRootBlock()?this.setTargetBlock_(a.getRootBlock()):this.setTargetBlock_(a))}; +Blockly.Gesture.prototype.setTargetBlock_=function(a){a.isShadow()?this.setTargetBlock_(a.getParent()):this.targetBlock_=a};Blockly.Gesture.prototype.setStartWorkspace_=function(a){this.startWorkspace_||(this.startWorkspace_=a)};Blockly.Gesture.prototype.setStartFlyout_=function(a){this.flyout_||(this.flyout_=a)};Blockly.Gesture.prototype.isBubbleClick_=function(){return!!this.startBubble_&&!this.hasExceededDragRadius_}; +Blockly.Gesture.prototype.isBlockClick_=function(){return!!this.startBlock_&&!this.hasExceededDragRadius_&&!this.isFieldClick_()};Blockly.Gesture.prototype.isFieldClick_=function(){return(this.startField_?this.startField_.isClickable():!1)&&!this.hasExceededDragRadius_&&(!this.flyout_||!this.flyout_.autoClose)};Blockly.Gesture.prototype.isWorkspaceClick_=function(){return!this.startBlock_&&!this.startBubble_&&!this.startField_&&!this.hasExceededDragRadius_}; +Blockly.Gesture.prototype.isDragging=function(){return this.isDraggingWorkspace_||this.isDraggingBlock_||this.isDraggingBubble_};Blockly.Gesture.prototype.hasStarted=function(){return this.hasStarted_};Blockly.Gesture.prototype.getInsertionMarkers=function(){return this.blockDragger_?this.blockDragger_.getInsertionMarkers():[]};Blockly.Gesture.inProgress=function(){for(var a=Blockly.Workspace.getAll(),b=0,c;c=a[b];b++)if(c.currentGesture_)return!0;return!1};Blockly.Field=function(a,b,c){this.tooltip_=this.validator_=this.value_=null;this.size_=new Blockly.utils.Size(0,0);this.constants_=this.mouseDownWrapper_=this.textContent_=this.textElement_=this.borderRect_=this.fieldGroup_=this.markerSvg_=this.cursorSvg_=null;c&&this.configure_(c);this.setValue(a);b&&this.setValidator(b)};Blockly.Field.prototype.name=void 0;Blockly.Field.prototype.disposed=!1;Blockly.Field.prototype.maxDisplayLength=50;Blockly.Field.prototype.sourceBlock_=null; +Blockly.Field.prototype.isDirty_=!0;Blockly.Field.prototype.visible_=!0;Blockly.Field.prototype.clickTarget_=null;Blockly.Field.NBSP="\u00a0";Blockly.Field.prototype.EDITABLE=!0;Blockly.Field.prototype.SERIALIZABLE=!1;Blockly.Field.prototype.configure_=function(a){var b=a.tooltip;"string"==typeof b&&(b=Blockly.utils.replaceMessageReferences(a.tooltip));b&&this.setTooltip(b)}; +Blockly.Field.prototype.setSourceBlock=function(a){if(this.sourceBlock_)throw Error("Field already bound to a block.");this.sourceBlock_=a;a.workspace.rendered&&(this.constants_=a.workspace.getRenderer().getConstants())};Blockly.Field.prototype.getSourceBlock=function(){return this.sourceBlock_}; +Blockly.Field.prototype.init=function(){this.fieldGroup_||(this.fieldGroup_=Blockly.utils.dom.createSvgElement("g",{},null),this.isVisible()||(this.fieldGroup_.style.display="none"),this.sourceBlock_.getSvgRoot().appendChild(this.fieldGroup_),this.initView(),this.updateEditable(),this.setTooltip(this.tooltip_),this.bindEvents_(),this.initModel())};Blockly.Field.prototype.initView=function(){this.createBorderRect_();this.createTextElement_()};Blockly.Field.prototype.initModel=function(){}; +Blockly.Field.prototype.createBorderRect_=function(){this.size_.height=Math.max(this.size_.height,this.constants_.FIELD_BORDER_RECT_HEIGHT);this.size_.width=Math.max(this.size_.width,2*this.constants_.FIELD_BORDER_RECT_X_PADDING);this.borderRect_=Blockly.utils.dom.createSvgElement("rect",{rx:this.constants_.FIELD_BORDER_RECT_RADIUS,ry:this.constants_.FIELD_BORDER_RECT_RADIUS,x:0,y:0,height:this.size_.height,width:this.size_.width,"class":"blocklyFieldRect"},this.fieldGroup_)}; +Blockly.Field.prototype.createTextElement_=function(){var a=this.borderRect_?this.constants_.FIELD_BORDER_RECT_X_PADDING:0,b=this.constants_.FIELD_TEXT_BASELINE_CENTER,c=this.constants_.FIELD_TEXT_BASELINE_Y;this.size_.height=Math.max(this.size_.height,b?this.constants_.FIELD_TEXT_HEIGHT:c);this.size_.height>this.constants_.FIELD_TEXT_HEIGHT&&(c+=(this.size_.height-c)/2);this.textElement_=Blockly.utils.dom.createSvgElement("text",{"class":"blocklyText",y:b?this.size_.height/2:c,dy:this.constants_.FIELD_TEXT_Y_OFFSET, +x:a},this.fieldGroup_);b&&this.textElement_.setAttribute("dominant-baseline","central");this.textContent_=document.createTextNode("");this.textElement_.appendChild(this.textContent_)};Blockly.Field.prototype.bindEvents_=function(){Blockly.Tooltip.bindMouseEvents(this.getClickTarget_());this.mouseDownWrapper_=Blockly.bindEventWithChecks_(this.getClickTarget_(),"mousedown",this,this.onMouseDown_)};Blockly.Field.prototype.fromXml=function(a){this.setValue(a.textContent)}; +Blockly.Field.prototype.toXml=function(a){a.textContent=this.getValue();return a};Blockly.Field.prototype.dispose=function(){Blockly.DropDownDiv.hideIfOwner(this);Blockly.WidgetDiv.hideIfOwner(this);this.mouseDownWrapper_&&Blockly.unbindEvent_(this.mouseDownWrapper_);Blockly.utils.dom.removeNode(this.fieldGroup_);this.disposed=!0}; +Blockly.Field.prototype.updateEditable=function(){var a=this.fieldGroup_;this.EDITABLE&&a&&(this.sourceBlock_.isEditable()?(Blockly.utils.dom.addClass(a,"blocklyEditableText"),Blockly.utils.dom.removeClass(a,"blocklyNonEditableText"),a.style.cursor=this.CURSOR):(Blockly.utils.dom.addClass(a,"blocklyNonEditableText"),Blockly.utils.dom.removeClass(a,"blocklyEditableText"),a.style.cursor=""))}; +Blockly.Field.prototype.isClickable=function(){return!!this.sourceBlock_&&this.sourceBlock_.isEditable()&&!!this.showEditor_&&"function"===typeof this.showEditor_};Blockly.Field.prototype.isCurrentlyEditable=function(){return this.EDITABLE&&!!this.sourceBlock_&&this.sourceBlock_.isEditable()}; +Blockly.Field.prototype.isSerializable=function(){var a=!1;this.name&&(this.SERIALIZABLE?a=!0:this.EDITABLE&&(console.warn("Detected an editable field that was not serializable. Please define SERIALIZABLE property as true on all editable custom fields. Proceeding with serialization."),a=!0));return a};Blockly.Field.prototype.isVisible=function(){return this.visible_}; +Blockly.Field.prototype.setVisible=function(a){if(this.visible_!=a){this.visible_=a;var b=this.getSvgRoot();b&&(b.style.display=a?"block":"none")}};Blockly.Field.prototype.setValidator=function(a){this.validator_=a};Blockly.Field.prototype.getValidator=function(){return this.validator_};Blockly.Field.prototype.classValidator=function(a){return a}; +Blockly.Field.prototype.callValidator=function(a){var b=this.classValidator(a);if(null===b)return null;void 0!==b&&(a=b);if(b=this.getValidator()){b=b.call(this,a);if(null===b)return null;void 0!==b&&(a=b)}return a};Blockly.Field.prototype.getSvgRoot=function(){return this.fieldGroup_};Blockly.Field.prototype.applyColour=function(){};Blockly.Field.prototype.render_=function(){this.textContent_&&(this.textContent_.nodeValue=this.getDisplayText_(),this.updateSize_())}; +Blockly.Field.prototype.showEditor=function(a){this.isClickable()&&this.showEditor_(a)};Blockly.Field.prototype.updateWidth=function(){console.warn("Deprecated call to updateWidth, call Blockly.Field.updateSize_ to force an update to the size of the field, or Blockly.utils.dom.getTextWidth() to check the size of the field.");this.updateSize_()}; +Blockly.Field.prototype.updateSize_=function(){var a=Blockly.utils.dom.getFastTextWidth(this.textElement_,this.constants_.FIELD_TEXT_FONTSIZE,this.constants_.FIELD_TEXT_FONTWEIGHT,this.constants_.FIELD_TEXT_FONTFAMILY);this.borderRect_&&(a+=2*this.constants_.FIELD_BORDER_RECT_X_PADDING,this.borderRect_.setAttribute("width",a));this.size_.width=a}; +Blockly.Field.prototype.getSize=function(){if(!this.isVisible())return new Blockly.utils.Size(0,0);this.isDirty_?(this.render_(),this.isDirty_=!1):this.visible_&&0==this.size_.width&&(console.warn("Deprecated use of setting size_.width to 0 to rerender a field. Set field.isDirty_ to true instead."),this.render_());return this.size_}; +Blockly.Field.prototype.getScaledBBox=function(){if(this.borderRect_)a=this.borderRect_.getBoundingClientRect(),c=Blockly.utils.style.getPageOffset(this.borderRect_),d=a.width,a=a.height;else{var a=this.sourceBlock_.getHeightWidth(),b=this.sourceBlock_.workspace.scale,c=this.getAbsoluteXY_(),d=a.width*b;a=a.height*b;Blockly.utils.userAgent.GECKO?(c.x+=1.5*b,c.y+=1.5*b):Blockly.utils.userAgent.EDGE||Blockly.utils.userAgent.IE||(c.x-=.5*b,c.y-=.5*b);d+=1*b;a+=1*b}return{top:c.y,bottom:c.y+a,left:c.x, +right:c.x+d}};Blockly.Field.prototype.getDisplayText_=function(){var a=this.getText();if(!a)return Blockly.Field.NBSP;a.length>this.maxDisplayLength&&(a=a.substring(0,this.maxDisplayLength-2)+"\u2026");a=a.replace(/\s/g,Blockly.Field.NBSP);this.sourceBlock_&&this.sourceBlock_.RTL&&(a+="\u200f");return a};Blockly.Field.prototype.getText=function(){if(this.getText_){var a=this.getText_.call(this);if(null!==a)return String(a)}return String(this.getValue())}; +Blockly.Field.prototype.setText=function(a){throw Error("setText method is deprecated");};Blockly.Field.prototype.markDirty=function(){this.isDirty_=!0};Blockly.Field.prototype.forceRerender=function(){this.isDirty_=!0;this.sourceBlock_&&this.sourceBlock_.rendered&&(this.sourceBlock_.render(),this.sourceBlock_.bumpNeighbours())}; +Blockly.Field.prototype.setValue=function(a){if(null!==a){var b=this.doClassValidation_(a);a=this.processValidation_(a,b);if(!(a instanceof Error)){if(b=this.getValidator())if(b=b.call(this,a),a=this.processValidation_(a,b),a instanceof Error)return;b=this.getValue();b!==a&&(this.sourceBlock_&&Blockly.Events.isEnabled()&&Blockly.Events.fire(new Blockly.Events.BlockChange(this.sourceBlock_,"field",this.name||null,b,a)),this.doValueUpdate_(a),this.isDirty_&&this.forceRerender())}}}; +Blockly.Field.prototype.processValidation_=function(a,b){if(null===b)return this.doValueInvalid_(a),this.isDirty_&&this.forceRerender(),Error();void 0!==b&&(a=b);return a};Blockly.Field.prototype.getValue=function(){return this.value_};Blockly.Field.prototype.doClassValidation_=function(a){return null===a||void 0===a?null:a=this.classValidator(a)};Blockly.Field.prototype.doValueUpdate_=function(a){this.value_=a;this.isDirty_=!0};Blockly.Field.prototype.doValueInvalid_=function(a){}; +Blockly.Field.prototype.onMouseDown_=function(a){this.sourceBlock_&&this.sourceBlock_.workspace&&(a=this.sourceBlock_.workspace.getGesture(a))&&a.setStartField(this)};Blockly.Field.prototype.setTooltip=function(a){var b=this.getClickTarget_();b?b.tooltip=a||""===a?a:this.sourceBlock_:this.tooltip_=a};Blockly.Field.prototype.getClickTarget_=function(){return this.clickTarget_||this.getSvgRoot()};Blockly.Field.prototype.getAbsoluteXY_=function(){return Blockly.utils.style.getPageOffset(this.getClickTarget_())}; +Blockly.Field.prototype.referencesVariables=function(){return!1};Blockly.Field.prototype.getParentInput=function(){for(var a=null,b=this.sourceBlock_,c=b.inputList,d=0;da||a>this.fieldRow.length)throw Error("index "+a+" out of bounds.");if(!(b||""==b&&c))return a;"string"==typeof b&&(b=new Blockly.FieldLabel(b));b.setSourceBlock(this.sourceBlock_);this.sourceBlock_.rendered&&b.init();b.name=c;b.prefixField&&(a=this.insertFieldAt(a,b.prefixField));this.fieldRow.splice(a,0,b);++a;b.suffixField&&(a=this.insertFieldAt(a,b.suffixField));this.sourceBlock_.rendered&&(this.sourceBlock_.render(),this.sourceBlock_.bumpNeighbours()); +return a};Blockly.Input.prototype.removeField=function(a){for(var b=0,c;c=this.fieldRow[b];b++)if(c.name===a){c.dispose();this.fieldRow.splice(b,1);this.sourceBlock_.rendered&&(this.sourceBlock_.render(),this.sourceBlock_.bumpNeighbours());return}throw Error('Field "%s" not found.',a);};Blockly.Input.prototype.isVisible=function(){return this.visible_}; +Blockly.Input.prototype.setVisible=function(a){var b=[];if(this.visible_==a)return b;for(var c=(this.visible_=a)?"block":"none",d=0,e;e=this.fieldRow[d];d++)e.setVisible(a);this.connection&&(a?b=this.connection.startTrackingAll():this.connection.stopTrackingAll(),d=this.connection.targetBlock())&&(d.getSvgRoot().style.display=c,a||(d.rendered=!1));return b};Blockly.Input.prototype.markDirty=function(){for(var a=0,b;b=this.fieldRow[a];a++)b.markDirty()}; +Blockly.Input.prototype.setCheck=function(a){if(!this.connection)throw Error("This input does not have a connection.");this.connection.setCheck(a);return this};Blockly.Input.prototype.setAlign=function(a){this.align=a;this.sourceBlock_.rendered&&this.sourceBlock_.render();return this};Blockly.Input.prototype.init=function(){if(this.sourceBlock_.workspace.rendered)for(var a=0;aa&&(c=c.substring(0,a-3)+"...");return c}; +Blockly.Block.prototype.appendValueInput=function(a){return this.appendInput_(Blockly.INPUT_VALUE,a)};Blockly.Block.prototype.appendStatementInput=function(a){return this.appendInput_(Blockly.NEXT_STATEMENT,a)};Blockly.Block.prototype.appendDummyInput=function(a){return this.appendInput_(Blockly.DUMMY_INPUT,a||"")}; +Blockly.Block.prototype.jsonInit=function(a){var b=a.type?'Block "'+a.type+'": ':"";if(a.output&&a.previousStatement)throw Error(b+"Must not have both an output and a previousStatement.");a.style&&a.style.hat&&(this.hat=a.style.hat,a.style=null);if(a.style&&a.colour)throw Error(b+"Must not have both a colour and a style.");a.style?this.jsonInitStyle_(a,b):this.jsonInitColour_(a,b);for(var c=0;void 0!==a["message"+c];)this.interpolate_(a["message"+c],a["args"+c]||[],a["lastDummyAlign"+c],b),c++;void 0!== +a.inputsInline&&this.setInputsInline(a.inputsInline);void 0!==a.output&&this.setOutput(!0,a.output);void 0!==a.outputShape&&this.setOutputShape(a.outputShape);void 0!==a.previousStatement&&this.setPreviousStatement(!0,a.previousStatement);void 0!==a.nextStatement&&this.setNextStatement(!0,a.nextStatement);void 0!==a.tooltip&&(c=a.tooltip,c=Blockly.utils.replaceMessageReferences(c),this.setTooltip(c));void 0!==a.enableContextMenu&&(c=a.enableContextMenu,this.contextMenu=!!c);void 0!==a.helpUrl&&(c= +a.helpUrl,c=Blockly.utils.replaceMessageReferences(c),this.setHelpUrl(c));"string"==typeof a.extensions&&(console.warn(b+"JSON attribute 'extensions' should be an array of strings. Found raw string in JSON for '"+a.type+"' block."),a.extensions=[a.extensions]);void 0!==a.mutator&&Blockly.Extensions.apply(a.mutator,this,!0);if(Array.isArray(a.extensions))for(a=a.extensions,b=0;b=k||k>b.length)throw Error('Block "'+this.type+'": Message index %'+k+" out of range.");if(f[k])throw Error('Block "'+this.type+'": Message index %'+k+" duplicated.");f[k]=!0;g++;a.push(b[k-1])}else(k=k.trim())&&a.push(k)}if(g!=b.length)throw Error('Block "'+this.type+'": Message does not reference all '+b.length+" arg(s)."); +a.length&&("string"==typeof a[a.length-1]||Blockly.utils.string.startsWith(a[a.length-1].type,"field_"))&&(h={type:"input_dummy"},c&&(h.align=c),a.push(h));c={LEFT:Blockly.ALIGN_LEFT,RIGHT:Blockly.ALIGN_RIGHT,CENTRE:Blockly.ALIGN_CENTRE,CENTER:Blockly.ALIGN_CENTRE};b=[];for(h=0;h=this.inputList.length)throw RangeError("Input index "+a+" out of bounds.");if(b>this.inputList.length)throw RangeError("Reference input "+b+" out of bounds.");var c=this.inputList[a];this.inputList.splice(a,1);aa?b-1:a},this.highlightedIndex_)}; +Blockly.Menu.prototype.highlightHelper=function(a,b){b=0>b?-1:b;var c=this.getChildCount();b=a.call(this,b,c);for(var d=0;d<=c;){var e=this.getChildAt(b);if(e&&this.canHighlightItem(e))return this.setHighlightedIndex(b),!0;d++;b=a.call(this,b,c)}return!1};Blockly.Menu.prototype.canHighlightItem=function(a){return a.isEnabled()};Blockly.Menu.prototype.handleMouseOver_=function(a){(a=this.getMenuItem(a.target))&&a.isEnabled()&&this.getHighlighted()!==a&&(this.unhighlightCurrent(),this.setHighlighted(a))}; +Blockly.Menu.prototype.handleClick_=function(a){var b=this.openingCoords;this.openingCoords=null;if(b&&"number"===typeof a.clientX){var c=new Blockly.utils.Coordinate(a.clientX,a.clientY);if(1>Blockly.utils.Coordinate.distance(b,c))return}(b=this.getMenuItem(a.target))&&b.handleClick(a)&&a.preventDefault()};Blockly.Menu.prototype.handleMouseEnter_=function(a){this.focus()};Blockly.Menu.prototype.handleMouseLeave_=function(a){this.getElement()&&(this.blur(),this.clearHighlighted())}; +Blockly.Menu.prototype.handleKeyEvent=function(a){return 0!=this.getChildCount()&&this.handleKeyEventInternal(a)?(a.preventDefault(),a.stopPropagation(),!0):!1}; +Blockly.Menu.prototype.handleKeyEventInternal=function(a){var b=this.getHighlighted();if(b&&"function"==typeof b.handleKeyEvent&&b.handleKeyEvent(a))return!0;if(a.shiftKey||a.ctrlKey||a.metaKey||a.altKey)return!1;switch(a.keyCode){case Blockly.utils.KeyCodes.ENTER:b&&b.performActionInternal(a);break;case Blockly.utils.KeyCodes.UP:this.highlightPrevious();break;case Blockly.utils.KeyCodes.DOWN:this.highlightNext();break;default:return!1}return!0};Blockly.MenuItem=function(a,b){Blockly.Component.call(this);this.setContentInternal(a);this.setValue(b);this.enabled_=!0};Blockly.utils.object.inherits(Blockly.MenuItem,Blockly.Component); +Blockly.MenuItem.prototype.createDom=function(){var a=document.createElement("div");a.id=this.getId();this.setElementInternal(a);a.className="goog-menuitem goog-option "+(this.enabled_?"":"goog-menuitem-disabled ")+(this.checked_?"goog-option-selected ":"")+(this.isRightToLeft()?"goog-menuitem-rtl ":"");var b=this.getContentWrapperDom();a.appendChild(b);var c=this.getCheckboxDom();c&&b.appendChild(c);b.appendChild(this.getContentDom());Blockly.utils.aria.setRole(a,this.roleName_||(this.checkable_? +Blockly.utils.aria.Role.MENUITEMCHECKBOX:Blockly.utils.aria.Role.MENUITEM));Blockly.utils.aria.setState(a,Blockly.utils.aria.State.SELECTED,this.checkable_&&this.checked_||!1)};Blockly.MenuItem.prototype.getCheckboxDom=function(){if(!this.checkable_)return null;var a=document.createElement("div");a.className="goog-menuitem-checkbox";return a};Blockly.MenuItem.prototype.getContentDom=function(){var a=this.content_;"string"===typeof a&&(a=document.createTextNode(a));return a}; +Blockly.MenuItem.prototype.getContentWrapperDom=function(){var a=document.createElement("div");a.className="goog-menuitem-content";return a};Blockly.MenuItem.prototype.setContentInternal=function(a){this.content_=a};Blockly.MenuItem.prototype.setValue=function(a){this.value_=a};Blockly.MenuItem.prototype.getValue=function(){return this.value_};Blockly.MenuItem.prototype.setRole=function(a){this.roleName_=a};Blockly.MenuItem.prototype.setCheckable=function(a){this.checkable_=a}; +Blockly.MenuItem.prototype.setChecked=function(a){if(this.checkable_){this.checked_=a;var b=this.getElement();b&&this.isEnabled()&&(a?(Blockly.utils.dom.addClass(b,"goog-option-selected"),Blockly.utils.aria.setState(b,Blockly.utils.aria.State.SELECTED,!0)):(Blockly.utils.dom.removeClass(b,"goog-option-selected"),Blockly.utils.aria.setState(b,Blockly.utils.aria.State.SELECTED,!1)))}}; +Blockly.MenuItem.prototype.setHighlighted=function(a){this.highlight_=a;var b=this.getElement();b&&this.isEnabled()&&(a?Blockly.utils.dom.addClass(b,"goog-menuitem-highlight"):Blockly.utils.dom.removeClass(b,"goog-menuitem-highlight"))};Blockly.MenuItem.prototype.isEnabled=function(){return this.enabled_};Blockly.MenuItem.prototype.setEnabled=function(a){this.enabled_=a;(a=this.getElement())&&(this.enabled_?Blockly.utils.dom.removeClass(a,"goog-menuitem-disabled"):Blockly.utils.dom.addClass(a,"goog-menuitem-disabled"))}; +Blockly.MenuItem.prototype.handleClick=function(a){this.isEnabled()&&(this.setHighlighted(!0),this.performActionInternal())};Blockly.MenuItem.prototype.performActionInternal=function(){this.checkable_&&this.setChecked(!this.checked_);this.actionHandler_&&this.actionHandler_.call(this.actionHandlerObj_,this)};Blockly.MenuItem.prototype.onAction=function(a,b){this.actionHandler_=a;this.actionHandlerObj_=b};Blockly.utils.uiMenu={};Blockly.utils.uiMenu.getSize=function(a){a=a.getElement();var b=Blockly.utils.style.getSize(a);b.height=a.scrollHeight;return b};Blockly.utils.uiMenu.adjustBBoxesForRTL=function(a,b,c){b.left+=c.width;b.right+=c.width;a.left+=c.width;a.right+=c.width};Blockly.ContextMenu={};Blockly.ContextMenu.currentBlock=null;Blockly.ContextMenu.eventWrapper_=null;Blockly.ContextMenu.show=function(a,b,c){Blockly.WidgetDiv.show(Blockly.ContextMenu,c,null);if(b.length){var d=Blockly.ContextMenu.populate_(b,c);Blockly.ContextMenu.position_(d,a,c);setTimeout(function(){d.getElement().focus()},1);Blockly.ContextMenu.currentBlock=null}else Blockly.ContextMenu.hide()}; +Blockly.ContextMenu.populate_=function(a,b){var c=new Blockly.Menu;c.setRightToLeft(b);for(var d=0,e;e=a[d];d++){var f=new Blockly.MenuItem(e.text);f.setRightToLeft(b);c.addChild(f,!0);f.setEnabled(e.enabled);if(e.enabled)f.onAction(function(){Blockly.ContextMenu.hide();this.callback()},e)}return c}; +Blockly.ContextMenu.position_=function(a,b,c){var d=Blockly.utils.getViewportBBox();b={top:b.clientY+d.top,bottom:b.clientY+d.top,left:b.clientX+d.left,right:b.clientX+d.left};Blockly.ContextMenu.createWidget_(a);var e=Blockly.utils.uiMenu.getSize(a);c&&Blockly.utils.uiMenu.adjustBBoxesForRTL(d,b,e);Blockly.WidgetDiv.positionWithAnchor(d,b,e,c);a.getElement().focus()}; +Blockly.ContextMenu.createWidget_=function(a){a.render(Blockly.WidgetDiv.DIV);var b=a.getElement();Blockly.utils.dom.addClass(b,"blocklyContextMenu");Blockly.bindEventWithChecks_(b,"contextmenu",null,Blockly.utils.noEvent);a.focus()};Blockly.ContextMenu.hide=function(){Blockly.WidgetDiv.hideIfOwner(Blockly.ContextMenu);Blockly.ContextMenu.currentBlock=null;Blockly.ContextMenu.eventWrapper_&&(Blockly.unbindEvent_(Blockly.ContextMenu.eventWrapper_),Blockly.ContextMenu.eventWrapper_=null)}; +Blockly.ContextMenu.callbackFactory=function(a,b){return function(){Blockly.Events.disable();try{var c=Blockly.Xml.domToBlock(b,a.workspace),d=a.getRelativeToSurfaceXY();d.x=a.RTL?d.x-Blockly.SNAP_RADIUS:d.x+Blockly.SNAP_RADIUS;d.y+=2*Blockly.SNAP_RADIUS;c.moveBy(d.x,d.y)}finally{Blockly.Events.enable()}Blockly.Events.isEnabled()&&!c.isShadow()&&Blockly.Events.fire(new Blockly.Events.BlockCreate(c));c.select()}}; +Blockly.ContextMenu.blockDeleteOption=function(a){var b=a.getDescendants(!1).length,c=a.getNextBlock();c&&(b-=c.getDescendants(!1).length);return{text:1==b?Blockly.Msg.DELETE_BLOCK:Blockly.Msg.DELETE_X_BLOCKS.replace("%1",String(b)),enabled:!0,callback:function(){Blockly.Events.setGroup(!0);a.dispose(!0,!0);Blockly.Events.setGroup(!1)}}};Blockly.ContextMenu.blockHelpOption=function(a){return{enabled:!("function"==typeof a.helpUrl?!a.helpUrl():!a.helpUrl),text:Blockly.Msg.HELP,callback:function(){a.showHelp()}}}; +Blockly.ContextMenu.blockDuplicateOption=function(a){var b=a.isDuplicatable();return{text:Blockly.Msg.DUPLICATE_BLOCK,enabled:b,callback:function(){Blockly.duplicate(a)}}};Blockly.ContextMenu.blockCommentOption=function(a){var b={enabled:!Blockly.utils.userAgent.IE};a.getCommentIcon()?(b.text=Blockly.Msg.REMOVE_COMMENT,b.callback=function(){a.setCommentText(null)}):(b.text=Blockly.Msg.ADD_COMMENT,b.callback=function(){a.setCommentText("")});return b}; +Blockly.ContextMenu.commentDeleteOption=function(a){return{text:Blockly.Msg.REMOVE_COMMENT,enabled:!0,callback:function(){Blockly.Events.setGroup(!0);a.dispose(!0,!0);Blockly.Events.setGroup(!1)}}};Blockly.ContextMenu.commentDuplicateOption=function(a){return{text:Blockly.Msg.DUPLICATE_COMMENT,enabled:!0,callback:function(){Blockly.duplicate(a)}}}; +Blockly.ContextMenu.workspaceCommentOption=function(a,b){if(!Blockly.WorkspaceCommentSvg)throw Error("Missing require for Blockly.WorkspaceCommentSvg");var c={enabled:!Blockly.utils.userAgent.IE};c.text=Blockly.Msg.ADD_COMMENT;c.callback=function(){var c=new Blockly.WorkspaceCommentSvg(a,Blockly.Msg.WORKSPACE_COMMENT_DEFAULT_TEXT,Blockly.WorkspaceCommentSvg.DEFAULT_SIZE,Blockly.WorkspaceCommentSvg.DEFAULT_SIZE),e=a.getInjectionDiv().getBoundingClientRect();e=new Blockly.utils.Coordinate(b.clientX- +e.left,b.clientY-e.top);var f=a.getOriginOffsetInPixels();e=Blockly.utils.Coordinate.difference(e,f);e.scale(1/a.scale);c.moveBy(e.x,e.y);a.rendered&&(c.initSvg(),c.render(),c.select())};return c};Blockly.RenderedConnection=function(a,b){Blockly.RenderedConnection.superClass_.constructor.call(this,a,b);this.db_=a.workspace.connectionDBList[b];this.dbOpposite_=a.workspace.connectionDBList[Blockly.OPPOSITE_TYPE[b]];this.offsetInBlock_=new Blockly.utils.Coordinate(0,0);this.trackedState_=Blockly.RenderedConnection.TrackedState.WILL_TRACK};Blockly.utils.object.inherits(Blockly.RenderedConnection,Blockly.Connection);Blockly.RenderedConnection.TrackedState={WILL_TRACK:-1,UNTRACKED:0,TRACKED:1}; +Blockly.RenderedConnection.prototype.dispose=function(){Blockly.RenderedConnection.superClass_.dispose.call(this);this.trackedState_==Blockly.RenderedConnection.TrackedState.TRACKED&&this.db_.removeConnection(this,this.y)};Blockly.RenderedConnection.prototype.getSourceBlock=function(){return Blockly.RenderedConnection.superClass_.getSourceBlock.call(this)};Blockly.RenderedConnection.prototype.targetBlock=function(){return Blockly.RenderedConnection.superClass_.targetBlock.call(this)}; +Blockly.RenderedConnection.prototype.distanceFrom=function(a){var b=this.x-a.x;a=this.y-a.y;return Math.sqrt(b*b+a*a)}; +Blockly.RenderedConnection.prototype.bumpAwayFrom=function(a){if(!this.sourceBlock_.workspace.isDragging()){var b=this.sourceBlock_.getRootBlock();if(!b.isInFlyout){var c=!1;if(!b.isMovable()){b=a.getSourceBlock().getRootBlock();if(!b.isMovable())return;a=this;c=!0}var d=Blockly.selected==b;d||b.addSelect();var e=a.x+Blockly.SNAP_RADIUS+Math.floor(Math.random()*Blockly.BUMP_RANDOMNESS)-this.x,f=a.y+Blockly.SNAP_RADIUS+Math.floor(Math.random()*Blockly.BUMP_RANDOMNESS)-this.y;c&&(f=-f);b.RTL&&(e=a.x- +Blockly.SNAP_RADIUS-Math.floor(Math.random()*Blockly.BUMP_RANDOMNESS)-this.x);b.moveBy(e,f);d||b.removeSelect()}}}; +Blockly.RenderedConnection.prototype.moveTo=function(a,b){this.trackedState_==Blockly.RenderedConnection.TrackedState.WILL_TRACK?(this.db_.addConnection(this,b),this.trackedState_=Blockly.RenderedConnection.TrackedState.TRACKED):this.trackedState_==Blockly.RenderedConnection.TrackedState.TRACKED&&(this.db_.removeConnection(this,this.y),this.db_.addConnection(this,b));this.x=a;this.y=b};Blockly.RenderedConnection.prototype.moveBy=function(a,b){this.moveTo(this.x+a,this.y+b)}; +Blockly.RenderedConnection.prototype.moveToOffset=function(a){this.moveTo(a.x+this.offsetInBlock_.x,a.y+this.offsetInBlock_.y)};Blockly.RenderedConnection.prototype.setOffsetInBlock=function(a,b){this.offsetInBlock_.x=a;this.offsetInBlock_.y=b};Blockly.RenderedConnection.prototype.getOffsetInBlock=function(){return this.offsetInBlock_}; +Blockly.RenderedConnection.prototype.tighten=function(){var a=this.targetConnection.x-this.x,b=this.targetConnection.y-this.y;if(0!=a||0!=b){var c=this.targetBlock(),d=c.getSvgRoot();if(!d)throw Error("block is not rendered.");d=Blockly.utils.getRelativeXY(d);c.getSvgRoot().setAttribute("transform","translate("+(d.x-a)+","+(d.y-b)+")");c.moveConnections(-a,-b)}};Blockly.RenderedConnection.prototype.closest=function(a,b){return this.dbOpposite_.searchForClosest(this,a,b)}; +Blockly.RenderedConnection.prototype.highlight=function(){var a=this.sourceBlock_.workspace.getRenderer().getConstants();var b=a.shapeFor(this);this.type==Blockly.INPUT_VALUE||this.type==Blockly.OUTPUT_VALUE?(a=a.TAB_OFFSET_FROM_TOP,b=Blockly.utils.svgPaths.moveBy(0,-a)+Blockly.utils.svgPaths.lineOnAxis("v",a)+b.pathDown+Blockly.utils.svgPaths.lineOnAxis("v",a)):(a=a.NOTCH_OFFSET_LEFT-a.CORNER_RADIUS,b=Blockly.utils.svgPaths.moveBy(-a,0)+Blockly.utils.svgPaths.lineOnAxis("h",a)+b.pathLeft+Blockly.utils.svgPaths.lineOnAxis("h", +a));a=this.sourceBlock_.getRelativeToSurfaceXY();Blockly.Connection.highlightedPath_=Blockly.utils.dom.createSvgElement("path",{"class":"blocklyHighlightedConnectionPath",d:b,transform:"translate("+(this.x-a.x)+","+(this.y-a.y)+")"+(this.sourceBlock_.RTL?" scale(-1 1)":"")},this.sourceBlock_.getSvgRoot())};Blockly.RenderedConnection.prototype.unhighlight=function(){Blockly.utils.dom.removeNode(Blockly.Connection.highlightedPath_);delete Blockly.Connection.highlightedPath_}; +Blockly.RenderedConnection.prototype.setTracking=function(a){a&&this.trackedState_==Blockly.RenderedConnection.TrackedState.TRACKED||!a&&this.trackedState_==Blockly.RenderedConnection.TrackedState.UNTRACKED||this.sourceBlock_.isInFlyout||(a?(this.db_.addConnection(this,this.y),this.trackedState_=Blockly.RenderedConnection.TrackedState.TRACKED):(this.trackedState_==Blockly.RenderedConnection.TrackedState.TRACKED&&this.db_.removeConnection(this,this.y),this.trackedState_=Blockly.RenderedConnection.TrackedState.UNTRACKED))}; +Blockly.RenderedConnection.prototype.stopTrackingAll=function(){this.setTracking(!1);if(this.targetConnection)for(var a=this.targetBlock().getDescendants(!1),b=0;bb?!1:Blockly.RenderedConnection.superClass_.isConnectionAllowed.call(this,a)};Blockly.RenderedConnection.prototype.onFailedConnect=function(a){this.bumpAwayFrom(a)};Blockly.RenderedConnection.prototype.disconnectInternal_=function(a,b){Blockly.RenderedConnection.superClass_.disconnectInternal_.call(this,a,b);a.rendered&&a.render();b.rendered&&(b.updateDisabled(),b.render())}; +Blockly.RenderedConnection.prototype.respawnShadow_=function(){var a=this.getSourceBlock(),b=this.getShadowDom();if(a.workspace&&b&&Blockly.Events.recordUndo){Blockly.RenderedConnection.superClass_.respawnShadow_.call(this);b=this.targetBlock();if(!b)throw Error("Couldn't respawn the shadow block that should exist here.");b.initSvg();b.render(!1);a.rendered&&a.render()}};Blockly.RenderedConnection.prototype.neighbours=function(a){return this.dbOpposite_.getNeighbours(this,a)}; +Blockly.RenderedConnection.prototype.connect_=function(a){Blockly.RenderedConnection.superClass_.connect_.call(this,a);var b=this.getSourceBlock();a=a.getSourceBlock();b.rendered&&b.updateDisabled();a.rendered&&a.updateDisabled();b.rendered&&a.rendered&&(this.type==Blockly.NEXT_STATEMENT||this.type==Blockly.PREVIOUS_STATEMENT?a.render():b.render())}; +Blockly.RenderedConnection.prototype.onCheckChanged_=function(){!this.isConnected()||this.targetConnection&&this.checkType(this.targetConnection)||((this.isSuperior()?this.targetBlock():this.sourceBlock_).unplug(),this.sourceBlock_.bumpNeighbours())};Blockly.Marker=function(){this.drawer_=this.curNode_=this.colour=null;this.type="marker"};Blockly.Marker.prototype.setDrawer=function(a){this.drawer_=a};Blockly.Marker.prototype.getDrawer=function(){return this.drawer_};Blockly.Marker.prototype.getCurNode=function(){return this.curNode_};Blockly.Marker.prototype.setCurNode=function(a){var b=this.curNode_;this.curNode_=a;this.drawer_&&this.drawer_.draw(b,this.curNode_)}; +Blockly.Marker.prototype.draw=function(){this.drawer_&&this.drawer_.draw(this.curNode_,this.curNode_)};Blockly.Marker.prototype.hide=function(){this.drawer_&&this.drawer_.hide()};Blockly.Marker.prototype.dispose=function(){this.getDrawer()&&this.getDrawer().dispose()};Blockly.Cursor=function(){Blockly.Cursor.superClass_.constructor.call(this);this.type="cursor"};Blockly.utils.object.inherits(Blockly.Cursor,Blockly.Marker);Blockly.Cursor.prototype.next=function(){var a=this.getCurNode();if(!a)return null;for(a=a.next();a&&a.next()&&(a.getType()==Blockly.ASTNode.types.NEXT||a.getType()==Blockly.ASTNode.types.BLOCK);)a=a.next();a&&this.setCurNode(a);return a}; +Blockly.Cursor.prototype.in=function(){var a=this.getCurNode();if(!a)return null;if(a.getType()==Blockly.ASTNode.types.PREVIOUS||a.getType()==Blockly.ASTNode.types.OUTPUT)a=a.next();(a=a.in())&&this.setCurNode(a);return a};Blockly.Cursor.prototype.prev=function(){var a=this.getCurNode();if(!a)return null;for(a=a.prev();a&&a.prev()&&(a.getType()==Blockly.ASTNode.types.NEXT||a.getType()==Blockly.ASTNode.types.BLOCK);)a=a.prev();a&&this.setCurNode(a);return a}; +Blockly.Cursor.prototype.out=function(){var a=this.getCurNode();if(!a)return null;(a=a.out())&&a.getType()==Blockly.ASTNode.types.BLOCK&&(a=a.prev()||a);a&&this.setCurNode(a);return a}; +Blockly.Cursor.prototype.onBlocklyAction=function(a){if(this.getCurNode()&&this.getCurNode().getType()===Blockly.ASTNode.types.FIELD&&this.getCurNode().getLocation().onBlocklyAction(a))return!0;switch(a.name){case Blockly.navigation.actionNames.PREVIOUS:return this.prev(),!0;case Blockly.navigation.actionNames.OUT:return this.out(),!0;case Blockly.navigation.actionNames.NEXT:return this.next(),!0;case Blockly.navigation.actionNames.IN:return this.in(),!0;default:return!1}};Blockly.BasicCursor=function(){Blockly.BasicCursor.superClass_.constructor.call(this)};Blockly.utils.object.inherits(Blockly.BasicCursor,Blockly.Cursor);Blockly.BasicCursor.prototype.next=function(){var a=this.getCurNode();if(!a)return null;(a=this.getNextNode_(a,this.validNode_))&&this.setCurNode(a);return a};Blockly.BasicCursor.prototype.in=function(){return this.next()}; +Blockly.BasicCursor.prototype.prev=function(){var a=this.getCurNode();if(!a)return null;(a=this.getPreviousNode_(a,this.validNode_))&&this.setCurNode(a);return a};Blockly.BasicCursor.prototype.out=function(){return this.prev()};Blockly.BasicCursor.prototype.getNextNode_=function(a,b){if(!a)return null;var c=a.in()||a.next();if(b(c))return c;if(c)return this.getNextNode_(c,b);a=this.findSiblingOrParent_(a.out());return b(a)?a:a?this.getNextNode_(a,b):null}; +Blockly.BasicCursor.prototype.getPreviousNode_=function(a,b){if(!a)return null;var c=a.prev();c=c?this.getRightMostChild_(c):a.out();return b(c)?c:c?this.getPreviousNode_(c,b):null};Blockly.BasicCursor.prototype.validNode_=function(a){var b=!1;a=a&&a.getType();if(a==Blockly.ASTNode.types.OUTPUT||a==Blockly.ASTNode.types.INPUT||a==Blockly.ASTNode.types.FIELD||a==Blockly.ASTNode.types.NEXT||a==Blockly.ASTNode.types.PREVIOUS||a==Blockly.ASTNode.types.WORKSPACE)b=!0;return b}; +Blockly.BasicCursor.prototype.findSiblingOrParent_=function(a){if(!a)return null;var b=a.next();return b?b:this.findSiblingOrParent_(a.out())};Blockly.BasicCursor.prototype.getRightMostChild_=function(a){if(!a.in())return a;for(a=a.in();a.next();)a=a.next();return this.getRightMostChild_(a)};Blockly.TabNavigateCursor=function(){Blockly.TabNavigateCursor.superClass_.constructor.call(this)};Blockly.utils.object.inherits(Blockly.TabNavigateCursor,Blockly.BasicCursor);Blockly.TabNavigateCursor.prototype.validNode_=function(a){var b=!1,c=a&&a.getType();a&&(a=a.getLocation(),c==Blockly.ASTNode.types.FIELD&&a&&a.isTabNavigable()&&a.isClickable()&&(b=!0));return b};Blockly.utils.Rect=function(a,b,c,d){this.top=a;this.bottom=b;this.left=c;this.right=d};Blockly.utils.Rect.prototype.contains=function(a,b){return a>=this.left&&a<=this.right&&b>=this.top&&b<=this.bottom};Blockly.BlockSvg=function(a,b,c){this.svgGroup_=Blockly.utils.dom.createSvgElement("g",{},null);this.svgGroup_.translate_="";this.style=a.getRenderer().getConstants().getBlockStyle(null);this.pathObject=a.getRenderer().makePathObject(this.svgGroup_,this.style);this.rendered=!1;this.workspace=a;this.previousConnection=this.nextConnection=this.outputConnection=null;this.useDragSurface_=Blockly.utils.is3dSupported()&&!!a.getBlockDragSurface();var d=this.pathObject.svgPath;d.tooltip=this;Blockly.Tooltip.bindMouseEvents(d); +Blockly.BlockSvg.superClass_.constructor.call(this,a,b,c);this.svgGroup_.dataset&&(this.svgGroup_.dataset.id=this.id)};Blockly.utils.object.inherits(Blockly.BlockSvg,Blockly.Block);Blockly.BlockSvg.prototype.height=0;Blockly.BlockSvg.prototype.width=0;Blockly.BlockSvg.prototype.dragStartXY_=null;Blockly.BlockSvg.prototype.warningTextDb_=null;Blockly.BlockSvg.INLINE=-1;Blockly.BlockSvg.COLLAPSED_WARNING_ID="TEMP_COLLAPSED_WARNING_"; +Blockly.BlockSvg.prototype.initSvg=function(){if(!this.workspace.rendered)throw TypeError("Workspace is headless.");for(var a=0,b;b=this.inputList[a];a++)b.init();b=this.getIcons();for(a=0;a=this.connections_.length)return-1;b=a.y;for(var d=c;0<=d&&this.connections_[d].y==b;){if(this.connections_[d]==a)return d;d--}for(;ca)c=d;else{b=d;break}}return b};Blockly.ConnectionDB.prototype.removeConnection=function(a,b){a=this.findIndexOfConnection_(a,b);if(-1==a)throw Error("Unable to find connection in connectionDB.");this.connections_.splice(a,1)}; +Blockly.ConnectionDB.prototype.getNeighbours=function(a,b){function c(a){var c=e-d[a].x,g=f-d[a].y;Math.sqrt(c*c+g*g)<=b&&k.push(d[a]);return ga)throw Error("Cannot unsubscribe a workspace that hasn't been subscribed.");this.subscribedWorkspaces_.splice(a,1)}; +Blockly.ThemeManager.prototype.subscribe=function(a,b,c){this.componentDB_[b]||(this.componentDB_[b]=[]);this.componentDB_[b].push({element:a,propertyName:c});b=this.theme_&&this.theme_.getComponentStyle(b);a.style[c]=b||""};Blockly.ThemeManager.prototype.unsubscribe=function(a){if(a)for(var b=Object.keys(this.componentDB_),c=0,d;d=b[c];c++){for(var e=this.componentDB_[d],f=e.length-1;0<=f;f--)e[f].element===a&&e.splice(f,1);this.componentDB_[d].length||delete this.componentDB_[d]}}; +Blockly.ThemeManager.prototype.dispose=function(){this.componentDB_=this.subscribedWorkspaces_=this.theme_=this.owner_=null};Blockly.TouchGesture=function(a,b){Blockly.TouchGesture.superClass_.constructor.call(this,a,b);this.isMultiTouch_=!1;this.cachedPoints_=Object.create(null);this.startDistance_=this.previousScale_=0;this.isPinchZoomEnabled_=this.onStartWrapper_=null};Blockly.utils.object.inherits(Blockly.TouchGesture,Blockly.Gesture);Blockly.TouchGesture.ZOOM_IN_MULTIPLIER=5;Blockly.TouchGesture.ZOOM_OUT_MULTIPLIER=6; +Blockly.TouchGesture.prototype.doStart=function(a){this.isPinchZoomEnabled_=this.startWorkspace_.options.zoomOptions&&this.startWorkspace_.options.zoomOptions.pinch;Blockly.TouchGesture.superClass_.doStart.call(this,a);!this.isEnding_&&Blockly.Touch.isTouchEvent(a)&&this.handleTouchStart(a)}; +Blockly.TouchGesture.prototype.bindMouseEvents=function(a){this.onStartWrapper_=Blockly.bindEventWithChecks_(document,"mousedown",null,this.handleStart.bind(this),!0);this.onMoveWrapper_=Blockly.bindEventWithChecks_(document,"mousemove",null,this.handleMove.bind(this),!0);this.onUpWrapper_=Blockly.bindEventWithChecks_(document,"mouseup",null,this.handleUp.bind(this),!0);a.preventDefault();a.stopPropagation()}; +Blockly.TouchGesture.prototype.handleStart=function(a){!this.isDragging()&&Blockly.Touch.isTouchEvent(a)&&(this.handleTouchStart(a),this.isMultiTouch()&&Blockly.longStop_())};Blockly.TouchGesture.prototype.handleMove=function(a){this.isDragging()?Blockly.Touch.shouldHandleEvent(a)&&Blockly.TouchGesture.superClass_.handleMove.call(this,a):this.isMultiTouch()?(Blockly.Touch.isTouchEvent(a)&&this.handleTouchMove(a),Blockly.longStop_()):Blockly.TouchGesture.superClass_.handleMove.call(this,a)}; +Blockly.TouchGesture.prototype.handleUp=function(a){Blockly.Touch.isTouchEvent(a)&&!this.isDragging()&&this.handleTouchEnd(a);!this.isMultiTouch()||this.isDragging()?Blockly.Touch.shouldHandleEvent(a)&&Blockly.TouchGesture.superClass_.handleUp.call(this,a):(a.preventDefault(),a.stopPropagation(),this.dispose())};Blockly.TouchGesture.prototype.isMultiTouch=function(){return this.isMultiTouch_}; +Blockly.TouchGesture.prototype.dispose=function(){Blockly.TouchGesture.superClass_.dispose.call(this);this.onStartWrapper_&&Blockly.unbindEvent_(this.onStartWrapper_)};Blockly.TouchGesture.prototype.handleTouchStart=function(a){var b=Blockly.Touch.getTouchIdentifierFromEvent(a);this.cachedPoints_[b]=this.getTouchPoint(a);b=Object.keys(this.cachedPoints_);2==b.length&&(this.startDistance_=Blockly.utils.Coordinate.distance(this.cachedPoints_[b[0]],this.cachedPoints_[b[1]]),this.isMultiTouch_=!0,a.preventDefault())}; +Blockly.TouchGesture.prototype.handleTouchMove=function(a){var b=Blockly.Touch.getTouchIdentifierFromEvent(a);this.cachedPoints_[b]=this.getTouchPoint(a);b=Object.keys(this.cachedPoints_);this.isPinchZoomEnabled_&&2===b.length?this.handlePinch_(a):Blockly.TouchGesture.superClass_.handleMove.call(this,a)}; +Blockly.TouchGesture.prototype.handlePinch_=function(a){var b=Object.keys(this.cachedPoints_);b=Blockly.utils.Coordinate.distance(this.cachedPoints_[b[0]],this.cachedPoints_[b[1]])/this.startDistance_;if(0this.previousScale_){var c=b-this.previousScale_;c=0Object.keys(this.cachedPoints_).length&&(this.cachedPoints_=Object.create(null),this.previousScale_=0)};Blockly.TouchGesture.prototype.getTouchPoint=function(a){return this.startWorkspace_?new Blockly.utils.Coordinate(a.pageX?a.pageX:a.changedTouches[0].pageX,a.pageY?a.pageY:a.changedTouches[0].pageY):null};Blockly.WorkspaceAudio=function(a){this.parentWorkspace_=a;this.SOUNDS_=Object.create(null)};Blockly.WorkspaceAudio.prototype.lastSound_=null;Blockly.WorkspaceAudio.prototype.dispose=function(){this.SOUNDS_=this.parentWorkspace_=null}; +Blockly.WorkspaceAudio.prototype.load=function(a,b){if(a.length){try{var c=new Blockly.utils.global.Audio}catch(h){return}for(var d,e=0;e=this.remainingCapacity()||(this.currentGesture_&&this.currentGesture_.cancel(),"comment"==a.tagName.toLowerCase()?this.pasteWorkspaceComment_(a):this.pasteBlock_(a))}; +Blockly.WorkspaceSvg.prototype.pasteBlock_=function(a){Blockly.Events.disable();try{var b=Blockly.Xml.domToBlock(a,this),c=this.getMarker(Blockly.navigation.MARKER_NAME).getCurNode();if(this.keyboardAccessibilityMode&&c&&c.isConnection()){var d=c.getLocation();Blockly.navigation.insertBlock(b,d);return}var e=parseInt(a.getAttribute("x"),10),f=parseInt(a.getAttribute("y"),10);if(!isNaN(e)&&!isNaN(f)){this.RTL&&(e=-e);do{a=!1;var g=this.getAllBlocks(!1);c=0;for(var h;h=g[c];c++){var k=h.getRelativeToSurfaceXY(); +if(1>=Math.abs(e-k.x)&&1>=Math.abs(f-k.y)){a=!0;break}}if(!a){var l=b.getConnections_(!1);c=0;for(var m;m=l[c];c++)if(m.closest(Blockly.SNAP_RADIUS,new Blockly.utils.Coordinate(e,f)).connection){a=!0;break}}a&&(e=this.RTL?e-Blockly.SNAP_RADIUS:e+Blockly.SNAP_RADIUS,f+=2*Blockly.SNAP_RADIUS)}while(a);b.moveBy(e,f)}}finally{Blockly.Events.enable()}Blockly.Events.isEnabled()&&!b.isShadow()&&Blockly.Events.fire(new Blockly.Events.BlockCreate(b));b.select()}; +Blockly.WorkspaceSvg.prototype.pasteWorkspaceComment_=function(a){Blockly.Events.disable();try{var b=Blockly.WorkspaceCommentSvg.fromXml(a,this),c=parseInt(a.getAttribute("x"),10),d=parseInt(a.getAttribute("y"),10);isNaN(c)||isNaN(d)||(this.RTL&&(c=-c),b.moveBy(c+50,d+50))}finally{Blockly.Events.enable()}Blockly.Events.isEnabled();b.select()}; +Blockly.WorkspaceSvg.prototype.refreshToolboxSelection=function(){var a=this.isFlyout?this.targetWorkspace:this;a&&!a.currentGesture_&&a.toolbox_&&a.toolbox_.getFlyout()&&a.toolbox_.refreshSelection()};Blockly.WorkspaceSvg.prototype.renameVariableById=function(a,b){Blockly.WorkspaceSvg.superClass_.renameVariableById.call(this,a,b);this.refreshToolboxSelection()};Blockly.WorkspaceSvg.prototype.deleteVariableById=function(a){Blockly.WorkspaceSvg.superClass_.deleteVariableById.call(this,a);this.refreshToolboxSelection()}; +Blockly.WorkspaceSvg.prototype.createVariable=function(a,b,c){a=Blockly.WorkspaceSvg.superClass_.createVariable.call(this,a,b,c);this.refreshToolboxSelection();return a};Blockly.WorkspaceSvg.prototype.recordDeleteAreas=function(){this.deleteAreaTrash_=this.trashcan&&this.svgGroup_.parentNode?this.trashcan.getClientRect():null;this.deleteAreaToolbox_=this.flyout_?this.flyout_.getClientRect():this.toolbox_?this.toolbox_.getClientRect():null}; +Blockly.WorkspaceSvg.prototype.isDeleteArea=function(a){return this.deleteAreaTrash_&&this.deleteAreaTrash_.contains(a.clientX,a.clientY)?Blockly.DELETE_AREA_TRASH:this.deleteAreaToolbox_&&this.deleteAreaToolbox_.contains(a.clientX,a.clientY)?Blockly.DELETE_AREA_TOOLBOX:Blockly.DELETE_AREA_NONE};Blockly.WorkspaceSvg.prototype.onMouseDown_=function(a){var b=this.getGesture(a);b&&b.handleWsStart(a,this)}; +Blockly.WorkspaceSvg.prototype.startDrag=function(a,b){a=Blockly.utils.mouseToSvg(a,this.getParentSvg(),this.getInverseScreenCTM());a.x/=this.scale;a.y/=this.scale;this.dragDeltaXY_=Blockly.utils.Coordinate.difference(b,a)};Blockly.WorkspaceSvg.prototype.moveDrag=function(a){a=Blockly.utils.mouseToSvg(a,this.getParentSvg(),this.getInverseScreenCTM());a.x/=this.scale;a.y/=this.scale;return Blockly.utils.Coordinate.sum(this.dragDeltaXY_,a)}; +Blockly.WorkspaceSvg.prototype.isDragging=function(){return null!=this.currentGesture_&&this.currentGesture_.isDragging()};Blockly.WorkspaceSvg.prototype.isDraggable=function(){return this.options.moveOptions&&this.options.moveOptions.drag}; +Blockly.WorkspaceSvg.prototype.isContentBounded=function(){return this.options.moveOptions&&this.options.moveOptions.scrollbars||this.options.moveOptions&&this.options.moveOptions.wheel||this.options.moveOptions&&this.options.moveOptions.drag||this.options.zoomOptions&&this.options.zoomOptions.controls||this.options.zoomOptions&&this.options.zoomOptions.wheel||this.options.zoomOptions&&this.options.zoomOptions.pinch}; +Blockly.WorkspaceSvg.prototype.isMovable=function(){return this.options.moveOptions&&this.options.moveOptions.scrollbars||this.options.moveOptions&&this.options.moveOptions.wheel||this.options.moveOptions&&this.options.moveOptions.drag||this.options.zoomOptions&&this.options.zoomOptions.wheel||this.options.zoomOptions&&this.options.zoomOptions.pinch}; +Blockly.WorkspaceSvg.prototype.onMouseWheel_=function(a){if(Blockly.Gesture.inProgress())a.preventDefault(),a.stopPropagation();else{var b=this.options.zoomOptions&&this.options.zoomOptions.wheel,c=this.options.moveOptions&&this.options.moveOptions.wheel;if(b||c){var d=Blockly.utils.getScrollDeltaPixels(a);!b||!a.ctrlKey&&c?(b=this.scrollX-d.x,c=this.scrollY-d.y,a.shiftKey&&!d.x&&(b=this.scrollX-d.y,c=this.scrollY),this.scroll(b,c)):(d=-d.y/50,b=Blockly.utils.mouseToSvg(a,this.getParentSvg(),this.getInverseScreenCTM()), +this.zoom(b.x,b.y,d));a.preventDefault()}}};Blockly.WorkspaceSvg.prototype.getBlocksBoundingBox=function(){var a=this.getTopBlocks(!1),b=this.getTopComments(!1);a=a.concat(b);if(!a.length)return new Blockly.utils.Rect(0,0,0,0);b=a[0].getBoundingRectangle();for(var c=1;cb.bottom&&(b.bottom=d.bottom);d.leftb.right&&(b.right=d.right)}return b}; +Blockly.WorkspaceSvg.prototype.cleanUp=function(){this.setResizesEnabled(!1);Blockly.Events.setGroup(!0);for(var a=this.getTopBlocks(!0),b=0,c=0,d;d=a[c];c++)if(d.isMovable()){var e=d.getRelativeToSurfaceXY();d.moveBy(-e.x,b-e.y);d.snapToGrid();b=d.getRelativeToSurfaceXY().y+d.getHeightWidth().height+this.renderer_.getConstants().MIN_BLOCK_HEIGHT}Blockly.Events.setGroup(!1);this.setResizesEnabled(!0)}; +Blockly.WorkspaceSvg.prototype.showContextMenu=function(a){function b(a){if(a.isDeletable())p=p.concat(a.getDescendants(!1));else{a=a.getChildren(!1);for(var c=0;cp.length?c():Blockly.confirm(Blockly.Msg.DELETE_ALL_BLOCKS.replace("%1",p.length),function(a){a&& +c()})}};d.push(h);this.configureContextMenu&&this.configureContextMenu(d);Blockly.ContextMenu.show(a,d,this.RTL)}}; +Blockly.WorkspaceSvg.prototype.updateToolbox=function(a){if(a=Blockly.Options.parseToolboxTree(a)){if(!this.options.languageTree)throw Error("Existing toolbox is null. Can't create new toolbox.");if(a.getElementsByTagName("category").length){if(!this.toolbox_)throw Error("Existing toolbox has no categories. Can't change mode.");this.options.languageTree=a;this.toolbox_.renderTree(a)}else{if(!this.flyout_)throw Error("Existing toolbox has categories. Can't change mode.");this.options.languageTree= +a;this.flyout_.show(a.childNodes)}}else if(this.options.languageTree)throw Error("Can't nullify an existing toolbox.");};Blockly.WorkspaceSvg.prototype.markFocused=function(){this.options.parentWorkspace?this.options.parentWorkspace.markFocused():(Blockly.mainWorkspace=this,this.setBrowserFocus())};Blockly.WorkspaceSvg.prototype.setBrowserFocus=function(){document.activeElement&&document.activeElement.blur();try{this.getParentSvg().focus({preventScroll:!0})}catch(a){try{this.getParentSvg().parentNode.setActive()}catch(b){this.getParentSvg().parentNode.focus({preventScroll:!0})}}}; +Blockly.WorkspaceSvg.prototype.zoom=function(a,b,c){c=Math.pow(this.options.zoomOptions.scaleSpeed,c);var d=this.scale*c;if(this.scale!=d){d>this.options.zoomOptions.maxScale?c=this.options.zoomOptions.maxScale/this.scale:dthis.options.zoomOptions.maxScale?a=this.options.zoomOptions.maxScale:this.options.zoomOptions.minScale&&ab.viewBottom||b.contentLeftb.viewRight){c=null;a&&(c=Blockly.Events.getGroup(),Blockly.Events.setGroup(a.group));switch(a.type){case Blockly.Events.BLOCK_CREATE:case Blockly.Events.BLOCK_MOVE:var f= +e.getBlockById(a.blockId);f&&(f=f.getRootBlock());break;case Blockly.Events.COMMENT_CREATE:case Blockly.Events.COMMENT_MOVE:f=e.getCommentById(a.commentId)}if(f){d=f.getBoundingRectangle();d.height=d.bottom-d.top;d.width=d.right-d.left;var m=b.viewTop,n=b.viewBottom-d.height;n=Math.max(m,n);m=Blockly.utils.math.clamp(m,d.top,n)-d.top;n=b.viewLeft;var p=b.viewRight-d.width;b.RTL?n=Math.min(p,n):p=Math.max(n,p);b=Blockly.utils.math.clamp(n,d.left,p)-d.left;f.moveBy(b,m)}a&&(!a.group&&f&&console.log("WARNING: Moved object in bounds but there was no event group. This may break undo."), +null!==c&&Blockly.Events.setGroup(c))}}});Blockly.svgResize(e);Blockly.WidgetDiv.createDom();Blockly.DropDownDiv.createDom();Blockly.Tooltip.createDom();return e}; +Blockly.init_=function(a){var b=a.options,c=a.getParentSvg();Blockly.bindEventWithChecks_(c.parentNode,"contextmenu",null,function(a){Blockly.utils.isTargetInput(a)||a.preventDefault()});c=Blockly.bindEventWithChecks_(window,"resize",null,function(){Blockly.hideChaff(!0);Blockly.svgResize(a)});a.setResizeHandlerWrapper(c);Blockly.inject.bindDocumentEvents_();if(b.languageTree){c=a.getToolbox();var d=a.getFlyout(!0);c?c.init():d&&(d.init(a),d.show(b.languageTree.childNodes),d.scrollToStart())}c=Blockly.Scrollbar.scrollbarThickness; +b.hasTrashcan&&(c=a.trashcan.init(c));b.zoomOptions&&b.zoomOptions.controls&&a.zoomControls_.init(c);b.moveOptions&&b.moveOptions.scrollbars?(a.scrollbar=new Blockly.ScrollbarPair(a),a.scrollbar.resize()):a.setMetrics({x:.5,y:.5});b.hasSounds&&Blockly.inject.loadSounds_(b.pathToMedia,a)}; +Blockly.inject.bindDocumentEvents_=function(){Blockly.documentEventsBound_||(Blockly.bindEventWithChecks_(document,"scroll",null,function(){for(var a=Blockly.Workspace.getAll(),b=0,c;c=a[b];b++)c.updateInverseScreenCTM&&c.updateInverseScreenCTM()}),Blockly.bindEventWithChecks_(document,"keydown",null,Blockly.onKeyDown),Blockly.bindEvent_(document,"touchend",null,Blockly.longStop_),Blockly.bindEvent_(document,"touchcancel",null,Blockly.longStop_),Blockly.utils.userAgent.IPAD&&Blockly.bindEventWithChecks_(window, +"orientationchange",document,function(){Blockly.svgResize(Blockly.getMainWorkspace())}));Blockly.documentEventsBound_=!0}; +Blockly.inject.loadSounds_=function(a,b){var c=b.getAudioManager();c.load([a+"click.mp3",a+"click.wav",a+"click.ogg"],"click");c.load([a+"disconnect.wav",a+"disconnect.mp3",a+"disconnect.ogg"],"disconnect");c.load([a+"delete.mp3",a+"delete.ogg",a+"delete.wav"],"delete");var d=[];a=function(){for(;d.length;)Blockly.unbindEvent_(d.pop());c.preload()};d.push(Blockly.bindEventWithChecks_(document,"mousemove",null,a,!0));d.push(Blockly.bindEventWithChecks_(document,"touchstart",null,a,!0))};Blockly.Names=function(a,b){this.variablePrefix_=b||"";this.reservedDict_=Object.create(null);if(a)for(a=a.split(","),b=0;b1'),d.appendChild(c),b.push(d));if(Blockly.Blocks.variables_get){a.sort(Blockly.VariableModel.compareByName);c=0;for(var e;e=a[c];c++)d=Blockly.utils.xml.createElement("block"),d.setAttribute("type","variables_get"),d.setAttribute("gap",8),d.appendChild(Blockly.Variables.generateVariableFieldDom(e)),b.push(d)}}return b}; +Blockly.Variables.VAR_LETTER_OPTIONS="ijkmnopqrstuvwxyzabcdefgh";Blockly.Variables.generateUniqueName=function(a){return Blockly.Variables.generateUniqueNameFromOptions(Blockly.Variables.VAR_LETTER_OPTIONS.charAt(0),a.getAllVariableNames())}; +Blockly.Variables.generateUniqueNameFromOptions=function(a,b){if(!b.length)return a;for(var c=Blockly.Variables.VAR_LETTER_OPTIONS,d="",e=c.indexOf(a);;){for(var f=!1,g=0;ge?Blockly.WidgetDiv.positionInternal_(a,0,c.height+e):Blockly.WidgetDiv.positionInternal_(a,e,c.height)};Blockly.WidgetDiv.calculateX_=function(a,b,c,d){if(d)return b=Math.max(b.right-c.width,a.left),Math.min(b,a.right-c.width);b=Math.min(b.left,a.right-c.width);return Math.max(b,a.left)}; +Blockly.WidgetDiv.calculateY_=function(a,b,c){return b.bottom+c.height>=a.bottom?b.top-c.height:b.bottom};Blockly.VERSION="3.20200123.1";Blockly.mainWorkspace=null;Blockly.selected=null;Blockly.draggingConnections=[];Blockly.clipboardXml_=null;Blockly.clipboardSource_=null;Blockly.clipboardTypeCounts_=null;Blockly.cache3dSupported_=null;Blockly.svgSize=function(a){return{width:a.cachedWidth_,height:a.cachedHeight_}};Blockly.resizeSvgContents=function(a){a.resizeContents()}; +Blockly.svgResize=function(a){for(;a.options.parentWorkspace;)a=a.options.parentWorkspace;var b=a.getParentSvg(),c=b.parentNode;if(c){var d=c.offsetWidth;c=c.offsetHeight;b.cachedWidth_!=d&&(b.setAttribute("width",d+"px"),b.cachedWidth_=d);b.cachedHeight_!=c&&(b.setAttribute("height",c+"px"),b.cachedHeight_=c);a.resize()}}; +Blockly.onKeyDown=function(a){var b=Blockly.mainWorkspace;if(b&&!(Blockly.utils.isTargetInput(a)||b.rendered&&!b.isVisible()))if(b.options.readOnly)Blockly.navigation.onKeyPress(a);else{var c=!1;if(a.keyCode==Blockly.utils.KeyCodes.ESC)Blockly.hideChaff(),Blockly.navigation.onBlocklyAction(Blockly.navigation.ACTION_EXIT);else{if(Blockly.navigation.onKeyPress(a))return;if(a.keyCode==Blockly.utils.KeyCodes.BACKSPACE||a.keyCode==Blockly.utils.KeyCodes.DELETE){a.preventDefault();if(Blockly.Gesture.inProgress())return; +Blockly.selected&&Blockly.selected.isDeletable()&&(c=!0)}else if(a.altKey||a.ctrlKey||a.metaKey){if(Blockly.Gesture.inProgress())return;Blockly.selected&&Blockly.selected.isDeletable()&&Blockly.selected.isMovable()&&(a.keyCode==Blockly.utils.KeyCodes.C?(Blockly.hideChaff(),Blockly.copy_(Blockly.selected)):a.keyCode!=Blockly.utils.KeyCodes.X||Blockly.selected.workspace.isFlyout||(Blockly.copy_(Blockly.selected),c=!0));a.keyCode==Blockly.utils.KeyCodes.V?Blockly.clipboardXml_&&(a=Blockly.clipboardSource_, +a.isFlyout&&(a=a.targetWorkspace),Blockly.clipboardTypeCounts_&&a.isCapacityAvailable(Blockly.clipboardTypeCounts_)&&(Blockly.Events.setGroup(!0),a.paste(Blockly.clipboardXml_),Blockly.Events.setGroup(!1))):a.keyCode==Blockly.utils.KeyCodes.Z&&(Blockly.hideChaff(),b.undo(a.shiftKey))}}c&&!Blockly.selected.workspace.isFlyout&&(Blockly.Events.setGroup(!0),Blockly.hideChaff(),Blockly.selected.dispose(!0,!0),Blockly.Events.setGroup(!1))}}; +Blockly.copy_=function(a){if(a.isComment)var b=a.toXmlWithXY();else{b=Blockly.Xml.blockToDom(a,!0);Blockly.Xml.deleteNext(b);var c=a.getRelativeToSurfaceXY();b.setAttribute("x",a.RTL?-c.x:c.x);b.setAttribute("y",c.y)}Blockly.clipboardXml_=b;Blockly.clipboardSource_=a.workspace;Blockly.clipboardTypeCounts_=a.isComment?null:Blockly.utils.getBlockTypeCounts(a,!0)}; +Blockly.duplicate=function(a){var b=Blockly.clipboardXml_,c=Blockly.clipboardSource_;Blockly.copy_(a);a.workspace.paste(Blockly.clipboardXml_);Blockly.clipboardXml_=b;Blockly.clipboardSource_=c};Blockly.onContextMenu_=function(a){Blockly.utils.isTargetInput(a)||a.preventDefault()}; +Blockly.hideChaff=function(a){Blockly.Tooltip.hide();Blockly.WidgetDiv.hide();Blockly.DropDownDiv.hideWithoutAnimation();a||(a=Blockly.getMainWorkspace(),a.trashcan&&a.trashcan.flyout&&a.trashcan.flyout.hide(),(a=a.getToolbox())&&a.getFlyout()&&a.getFlyout().autoClose&&a.clearSelection())};Blockly.getMainWorkspace=function(){return Blockly.mainWorkspace};Blockly.alert=function(a,b){alert(a);b&&b()};Blockly.confirm=function(a,b){b(confirm(a))};Blockly.prompt=function(a,b,c){c(prompt(a,b))}; +Blockly.jsonInitFactory_=function(a){return function(){this.jsonInit(a)}}; +Blockly.defineBlocksWithJsonArray=function(a){for(var b=0;b90-b||a>-90-b&&a<-90+b?!0:!1}; +Blockly.HorizontalFlyout.prototype.getClientRect=function(){if(!this.svgGroup_)return null;var a=this.svgGroup_.getBoundingClientRect(),b=a.top;return this.toolboxPosition_==Blockly.TOOLBOX_AT_TOP?new Blockly.utils.Rect(-1E9,b+a.height,-1E9,1E9):new Blockly.utils.Rect(b,1E9,-1E9,1E9)}; +Blockly.HorizontalFlyout.prototype.reflowInternal_=function(){this.workspace_.scale=this.targetWorkspace_.scale;for(var a=0,b=this.workspace_.getTopBlocks(!1),c=0,d;d=b[c];c++)a=Math.max(a,d.getHeightWidth().height);a+=1.5*this.MARGIN;a*=this.workspace_.scale;a+=Blockly.Scrollbar.scrollbarThickness;if(this.height_!=a){for(c=0;d=b[c];c++)d.flyoutRect_&&this.moveRectToBlock_(d.flyoutRect_,d);this.height_=a;this.position()}};Blockly.VerticalFlyout=function(a){a.getMetrics=this.getMetrics_.bind(this);a.setMetrics=this.setMetrics_.bind(this);Blockly.VerticalFlyout.superClass_.constructor.call(this,a);this.horizontalLayout_=!1};Blockly.utils.object.inherits(Blockly.VerticalFlyout,Blockly.Flyout); +Blockly.VerticalFlyout.prototype.getMetrics_=function(){if(!this.isVisible())return null;try{var a=this.workspace_.getCanvas().getBBox()}catch(e){a={height:0,y:0,width:0,x:0}}var b=this.SCROLLBAR_PADDING,c=this.height_-2*this.SCROLLBAR_PADDING,d=this.width_;this.RTL||(d-=this.SCROLLBAR_PADDING);return{viewHeight:c,viewWidth:d,contentHeight:a.height*this.workspace_.scale+2*this.MARGIN,contentWidth:a.width*this.workspace_.scale+2*this.MARGIN,viewTop:-this.workspace_.scrollY+a.y,viewLeft:-this.workspace_.scrollX, +contentTop:a.y,contentLeft:a.x,absoluteTop:b,absoluteLeft:0}};Blockly.VerticalFlyout.prototype.setMetrics_=function(a){var b=this.getMetrics_();b&&("number"==typeof a.y&&(this.workspace_.scrollY=-b.contentHeight*a.y),this.workspace_.translate(this.workspace_.scrollX+b.absoluteLeft,this.workspace_.scrollY+b.absoluteTop))}; +Blockly.VerticalFlyout.prototype.position=function(){if(this.isVisible()){var a=this.targetWorkspace_.getMetrics();a&&(this.height_=a.viewHeight,this.setBackgroundPath_(this.width_-this.CORNER_RADIUS,a.viewHeight-2*this.CORNER_RADIUS),this.positionAt_(this.width_,this.height_,this.targetWorkspace_.toolboxPosition==this.toolboxPosition_?a.toolboxWidth?this.toolboxPosition_==Blockly.TOOLBOX_AT_LEFT?a.toolboxWidth:a.viewWidth-this.width_:this.toolboxPosition_==Blockly.TOOLBOX_AT_LEFT?0:a.viewWidth:this.toolboxPosition_== +Blockly.TOOLBOX_AT_LEFT?0:a.viewWidth+a.absoluteLeft-this.width_,0))}}; +Blockly.VerticalFlyout.prototype.setBackgroundPath_=function(a,b){var c=this.toolboxPosition_==Blockly.TOOLBOX_AT_RIGHT,d=a+this.CORNER_RADIUS;d=["M "+(c?d:0)+",0"];d.push("h",c?-a:a);d.push("a",this.CORNER_RADIUS,this.CORNER_RADIUS,0,0,c?0:1,c?-this.CORNER_RADIUS:this.CORNER_RADIUS,this.CORNER_RADIUS);d.push("v",Math.max(0,b));d.push("a",this.CORNER_RADIUS,this.CORNER_RADIUS,0,0,c?0:1,c?this.CORNER_RADIUS:-this.CORNER_RADIUS,this.CORNER_RADIUS);d.push("h",c?a:-a);d.push("z");this.svgBackground_.setAttribute("d", +d.join(" "))};Blockly.VerticalFlyout.prototype.scrollToStart=function(){this.scrollbar_.set(0)};Blockly.VerticalFlyout.prototype.wheel_=function(a){var b=Blockly.utils.getScrollDeltaPixels(a);if(b.y){var c=this.getMetrics_();b=c.viewTop-c.contentTop+b.y;b=Math.min(b,c.contentHeight-c.viewHeight);b=Math.max(b,0);this.scrollbar_.set(b);Blockly.WidgetDiv.hide()}a.preventDefault();a.stopPropagation()}; +Blockly.VerticalFlyout.prototype.layout_=function(a,b){this.workspace_.scale=this.targetWorkspace_.scale;for(var c=this.MARGIN,d=this.RTL?c:c+this.tabWidth_,e=0,f;f=a[e];e++)if("block"==f.type){f=f.block;for(var g=f.getDescendants(!1),h=0,k;k=g[h];h++)k.isInFlyout=!0;f.render();g=f.getSvgRoot();h=f.getHeightWidth();k=f.outputConnection?d-this.tabWidth_:d;f.moveBy(k,c);k=this.createRect_(f,this.RTL?k-h.width:k,c,h,e);this.addBlockListeners_(g,f,k);c+=h.height+b[e]}else"button"==f.type&&(this.initFlyoutButton_(f.button, +d,c),c+=f.button.height+b[e])};Blockly.VerticalFlyout.prototype.isDragTowardWorkspace=function(a){a=Math.atan2(a.y,a.x)/Math.PI*180;var b=this.dragAngleRange_;return a-b||a<-180+b||a>180-b?!0:!1};Blockly.VerticalFlyout.prototype.getClientRect=function(){if(!this.svgGroup_)return null;var a=this.svgGroup_.getBoundingClientRect(),b=a.left;return this.toolboxPosition_==Blockly.TOOLBOX_AT_LEFT?new Blockly.utils.Rect(-1E9,1E9,-1E9,b+a.width):new Blockly.utils.Rect(-1E9,1E9,b,1E9)}; +Blockly.VerticalFlyout.prototype.reflowInternal_=function(){this.workspace_.scale=this.targetWorkspace_.scale;for(var a=0,b=this.workspace_.getTopBlocks(!1),c=0,d;d=b[c];c++){var e=d.getHeightWidth().width;d.outputConnection&&(e-=this.tabWidth_);a=Math.max(a,e)}for(c=0;d=this.buttons_[c];c++)a=Math.max(a,d.width);a+=1.5*this.MARGIN+this.tabWidth_;a*=this.workspace_.scale;a+=Blockly.Scrollbar.scrollbarThickness;if(this.width_!=a){for(c=0;d=b[c];c++){if(this.RTL){e=d.getRelativeToSurfaceXY().x;var f= +a/this.workspace_.scale-this.MARGIN;d.outputConnection||(f-=this.tabWidth_);d.moveBy(f-e,0)}d.flyoutRect_&&this.moveRectToBlock_(d.flyoutRect_,d)}if(this.RTL)for(c=0;d=this.buttons_[c];c++)b=d.getPosition().y,d.moveTo(a/this.workspace_.scale-d.width-this.MARGIN-this.tabWidth_,b);this.width_=a;this.position()}};Blockly.FlyoutButton=function(a,b,c,d){this.workspace_=a;this.targetWorkspace_=b;this.text_=c.getAttribute("text");this.position_=new Blockly.utils.Coordinate(0,0);this.isLabel_=d;this.callbackKey_=c.getAttribute("callbackKey")||c.getAttribute("callbackkey");this.cssClass_=c.getAttribute("web-class")||null;this.onMouseUpWrapper_=null};Blockly.FlyoutButton.MARGIN=5;Blockly.FlyoutButton.prototype.width=0;Blockly.FlyoutButton.prototype.height=0; +Blockly.FlyoutButton.prototype.createDom=function(){var a=this.isLabel_?"blocklyFlyoutLabel":"blocklyFlyoutButton";this.cssClass_&&(a+=" "+this.cssClass_);this.svgGroup_=Blockly.utils.dom.createSvgElement("g",{"class":a},this.workspace_.getCanvas());if(!this.isLabel_)var b=Blockly.utils.dom.createSvgElement("rect",{"class":"blocklyFlyoutButtonShadow",rx:4,ry:4,x:1,y:1},this.svgGroup_);a=Blockly.utils.dom.createSvgElement("rect",{"class":this.isLabel_?"blocklyFlyoutLabelBackground":"blocklyFlyoutButtonBackground", +rx:4,ry:4},this.svgGroup_);var c=Blockly.utils.dom.createSvgElement("text",{"class":this.isLabel_?"blocklyFlyoutLabelText":"blocklyText",x:0,y:0,"text-anchor":"middle"},this.svgGroup_),d=Blockly.utils.replaceMessageReferences(this.text_);this.workspace_.RTL&&(d+="\u200f");c.textContent=d;this.isLabel_&&(this.svgText_=c,this.workspace_.getThemeManager().subscribe(this.svgText_,"flyoutForegroundColour","fill"));this.width=Blockly.utils.dom.getTextWidth(c);this.height=20;this.isLabel_||(this.width+= +2*Blockly.FlyoutButton.MARGIN,b.setAttribute("width",this.width),b.setAttribute("height",this.height));a.setAttribute("width",this.width);a.setAttribute("height",this.height);c.setAttribute("x",this.width/2);c.setAttribute("y",this.height-Blockly.FlyoutButton.MARGIN);this.updateTransform_();this.onMouseUpWrapper_=Blockly.bindEventWithChecks_(this.svgGroup_,"mouseup",this,this.onMouseUp_);return this.svgGroup_}; +Blockly.FlyoutButton.prototype.show=function(){this.updateTransform_();this.svgGroup_.setAttribute("display","block")};Blockly.FlyoutButton.prototype.updateTransform_=function(){this.svgGroup_.setAttribute("transform","translate("+this.position_.x+","+this.position_.y+")")};Blockly.FlyoutButton.prototype.moveTo=function(a,b){this.position_.x=a;this.position_.y=b;this.updateTransform_()};Blockly.FlyoutButton.prototype.getPosition=function(){return this.position_}; +Blockly.FlyoutButton.prototype.getTargetWorkspace=function(){return this.targetWorkspace_};Blockly.FlyoutButton.prototype.dispose=function(){this.onMouseUpWrapper_&&Blockly.unbindEvent_(this.onMouseUpWrapper_);this.svgGroup_&&Blockly.utils.dom.removeNode(this.svgGroup_);this.svgText_&&this.workspace_.getThemeManager().unsubscribe(this.svgText_)}; +Blockly.FlyoutButton.prototype.onMouseUp_=function(a){(a=this.targetWorkspace_.getGesture(a))&&a.cancel();this.isLabel_&&this.callbackKey_?console.warn("Labels should not have callbacks. Label text: "+this.text_):this.isLabel_||this.callbackKey_&&this.targetWorkspace_.getButtonCallback(this.callbackKey_)?this.isLabel_||this.targetWorkspace_.getButtonCallback(this.callbackKey_)(this):console.warn("Buttons should have callbacks. Button text: "+this.text_)};Blockly.Css.register(".blocklyFlyoutButton {,fill: #888;,cursor: default;,},.blocklyFlyoutButtonShadow {,fill: #666;,},.blocklyFlyoutButton:hover {,fill: #aaa;,},.blocklyFlyoutLabel {,cursor: default;,},.blocklyFlyoutLabelBackground {,opacity: 0;,},.blocklyFlyoutLabelText {,fill: #000;,}".split(","));Blockly.Generator=function(a){this.name_=a;this.FUNCTION_NAME_PLACEHOLDER_REGEXP_=new RegExp(this.FUNCTION_NAME_PLACEHOLDER_,"g")};Blockly.Generator.NAME_TYPE="generated_function";Blockly.Generator.prototype.INFINITE_LOOP_TRAP=null;Blockly.Generator.prototype.STATEMENT_PREFIX=null;Blockly.Generator.prototype.STATEMENT_SUFFIX=null;Blockly.Generator.prototype.INDENT=" ";Blockly.Generator.prototype.COMMENT_WRAP=60;Blockly.Generator.prototype.ORDER_OVERRIDES=[]; +Blockly.Generator.prototype.workspaceToCode=function(a){a||(console.warn("No workspace specified in workspaceToCode call. Guessing."),a=Blockly.getMainWorkspace());var b=[];this.init(a);a=a.getTopBlocks(!0);for(var c=0,d;d=a[c];c++){var e=this.blockToCode(d);Array.isArray(e)&&(e=e[0]);e&&(d.outputConnection&&(e=this.scrubNakedValue(e),this.STATEMENT_PREFIX&&!d.suppressPrefixSuffix&&(e=this.injectId(this.STATEMENT_PREFIX,d)+e),this.STATEMENT_SUFFIX&&!d.suppressPrefixSuffix&&(e+=this.injectId(this.STATEMENT_SUFFIX, +d))),b.push(e))}b=b.join("\n");b=this.finish(b);b=b.replace(/^\s+\n/,"");b=b.replace(/\n\s+$/,"\n");return b=b.replace(/[ \t]+\n/g,"\n")};Blockly.Generator.prototype.prefixLines=function(a,b){return b+a.replace(/(?!\n$)\n/g,"\n"+b)};Blockly.Generator.prototype.allNestedComments=function(a){var b=[];a=a.getDescendants(!0);for(var c=0;ca&&(a=this.computeDepth_(),this.setDepth_(a));return a};Blockly.tree.BaseNode.prototype.computeDepth_=function(){var a=this.getParent();return a?a.getDepth()+1:0};Blockly.tree.BaseNode.prototype.setDepth_=function(a){if(a!=this.depth_){this.depth_=a;var b=this.getRowElement();if(b){var c=this.getPixelIndent_()+"px";this.isRightToLeft()?b.style.paddingRight=c:b.style.paddingLeft=c}this.forEachChild(function(b){b.setDepth_(a+1)})}}; +Blockly.tree.BaseNode.prototype.contains=function(a){for(;a;){if(a==this)return!0;a=a.getParent()}return!1};Blockly.tree.BaseNode.prototype.getChildren=function(){var a=[];this.forEachChild(function(b){a.push(b)});return a};Blockly.tree.BaseNode.prototype.getFirstChild=function(){return this.getChildAt(0)};Blockly.tree.BaseNode.prototype.getLastChild=function(){return this.getChildAt(this.getChildCount()-1)};Blockly.tree.BaseNode.prototype.getPreviousSibling=function(){return this.previousSibling_}; +Blockly.tree.BaseNode.prototype.getNextSibling=function(){return this.nextSibling_};Blockly.tree.BaseNode.prototype.isLastSibling=function(){return!this.nextSibling_};Blockly.tree.BaseNode.prototype.isSelected=function(){return this.selected_};Blockly.tree.BaseNode.prototype.select=function(){var a=this.getTree();a&&a.setSelectedItem(this)};Blockly.tree.BaseNode.prototype.selectFirst=function(){var a=this.getTree();a&&this.firstChild_&&a.setSelectedItem(this.firstChild_)}; +Blockly.tree.BaseNode.prototype.setSelectedInternal=function(a){if(this.selected_!=a){this.selected_=a;this.updateRow();var b=this.getElement();b&&(Blockly.utils.aria.setState(b,Blockly.utils.aria.State.SELECTED,a),a&&(a=this.getTree().getElement(),Blockly.utils.aria.setState(a,Blockly.utils.aria.State.ACTIVEDESCENDANT,this.getId())))}};Blockly.tree.BaseNode.prototype.getExpanded=function(){return this.expanded_};Blockly.tree.BaseNode.prototype.setExpandedInternal=function(a){this.expanded_=a}; +Blockly.tree.BaseNode.prototype.setExpanded=function(a){var b=a!=this.expanded_,c;this.expanded_=a;var d=this.getTree(),e=this.getElement();if(this.hasChildren()){if(!a&&d&&this.contains(d.getSelectedItem())&&this.select(),e){if(c=this.getChildrenElement())Blockly.utils.style.setElementShown(c,a),Blockly.utils.aria.setState(e,Blockly.utils.aria.State.EXPANDED,a),a&&this.isInDocument()&&!c.hasChildNodes()&&(this.forEachChild(function(a){c.appendChild(a.toDom())}),this.forEachChild(function(a){a.enterDocument()})); +this.updateExpandIcon()}}else(c=this.getChildrenElement())&&Blockly.utils.style.setElementShown(c,!1);e&&this.updateIcon_();b&&(a?this.doNodeExpanded():this.doNodeCollapsed())};Blockly.tree.BaseNode.prototype.doNodeExpanded=function(){};Blockly.tree.BaseNode.prototype.doNodeCollapsed=function(){};Blockly.tree.BaseNode.prototype.toggle=function(){this.setExpanded(!this.getExpanded())};Blockly.tree.BaseNode.prototype.isUserCollapsible=function(){return this.isUserCollapsible_}; +Blockly.tree.BaseNode.prototype.toDom=function(){var a=this.getExpanded()&&this.hasChildren(),b=document.createElement("div");b.style.backgroundPosition=this.getBackgroundPosition();a||(b.style.display="none");a&&this.forEachChild(function(a){b.appendChild(a.toDom())});a=document.createElement("div");a.id=this.getId();a.appendChild(this.getRowDom());a.appendChild(b);return a};Blockly.tree.BaseNode.prototype.getPixelIndent_=function(){return Math.max(0,(this.getDepth()-1)*this.config_.indentWidth)}; +Blockly.tree.BaseNode.prototype.getRowDom=function(){var a=document.createElement("div");a.className=this.getRowClassName();a.style["padding-"+(this.isRightToLeft()?"right":"left")]=this.getPixelIndent_()+"px";a.appendChild(this.getIconDom());a.appendChild(this.getLabelDom());return a};Blockly.tree.BaseNode.prototype.getRowClassName=function(){var a="";this.isSelected()&&(a=" "+(this.config_.cssSelectedRow||""));return this.config_.cssTreeRow+a}; +Blockly.tree.BaseNode.prototype.getLabelDom=function(){var a=document.createElement("span");a.className=this.config_.cssItemLabel||"";a.textContent=this.getText();return a};Blockly.tree.BaseNode.prototype.getIconDom=function(){var a=document.createElement("span");a.style.display="inline-block";a.className=this.getCalculatedIconClass();return a};Blockly.tree.BaseNode.prototype.getCalculatedIconClass=function(){throw Error("unimplemented abstract method");}; +Blockly.tree.BaseNode.prototype.getBackgroundPosition=function(){return(this.isLastSibling()?"-100":(this.getDepth()-1)*this.config_.indentWidth)+"px 0"};Blockly.tree.BaseNode.prototype.getElement=function(){var a=Blockly.tree.BaseNode.superClass_.getElement.call(this);a||(a=document.getElementById(this.getId()),this.setElementInternal(a));return a};Blockly.tree.BaseNode.prototype.getRowElement=function(){var a=this.getElement();return a?a.firstChild:null}; +Blockly.tree.BaseNode.prototype.getIconElement=function(){var a=this.getRowElement();return a?a.firstChild:null};Blockly.tree.BaseNode.prototype.getLabelElement=function(){var a=this.getRowElement();return a&&a.lastChild?a.lastChild.previousSibling:null};Blockly.tree.BaseNode.prototype.getChildrenElement=function(){var a=this.getElement();return a?a.lastChild:null};Blockly.tree.BaseNode.prototype.getIconClass=function(){return this.iconClass_}; +Blockly.tree.BaseNode.prototype.getExpandedIconClass=function(){return this.expandedIconClass_};Blockly.tree.BaseNode.prototype.setText=function(a){this.content_=a};Blockly.tree.BaseNode.prototype.getText=function(){return this.content_};Blockly.tree.BaseNode.prototype.updateRow=function(){var a=this.getRowElement();a&&(a.className=this.getRowClassName())};Blockly.tree.BaseNode.prototype.updateExpandIcon=function(){var a=this.getChildrenElement();a&&(a.style.backgroundPosition=this.getBackgroundPosition())}; +Blockly.tree.BaseNode.prototype.updateIcon_=function(){this.getIconElement().className=this.getCalculatedIconClass()};Blockly.tree.BaseNode.prototype.onMouseDown=function(a){"expand"==a.target.getAttribute("type")&&this.hasChildren()?this.isUserCollapsible_&&this.toggle():(this.select(),this.updateRow())};Blockly.tree.BaseNode.prototype.onClick_=function(a){a.preventDefault()}; +Blockly.tree.BaseNode.prototype.onKeyDown=function(a){var b=!0;switch(a.keyCode){case Blockly.utils.KeyCodes.RIGHT:if(a.altKey)break;b=this.selectChild();break;case Blockly.utils.KeyCodes.LEFT:if(a.altKey)break;b=this.selectParent();break;case Blockly.utils.KeyCodes.DOWN:b=this.selectNext();break;case Blockly.utils.KeyCodes.UP:b=this.selectPrevious();break;default:b=!1}b&&a.preventDefault();return b}; +Blockly.tree.BaseNode.prototype.selectNext=function(){var a=this.getNextShownNode();a&&a.select();return!0};Blockly.tree.BaseNode.prototype.selectPrevious=function(){var a=this.getPreviousShownNode();a&&a.select();return!0};Blockly.tree.BaseNode.prototype.selectParent=function(){if(this.hasChildren()&&this.getExpanded()&&this.isUserCollapsible_)this.setExpanded(!1);else{var a=this.getParent(),b=this.getTree();a&&a!=b&&a.select()}return!0}; +Blockly.tree.BaseNode.prototype.selectChild=function(){return this.hasChildren()?(this.getExpanded()?this.getFirstChild().select():this.setExpanded(!0),!0):!1};Blockly.tree.BaseNode.prototype.getLastShownDescendant=function(){return this.getExpanded()&&this.hasChildren()?this.getLastChild().getLastShownDescendant():this}; +Blockly.tree.BaseNode.prototype.getNextShownNode=function(){if(this.hasChildren()&&this.getExpanded())return this.getFirstChild();for(var a=this,b;a!=this.getTree();){b=a.getNextSibling();if(null!=b)return b;a=a.getParent()}return null};Blockly.tree.BaseNode.prototype.getPreviousShownNode=function(){var a=this.getPreviousSibling();if(null!=a)return a.getLastShownDescendant();a=this.getParent();var b=this.getTree();return a==b||this==b?null:a};Blockly.tree.BaseNode.prototype.getConfig=function(){return this.config_}; +Blockly.tree.BaseNode.prototype.setTreeInternal=function(a){this.tree!=a&&(this.tree=a,this.forEachChild(function(b){b.setTreeInternal(a)}))};Blockly.tree.TreeNode=function(a,b,c){this.toolbox_=a;Blockly.tree.BaseNode.call(this,b,c)};Blockly.utils.object.inherits(Blockly.tree.TreeNode,Blockly.tree.BaseNode);Blockly.tree.TreeNode.prototype.getTree=function(){if(this.tree)return this.tree;var a=this.getParent();return a&&(a=a.getTree())?(this.setTreeInternal(a),a):null}; +Blockly.tree.TreeNode.prototype.getCalculatedIconClass=function(){var a=this.getExpanded(),b=this.getExpandedIconClass();if(a&&b)return b;b=this.getIconClass();if(!a&&b)return b;b=this.getConfig();if(this.hasChildren()){if(a&&b.cssExpandedFolderIcon)return b.cssTreeIcon+" "+b.cssExpandedFolderIcon;if(!a&&b.cssCollapsedFolderIcon)return b.cssTreeIcon+" "+b.cssCollapsedFolderIcon}else if(b.cssFileIcon)return b.cssTreeIcon+" "+b.cssFileIcon;return""}; +Blockly.tree.TreeNode.prototype.onClick_=function(a){this.hasChildren()&&this.isUserCollapsible()?(this.toggle(),this.select()):this.isSelected()?this.getTree().setSelectedItem(null):this.select();this.updateRow()};Blockly.tree.TreeNode.prototype.onMouseDown=function(a){}; +Blockly.tree.TreeNode.prototype.onKeyDown=function(a){if(this.tree.toolbox_.horizontalLayout_){var b={},c=Blockly.utils.KeyCodes.DOWN,d=Blockly.utils.KeyCodes.UP;b[Blockly.utils.KeyCodes.RIGHT]=this.isRightToLeft()?d:c;b[Blockly.utils.KeyCodes.LEFT]=this.isRightToLeft()?c:d;b[Blockly.utils.KeyCodes.UP]=Blockly.utils.KeyCodes.LEFT;b[Blockly.utils.KeyCodes.DOWN]=Blockly.utils.KeyCodes.RIGHT;Object.defineProperties(a,{keyCode:{value:b[a.keyCode]||a.keyCode}})}return Blockly.tree.TreeNode.superClass_.onKeyDown.call(this, +a)};Blockly.tree.TreeNode.prototype.onSizeChanged=function(a){this.onSizeChanged_=a};Blockly.tree.TreeNode.prototype.resizeToolbox_=function(){this.onSizeChanged_&&this.onSizeChanged_.call(this.toolbox_)};Blockly.tree.TreeNode.prototype.doNodeExpanded=Blockly.tree.TreeNode.prototype.resizeToolbox_;Blockly.tree.TreeNode.prototype.doNodeCollapsed=Blockly.tree.TreeNode.prototype.resizeToolbox_;Blockly.tree.TreeControl=function(a,b){this.toolbox_=a;this.onKeydownWrapper_=this.onClickWrapper_=this.onBlurWrapper_=this.onFocusWrapper_=null;Blockly.tree.BaseNode.call(this,"",b);this.setExpandedInternal(!0);this.setSelectedInternal(!0);this.selectedItem_=this};Blockly.utils.object.inherits(Blockly.tree.TreeControl,Blockly.tree.BaseNode);Blockly.tree.TreeControl.prototype.getTree=function(){return this};Blockly.tree.TreeControl.prototype.getToolbox=function(){return this.toolbox_}; +Blockly.tree.TreeControl.prototype.getDepth=function(){return 0};Blockly.tree.TreeControl.prototype.handleFocus_=function(a){this.focused_=!0;a=this.getElement();Blockly.utils.dom.addClass(a,"focused");this.selectedItem_&&this.selectedItem_.select()};Blockly.tree.TreeControl.prototype.handleBlur_=function(a){this.focused_=!1;a=this.getElement();Blockly.utils.dom.removeClass(a,"focused")};Blockly.tree.TreeControl.prototype.hasFocus=function(){return this.focused_}; +Blockly.tree.TreeControl.prototype.getExpanded=function(){return!0};Blockly.tree.TreeControl.prototype.setExpanded=function(a){this.setExpandedInternal(a)};Blockly.tree.TreeControl.prototype.getIconElement=function(){var a=this.getRowElement();return a?a.firstChild:null};Blockly.tree.TreeControl.prototype.updateExpandIcon=function(){};Blockly.tree.TreeControl.prototype.getRowClassName=function(){return Blockly.tree.TreeControl.superClass_.getRowClassName.call(this)+" "+this.getConfig().cssHideRoot}; +Blockly.tree.TreeControl.prototype.getCalculatedIconClass=function(){var a=this.getExpanded(),b=this.getExpandedIconClass();if(a&&b)return b;b=this.getIconClass();if(!a&&b)return b;b=this.getConfig();return a&&b.cssExpandedRootIcon?b.cssTreeIcon+" "+b.cssExpandedRootIcon:""}; +Blockly.tree.TreeControl.prototype.setSelectedItem=function(a){if(a!=this.selectedItem_&&(!this.onBeforeSelected_||this.onBeforeSelected_.call(this.toolbox_,a))){var b=this.getSelectedItem();this.selectedItem_&&this.selectedItem_.setSelectedInternal(!1);(this.selectedItem_=a)&&a.setSelectedInternal(!0);this.onAfterSelected_&&this.onAfterSelected_.call(this.toolbox_,b,a)}};Blockly.tree.TreeControl.prototype.onBeforeSelected=function(a){this.onBeforeSelected_=a}; +Blockly.tree.TreeControl.prototype.onAfterSelected=function(a){this.onAfterSelected_=a};Blockly.tree.TreeControl.prototype.getSelectedItem=function(){return this.selectedItem_};Blockly.tree.TreeControl.prototype.initAccessibility=function(){Blockly.tree.TreeControl.superClass_.initAccessibility.call(this);var a=this.getElement();Blockly.utils.aria.setRole(a,Blockly.utils.aria.Role.TREE);Blockly.utils.aria.setState(a,Blockly.utils.aria.State.LABELLEDBY,this.getLabelElement().id)}; +Blockly.tree.TreeControl.prototype.enterDocument=function(){Blockly.tree.TreeControl.superClass_.enterDocument.call(this);var a=this.getElement();a.className=this.getConfig().cssRoot;a.setAttribute("hideFocus","true");this.attachEvents_();this.initAccessibility()};Blockly.tree.TreeControl.prototype.exitDocument=function(){Blockly.tree.TreeControl.superClass_.exitDocument.call(this);this.detachEvents_()}; +Blockly.tree.TreeControl.prototype.attachEvents_=function(){var a=this.getElement();a.tabIndex=0;this.onFocusWrapper_=Blockly.bindEvent_(a,"focus",this,this.handleFocus_);this.onBlurWrapper_=Blockly.bindEvent_(a,"blur",this,this.handleBlur_);this.onClickWrapper_=Blockly.bindEventWithChecks_(a,"click",this,this.handleMouseEvent_);this.onKeydownWrapper_=Blockly.bindEvent_(a,"keydown",this,this.handleKeyEvent_)}; +Blockly.tree.TreeControl.prototype.detachEvents_=function(){this.onFocusWrapper_&&(Blockly.unbindEvent_(this.onFocusWrapper_),this.onFocusWrapper_=null);this.onBlurWrapper_&&(Blockly.unbindEvent_(this.onBlurWrapper_),this.onBlurWrapper_=null);this.onClickWrapper_&&(Blockly.unbindEvent_(this.onClickWrapper_),this.onClickWrapper_=null);this.onKeydownWrapper_&&(Blockly.unbindEvent_(this.onKeydownWrapper_),this.onKeydownWrapper_=null)}; +Blockly.tree.TreeControl.prototype.handleMouseEvent_=function(a){var b=this.getNodeFromEvent_(a);if(b)switch(a.type){case "mousedown":b.onMouseDown(a);break;case "click":b.onClick_(a)}};Blockly.tree.TreeControl.prototype.handleKeyEvent_=function(a){var b=!1;if(b=this.selectedItem_&&this.selectedItem_.onKeyDown(a)||b)Blockly.utils.style.scrollIntoContainerView(this.selectedItem_.getElement(),this.getElement().parentNode),a.preventDefault();return b}; +Blockly.tree.TreeControl.prototype.getNodeFromEvent_=function(a){for(var b=a.target;null!=b;){if(a=Blockly.tree.BaseNode.allNodes[b.id])return a;if(b==this.getElement())break;b=b.parentNode}return null};Blockly.tree.TreeControl.prototype.createNode=function(a){return new Blockly.tree.TreeNode(this.toolbox_,a||"",this.getConfig())};Blockly.Toolbox=function(a){this.workspace_=a;this.RTL=a.options.RTL;this.horizontalLayout_=a.options.horizontalLayout;this.toolboxPosition=a.options.toolboxPosition;this.config_={indentWidth:19,cssRoot:"blocklyTreeRoot",cssHideRoot:"blocklyHidden",cssTreeRow:"blocklyTreeRow",cssItemLabel:"blocklyTreeLabel",cssTreeIcon:"blocklyTreeIcon",cssExpandedFolderIcon:"blocklyTreeIconOpen",cssFileIcon:"blocklyTreeIconNone",cssSelectedRow:"blocklyTreeSelected"};this.treeSeparatorConfig_={cssTreeRow:"blocklyTreeSeparator"}; +this.horizontalLayout_&&(this.config_.cssTreeRow+=a.RTL?" blocklyHorizontalTreeRtl":" blocklyHorizontalTree",this.treeSeparatorConfig_.cssTreeRow="blocklyTreeSeparatorHorizontal "+(a.RTL?"blocklyHorizontalTreeRtl":"blocklyHorizontalTree"),this.config_.cssTreeIcon="");this.flyout_=null};Blockly.Toolbox.prototype.width=0;Blockly.Toolbox.prototype.height=0;Blockly.Toolbox.prototype.selectedOption_=null;Blockly.Toolbox.prototype.lastCategory_=null; +Blockly.Toolbox.prototype.init=function(){var a=this.workspace_,b=this.workspace_.getParentSvg();this.HtmlDiv=document.createElement("div");this.HtmlDiv.className="blocklyToolboxDiv blocklyNonSelectable";this.HtmlDiv.setAttribute("dir",a.RTL?"RTL":"LTR");b.parentNode.insertBefore(this.HtmlDiv,b);var c=a.getThemeManager();c.subscribe(this.HtmlDiv,"toolboxBackgroundColour","background-color");c.subscribe(this.HtmlDiv,"toolboxForegroundColour","color");Blockly.bindEventWithChecks_(this.HtmlDiv,"mousedown", +this,function(a){Blockly.utils.isRightButton(a)||a.target==this.HtmlDiv?Blockly.hideChaff(!1):Blockly.hideChaff(!0);Blockly.Touch.clearTouchIdentifier()},!1,!0);c=new Blockly.Options({parentWorkspace:a,rtl:a.RTL,oneBasedIndex:a.options.oneBasedIndex,horizontalLayout:a.horizontalLayout,renderer:a.options.renderer});c.toolboxPosition=a.options.toolboxPosition;if(a.horizontalLayout){if(!Blockly.HorizontalFlyout)throw Error("Missing require for Blockly.HorizontalFlyout");this.flyout_=new Blockly.HorizontalFlyout(c)}else{if(!Blockly.VerticalFlyout)throw Error("Missing require for Blockly.VerticalFlyout"); +this.flyout_=new Blockly.VerticalFlyout(c)}if(!this.flyout_)throw Error("One of Blockly.VerticalFlyout or Blockly.Horizontal must berequired.");Blockly.utils.dom.insertAfter(this.flyout_.createDom("svg"),b);this.flyout_.init(a);this.config_.cleardotPath=a.options.pathToMedia+"1x1.gif";this.config_.cssCollapsedFolderIcon="blocklyTreeIconClosed"+(a.RTL?"Rtl":"Ltr");this.renderTree(a.options.languageTree)}; +Blockly.Toolbox.prototype.renderTree=function(a){this.tree_&&(this.tree_.dispose(),this.lastCategory_=null);var b=new Blockly.tree.TreeControl(this,this.config_);this.tree_=b;b.setSelectedItem(null);b.onBeforeSelected(this.handleBeforeTreeSelected_);b.onAfterSelected(this.handleAfterTreeSelected_);var c=null;if(a){this.tree_.blocks=[];this.hasColours_=!1;c=this.syncTrees_(a,this.tree_,this.workspace_.options.pathToMedia);if(this.tree_.blocks.length)throw Error("Toolbox cannot have both blocks and categories in the root level."); +this.workspace_.resizeContents()}b.render(this.HtmlDiv);c&&b.setSelectedItem(c);this.addColour_();this.position();this.horizontalLayout_&&Blockly.utils.aria.setState(this.tree_.getElement(),Blockly.utils.aria.State.ORIENTATION,"horizontal")};Blockly.Toolbox.prototype.handleBeforeTreeSelected_=function(a){if(a==this.tree_)return!1;this.lastCategory_&&(this.lastCategory_.getRowElement().style.backgroundColor="");if(a){var b=a.hexColour||"#57e";a.getRowElement().style.backgroundColor=b;this.addColour_(a)}return!0}; +Blockly.Toolbox.prototype.handleAfterTreeSelected_=function(a,b){b&&b.blocks&&b.blocks.length?(this.flyout_.show(b.blocks),this.lastCategory_!=b&&this.flyout_.scrollToStart(),this.workspace_.keyboardAccessibilityMode&&Blockly.navigation.setState(Blockly.navigation.STATE_TOOLBOX)):(this.flyout_.hide(),!this.workspace_.keyboardAccessibilityMode||b instanceof Blockly.Toolbox.TreeSeparator||Blockly.navigation.setState(Blockly.navigation.STATE_WS));a!=b&&a!=this&&(a=new Blockly.Events.Ui(null,"category", +a&&a.getText(),b&&b.getText()),a.workspaceId=this.workspace_.id,Blockly.Events.fire(a));b&&(this.lastCategory_=b)};Blockly.Toolbox.prototype.handleNodeSizeChanged_=function(){Blockly.svgResize(this.workspace_)}; +Blockly.Toolbox.prototype.onBlocklyAction=function(a){var b=this.tree_.getSelectedItem();if(!b)return!1;switch(a.name){case Blockly.navigation.actionNames.PREVIOUS:return b.selectPrevious();case Blockly.navigation.actionNames.OUT:return b.selectParent();case Blockly.navigation.actionNames.NEXT:return b.selectNext();case Blockly.navigation.actionNames.IN:return b.selectChild();default:return!1}}; +Blockly.Toolbox.prototype.dispose=function(){this.flyout_.dispose();this.tree_.dispose();this.workspace_.getThemeManager().unsubscribe(this.HtmlDiv);Blockly.utils.dom.removeNode(this.HtmlDiv);this.lastCategory_=null};Blockly.Toolbox.prototype.getWidth=function(){return this.width};Blockly.Toolbox.prototype.getHeight=function(){return this.height};Blockly.Toolbox.prototype.getFlyout=function(){return this.flyout_}; +Blockly.Toolbox.prototype.position=function(){var a=this.HtmlDiv;if(a){var b=Blockly.svgSize(this.workspace_.getParentSvg());this.horizontalLayout_?(a.style.left="0",a.style.height="auto",a.style.width=b.width+"px",this.height=a.offsetHeight,this.toolboxPosition==Blockly.TOOLBOX_AT_TOP?a.style.top="0":a.style.bottom="0"):(this.toolboxPosition==Blockly.TOOLBOX_AT_RIGHT?a.style.right="0":a.style.left="0",a.style.height=b.height+"px",this.width=a.offsetWidth);this.flyout_.position()}}; +Blockly.Toolbox.prototype.syncTrees_=function(a,b,c){for(var d=null,e=null,f=0,g;g=a.childNodes[f];f++)if(g.tagName)switch(g.tagName.toUpperCase()){case "CATEGORY":e=Blockly.utils.replaceMessageReferences(g.getAttribute("name"));var h=this.tree_.createNode(e);h.onSizeChanged(this.handleNodeSizeChanged_);h.blocks=[];b.add(h);var k=g.getAttribute("custom");k?h.blocks=k:(k=this.syncTrees_(g,h,c))&&(d=k);k=g.getAttribute("categorystyle");var l=g.getAttribute("colour");l&&k?(h.hexColour="",console.warn('Toolbox category "'+ +e+'" can not have both a style and a colour')):k?this.setColourFromStyle_(k,h,e):this.setColour_(l,h,e);"true"==g.getAttribute("expanded")?(h.blocks.length&&(d=h),h.setExpanded(!0)):h.setExpanded(!1);e=g;break;case "SEP":if(e&&"CATEGORY"==e.tagName.toUpperCase()){b.add(new Blockly.Toolbox.TreeSeparator(this.treeSeparatorConfig_));break}case "BLOCK":case "SHADOW":case "LABEL":case "BUTTON":b.blocks.push(g),e=g}return d}; +Blockly.Toolbox.prototype.setColour_=function(a,b,c){a=Blockly.utils.replaceMessageReferences(a);if(null===a||""===a)b.hexColour="";else{var d=Number(a);isNaN(d)?(d=Blockly.utils.colour.parse(a))?(b.hexColour=d,this.hasColours_=!0):(b.hexColour="",console.warn('Toolbox category "'+c+'" has unrecognized colour attribute: '+a)):(b.hexColour=Blockly.hueToHex(d),this.hasColours_=!0)}}; +Blockly.Toolbox.prototype.setColourFromStyle_=function(a,b,c){b.styleName=a;var d=this.workspace_.getTheme();a&&d&&((d=d.categoryStyles[a])&&d.colour?this.setColour_(d.colour,b,c):console.warn('Style "'+a+'" must exist and contain a colour value'))};Blockly.Toolbox.prototype.updateColourFromTheme_=function(a){if(a=a||this.tree_){a=a.getChildren(!1);for(var b=0,c;c=a[b];b++)c.styleName&&(this.setColourFromStyle_(c.styleName,c,""),this.addColour_()),this.updateColourFromTheme_(c)}}; +Blockly.Toolbox.prototype.updateColourFromTheme=function(){var a=this.tree_;a&&(this.updateColourFromTheme_(a),this.updateSelectedItemColour_(a))};Blockly.Toolbox.prototype.updateSelectedItemColour_=function(a){if(a=a.getSelectedItem()){var b=a.hexColour||"#57e";a.getRowElement().style.backgroundColor=b;this.addColour_(a)}}; +Blockly.Toolbox.prototype.addColour_=function(a){a=(a||this.tree_).getChildren(!1);for(var b=0,c;c=a[b];b++){var d=c.getRowElement();if(d){var e=this.hasColours_?"8px solid "+(c.hexColour||"#ddd"):"none";this.workspace_.RTL?d.style.borderRight=e:d.style.borderLeft=e}this.addColour_(c)}};Blockly.Toolbox.prototype.clearSelection=function(){this.tree_.setSelectedItem(null)};Blockly.Toolbox.prototype.addStyle=function(a){Blockly.utils.dom.addClass(this.HtmlDiv,a)}; +Blockly.Toolbox.prototype.removeStyle=function(a){Blockly.utils.dom.removeClass(this.HtmlDiv,a)}; +Blockly.Toolbox.prototype.getClientRect=function(){if(!this.HtmlDiv)return null;var a=this.HtmlDiv.getBoundingClientRect(),b=a.top,c=b+a.height,d=a.left;a=d+a.width;return this.toolboxPosition==Blockly.TOOLBOX_AT_TOP?new Blockly.utils.Rect(-1E7,c,-1E7,1E7):this.toolboxPosition==Blockly.TOOLBOX_AT_BOTTOM?new Blockly.utils.Rect(b,1E7,-1E7,1E7):this.toolboxPosition==Blockly.TOOLBOX_AT_LEFT?new Blockly.utils.Rect(-1E7,1E7,-1E7,a):new Blockly.utils.Rect(-1E7,1E7,d,1E7)}; +Blockly.Toolbox.prototype.refreshSelection=function(){var a=this.tree_.getSelectedItem();a&&a.blocks&&this.flyout_.show(a.blocks)};Blockly.Toolbox.prototype.selectFirstCategory=function(){this.tree_.getSelectedItem()||this.tree_.selectFirst()};Blockly.Toolbox.TreeSeparator=function(a){Blockly.tree.TreeNode.call(this,null,"",a)};Blockly.utils.object.inherits(Blockly.Toolbox.TreeSeparator,Blockly.tree.TreeNode); +Blockly.Css.register([".blocklyToolboxDelete {",'cursor: url("<<>>/handdelete.cur"), auto;',"}",".blocklyToolboxGrab {",'cursor: url("<<>>/handclosed.cur"), auto;',"cursor: grabbing;","cursor: -webkit-grabbing;","}",".blocklyToolboxDiv {","background-color: #ddd;","overflow-x: visible;","overflow-y: auto;","position: absolute;","z-index: 70;","-webkit-tap-highlight-color: transparent;","}",".blocklyTreeRoot {","padding: 4px 0;","}",".blocklyTreeRoot:focus {","outline: none;","}",".blocklyTreeRow {", +"height: 22px;","line-height: 22px;","margin-bottom: 3px;","padding-right: 8px;","white-space: nowrap;","}",".blocklyHorizontalTree {","float: left;","margin: 1px 5px 8px 0;","}",".blocklyHorizontalTreeRtl {","float: right;","margin: 1px 0 8px 5px;","}",'.blocklyToolboxDiv[dir="RTL"] .blocklyTreeRow {',"margin-left: 8px;","}",".blocklyTreeRow:not(.blocklyTreeSelected):hover {","background-color: #e4e4e4;","}",".blocklyTreeSeparator {","border-bottom: solid #e5e5e5 1px;","height: 0;","margin: 5px 0;", +"}",".blocklyTreeSeparatorHorizontal {","border-right: solid #e5e5e5 1px;","width: 0;","padding: 5px 0;","margin: 0 5px;","}",".blocklyTreeIcon {","background-image: url(<<>>/sprites.png);","height: 16px;","vertical-align: middle;","width: 16px;","}",".blocklyTreeIconClosedLtr {","background-position: -32px -1px;","}",".blocklyTreeIconClosedRtl {","background-position: 0 -1px;","}",".blocklyTreeIconOpen {","background-position: -16px -1px;","}",".blocklyTreeSelected>.blocklyTreeIconClosedLtr {", +"background-position: -32px -17px;","}",".blocklyTreeSelected>.blocklyTreeIconClosedRtl {","background-position: 0 -17px;","}",".blocklyTreeSelected>.blocklyTreeIconOpen {","background-position: -16px -17px;","}",".blocklyTreeIconNone,",".blocklyTreeSelected>.blocklyTreeIconNone {","background-position: -48px -1px;","}",".blocklyTreeLabel {","cursor: default;","font-family: sans-serif;","font-size: 16px;","padding: 0 3px;","vertical-align: middle;","}",".blocklyToolboxDelete .blocklyTreeLabel {", +'cursor: url("<<>>/handdelete.cur"), auto;',"}",".blocklyTreeSelected .blocklyTreeLabel {","color: #fff;","}"]);Blockly.Trashcan=function(a){this.workspace_=a;this.contents_=[];this.flyout=null;if(!(0>=this.workspace_.options.maxTrashcanContents)){a=new Blockly.Options({scrollbars:!0,parentWorkspace:this.workspace_,rtl:this.workspace_.RTL,oneBasedIndex:this.workspace_.options.oneBasedIndex,renderer:this.workspace_.options.renderer});if(this.workspace_.horizontalLayout){a.toolboxPosition=this.workspace_.toolboxPosition==Blockly.TOOLBOX_AT_TOP?Blockly.TOOLBOX_AT_BOTTOM:Blockly.TOOLBOX_AT_TOP;if(!Blockly.HorizontalFlyout)throw Error("Missing require for Blockly.HorizontalFlyout"); +this.flyout=new Blockly.HorizontalFlyout(a)}else{a.toolboxPosition=this.workspace_.toolboxPosition==Blockly.TOOLBOX_AT_RIGHT?Blockly.TOOLBOX_AT_LEFT:Blockly.TOOLBOX_AT_RIGHT;if(!Blockly.VerticalFlyout)throw Error("Missing require for Blockly.VerticalFlyout");this.flyout=new Blockly.VerticalFlyout(a)}this.workspace_.addChangeListener(this.onDelete_.bind(this))}};Blockly.Trashcan.prototype.WIDTH_=47;Blockly.Trashcan.prototype.BODY_HEIGHT_=44;Blockly.Trashcan.prototype.LID_HEIGHT_=16; +Blockly.Trashcan.prototype.MARGIN_BOTTOM_=20;Blockly.Trashcan.prototype.MARGIN_SIDE_=20;Blockly.Trashcan.prototype.MARGIN_HOTSPOT_=10;Blockly.Trashcan.prototype.SPRITE_LEFT_=0;Blockly.Trashcan.prototype.SPRITE_TOP_=32;Blockly.Trashcan.prototype.HAS_BLOCKS_LID_ANGLE=.1;Blockly.Trashcan.prototype.isOpen=!1;Blockly.Trashcan.prototype.minOpenness_=0;Blockly.Trashcan.prototype.svgGroup_=null;Blockly.Trashcan.prototype.svgLid_=null;Blockly.Trashcan.prototype.lidTask_=0; +Blockly.Trashcan.prototype.lidOpen_=0;Blockly.Trashcan.prototype.left_=0;Blockly.Trashcan.prototype.top_=0; +Blockly.Trashcan.prototype.createDom=function(){this.svgGroup_=Blockly.utils.dom.createSvgElement("g",{"class":"blocklyTrash"},null);var a=String(Math.random()).substring(2);var b=Blockly.utils.dom.createSvgElement("clipPath",{id:"blocklyTrashBodyClipPath"+a},this.svgGroup_);Blockly.utils.dom.createSvgElement("rect",{width:this.WIDTH_,height:this.BODY_HEIGHT_,y:this.LID_HEIGHT_},b);var c=Blockly.utils.dom.createSvgElement("image",{width:Blockly.SPRITE.width,x:-this.SPRITE_LEFT_,height:Blockly.SPRITE.height, +y:-this.SPRITE_TOP_,"clip-path":"url(#blocklyTrashBodyClipPath"+a+")"},this.svgGroup_);c.setAttributeNS(Blockly.utils.dom.XLINK_NS,"xlink:href",this.workspace_.options.pathToMedia+Blockly.SPRITE.url);b=Blockly.utils.dom.createSvgElement("clipPath",{id:"blocklyTrashLidClipPath"+a},this.svgGroup_);Blockly.utils.dom.createSvgElement("rect",{width:this.WIDTH_,height:this.LID_HEIGHT_},b);this.svgLid_=Blockly.utils.dom.createSvgElement("image",{width:Blockly.SPRITE.width,x:-this.SPRITE_LEFT_,height:Blockly.SPRITE.height, +y:-this.SPRITE_TOP_,"clip-path":"url(#blocklyTrashLidClipPath"+a+")"},this.svgGroup_);this.svgLid_.setAttributeNS(Blockly.utils.dom.XLINK_NS,"xlink:href",this.workspace_.options.pathToMedia+Blockly.SPRITE.url);Blockly.bindEventWithChecks_(this.svgGroup_,"mouseup",this,this.click);Blockly.bindEvent_(c,"mouseover",this,this.mouseOver_);Blockly.bindEvent_(c,"mouseout",this,this.mouseOut_);this.animateLid_();return this.svgGroup_}; +Blockly.Trashcan.prototype.init=function(a){0this.minOpenness_&&1>this.lidOpen_&&(this.lidTask_=setTimeout(this.animateLid_.bind(this),20))}; +Blockly.Trashcan.prototype.setLidAngle_=function(a){var b=this.workspace_.toolboxPosition==Blockly.TOOLBOX_AT_RIGHT||this.workspace_.horizontalLayout&&this.workspace_.RTL;this.svgLid_.setAttribute("transform","rotate("+(b?-a:a)+","+(b?4:this.WIDTH_-4)+","+(this.LID_HEIGHT_-2)+")")};Blockly.Trashcan.prototype.close=function(){this.setOpen(!1)};Blockly.Trashcan.prototype.click=function(){if(this.contents_.length){for(var a=[],b=0,c;c=this.contents_[b];b++)a[b]=Blockly.Xml.textToDom(c);this.flyout.show(a)}}; +Blockly.Trashcan.prototype.mouseOver_=function(){this.contents_.length&&this.setOpen(!0)};Blockly.Trashcan.prototype.mouseOut_=function(){this.setOpen(!1)}; +Blockly.Trashcan.prototype.onDelete_=function(a){if(!(0>=this.workspace_.options.maxTrashcanContents)&&a.type==Blockly.Events.BLOCK_DELETE&&"shadow"!=a.oldXml.tagName.toLowerCase()&&(a=this.cleanBlockXML_(a.oldXml),-1==this.contents_.indexOf(a))){for(this.contents_.unshift(a);this.contents_.length>this.workspace_.options.maxTrashcanContents;)this.contents_.pop();this.minOpenness_=this.HAS_BLOCKS_LID_ANGLE;this.setLidAngle_(45*this.minOpenness_)}}; +Blockly.Trashcan.prototype.cleanBlockXML_=function(a){for(var b=a=a.cloneNode(!0);b;){b.removeAttribute&&(b.removeAttribute("x"),b.removeAttribute("y"),b.removeAttribute("id"),b.removeAttribute("disabled"),"comment"==b.nodeName&&(b.removeAttribute("h"),b.removeAttribute("w"),b.removeAttribute("pinned")));var c=b.firstChild||b.nextSibling;if(!c)for(c=b.parentNode;c;){if(c.nextSibling){c=c.nextSibling;break}c=c.parentNode}b=c}return Blockly.Xml.domToText(a)};Blockly.VariablesDynamic={};Blockly.VariablesDynamic.onCreateVariableButtonClick_String=function(a){Blockly.Variables.createVariableButtonHandler(a.getTargetWorkspace(),void 0,"String")};Blockly.VariablesDynamic.onCreateVariableButtonClick_Number=function(a){Blockly.Variables.createVariableButtonHandler(a.getTargetWorkspace(),void 0,"Number")};Blockly.VariablesDynamic.onCreateVariableButtonClick_Colour=function(a){Blockly.Variables.createVariableButtonHandler(a.getTargetWorkspace(),void 0,"Colour")}; +Blockly.VariablesDynamic.flyoutCategory=function(a){var b=[],c=document.createElement("button");c.setAttribute("text",Blockly.Msg.NEW_STRING_VARIABLE);c.setAttribute("callbackKey","CREATE_VARIABLE_STRING");b.push(c);c=document.createElement("button");c.setAttribute("text",Blockly.Msg.NEW_NUMBER_VARIABLE);c.setAttribute("callbackKey","CREATE_VARIABLE_NUMBER");b.push(c);c=document.createElement("button");c.setAttribute("text",Blockly.Msg.NEW_COLOUR_VARIABLE);c.setAttribute("callbackKey","CREATE_VARIABLE_COLOUR"); +b.push(c);a.registerButtonCallback("CREATE_VARIABLE_STRING",Blockly.VariablesDynamic.onCreateVariableButtonClick_String);a.registerButtonCallback("CREATE_VARIABLE_NUMBER",Blockly.VariablesDynamic.onCreateVariableButtonClick_Number);a.registerButtonCallback("CREATE_VARIABLE_COLOUR",Blockly.VariablesDynamic.onCreateVariableButtonClick_Colour);a=Blockly.VariablesDynamic.flyoutCategoryBlocks(a);return b=b.concat(a)}; +Blockly.VariablesDynamic.flyoutCategoryBlocks=function(a){a=a.getAllVariables();var b=[];if(0image, .blocklyZoom>svg>image {","opacity: .4;","}",".blocklyZoom>image:hover, .blocklyZoom>svg>image:hover {","opacity: .6;","}",".blocklyZoom>image:active, .blocklyZoom>svg>image:active {","opacity: .8;","}"]);Blockly.Mutator=function(a){Blockly.Mutator.superClass_.constructor.call(this,null);this.quarkNames_=a};Blockly.utils.object.inherits(Blockly.Mutator,Blockly.Icon);Blockly.Mutator.prototype.workspaceWidth_=0;Blockly.Mutator.prototype.workspaceHeight_=0;Blockly.Mutator.prototype.setBlock=function(a){this.block_=a};Blockly.Mutator.prototype.getWorkspace=function(){return this.workspace_}; +Blockly.Mutator.prototype.drawIcon_=function(a){Blockly.utils.dom.createSvgElement("rect",{"class":"blocklyIconShape",rx:"4",ry:"4",height:"16",width:"16"},a);Blockly.utils.dom.createSvgElement("path",{"class":"blocklyIconSymbol",d:"m4.203,7.296 0,1.368 -0.92,0.677 -0.11,0.41 0.9,1.559 0.41,0.11 1.043,-0.457 1.187,0.683 0.127,1.134 0.3,0.3 1.8,0 0.3,-0.299 0.127,-1.138 1.185,-0.682 1.046,0.458 0.409,-0.11 0.9,-1.559 -0.11,-0.41 -0.92,-0.677 0,-1.366 0.92,-0.677 0.11,-0.41 -0.9,-1.559 -0.409,-0.109 -1.046,0.458 -1.185,-0.682 -0.127,-1.138 -0.3,-0.299 -1.8,0 -0.3,0.3 -0.126,1.135 -1.187,0.682 -1.043,-0.457 -0.41,0.11 -0.899,1.559 0.108,0.409z"}, +a);Blockly.utils.dom.createSvgElement("circle",{"class":"blocklyIconShape",r:"2.7",cx:"8",cy:"8"},a)};Blockly.Mutator.prototype.iconClick_=function(a){this.block_.isEditable()&&Blockly.Icon.prototype.iconClick_.call(this,a)}; +Blockly.Mutator.prototype.createEditor_=function(){this.svgDialog_=Blockly.utils.dom.createSvgElement("svg",{x:Blockly.Bubble.BORDER_WIDTH,y:Blockly.Bubble.BORDER_WIDTH},null);if(this.quarkNames_.length)for(var a=Blockly.utils.xml.createElement("xml"),b=0,c;c=this.quarkNames_[b];b++){var d=Blockly.utils.xml.createElement("block");d.setAttribute("type",c);a.appendChild(d)}else a=null;b=new Blockly.Options({disable:!1,parentWorkspace:this.block_.workspace,media:this.block_.workspace.options.pathToMedia, +rtl:this.block_.RTL,horizontalLayout:!1,renderer:this.block_.workspace.options.renderer});b.toolboxPosition=this.block_.RTL?Blockly.TOOLBOX_AT_RIGHT:Blockly.TOOLBOX_AT_LEFT;b.languageTree=a;b.getMetrics=this.getFlyoutMetrics_.bind(this);this.workspace_=new Blockly.WorkspaceSvg(b);this.workspace_.isMutator=!0;this.workspace_.addChangeListener(Blockly.Events.disableOrphans);a=this.workspace_.addFlyout("g");b=this.workspace_.createDom("blocklyMutatorBackground");b.insertBefore(a,this.workspace_.svgBlockCanvas_); +this.svgDialog_.appendChild(b);return this.svgDialog_};Blockly.Mutator.prototype.updateEditable=function(){Blockly.Mutator.superClass_.updateEditable.call(this);this.block_.isInFlyout||(this.block_.isEditable()?this.iconGroup_&&Blockly.utils.dom.removeClass(this.iconGroup_,"blocklyIconGroupReadonly"):(this.setVisible(!1),this.iconGroup_&&Blockly.utils.dom.addClass(this.iconGroup_,"blocklyIconGroupReadonly")))}; +Blockly.Mutator.prototype.resizeBubble_=function(){var a=2*Blockly.Bubble.BORDER_WIDTH,b=this.workspace_.getCanvas().getBBox();var c=this.block_.RTL?-b.x:b.width+b.x;b=b.height+3*a;var d=this.workspace_.getFlyout();d&&(d=d.getMetrics_(),b=Math.max(b,d.contentHeight+20));c+=3*a;if(Math.abs(this.workspaceWidth_-c)>a||Math.abs(this.workspaceHeight_-b)>a)this.workspaceWidth_=c,this.workspaceHeight_=b,this.bubble_.setBubbleSize(c+a,b+a),this.svgDialog_.setAttribute("width",this.workspaceWidth_),this.svgDialog_.setAttribute("height", +this.workspaceHeight_);this.block_.RTL&&(a="translate("+this.workspaceWidth_+",0)",this.workspace_.getCanvas().setAttribute("transform",a));this.workspace_.resize()};Blockly.Mutator.prototype.onBubbleMove_=function(){this.workspace_&&this.workspace_.recordDeleteAreas()}; +Blockly.Mutator.prototype.setVisible=function(a){if(a!=this.isVisible())if(Blockly.Events.fire(new Blockly.Events.Ui(this.block_,"mutatorOpen",!a,a)),a){this.bubble_=new Blockly.Bubble(this.block_.workspace,this.createEditor_(),this.block_.pathObject.svgPath,this.iconXY_,null,null);this.bubble_.setSvgId(this.block_.id);this.bubble_.registerMoveEvent(this.onBubbleMove_.bind(this));var b=this.workspace_.options.languageTree;a=this.workspace_.getFlyout();b&&(a.init(this.workspace_),a.show(b.childNodes)); +this.rootBlock_=this.block_.decompose(this.workspace_);b=this.rootBlock_.getDescendants(!1);for(var c=0,d;d=b[c];c++)d.render();this.rootBlock_.setMovable(!1);this.rootBlock_.setDeletable(!1);a?(b=2*a.CORNER_RADIUS,a=a.getWidth()+b):a=b=16;this.block_.RTL&&(a=-a);this.rootBlock_.moveBy(a,b);if(this.block_.saveConnections){var e=this,f=this.block_;f.saveConnections(this.rootBlock_);this.sourceListener_=function(){f.saveConnections(e.rootBlock_)};this.block_.workspace.addChangeListener(this.sourceListener_)}this.resizeBubble_(); +this.workspace_.addChangeListener(this.workspaceChanged_.bind(this));this.applyColour()}else this.svgDialog_=null,this.workspace_.dispose(),this.rootBlock_=this.workspace_=null,this.bubble_.dispose(),this.bubble_=null,this.workspaceHeight_=this.workspaceWidth_=0,this.sourceListener_&&(this.block_.workspace.removeChangeListener(this.sourceListener_),this.sourceListener_=null)}; +Blockly.Mutator.prototype.workspaceChanged_=function(a){if(a.type!=Blockly.Events.UI&&(a.type!=Blockly.Events.CHANGE||"disabled"!=a.element)){if(!this.workspace_.isDragging()){a=this.workspace_.getTopBlocks(!1);for(var b=0,c;c=a[b];b++){var d=c.getRelativeToSurfaceXY(),e=c.getHeightWidth();20>d.y+e.height&&c.moveBy(0,20-e.height-d.y)}}if(this.rootBlock_.workspace==this.workspace_){Blockly.Events.setGroup(!0);c=this.block_;a=(a=c.mutationToDom())&&Blockly.Xml.domToText(a);c.compose(this.rootBlock_); +c.initSvg();c.render();Blockly.getMainWorkspace().keyboardAccessibilityMode&&Blockly.navigation.moveCursorOnBlockMutation(c);b=(b=c.mutationToDom())&&Blockly.Xml.domToText(b);if(a!=b){Blockly.Events.fire(new Blockly.Events.BlockChange(c,"mutation",null,a,b));var f=Blockly.Events.getGroup();setTimeout(function(){Blockly.Events.setGroup(f);c.bumpNeighbours();Blockly.Events.setGroup(!1)},Blockly.BUMP_DELAY)}this.workspace_.isDragging()||this.resizeBubble_();Blockly.Events.setGroup(!1)}}}; +Blockly.Mutator.prototype.getFlyoutMetrics_=function(){return{viewHeight:this.workspaceHeight_,viewWidth:this.workspaceWidth_-this.workspace_.getFlyout().getWidth(),absoluteTop:0,absoluteLeft:this.workspace_.RTL?0:this.workspace_.getFlyout().getWidth()}};Blockly.Mutator.prototype.dispose=function(){this.block_.mutator=null;Blockly.Icon.prototype.dispose.call(this)}; +Blockly.Mutator.prototype.updateBlockStyle=function(){var a=this.workspace_;if(a&&a.getAllBlocks(!1)){for(var b=a.getAllBlocks(!1),c=0;c=a&&this.sourceBlock_.outputConnection&&!b}else this.fullBlockClickTarget_=!1;this.fullBlockClickTarget_?this.clickTarget_=this.sourceBlock_.getSvgRoot():this.createBorderRect_();this.createTextElement_()}; +Blockly.FieldTextInput.prototype.doClassValidation_=function(a){return null===a||void 0===a?null:String(a)};Blockly.FieldTextInput.prototype.doValueInvalid_=function(a){this.isBeingEdited_&&(this.isTextValid_=!1,a=this.value_,this.value_=this.htmlInput_.untypedDefaultValue_,this.sourceBlock_&&Blockly.Events.isEnabled()&&Blockly.Events.fire(new Blockly.Events.BlockChange(this.sourceBlock_,"field",this.name||null,a,this.value_)))}; +Blockly.FieldTextInput.prototype.doValueUpdate_=function(a){this.isTextValid_=!0;this.value_=a;this.isBeingEdited_||(this.isDirty_=!0)};Blockly.FieldTextInput.prototype.applyColour=function(){this.sourceBlock_&&this.constants_.FULL_BLOCK_FIELDS&&(this.borderRect_?this.borderRect_.setAttribute("stroke",this.sourceBlock_.style.colourTertiary):this.sourceBlock_.pathObject.svgPath.setAttribute("fill",this.constants_.FIELD_BORDER_RECT_COLOUR))}; +Blockly.FieldTextInput.prototype.render_=function(){Blockly.FieldTextInput.superClass_.render_.call(this);if(this.isBeingEdited_){this.resizeEditor_();var a=this.htmlInput_;this.isTextValid_?(Blockly.utils.dom.removeClass(a,"blocklyInvalidInput"),Blockly.utils.aria.setState(a,Blockly.utils.aria.State.INVALID,!1)):(Blockly.utils.dom.addClass(a,"blocklyInvalidInput"),Blockly.utils.aria.setState(a,Blockly.utils.aria.State.INVALID,!0))}}; +Blockly.FieldTextInput.prototype.setSpellcheck=function(a){a!=this.spellcheck_&&(this.spellcheck_=a,this.htmlInput_&&this.htmlInput_.setAttribute("spellcheck",this.spellcheck_))};Blockly.FieldTextInput.prototype.showEditor_=function(a,b){this.workspace_=this.sourceBlock_.workspace;a=b||!1;!a&&(Blockly.utils.userAgent.MOBILE||Blockly.utils.userAgent.ANDROID||Blockly.utils.userAgent.IPAD)?this.showPromptEditor_():this.showInlineEditor_(a)}; +Blockly.FieldTextInput.prototype.showPromptEditor_=function(){var a=this;Blockly.prompt(Blockly.Msg.CHANGE_VALUE_TITLE,this.getText(),function(b){a.setValue(b)})};Blockly.FieldTextInput.prototype.showInlineEditor_=function(a){Blockly.WidgetDiv.show(this,this.sourceBlock_.RTL,this.widgetDispose_.bind(this));this.htmlInput_=this.widgetCreate_();this.isBeingEdited_=!0;a||(this.htmlInput_.focus({preventScroll:!0}),this.htmlInput_.select())}; +Blockly.FieldTextInput.prototype.widgetCreate_=function(){var a=Blockly.WidgetDiv.DIV;Blockly.utils.dom.addClass(this.getClickTarget_(),"editing");var b=document.createElement("input");b.className="blocklyHtmlInput";b.setAttribute("spellcheck",this.spellcheck_);var c=this.workspace_.scale,d=this.constants_.FIELD_TEXT_FONTSIZE*c+"pt";a.style.fontSize=d;b.style.fontSize=d;d=Blockly.FieldTextInput.BORDERRADIUS*c+"px";if(this.fullBlockClickTarget_){d=this.getScaledBBox();d=(d.bottom-d.top)/2+"px";var e= +this.sourceBlock_.getParent()?this.sourceBlock_.getParent().style.colourTertiary:this.sourceBlock_.style.colourTertiary;b.style.border=1*c+"px solid "+e;a.style.borderRadius=d;a.style.transition="box-shadow 0.25s ease 0s";this.constants_.FIELD_TEXTINPUT_BOX_SHADOW&&(a.style.boxShadow="rgba(255, 255, 255, 0.3) 0px 0px 0px "+4*c+"px")}b.style.borderRadius=d;a.appendChild(b);b.value=b.defaultValue=this.getEditorText_(this.value_);b.untypedDefaultValue_=this.value_;b.oldValue_=null;this.resizeEditor_(); +this.bindInputEvents_(b);return b};Blockly.FieldTextInput.prototype.widgetDispose_=function(){this.isBeingEdited_=!1;this.isTextValid_=!0;this.forceRerender();if(this.onFinishEditing_)this.onFinishEditing_(this.value_);this.unbindInputEvents_();var a=Blockly.WidgetDiv.DIV.style;a.width="auto";a.height="auto";a.fontSize="";a.transition="";a.boxShadow="";this.htmlInput_=null;Blockly.utils.dom.removeClass(this.getClickTarget_(),"editing")}; +Blockly.FieldTextInput.prototype.bindInputEvents_=function(a){this.onKeyDownWrapper_=Blockly.bindEventWithChecks_(a,"keydown",this,this.onHtmlInputKeyDown_);this.onKeyInputWrapper_=Blockly.bindEventWithChecks_(a,"input",this,this.onHtmlInputChange_)}; +Blockly.FieldTextInput.prototype.unbindInputEvents_=function(){this.onKeyDownWrapper_&&(Blockly.unbindEvent_(this.onKeyDownWrapper_),this.onKeyDownWrapper_=null);this.onKeyInputWrapper_&&(Blockly.unbindEvent_(this.onKeyInputWrapper_),this.onKeyInputWrapper_=null)}; +Blockly.FieldTextInput.prototype.onHtmlInputKeyDown_=function(a){a.keyCode==Blockly.utils.KeyCodes.ENTER?(Blockly.WidgetDiv.hide(),Blockly.DropDownDiv.hideWithoutAnimation()):a.keyCode==Blockly.utils.KeyCodes.ESC?(this.htmlInput_.value=this.htmlInput_.defaultValue,Blockly.WidgetDiv.hide(),Blockly.DropDownDiv.hideWithoutAnimation()):a.keyCode==Blockly.utils.KeyCodes.TAB&&(Blockly.WidgetDiv.hide(),Blockly.DropDownDiv.hideWithoutAnimation(),this.sourceBlock_.tab(this,!a.shiftKey),a.preventDefault())}; +Blockly.FieldTextInput.prototype.onHtmlInputChange_=function(a){a=this.htmlInput_.value;a!==this.htmlInput_.oldValue_&&(this.htmlInput_.oldValue_=a,Blockly.Events.setGroup(!0),a=this.getValueFromEditorText_(a),this.setValue(a),this.forceRerender(),this.resizeEditor_(),Blockly.Events.setGroup(!1))};Blockly.FieldTextInput.prototype.setEditorValue_=function(a){this.isDirty_=!0;this.isBeingEdited_&&(this.htmlInput_.value=this.getEditorText_(a));this.setValue(a)}; +Blockly.FieldTextInput.prototype.resizeEditor_=function(){var a=Blockly.WidgetDiv.DIV,b=this.getScaledBBox();a.style.width=b.right-b.left+"px";a.style.height=b.bottom-b.top+"px";b=new Blockly.utils.Coordinate(this.sourceBlock_.RTL?b.right-a.offsetWidth:b.left,b.top);a.style.left=b.x+"px";a.style.top=b.y+"px"}; +Blockly.FieldTextInput.numberValidator=function(a){console.warn("Blockly.FieldTextInput.numberValidator is deprecated. Use Blockly.FieldNumber instead.");if(null===a)return null;a=String(a);a=a.replace(/O/ig,"0");a=a.replace(/,/g,"");a=Number(a||0);return isNaN(a)?null:String(a)};Blockly.FieldTextInput.nonnegativeIntegerValidator=function(a){(a=Blockly.FieldTextInput.numberValidator(a))&&(a=String(Math.max(0,Math.floor(a))));return a};Blockly.FieldTextInput.prototype.isTabNavigable=function(){return!0}; +Blockly.FieldTextInput.prototype.getText_=function(){return this.isBeingEdited_&&this.htmlInput_?this.htmlInput_.value:null};Blockly.FieldTextInput.prototype.getEditorText_=function(a){return String(a)};Blockly.FieldTextInput.prototype.getValueFromEditorText_=function(a){return a};Blockly.fieldRegistry.register("field_input",Blockly.FieldTextInput);Blockly.FieldAngle=function(a,b,c){this.clockwise_=Blockly.FieldAngle.CLOCKWISE;this.offset_=Blockly.FieldAngle.OFFSET;this.wrap_=Blockly.FieldAngle.WRAP;this.round_=Blockly.FieldAngle.ROUND;Blockly.FieldAngle.superClass_.constructor.call(this,a||0,b,c);this.moveSurfaceWrapper_=this.clickSurfaceWrapper_=this.clickWrapper_=this.line_=this.gauge_=null};Blockly.utils.object.inherits(Blockly.FieldAngle,Blockly.FieldTextInput); +Blockly.FieldAngle.fromJson=function(a){return new Blockly.FieldAngle(a.angle,void 0,a)};Blockly.FieldAngle.prototype.SERIALIZABLE=!0;Blockly.FieldAngle.ROUND=15;Blockly.FieldAngle.HALF=50;Blockly.FieldAngle.CLOCKWISE=!1;Blockly.FieldAngle.OFFSET=0;Blockly.FieldAngle.WRAP=360;Blockly.FieldAngle.RADIUS=Blockly.FieldAngle.HALF-1; +Blockly.FieldAngle.prototype.configure_=function(a){Blockly.FieldAngle.superClass_.configure_.call(this,a);switch(a.mode){case "compass":this.clockwise_=!0;this.offset_=90;break;case "protractor":this.clockwise_=!1,this.offset_=0}var b=a.clockwise;"boolean"==typeof b&&(this.clockwise_=b);b=a.offset;null!=b&&(b=Number(b),isNaN(b)||(this.offset_=b));b=a.wrap;null!=b&&(b=Number(b),isNaN(b)||(this.wrap_=b));a=a.round;null!=a&&(a=Number(a),isNaN(a)||(this.round_=a))}; +Blockly.FieldAngle.prototype.initView=function(){Blockly.FieldAngle.superClass_.initView.call(this);this.symbol_=Blockly.utils.dom.createSvgElement("tspan",{},null);this.symbol_.appendChild(document.createTextNode("\u00b0"));this.textElement_.appendChild(this.symbol_)};Blockly.FieldAngle.prototype.render_=function(){Blockly.FieldAngle.superClass_.render_.call(this);this.updateGraph_()}; +Blockly.FieldAngle.prototype.showEditor_=function(a){Blockly.FieldAngle.superClass_.showEditor_.call(this,a,Blockly.utils.userAgent.MOBILE||Blockly.utils.userAgent.ANDROID||Blockly.utils.userAgent.IPAD);a=this.dropdownCreate_();Blockly.DropDownDiv.getContentDiv().appendChild(a);Blockly.DropDownDiv.setColour(this.sourceBlock_.style.colourPrimary,this.sourceBlock_.style.colourTertiary);Blockly.DropDownDiv.showPositionedByField(this,this.dropdownDispose_.bind(this));this.updateGraph_()}; +Blockly.FieldAngle.prototype.dropdownCreate_=function(){var a=Blockly.utils.dom.createSvgElement("svg",{xmlns:Blockly.utils.dom.SVG_NS,"xmlns:html":Blockly.utils.dom.HTML_NS,"xmlns:xlink":Blockly.utils.dom.XLINK_NS,version:"1.1",height:2*Blockly.FieldAngle.HALF+"px",width:2*Blockly.FieldAngle.HALF+"px",style:"touch-action: none"},null),b=Blockly.utils.dom.createSvgElement("circle",{cx:Blockly.FieldAngle.HALF,cy:Blockly.FieldAngle.HALF,r:Blockly.FieldAngle.RADIUS,"class":"blocklyAngleCircle"},a);this.gauge_= +Blockly.utils.dom.createSvgElement("path",{"class":"blocklyAngleGauge"},a);this.line_=Blockly.utils.dom.createSvgElement("line",{x1:Blockly.FieldAngle.HALF,y1:Blockly.FieldAngle.HALF,"class":"blocklyAngleLine"},a);for(var c=0;360>c;c+=15)Blockly.utils.dom.createSvgElement("line",{x1:Blockly.FieldAngle.HALF+Blockly.FieldAngle.RADIUS,y1:Blockly.FieldAngle.HALF,x2:Blockly.FieldAngle.HALF+Blockly.FieldAngle.RADIUS-(0==c%45?10:5),y2:Blockly.FieldAngle.HALF,"class":"blocklyAngleMarks",transform:"rotate("+ +c+","+Blockly.FieldAngle.HALF+","+Blockly.FieldAngle.HALF+")"},a);this.clickWrapper_=Blockly.bindEventWithChecks_(a,"click",this,this.hide_);this.clickSurfaceWrapper_=Blockly.bindEventWithChecks_(b,"click",this,this.onMouseMove_,!0,!0);this.moveSurfaceWrapper_=Blockly.bindEventWithChecks_(b,"mousemove",this,this.onMouseMove_,!0,!0);return a}; +Blockly.FieldAngle.prototype.dropdownDispose_=function(){this.clickWrapper_&&(Blockly.unbindEvent_(this.clickWrapper_),this.clickWrapper_=null);this.clickSurfaceWrapper_&&(Blockly.unbindEvent_(this.clickSurfaceWrapper_),this.clickSurfaceWrapper_=null);this.moveSurfaceWrapper_&&(Blockly.unbindEvent_(this.moveSurfaceWrapper_),this.moveSurfaceWrapper_=null);this.line_=this.gauge_=null};Blockly.FieldAngle.prototype.hide_=function(){Blockly.DropDownDiv.hideIfOwner(this);Blockly.WidgetDiv.hide()}; +Blockly.FieldAngle.prototype.onMouseMove_=function(a){var b=this.gauge_.ownerSVGElement.getBoundingClientRect(),c=a.clientX-b.left-Blockly.FieldAngle.HALF;a=a.clientY-b.top-Blockly.FieldAngle.HALF;b=Math.atan(-a/c);isNaN(b)||(b=Blockly.utils.math.toDegrees(b),0>c?b+=180:0a&&(a+=360);a>this.wrap_&&(a-=360);return a};Blockly.Css.register(".blocklyAngleCircle {,stroke: #444;,stroke-width: 1;,fill: #ddd;,fill-opacity: .8;,},.blocklyAngleMarks {,stroke: #444;,stroke-width: 1;,},.blocklyAngleGauge {,fill: #f88;,fill-opacity: .8;,pointer-events: none;,},.blocklyAngleLine {,stroke: #f00;,stroke-width: 2;,stroke-linecap: round;,pointer-events: none;,}".split(",")); +Blockly.fieldRegistry.register("field_angle",Blockly.FieldAngle);Blockly.FieldCheckbox=function(a,b,c){this.checkChar_=null;null==a&&(a="FALSE");Blockly.FieldCheckbox.superClass_.constructor.call(this,a,b,c)};Blockly.utils.object.inherits(Blockly.FieldCheckbox,Blockly.Field);Blockly.FieldCheckbox.fromJson=function(a){return new Blockly.FieldCheckbox(a.checked,void 0,a)};Blockly.FieldCheckbox.CHECK_CHAR="\u2713";Blockly.FieldCheckbox.prototype.SERIALIZABLE=!0;Blockly.FieldCheckbox.prototype.CURSOR="default";Blockly.FieldCheckbox.prototype.isDirty_=!1; +Blockly.FieldCheckbox.prototype.configure_=function(a){Blockly.FieldCheckbox.superClass_.configure_.call(this,a);a.checkCharacter&&(this.checkChar_=a.checkCharacter)}; +Blockly.FieldCheckbox.prototype.initView=function(){this.size_.width=this.constants_.FIELD_CHECKBOX_DEFAULT_WIDTH;Blockly.FieldCheckbox.superClass_.initView.call(this);this.textElement_.setAttribute("x",this.constants_.FIELD_CHECKBOX_X_OFFSET);this.textElement_.setAttribute("y",this.constants_.FIELD_CHECKBOX_Y_OFFSET);this.textElement_.removeAttribute("dominant-baseline");Blockly.utils.dom.addClass(this.textElement_,"blocklyCheckbox");this.textContent_.nodeValue=this.checkChar_||Blockly.FieldCheckbox.CHECK_CHAR; +this.textElement_.style.display=this.value_?"block":"none"};Blockly.FieldCheckbox.prototype.setCheckCharacter=function(a){this.checkChar_=a;this.textContent_&&(this.textContent_.nodeValue=a||Blockly.FieldCheckbox.CHECK_CHAR)};Blockly.FieldCheckbox.prototype.showEditor_=function(){this.setValue(!this.value_)};Blockly.FieldCheckbox.prototype.doClassValidation_=function(a){return!0===a||"TRUE"===a?"TRUE":!1===a||"FALSE"===a?"FALSE":null}; +Blockly.FieldCheckbox.prototype.doValueUpdate_=function(a){this.value_=this.convertValueToBool_(a);this.textElement_&&(this.textElement_.style.display=this.value_?"block":"none")};Blockly.FieldCheckbox.prototype.getValue=function(){return this.value_?"TRUE":"FALSE"};Blockly.FieldCheckbox.prototype.getValueBoolean=function(){return this.value_};Blockly.FieldCheckbox.prototype.getText=function(){return String(this.convertValueToBool_(this.value_))}; +Blockly.FieldCheckbox.prototype.convertValueToBool_=function(a){return"string"==typeof a?"TRUE"==a:!!a};Blockly.fieldRegistry.register("field_checkbox",Blockly.FieldCheckbox);Blockly.FieldColour=function(a,b,c){Blockly.FieldColour.superClass_.constructor.call(this,a||Blockly.FieldColour.COLOURS[0],b,c);this.onKeyDownWrapper_=this.onMouseLeaveWrapper_=this.onMouseEnterWrapper_=this.onMouseMoveWrapper_=this.onClickWrapper_=this.highlightedIndex_=this.picker_=null};Blockly.utils.object.inherits(Blockly.FieldColour,Blockly.Field);Blockly.FieldColour.fromJson=function(a){return new Blockly.FieldColour(a.colour,void 0,a)};Blockly.FieldColour.prototype.SERIALIZABLE=!0; +Blockly.FieldColour.prototype.CURSOR="default";Blockly.FieldColour.prototype.isDirty_=!1;Blockly.FieldColour.prototype.colours_=null;Blockly.FieldColour.prototype.titles_=null;Blockly.FieldColour.prototype.columns_=0;Blockly.FieldColour.prototype.configure_=function(a){Blockly.FieldColour.superClass_.configure_.call(this,a);a.colourOptions&&(this.colours_=a.colourOptions,this.titles_=a.colourTitles);a.columns&&(this.columns_=a.columns)}; +Blockly.FieldColour.prototype.initView=function(){this.size_=new Blockly.utils.Size(this.constants_.FIELD_COLOUR_DEFAULT_WIDTH,this.constants_.FIELD_COLOUR_DEFAULT_HEIGHT);this.constants_.FIELD_COLOUR_FULL_BLOCK?this.clickTarget_=this.sourceBlock_.getSvgRoot():(this.createBorderRect_(),this.borderRect_.style.fillOpacity="1")}; +Blockly.FieldColour.prototype.applyColour=function(){this.constants_.FIELD_COLOUR_FULL_BLOCK?(this.sourceBlock_.pathObject.svgPath.setAttribute("fill",this.getValue()),this.sourceBlock_.pathObject.svgPath.setAttribute("stroke","#fff")):this.borderRect_&&(this.borderRect_.style.fill=this.getValue())};Blockly.FieldColour.prototype.doClassValidation_=function(a){return"string"!=typeof a?null:Blockly.utils.colour.parse(a)}; +Blockly.FieldColour.prototype.doValueUpdate_=function(a){this.value_=a;this.borderRect_?this.borderRect_.style.fill=a:this.sourceBlock_&&(this.sourceBlock_.pathObject.svgPath.setAttribute("fill",a),this.sourceBlock_.pathObject.svgPath.setAttribute("stroke","#fff"))};Blockly.FieldColour.prototype.getText=function(){var a=this.value_;/^#(.)\1(.)\2(.)\3$/.test(a)&&(a="#"+a[1]+a[3]+a[5]);return a};Blockly.FieldColour.COLOURS="#ffffff #cccccc #c0c0c0 #999999 #666666 #333333 #000000 #ffcccc #ff6666 #ff0000 #cc0000 #990000 #660000 #330000 #ffcc99 #ff9966 #ff9900 #ff6600 #cc6600 #993300 #663300 #ffff99 #ffff66 #ffcc66 #ffcc33 #cc9933 #996633 #663333 #ffffcc #ffff33 #ffff00 #ffcc00 #999900 #666600 #333300 #99ff99 #66ff99 #33ff33 #33cc00 #009900 #006600 #003300 #99ffff #33ffff #66cccc #00cccc #339999 #336666 #003333 #ccffff #66ffff #33ccff #3366ff #3333ff #000099 #000066 #ccccff #9999ff #6666cc #6633ff #6600cc #333399 #330099 #ffccff #ff99ff #cc66cc #cc33cc #993399 #663366 #330033".split(" "); +Blockly.FieldColour.TITLES=[];Blockly.FieldColour.COLUMNS=7;Blockly.FieldColour.prototype.setColours=function(a,b){this.colours_=a;b&&(this.titles_=b);return this};Blockly.FieldColour.prototype.setColumns=function(a){this.columns_=a;return this};Blockly.FieldColour.prototype.showEditor_=function(){this.picker_=this.dropdownCreate_();Blockly.DropDownDiv.getContentDiv().appendChild(this.picker_);Blockly.DropDownDiv.showPositionedByField(this,this.dropdownDispose_.bind(this));this.picker_.focus({preventScroll:!0})}; +Blockly.FieldColour.prototype.onClick_=function(a){a=(a=a.target)&&a.label;null!==a&&(this.setValue(a),Blockly.DropDownDiv.hideIfOwner(this))}; +Blockly.FieldColour.prototype.onKeyDown_=function(a){var b=!1;if(a.keyCode===Blockly.utils.KeyCodes.UP)this.moveHighlightBy_(0,-1),b=!0;else if(a.keyCode===Blockly.utils.KeyCodes.DOWN)this.moveHighlightBy_(0,1),b=!0;else if(a.keyCode===Blockly.utils.KeyCodes.LEFT)this.moveHighlightBy_(-1,0),b=!0;else if(a.keyCode===Blockly.utils.KeyCodes.RIGHT)this.moveHighlightBy_(1,0),b=!0;else if(a.keyCode===Blockly.utils.KeyCodes.ENTER){if(b=this.getHighlighted_())b=b&&b.label,null!==b&&this.setValue(b);Blockly.DropDownDiv.hideWithoutAnimation(); +b=!0}b&&a.stopPropagation()};Blockly.FieldColour.prototype.onBlocklyAction=function(a){if(this.picker_){if(a===Blockly.navigation.ACTION_PREVIOUS)return this.moveHighlightBy_(0,-1),!0;if(a===Blockly.navigation.ACTION_NEXT)return this.moveHighlightBy_(0,1),!0;if(a===Blockly.navigation.ACTION_OUT)return this.moveHighlightBy_(-1,0),!0;if(a===Blockly.navigation.ACTION_IN)return this.moveHighlightBy_(1,0),!0}return Blockly.FieldColour.superClass_.onBlocklyAction.call(this,a)}; +Blockly.FieldColour.prototype.moveHighlightBy_=function(a,b){var c=this.colours_||Blockly.FieldColour.COLOURS,d=this.columns_||Blockly.FieldColour.COLUMNS,e=this.highlightedIndex_%d,f=Math.floor(this.highlightedIndex_/d);e+=a;f+=b;0>a?0>e&&0e&&(e=0):0d-1&&fd-1&&e--:0>b?0>f&&(f=0):0Math.floor(c.length/d)-1&&(f=Math.floor(c.length/d)-1);this.setHighlightedCell_(this.picker_.childNodes[f].childNodes[e],f*d+e)}; +Blockly.FieldColour.prototype.onMouseMove_=function(a){var b=(a=a.target)&&Number(a.getAttribute("data-index"));null!==b&&b!==this.highlightedIndex_&&this.setHighlightedCell_(a,b)};Blockly.FieldColour.prototype.onMouseEnter_=function(){this.picker_.focus({preventScroll:!0})};Blockly.FieldColour.prototype.onMouseLeave_=function(){this.picker_.blur();var a=this.getHighlighted_();a&&Blockly.utils.dom.removeClass(a,"blocklyColourHighlighted")}; +Blockly.FieldColour.prototype.getHighlighted_=function(){var a=this.columns_||Blockly.FieldColour.COLUMNS,b=this.picker_.childNodes[Math.floor(this.highlightedIndex_/a)];return b?b.childNodes[this.highlightedIndex_%a]:null}; +Blockly.FieldColour.prototype.setHighlightedCell_=function(a,b){var c=this.getHighlighted_();c&&Blockly.utils.dom.removeClass(c,"blocklyColourHighlighted");Blockly.utils.dom.addClass(a,"blocklyColourHighlighted");this.highlightedIndex_=b;Blockly.utils.aria.setState(this.picker_,Blockly.utils.aria.State.ACTIVEDESCENDANT,a.getAttribute("id"))}; +Blockly.FieldColour.prototype.dropdownCreate_=function(){var a=this.columns_||Blockly.FieldColour.COLUMNS,b=this.colours_||Blockly.FieldColour.COLOURS,c=this.titles_||Blockly.FieldColour.TITLES,d=this.getValue(),e=document.createElement("table");e.className="blocklyColourTable";e.tabIndex=0;e.dir="ltr";Blockly.utils.aria.setRole(e,Blockly.utils.aria.Role.GRID);Blockly.utils.aria.setState(e,Blockly.utils.aria.State.EXPANDED,!0);Blockly.utils.aria.setState(e,Blockly.utils.aria.State.ROWCOUNT,Math.floor(b.length/ +a));Blockly.utils.aria.setState(e,Blockly.utils.aria.State.COLCOUNT,a);for(var f,g=0;gtr>td {","border: .5px solid #888;","box-sizing: border-box;","cursor: pointer;","display: inline-block;","height: 20px;","padding: 0;","width: 20px;","}",".blocklyColourTable>tr>td.blocklyColourHighlighted {","border-color: #eee;","box-shadow: 2px 2px 7px 2px rgba(0,0,0,.3);","position: relative;","}",".blocklyColourSelected, .blocklyColourSelected:hover {", +"border-color: #eee !important;","outline: 1px solid #333;","position: relative;","}"]);Blockly.fieldRegistry.register("field_colour",Blockly.FieldColour);Blockly.FieldDropdown=function(a,b,c){"function"!=typeof a&&Blockly.FieldDropdown.validateOptions_(a);this.menuGenerator_=a;this.generatedOptions_=null;this.trimOptions_();this.selectedOption_=this.getOptions(!1)[0];Blockly.FieldDropdown.superClass_.constructor.call(this,this.selectedOption_[1],b,c);this.svgArrow_=this.arrow_=this.imageElement_=this.menu_=this.selectedMenuItem_=null};Blockly.utils.object.inherits(Blockly.FieldDropdown,Blockly.Field); +Blockly.FieldDropdown.fromJson=function(a){return new Blockly.FieldDropdown(a.options,void 0,a)};Blockly.FieldDropdown.prototype.SERIALIZABLE=!0;Blockly.FieldDropdown.CHECKMARK_OVERHANG=25;Blockly.FieldDropdown.MAX_MENU_HEIGHT_VH=.45;Blockly.FieldDropdown.IMAGE_Y_OFFSET=5;Blockly.FieldDropdown.IMAGE_Y_PADDING=2*Blockly.FieldDropdown.IMAGE_Y_OFFSET;Blockly.FieldDropdown.ARROW_CHAR=Blockly.utils.userAgent.ANDROID?"\u25bc":"\u25be";Blockly.FieldDropdown.prototype.CURSOR="default"; +Blockly.FieldDropdown.prototype.initView=function(){this.shouldAddBorderRect_()?this.createBorderRect_():this.clickTarget_=this.sourceBlock_.getSvgRoot();this.createTextElement_();this.imageElement_=Blockly.utils.dom.createSvgElement("image",{},this.fieldGroup_);this.constants_.FIELD_DROPDOWN_SVG_ARROW?this.createSVGArrow_():this.createTextArrow_();this.borderRect_&&Blockly.utils.dom.addClass(this.borderRect_,"blocklyDropdownRect")}; +Blockly.FieldDropdown.prototype.shouldAddBorderRect_=function(){return!this.constants_.FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW||this.constants_.FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW&&!this.sourceBlock_.isShadow()}; +Blockly.FieldDropdown.prototype.createTextArrow_=function(){this.arrow_=Blockly.utils.dom.createSvgElement("tspan",{},this.textElement_);this.arrow_.appendChild(document.createTextNode(this.sourceBlock_.RTL?Blockly.FieldDropdown.ARROW_CHAR+" ":" "+Blockly.FieldDropdown.ARROW_CHAR));this.sourceBlock_.RTL?this.textElement_.insertBefore(this.arrow_,this.textContent_):this.textElement_.appendChild(this.arrow_)}; +Blockly.FieldDropdown.prototype.createSVGArrow_=function(){this.svgArrow_=Blockly.utils.dom.createSvgElement("image",{height:this.constants_.FIELD_DROPDOWN_SVG_ARROW_SIZE+"px",width:this.constants_.FIELD_DROPDOWN_SVG_ARROW_SIZE+"px"},this.fieldGroup_);this.svgArrow_.setAttributeNS(Blockly.utils.dom.XLINK_NS,"xlink:href",this.constants_.FIELD_DROPDOWN_SVG_ARROW_DATAURI)}; +Blockly.FieldDropdown.prototype.showEditor_=function(a){this.menu_=this.dropdownCreate_();this.menu_.openingCoords=a&&"number"===typeof a.clientX?new Blockly.utils.Coordinate(a.clientX,a.clientY):null;this.menu_.render(Blockly.DropDownDiv.getContentDiv());Blockly.utils.dom.addClass(this.menu_.getElement(),"blocklyDropdownMenu");if(this.constants_.FIELD_DROPDOWN_COLOURED_DIV){a=this.sourceBlock_.isShadow()?this.sourceBlock_.getParent().getColour():this.sourceBlock_.getColour();var b=this.sourceBlock_.isShadow()? +this.sourceBlock_.getParent().style.colourTertiary:this.sourceBlock_.style.colourTertiary;Blockly.DropDownDiv.setColour(a,b)}Blockly.DropDownDiv.showPositionedByField(this,this.dropdownDispose_.bind(this));this.menu_.focus();this.selectedMenuItem_&&Blockly.utils.style.scrollIntoContainerView(this.selectedMenuItem_.getElement(),this.menu_.getElement());this.applyColour()}; +Blockly.FieldDropdown.prototype.dropdownCreate_=function(){var a=new Blockly.Menu;a.setRightToLeft(this.sourceBlock_.RTL);a.setRole(Blockly.utils.aria.Role.LISTBOX);var b=this.getOptions(!1);this.selectedMenuItem_=null;for(var c=0;ca.length)){b=[];for(c=0;c=c||0>=b)throw Error("Height and width values of an image field must be greater than 0.");this.flipRtl_=!1;this.altText_="";Blockly.FieldImage.superClass_.constructor.call(this, +a||"",null,g);g||(this.flipRtl_=!!f,this.altText_=Blockly.utils.replaceMessageReferences(d)||"");this.size_=new Blockly.utils.Size(b,c+Blockly.FieldImage.Y_PADDING);this.imageHeight_=c;this.clickHandler_=null;"function"==typeof e&&(this.clickHandler_=e);this.imageElement_=null};Blockly.utils.object.inherits(Blockly.FieldImage,Blockly.Field);Blockly.FieldImage.fromJson=function(a){return new Blockly.FieldImage(a.src,a.width,a.height,void 0,void 0,void 0,a)};Blockly.FieldImage.Y_PADDING=1; +Blockly.FieldImage.prototype.EDITABLE=!1;Blockly.FieldImage.prototype.isDirty_=!1;Blockly.FieldImage.prototype.configure_=function(a){Blockly.FieldImage.superClass_.configure_.call(this,a);this.flipRtl_=!!a.flipRtl;this.altText_=Blockly.utils.replaceMessageReferences(a.alt)||""}; +Blockly.FieldImage.prototype.initView=function(){this.imageElement_=Blockly.utils.dom.createSvgElement("image",{height:this.imageHeight_+"px",width:this.size_.width+"px",alt:this.altText_},this.fieldGroup_);this.imageElement_.setAttributeNS(Blockly.utils.dom.XLINK_NS,"xlink:href",this.value_)};Blockly.FieldImage.prototype.doClassValidation_=function(a){return"string"!=typeof a?null:a}; +Blockly.FieldImage.prototype.doValueUpdate_=function(a){this.value_=a;this.imageElement_&&this.imageElement_.setAttributeNS(Blockly.utils.dom.XLINK_NS,"xlink:href",String(this.value_))};Blockly.FieldImage.prototype.getFlipRtl=function(){return this.flipRtl_};Blockly.FieldImage.prototype.setAlt=function(a){a!=this.altText_&&(this.altText_=a||"",this.imageElement_&&this.imageElement_.setAttribute("alt",this.altText_))};Blockly.FieldImage.prototype.showEditor_=function(){this.clickHandler_&&this.clickHandler_(this)}; +Blockly.FieldImage.prototype.setOnClickHandler=function(a){this.clickHandler_=a};Blockly.FieldImage.prototype.getText_=function(){return this.altText_};Blockly.fieldRegistry.register("field_image",Blockly.FieldImage);Blockly.FieldMultilineInput=function(a,b,c){null==a&&(a="");Blockly.FieldMultilineInput.superClass_.constructor.call(this,a,b,c);this.textGroup_=null};Blockly.utils.object.inherits(Blockly.FieldMultilineInput,Blockly.FieldTextInput);Blockly.FieldMultilineInput.LINE_HEIGHT=20;Blockly.FieldMultilineInput.fromJson=function(a){var b=Blockly.utils.replaceMessageReferences(a.text);return new Blockly.FieldMultilineInput(b,void 0,a)}; +Blockly.FieldMultilineInput.prototype.initView=function(){this.createBorderRect_();this.textGroup_=Blockly.utils.dom.createSvgElement("g",{"class":"blocklyEditableText"},this.fieldGroup_)}; +Blockly.FieldMultilineInput.prototype.getDisplayText_=function(){var a=this.value_;if(!a)return Blockly.Field.NBSP;var b=a.split("\n");a="";for(var c=0;cthis.maxDisplayLength&&(d=d.substring(0,this.maxDisplayLength-4)+"...");d=d.replace(/\s/g,Blockly.Field.NBSP);a+=d;c!==b.length-1&&(a+="\n")}this.sourceBlock_.RTL&&(a+="\u200f");return a}; +Blockly.FieldMultilineInput.prototype.render_=function(){for(var a;a=this.textGroup_.firstChild;)this.textGroup_.removeChild(a);a=this.getDisplayText_().split("\n");for(var b=0,c=0;cb&&(b=e);c+=Blockly.FieldMultilineInput.LINE_HEIGHT}this.borderRect_&&(b+=2*this.constants_.FIELD_BORDER_RECT_X_PADDING,this.borderRect_.setAttribute("width",b),this.borderRect_.setAttribute("height",c));this.size_.width=b;this.size_.height=c}; +Blockly.FieldMultilineInput.prototype.resizeEditor_=function(){var a=Blockly.WidgetDiv.DIV,b=this.getScaledBBox();a.style.width=b.right-b.left+"px";a.style.height=b.bottom-b.top+"px";b=new Blockly.utils.Coordinate(this.sourceBlock_.RTL?b.right-a.offsetWidth:b.left,b.top);a.style.left=b.x+"px";a.style.top=b.y+"px"}; +Blockly.FieldMultilineInput.prototype.widgetCreate_=function(){var a=Blockly.WidgetDiv.DIV,b=this.workspace_.scale,c=document.createElement("textarea");c.className="blocklyHtmlInput blocklyHtmlTextAreaInput";c.setAttribute("spellcheck",this.spellcheck_);var d=this.constants_.FIELD_TEXT_FONTSIZE*b+"pt";a.style.fontSize=d;c.style.fontSize=d;c.style.borderRadius=Blockly.FieldTextInput.BORDERRADIUS*b+"px";d=this.constants_.FIELD_BORDER_RECT_X_PADDING*b;c.style.paddingLeft=d+"px";c.style.width="calc(100% - "+ +d+"px)";c.style.lineHeight=Blockly.FieldMultilineInput.LINE_HEIGHT*b+"px";a.appendChild(c);c.value=c.defaultValue=this.getEditorText_(this.value_);c.untypedDefaultValue_=this.value_;c.oldValue_=null;Blockly.utils.userAgent.GECKO?setTimeout(this.resizeEditor_.bind(this),0):this.resizeEditor_();this.bindInputEvents_(c);return c}; +Blockly.FieldMultilineInput.prototype.onHtmlInputKeyDown_=function(a){a.keyCode!==Blockly.utils.KeyCodes.ENTER&&Blockly.FieldMultilineInput.superClass_.onHtmlInputKeyDown_.call(this,a)};Blockly.Css.register(".blocklyHtmlTextAreaInput {,font-family: monospace;,resize: none;,overflow: hidden;,height: 100%;,text-align: left;,}".split(","));Blockly.fieldRegistry.register("field_multilinetext",Blockly.FieldMultilineInput);Blockly.FieldNumber=function(a,b,c,d,e,f){this.min_=-Infinity;this.max_=Infinity;this.precision_=0;this.decimalPlaces_=null;Blockly.FieldNumber.superClass_.constructor.call(this,a||0,e,f);f||this.setConstraints(b,c,d)};Blockly.utils.object.inherits(Blockly.FieldNumber,Blockly.FieldTextInput);Blockly.FieldNumber.fromJson=function(a){return new Blockly.FieldNumber(a.value,void 0,void 0,void 0,void 0,a)};Blockly.FieldNumber.prototype.SERIALIZABLE=!0; +Blockly.FieldNumber.prototype.configure_=function(a){Blockly.FieldNumber.superClass_.configure_.call(this,a);this.setMinInternal_(a.min);this.setMaxInternal_(a.max);this.setPrecisionInternal_(a.precision)};Blockly.FieldNumber.prototype.setConstraints=function(a,b,c){this.setMinInternal_(a);this.setMaxInternal_(b);this.setPrecisionInternal_(c);this.setValue(this.getValue())};Blockly.FieldNumber.prototype.setMin=function(a){this.setMinInternal_(a);this.setValue(this.getValue())}; +Blockly.FieldNumber.prototype.setMinInternal_=function(a){null==a?this.min_=-Infinity:(a=Number(a),isNaN(a)||(this.min_=a))};Blockly.FieldNumber.prototype.getMin=function(){return this.min_};Blockly.FieldNumber.prototype.setMax=function(a){this.setMaxInternal_(a);this.setValue(this.getValue())};Blockly.FieldNumber.prototype.setMaxInternal_=function(a){null==a?this.max_=Infinity:(a=Number(a),isNaN(a)||(this.max_=a))};Blockly.FieldNumber.prototype.getMax=function(){return this.max_}; +Blockly.FieldNumber.prototype.setPrecision=function(a){this.setPrecisionInternal_(a);this.setValue(this.getValue())};Blockly.FieldNumber.prototype.setPrecisionInternal_=function(a){null==a?this.precision_=0:(a=Number(a),isNaN(a)||(this.precision_=a));var b=this.precision_.toString(),c=b.indexOf(".");this.decimalPlaces_=-1==c?a?0:null:b.length-c-1};Blockly.FieldNumber.prototype.getPrecision=function(){return this.precision_}; +Blockly.FieldNumber.prototype.doClassValidation_=function(a){if(null===a)return null;a=String(a);a=a.replace(/O/ig,"0");a=a.replace(/,/g,"");a=a.replace(/infinity/i,"Infinity");a=Number(a||0);if(isNaN(a))return null;a=Math.min(Math.max(a,this.min_),this.max_);this.precision_&&isFinite(a)&&(a=Math.round(a/this.precision_)*this.precision_);null!=this.decimalPlaces_&&(a=Number(a.toFixed(this.decimalPlaces_)));return a}; +Blockly.FieldNumber.prototype.widgetCreate_=function(){var a=Blockly.FieldNumber.superClass_.widgetCreate_.call(this);-Infinitythis.max_&&Blockly.utils.aria.setState(a,Blockly.utils.aria.State.VALUEMAX,this.max_);return a};Blockly.fieldRegistry.register("field_number",Blockly.FieldNumber);Blockly.FieldVariable=function(a,b,c,d,e){this.menuGenerator_=Blockly.FieldVariable.dropdownCreate;this.defaultVariableName=a||"";this.size_=new Blockly.utils.Size(0,0);e&&this.configure_(e);b&&this.setValidator(b);e||this.setTypes_(c,d)};Blockly.utils.object.inherits(Blockly.FieldVariable,Blockly.FieldDropdown);Blockly.FieldVariable.fromJson=function(a){var b=Blockly.utils.replaceMessageReferences(a.variable);return new Blockly.FieldVariable(b,void 0,void 0,void 0,a)}; +Blockly.FieldVariable.prototype.workspace_=null;Blockly.FieldVariable.prototype.SERIALIZABLE=!0;Blockly.FieldVariable.prototype.configure_=function(a){Blockly.FieldVariable.superClass_.configure_.call(this,a);this.setTypes_(a.variableTypes,a.defaultType)};Blockly.FieldVariable.prototype.initModel=function(){if(!this.variable_){var a=Blockly.Variables.getOrCreateVariablePackage(this.sourceBlock_.workspace,null,this.defaultVariableName,this.defaultType_);this.doValueUpdate_(a.getId())}}; +Blockly.FieldVariable.prototype.shouldAddBorderRect_=function(){return Blockly.FieldVariable.superClass_.shouldAddBorderRect_.call(this)&&(!this.constants_.FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW||"variables_get"!=this.sourceBlock_.type)}; +Blockly.FieldVariable.prototype.fromXml=function(a){var b=a.getAttribute("id"),c=a.textContent,d=a.getAttribute("variabletype")||a.getAttribute("variableType")||"";b=Blockly.Variables.getOrCreateVariablePackage(this.sourceBlock_.workspace,b,c,d);if(null!=d&&d!==b.type)throw Error("Serialized variable type with id '"+b.getId()+"' had type "+b.type+", and does not match variable field that references it: "+Blockly.Xml.domToText(a)+".");this.setValue(b.getId())}; +Blockly.FieldVariable.prototype.toXml=function(a){this.initModel();a.id=this.variable_.getId();a.textContent=this.variable_.name;this.variable_.type&&a.setAttribute("variabletype",this.variable_.type);return a};Blockly.FieldVariable.prototype.setSourceBlock=function(a){if(a.isShadow())throw Error("Variable fields are not allowed to exist on shadow blocks.");Blockly.FieldVariable.superClass_.setSourceBlock.call(this,a)}; +Blockly.FieldVariable.prototype.getValue=function(){return this.variable_?this.variable_.getId():null};Blockly.FieldVariable.prototype.getText=function(){return this.variable_?this.variable_.name:""};Blockly.FieldVariable.prototype.getVariable=function(){return this.variable_};Blockly.FieldVariable.prototype.getValidator=function(){return this.variable_?this.validator_:null}; +Blockly.FieldVariable.prototype.doClassValidation_=function(a){if(null===a)return null;var b=Blockly.Variables.getVariable(this.sourceBlock_.workspace,a);if(!b)return console.warn("Variable id doesn't point to a real variable! ID was "+a),null;b=b.type;return this.typeIsAllowed_(b)?a:(console.warn("Variable type doesn't match this field! Type was "+b),null)}; +Blockly.FieldVariable.prototype.doValueUpdate_=function(a){this.variable_=Blockly.Variables.getVariable(this.sourceBlock_.workspace,a);Blockly.FieldVariable.superClass_.doValueUpdate_.call(this,a)};Blockly.FieldVariable.prototype.typeIsAllowed_=function(a){var b=this.getVariableTypes_();if(!b)return!0;for(var c=0;crect,",a+" .blocklyEditableText>rect {","fill: "+this.FIELD_BORDER_RECT_COLOUR+";","fill-opacity: .6;","stroke: none;","}",a+" .blocklyNonEditableText>text,",a+" .blocklyEditableText>text {","fill: #000;", +"}",a+" .blocklyEditableText:not(.editing):hover>rect {","stroke: #fff;","stroke-width: 2;","}",a+" .blocklyHtmlInput {","font-family: "+this.FIELD_TEXT_FONTFAMILY+";","font-weight: "+this.FIELD_TEXT_FONTWEIGHT+";","}",a+" .blocklySelected>.blocklyPath {","stroke: #fc3;","stroke-width: 3px;","}",a+" .blocklyHighlightedConnectionPath {","stroke: #fc3;","}",a+" .blocklyReplaceable .blocklyPath {","fill-opacity: .5;","}",a+" .blocklyReplaceable .blocklyPathLight,",a+" .blocklyReplaceable .blocklyPathDark {", +"display: none;","}"]};Blockly.blockRendering.MarkerSvg=function(a,b,c){this.workspace_=a;this.marker_=c;this.parent_=null;this.constants_=b;this.currentMarkerSvg=null;a=this.isCursor()?this.constants_.CURSOR_COLOUR:this.constants_.MARKER_COLOUR;this.colour_=c.colour||a};Blockly.blockRendering.MarkerSvg.CURSOR_CLASS="blocklyCursor";Blockly.blockRendering.MarkerSvg.MARKER_CLASS="blocklyMarker";Blockly.blockRendering.MarkerSvg.HEIGHT_MULTIPLIER=.75;Blockly.blockRendering.MarkerSvg.prototype.getSvgRoot=function(){return this.svgGroup_}; +Blockly.blockRendering.MarkerSvg.prototype.isCursor=function(){return"cursor"==this.marker_.type};Blockly.blockRendering.MarkerSvg.prototype.createDom=function(){var a=this.isCursor()?Blockly.blockRendering.MarkerSvg.CURSOR_CLASS:Blockly.blockRendering.MarkerSvg.MARKER_CLASS;this.svgGroup_=Blockly.utils.dom.createSvgElement("g",{"class":a},null);this.createDomInternal_();return this.svgGroup_}; +Blockly.blockRendering.MarkerSvg.prototype.setParent_=function(a){this.isCursor()?(this.parent_&&this.parent_.setCursorSvg(null),a.setCursorSvg(this.getSvgRoot())):(this.parent_&&this.parent_.setMarkerSvg(null),a.setMarkerSvg(this.getSvgRoot()));this.parent_=a}; +Blockly.blockRendering.MarkerSvg.prototype.showWithBlockPrevOutput_=function(a){if(a){var b=a.width,c=a.height,d=c*Blockly.blockRendering.MarkerSvg.HEIGHT_MULTIPLIER,e=this.constants_.CURSOR_BLOCK_PADDING;if(a.previousConnection){var f=this.constants_.shapeFor(a.previousConnection);this.positionPrevious_(b,e,d,f)}else a.outputConnection?(f=this.constants_.shapeFor(a.outputConnection),this.positionOutput_(b,c,f)):this.positionBlock_(b,e,d);this.setParent_(a);this.showCurrent_()}}; +Blockly.blockRendering.MarkerSvg.prototype.showWithCoordinates_=function(a){var b=a.getWsCoordinate();a=b.x;b=b.y;this.workspace_.RTL&&(a-=this.constants_.CURSOR_WS_WIDTH);this.positionLine_(a,b,this.constants_.CURSOR_WS_WIDTH);this.setParent_(this.workspace_);this.showCurrent_()};Blockly.blockRendering.MarkerSvg.prototype.showWithField_=function(a){a=a.getLocation();var b=a.getSize().width,c=a.getSize().height;this.positionRect_(0,0,b,c);this.setParent_(a);this.showCurrent_()}; +Blockly.blockRendering.MarkerSvg.prototype.showWithInput_=function(a){a=a.getLocation();var b=a.getSourceBlock();this.positionInput_(a);this.setParent_(b);this.showCurrent_()};Blockly.blockRendering.MarkerSvg.prototype.showWithNext_=function(a){var b=a.getLocation();a=b.getSourceBlock();var c=0;b=b.getOffsetInBlock().y;var d=a.getHeightWidth().width;this.workspace_.RTL&&(c=-d);this.positionLine_(c,b,d);this.setParent_(a);this.showCurrent_()}; +Blockly.blockRendering.MarkerSvg.prototype.showWithStack_=function(a){a=a.getLocation();var b=a.getHeightWidth(),c=b.width+this.constants_.CURSOR_STACK_PADDING;b=b.height+this.constants_.CURSOR_STACK_PADDING;var d=-this.constants_.CURSOR_STACK_PADDING/2,e=-this.constants_.CURSOR_STACK_PADDING/2,f=d;this.workspace_.RTL&&(f=-(c+d));this.positionRect_(f,e,c,b);this.setParent_(a);this.showCurrent_()}; +Blockly.blockRendering.MarkerSvg.prototype.showCurrent_=function(){this.hide();this.currentMarkerSvg.style.display=""};Blockly.blockRendering.MarkerSvg.prototype.positionBlock_=function(a,b,c){a=Blockly.utils.svgPaths.moveBy(-b,c)+Blockly.utils.svgPaths.lineOnAxis("V",-b)+Blockly.utils.svgPaths.lineOnAxis("H",a+2*b)+Blockly.utils.svgPaths.lineOnAxis("V",c);this.markerBlock_.setAttribute("d",a);this.workspace_.RTL&&this.flipRtl_(this.markerBlock_);this.currentMarkerSvg=this.markerBlock_}; +Blockly.blockRendering.MarkerSvg.prototype.positionInput_=function(a){var b=a.getOffsetInBlock().x,c=a.getOffsetInBlock().y;a=Blockly.utils.svgPaths.moveTo(0,0)+this.constants_.shapeFor(a).pathDown;this.markerInput_.setAttribute("d",a);this.markerInput_.setAttribute("transform","translate("+b+","+c+")"+(this.workspace_.RTL?" scale(-1 1)":""));this.currentMarkerSvg=this.markerInput_}; +Blockly.blockRendering.MarkerSvg.prototype.positionLine_=function(a,b,c){this.markerSvgLine_.setAttribute("x",a);this.markerSvgLine_.setAttribute("y",b);this.markerSvgLine_.setAttribute("width",c);this.currentMarkerSvg=this.markerSvgLine_}; +Blockly.blockRendering.MarkerSvg.prototype.positionOutput_=function(a,b,c){a=Blockly.utils.svgPaths.moveBy(a,0)+Blockly.utils.svgPaths.lineOnAxis("h",-(a-c.width))+Blockly.utils.svgPaths.lineOnAxis("v",this.constants_.TAB_OFFSET_FROM_TOP)+c.pathDown+Blockly.utils.svgPaths.lineOnAxis("V",b)+Blockly.utils.svgPaths.lineOnAxis("H",a);this.markerBlock_.setAttribute("d",a);this.workspace_.RTL&&this.flipRtl_(this.markerBlock_);this.currentMarkerSvg=this.markerBlock_}; +Blockly.blockRendering.MarkerSvg.prototype.positionPrevious_=function(a,b,c,d){a=Blockly.utils.svgPaths.moveBy(-b,c)+Blockly.utils.svgPaths.lineOnAxis("V",-b)+Blockly.utils.svgPaths.lineOnAxis("H",this.constants_.NOTCH_OFFSET_LEFT)+d.pathLeft+Blockly.utils.svgPaths.lineOnAxis("H",a+2*b)+Blockly.utils.svgPaths.lineOnAxis("V",c);this.markerBlock_.setAttribute("d",a);this.workspace_.RTL&&this.flipRtl_(this.markerBlock_);this.currentMarkerSvg=this.markerBlock_}; +Blockly.blockRendering.MarkerSvg.prototype.positionRect_=function(a,b,c,d){this.markerSvgRect_.setAttribute("x",a);this.markerSvgRect_.setAttribute("y",b);this.markerSvgRect_.setAttribute("width",c);this.markerSvgRect_.setAttribute("height",d);this.currentMarkerSvg=this.markerSvgRect_};Blockly.blockRendering.MarkerSvg.prototype.flipRtl_=function(a){a.setAttribute("transform","scale(-1 1)")}; +Blockly.blockRendering.MarkerSvg.prototype.hide=function(){this.markerSvgLine_.style.display="none";this.markerSvgRect_.style.display="none";this.markerInput_.style.display="none";this.markerBlock_.style.display="none"};Blockly.blockRendering.MarkerSvg.prototype.draw=function(a,b){b?(this.showAtLocation_(b),this.firemarkerEvent_(a,b),a=this.currentMarkerSvg.childNodes[0],void 0!==a&&a.beginElement&&a.beginElement()):this.hide()}; +Blockly.blockRendering.MarkerSvg.prototype.showAtLocation_=function(a){a.getType()==Blockly.ASTNode.types.BLOCK?(a=a.getLocation(),this.showWithBlockPrevOutput_(a)):a.getType()==Blockly.ASTNode.types.OUTPUT?(a=a.getLocation().getSourceBlock(),this.showWithBlockPrevOutput_(a)):a.getLocation().type==Blockly.INPUT_VALUE?this.showWithInput_(a):a.getLocation().type==Blockly.NEXT_STATEMENT?this.showWithNext_(a):a.getType()==Blockly.ASTNode.types.PREVIOUS?(a=a.getLocation().getSourceBlock(),this.showWithBlockPrevOutput_(a)): +a.getType()==Blockly.ASTNode.types.FIELD?this.showWithField_(a):a.getType()==Blockly.ASTNode.types.WORKSPACE?this.showWithCoordinates_(a):a.getType()==Blockly.ASTNode.types.STACK&&this.showWithStack_(a)};Blockly.blockRendering.MarkerSvg.prototype.firemarkerEvent_=function(a,b){var c=b.getSourceBlock(),d=this.isCursor()?"cursorMove":"markerMove";a=new Blockly.Events.Ui(c,d,a,b);b.getType()==Blockly.ASTNode.types.WORKSPACE&&(a.workspaceId=b.getLocation().id);Blockly.Events.fire(a)}; +Blockly.blockRendering.MarkerSvg.prototype.getBlinkProperties_=function(){return{attributeType:"XML",attributeName:"fill",dur:"1s",values:this.colour_+";transparent;transparent;",repeatCount:"indefinite"}}; +Blockly.blockRendering.MarkerSvg.prototype.createDomInternal_=function(){this.markerSvg_=Blockly.utils.dom.createSvgElement("g",{width:this.constants_.CURSOR_WS_WIDTH,height:this.constants_.WS_CURSOR_HEIGHT},this.svgGroup_);this.markerSvgLine_=Blockly.utils.dom.createSvgElement("rect",{fill:this.colour_,width:this.constants_.CURSOR_WS_WIDTH,height:this.constants_.WS_CURSOR_HEIGHT,style:"display: none"},this.markerSvg_);this.markerSvgRect_=Blockly.utils.dom.createSvgElement("rect",{"class":"blocklyVerticalMarker", +rx:10,ry:10,style:"display: none",stroke:this.colour_},this.markerSvg_);this.markerInput_=Blockly.utils.dom.createSvgElement("path",{transform:"",style:"display: none",fill:this.colour_},this.markerSvg_);this.markerBlock_=Blockly.utils.dom.createSvgElement("path",{transform:"",style:"display: none",fill:"none",stroke:this.colour_,"stroke-width":this.constants_.CURSOR_STROKE_WIDTH},this.markerSvg_);if(this.isCursor()){var a=this.getBlinkProperties_();Blockly.utils.dom.createSvgElement("animate",this.getBlinkProperties_(), +this.markerSvgLine_);Blockly.utils.dom.createSvgElement("animate",a,this.markerInput_);a.attributeName="stroke";Blockly.utils.dom.createSvgElement("animate",a,this.markerBlock_)}return this.markerSvg_};Blockly.blockRendering.MarkerSvg.prototype.dispose=function(){this.svgGroup_&&Blockly.utils.dom.removeNode(this.svgGroup_)};Blockly.blockRendering.Types={NONE:0,FIELD:1,HAT:2,ICON:4,SPACER:8,BETWEEN_ROW_SPACER:16,IN_ROW_SPACER:32,EXTERNAL_VALUE_INPUT:64,INPUT:128,INLINE_INPUT:256,STATEMENT_INPUT:512,CONNECTION:1024,PREVIOUS_CONNECTION:2048,NEXT_CONNECTION:4096,OUTPUT_CONNECTION:8192,CORNER:16384,LEFT_SQUARE_CORNER:32768,LEFT_ROUND_CORNER:65536,RIGHT_SQUARE_CORNER:131072,RIGHT_ROUND_CORNER:262144,JAGGED_EDGE:524288,ROW:1048576,TOP_ROW:2097152,BOTTOM_ROW:4194304,INPUT_ROW:8388608}; +Blockly.blockRendering.Types.LEFT_CORNER=Blockly.blockRendering.Types.LEFT_SQUARE_CORNER|Blockly.blockRendering.Types.LEFT_ROUND_CORNER;Blockly.blockRendering.Types.RIGHT_CORNER=Blockly.blockRendering.Types.RIGHT_SQUARE_CORNER|Blockly.blockRendering.Types.RIGHT_ROUND_CORNER;Blockly.blockRendering.Types.nextTypeValue_=16777216; +Blockly.blockRendering.Types.getType=function(a){Blockly.blockRendering.Types.hasOwnProperty(a)||(Blockly.blockRendering.Types[a]=Blockly.blockRendering.Types.nextTypeValue_,Blockly.blockRendering.Types.nextTypeValue_<<=1);return Blockly.blockRendering.Types[a]};Blockly.blockRendering.Types.isField=function(a){return a.type&Blockly.blockRendering.Types.FIELD};Blockly.blockRendering.Types.isHat=function(a){return a.type&Blockly.blockRendering.Types.HAT}; +Blockly.blockRendering.Types.isIcon=function(a){return a.type&Blockly.blockRendering.Types.ICON};Blockly.blockRendering.Types.isSpacer=function(a){return a.type&Blockly.blockRendering.Types.SPACER};Blockly.blockRendering.Types.isInRowSpacer=function(a){return a.type&Blockly.blockRendering.Types.IN_ROW_SPACER};Blockly.blockRendering.Types.isInput=function(a){return a.type&Blockly.blockRendering.Types.INPUT};Blockly.blockRendering.Types.isExternalInput=function(a){return a.type&Blockly.blockRendering.Types.EXTERNAL_VALUE_INPUT}; +Blockly.blockRendering.Types.isInlineInput=function(a){return a.type&Blockly.blockRendering.Types.INLINE_INPUT};Blockly.blockRendering.Types.isStatementInput=function(a){return a.type&Blockly.blockRendering.Types.STATEMENT_INPUT};Blockly.blockRendering.Types.isPreviousConnection=function(a){return a.type&Blockly.blockRendering.Types.PREVIOUS_CONNECTION};Blockly.blockRendering.Types.isNextConnection=function(a){return a.type&Blockly.blockRendering.Types.NEXT_CONNECTION}; +Blockly.blockRendering.Types.isPreviousOrNextConnection=function(a){return a.type&(Blockly.blockRendering.Types.PREVIOUS_CONNECTION|Blockly.blockRendering.Types.NEXT_CONNECTION)};Blockly.blockRendering.Types.isLeftRoundedCorner=function(a){return a.type&Blockly.blockRendering.Types.LEFT_ROUND_CORNER};Blockly.blockRendering.Types.isRightRoundedCorner=function(a){return a.type&Blockly.blockRendering.Types.RIGHT_ROUND_CORNER}; +Blockly.blockRendering.Types.isLeftSquareCorner=function(a){return a.type&Blockly.blockRendering.Types.LEFT_SQUARE_CORNER};Blockly.blockRendering.Types.isRightSquareCorner=function(a){return a.type&Blockly.blockRendering.Types.RIGHT_SQUARE_CORNER};Blockly.blockRendering.Types.isCorner=function(a){return a.type&Blockly.blockRendering.Types.CORNER};Blockly.blockRendering.Types.isJaggedEdge=function(a){return a.type&Blockly.blockRendering.Types.JAGGED_EDGE}; +Blockly.blockRendering.Types.isRow=function(a){return a.type&Blockly.blockRendering.Types.ROW};Blockly.blockRendering.Types.isBetweenRowSpacer=function(a){return a.type&Blockly.blockRendering.Types.BETWEEN_ROW_SPACER};Blockly.blockRendering.Types.isTopRow=function(a){return a.type&Blockly.blockRendering.Types.TOP_ROW};Blockly.blockRendering.Types.isBottomRow=function(a){return a.type&Blockly.blockRendering.Types.BOTTOM_ROW}; +Blockly.blockRendering.Types.isTopOrBottomRow=function(a){return a.type&(Blockly.blockRendering.Types.TOP_ROW|Blockly.blockRendering.Types.BOTTOM_ROW)};Blockly.blockRendering.Types.isInputRow=function(a){return a.type&Blockly.blockRendering.Types.INPUT_ROW};Blockly.blockRendering.Measurable=function(a){this.height=this.width=0;this.type=Blockly.blockRendering.Types.NONE;this.centerline=this.xPos=0;this.constants_=a;this.notchOffset=this.constants_.NOTCH_OFFSET_LEFT};Blockly.blockRendering.Connection=function(a,b){Blockly.blockRendering.Connection.superClass_.constructor.call(this,a);this.connectionModel=b;this.shape=this.constants_.shapeFor(b);this.isDynamicShape=!!this.shape.isDynamic;this.type|=Blockly.blockRendering.Types.CONNECTION};Blockly.utils.object.inherits(Blockly.blockRendering.Connection,Blockly.blockRendering.Measurable); +Blockly.blockRendering.OutputConnection=function(a,b){Blockly.blockRendering.OutputConnection.superClass_.constructor.call(this,a,b);this.type|=Blockly.blockRendering.Types.OUTPUT_CONNECTION;this.height=this.isDynamicShape?0:this.shape.height;this.startX=this.width=this.isDynamicShape?0:this.shape.width;this.connectionOffsetY=this.constants_.TAB_OFFSET_FROM_TOP;this.connectionOffsetX=0};Blockly.utils.object.inherits(Blockly.blockRendering.OutputConnection,Blockly.blockRendering.Connection); +Blockly.blockRendering.PreviousConnection=function(a,b){Blockly.blockRendering.PreviousConnection.superClass_.constructor.call(this,a,b);this.type|=Blockly.blockRendering.Types.PREVIOUS_CONNECTION;this.height=this.shape.height;this.width=this.shape.width};Blockly.utils.object.inherits(Blockly.blockRendering.PreviousConnection,Blockly.blockRendering.Connection); +Blockly.blockRendering.NextConnection=function(a,b){Blockly.blockRendering.NextConnection.superClass_.constructor.call(this,a,b);this.type|=Blockly.blockRendering.Types.NEXT_CONNECTION;this.height=this.shape.height;this.width=this.shape.width};Blockly.utils.object.inherits(Blockly.blockRendering.NextConnection,Blockly.blockRendering.Connection);Blockly.blockRendering.InputConnection=function(a,b){Blockly.blockRendering.InputConnection.superClass_.constructor.call(this,a,b.connection);this.type|=Blockly.blockRendering.Types.INPUT;this.input=b;this.align=b.align;(this.connectedBlock=b.connection&&b.connection.targetBlock()?b.connection.targetBlock():null)?(a=this.connectedBlock.getHeightWidth(),this.connectedBlockWidth=a.width,this.connectedBlockHeight=a.height):this.connectedBlockHeight=this.connectedBlockWidth=0;this.connectionOffsetY=this.connectionOffsetX= +0};Blockly.utils.object.inherits(Blockly.blockRendering.InputConnection,Blockly.blockRendering.Connection); +Blockly.blockRendering.InlineInput=function(a,b){Blockly.blockRendering.InlineInput.superClass_.constructor.call(this,a,b);this.type|=Blockly.blockRendering.Types.INLINE_INPUT;this.connectedBlock?(this.width=this.connectedBlockWidth,this.height=this.connectedBlockHeight):(this.height=this.constants_.EMPTY_INLINE_INPUT_HEIGHT,this.width=this.constants_.EMPTY_INLINE_INPUT_PADDING);this.connectionHeight=this.isDynamicShape?this.shape.height(this.height):this.shape.height;this.connectionWidth=this.isDynamicShape? +this.shape.width(this.height):this.shape.width;this.connectedBlock||(this.width+=this.connectionWidth*(this.isDynamicShape?2:1));this.connectionOffsetY=this.isDynamicShape?this.shape.connectionOffsetY(this.connectionHeight):this.constants_.TAB_OFFSET_FROM_TOP;this.connectionOffsetX=this.isDynamicShape?this.shape.connectionOffsetX(this.connectionWidth):0};Blockly.utils.object.inherits(Blockly.blockRendering.InlineInput,Blockly.blockRendering.InputConnection); +Blockly.blockRendering.StatementInput=function(a,b){Blockly.blockRendering.StatementInput.superClass_.constructor.call(this,a,b);this.type|=Blockly.blockRendering.Types.STATEMENT_INPUT;this.height=this.connectedBlock?this.connectedBlockHeight+this.constants_.STATEMENT_BOTTOM_SPACER:this.constants_.EMPTY_STATEMENT_INPUT_HEIGHT;this.width=this.constants_.STATEMENT_INPUT_NOTCH_OFFSET+this.shape.width};Blockly.utils.object.inherits(Blockly.blockRendering.StatementInput,Blockly.blockRendering.InputConnection); +Blockly.blockRendering.ExternalValueInput=function(a,b){Blockly.blockRendering.ExternalValueInput.superClass_.constructor.call(this,a,b);this.type|=Blockly.blockRendering.Types.EXTERNAL_VALUE_INPUT;this.height=this.connectedBlock?this.connectedBlockHeight-this.constants_.TAB_OFFSET_FROM_TOP-this.constants_.MEDIUM_PADDING:this.shape.height;this.width=this.shape.width+this.constants_.EXTERNAL_VALUE_INPUT_PADDING;this.connectionOffsetY=this.constants_.TAB_OFFSET_FROM_TOP;this.connectionHeight=this.shape.height; +this.connectionWidth=this.shape.width};Blockly.utils.object.inherits(Blockly.blockRendering.ExternalValueInput,Blockly.blockRendering.InputConnection);Blockly.blockRendering.Icon=function(a,b){Blockly.blockRendering.Icon.superClass_.constructor.call(this,a);this.icon=b;this.isVisible=b.isVisible();this.type|=Blockly.blockRendering.Types.ICON;a=b.getCorrectedSize();this.height=a.height;this.width=a.width};Blockly.utils.object.inherits(Blockly.blockRendering.Icon,Blockly.blockRendering.Measurable); +Blockly.blockRendering.JaggedEdge=function(a){Blockly.blockRendering.JaggedEdge.superClass_.constructor.call(this,a);this.type|=Blockly.blockRendering.Types.JAGGED_EDGE;this.height=this.constants_.JAGGED_TEETH.height;this.width=this.constants_.JAGGED_TEETH.width};Blockly.utils.object.inherits(Blockly.blockRendering.JaggedEdge,Blockly.blockRendering.Measurable); +Blockly.blockRendering.Field=function(a,b,c){Blockly.blockRendering.Field.superClass_.constructor.call(this,a);this.field=b;this.isEditable=b.EDITABLE;this.flipRtl=b.getFlipRtl();this.type|=Blockly.blockRendering.Types.FIELD;a=this.field.getSize();this.height=a.height;this.width=a.width;this.parentInput=c};Blockly.utils.object.inherits(Blockly.blockRendering.Field,Blockly.blockRendering.Measurable); +Blockly.blockRendering.Hat=function(a){Blockly.blockRendering.Hat.superClass_.constructor.call(this,a);this.type|=Blockly.blockRendering.Types.HAT;this.height=this.constants_.START_HAT.height;this.width=this.constants_.START_HAT.width;this.ascenderHeight=this.height};Blockly.utils.object.inherits(Blockly.blockRendering.Hat,Blockly.blockRendering.Measurable); +Blockly.blockRendering.SquareCorner=function(a,b){Blockly.blockRendering.SquareCorner.superClass_.constructor.call(this,a);this.type=(b&&"left"!=b?Blockly.blockRendering.Types.RIGHT_SQUARE_CORNER:Blockly.blockRendering.Types.LEFT_SQUARE_CORNER)|Blockly.blockRendering.Types.CORNER;this.width=this.height=this.constants_.NO_PADDING};Blockly.utils.object.inherits(Blockly.blockRendering.SquareCorner,Blockly.blockRendering.Measurable); +Blockly.blockRendering.RoundCorner=function(a,b){Blockly.blockRendering.RoundCorner.superClass_.constructor.call(this,a);this.type=(b&&"left"!=b?Blockly.blockRendering.Types.RIGHT_ROUND_CORNER:Blockly.blockRendering.Types.LEFT_ROUND_CORNER)|Blockly.blockRendering.Types.CORNER;this.width=this.constants_.CORNER_RADIUS;this.height=this.constants_.CORNER_RADIUS/2};Blockly.utils.object.inherits(Blockly.blockRendering.RoundCorner,Blockly.blockRendering.Measurable); +Blockly.blockRendering.InRowSpacer=function(a,b){Blockly.blockRendering.InRowSpacer.superClass_.constructor.call(this,a);this.type=this.type|Blockly.blockRendering.Types.SPACER|Blockly.blockRendering.Types.IN_ROW_SPACER;this.width=b;this.height=this.constants_.SPACER_DEFAULT_HEIGHT};Blockly.utils.object.inherits(Blockly.blockRendering.InRowSpacer,Blockly.blockRendering.Measurable);Blockly.blockRendering.Row=function(a){this.type=Blockly.blockRendering.Types.ROW;this.elements=[];this.xPos=this.yPos=this.widthWithConnectedBlocks=this.minWidth=this.minHeight=this.width=this.height=0;this.hasJaggedEdge=this.hasDummyInput=this.hasInlineInput=this.hasStatement=this.hasExternalInput=!1;this.constants_=a;this.notchOffset=this.constants_.NOTCH_OFFSET_LEFT;this.align=null}; +Blockly.blockRendering.Row.prototype.measure=function(){throw Error("Unexpected attempt to measure a base Row.");};Blockly.blockRendering.Row.prototype.getLastInput=function(){for(var a=this.elements.length-1,b;b=this.elements[a];a--)if(Blockly.blockRendering.Types.isInput(b))return b;return null};Blockly.blockRendering.Row.prototype.startsWithElemSpacer=function(){return!0};Blockly.blockRendering.Row.prototype.endsWithElemSpacer=function(){return!0}; +Blockly.blockRendering.Row.prototype.getFirstSpacer=function(){for(var a=0,b;b=this.elements[a];a++)if(Blockly.blockRendering.Types.isSpacer(b))return b;return null};Blockly.blockRendering.Row.prototype.getLastSpacer=function(){for(var a=this.elements.length-1,b;b=this.elements[a];a--)if(Blockly.blockRendering.Types.isSpacer(b))return b;return null}; +Blockly.blockRendering.TopRow=function(a){Blockly.blockRendering.TopRow.superClass_.constructor.call(this,a);this.type|=Blockly.blockRendering.Types.TOP_ROW;this.ascenderHeight=this.capline=0;this.hasPreviousConnection=!1;this.connection=null};Blockly.utils.object.inherits(Blockly.blockRendering.TopRow,Blockly.blockRendering.Row); +Blockly.blockRendering.TopRow.prototype.hasLeftSquareCorner=function(a){var b=(a.hat?"cap"===a.hat:this.constants_.ADD_START_HATS)&&!a.outputConnection&&!a.previousConnection,c=a.getPreviousBlock();return!!a.outputConnection||b||(c?c.getNextBlock()==a:!1)};Blockly.blockRendering.TopRow.prototype.hasRightSquareCorner=function(a){return!0}; +Blockly.blockRendering.TopRow.prototype.measure=function(){for(var a=0,b=0,c=0,d=0,e;e=this.elements[d];d++)b+=e.width,Blockly.blockRendering.Types.isSpacer(e)||(Blockly.blockRendering.Types.isHat(e)?c=Math.max(c,e.ascenderHeight):a=Math.max(a,e.height));this.width=Math.max(this.minWidth,b);this.height=Math.max(this.minHeight,a)+c;this.capline=this.ascenderHeight=c;this.widthWithConnectedBlocks=this.width};Blockly.blockRendering.TopRow.prototype.startsWithElemSpacer=function(){return!1}; +Blockly.blockRendering.TopRow.prototype.endsWithElemSpacer=function(){return!1};Blockly.blockRendering.BottomRow=function(a){Blockly.blockRendering.BottomRow.superClass_.constructor.call(this,a);this.type|=Blockly.blockRendering.Types.BOTTOM_ROW;this.hasNextConnection=!1;this.connection=null;this.baseline=this.descenderHeight=0};Blockly.utils.object.inherits(Blockly.blockRendering.BottomRow,Blockly.blockRendering.Row); +Blockly.blockRendering.BottomRow.prototype.hasLeftSquareCorner=function(a){return!!a.outputConnection||!!a.getNextBlock()};Blockly.blockRendering.BottomRow.prototype.hasRightSquareCorner=function(a){return!0}; +Blockly.blockRendering.BottomRow.prototype.measure=function(){for(var a=0,b=0,c=0,d=0,e;e=this.elements[d];d++)b+=e.width,Blockly.blockRendering.Types.isSpacer(e)||(Blockly.blockRendering.Types.isNextConnection(e)?c=Math.max(c,e.height):a=Math.max(a,e.height));this.width=Math.max(this.minWidth,b);this.height=Math.max(this.minHeight,a)+c;this.descenderHeight=c;this.widthWithConnectedBlocks=this.width};Blockly.blockRendering.BottomRow.prototype.startsWithElemSpacer=function(){return!1}; +Blockly.blockRendering.BottomRow.prototype.endsWithElemSpacer=function(){return!1};Blockly.blockRendering.SpacerRow=function(a,b,c){Blockly.blockRendering.SpacerRow.superClass_.constructor.call(this,a);this.type=this.type|Blockly.blockRendering.Types.SPACER|Blockly.blockRendering.Types.BETWEEN_ROW_SPACER;this.width=c;this.height=b;this.followsStatement=!1;this.widthWithConnectedBlocks=0;this.elements=[new Blockly.blockRendering.InRowSpacer(this.constants_,c)]}; +Blockly.utils.object.inherits(Blockly.blockRendering.SpacerRow,Blockly.blockRendering.Row);Blockly.blockRendering.SpacerRow.prototype.measure=function(){};Blockly.blockRendering.InputRow=function(a){Blockly.blockRendering.InputRow.superClass_.constructor.call(this,a);this.type|=Blockly.blockRendering.Types.INPUT_ROW;this.connectedBlockWidths=0};Blockly.utils.object.inherits(Blockly.blockRendering.InputRow,Blockly.blockRendering.Row); +Blockly.blockRendering.InputRow.prototype.measure=function(){this.width=this.minWidth;this.height=this.minHeight;for(var a=0,b=0,c;c=this.elements[b];b++)this.width+=c.width,Blockly.blockRendering.Types.isInput(c)&&(Blockly.blockRendering.Types.isStatementInput(c)?a+=c.connectedBlockWidth:Blockly.blockRendering.Types.isExternalInput(c)&&0!=c.connectedBlockWidth&&(a+=c.connectedBlockWidth-c.connectionWidth)),Blockly.blockRendering.Types.isSpacer(c)||(this.height=Math.max(this.height,c.height));this.connectedBlockWidths= +a;this.widthWithConnectedBlocks=this.width+a};Blockly.blockRendering.InputRow.prototype.endsWithElemSpacer=function(){return!this.hasExternalInput&&!this.hasStatement};Blockly.blockRendering.RenderInfo=function(a,b){this.block_=b;this.renderer_=a;this.constants_=this.renderer_.getConstants();this.outputConnection=b.outputConnection?new Blockly.blockRendering.OutputConnection(this.constants_,b.outputConnection):null;this.isInline=b.getInputsInline()&&!b.isCollapsed();this.isCollapsed=b.isCollapsed();this.isInsertionMarker=b.isInsertionMarker();this.RTL=b.RTL;this.statementEdge=this.width=this.widthWithChildren=this.height=0;this.rows=[];this.inputRowNum_=1;this.hiddenIcons= +[];this.topRow=new Blockly.blockRendering.TopRow(this.constants_);this.bottomRow=new Blockly.blockRendering.BottomRow(this.constants_);this.startY=this.startX=0};Blockly.blockRendering.RenderInfo.prototype.getRenderer=function(){return this.renderer_};Blockly.blockRendering.RenderInfo.prototype.measure=function(){this.createRows_();this.addElemSpacing_();this.addRowSpacing_();this.computeBounds_();this.alignRowElements_();this.finalize_()}; +Blockly.blockRendering.RenderInfo.prototype.createRows_=function(){this.populateTopRow_();this.rows.push(this.topRow);var a=new Blockly.blockRendering.InputRow(this.constants_),b=this.block_.getIcons();if(b.length)for(var c=0,d;d=b[c];c++){var e=new Blockly.blockRendering.Icon(this.constants_,d);this.isCollapsed&&d.collapseHidden?this.hiddenIcons.push(e):a.elements.push(e)}d=null;for(c=0;b=this.block_.inputList[c];c++)if(b.isVisible()){this.shouldStartNewRow_(b,d)&&(this.rows.push(a),a=new Blockly.blockRendering.InputRow(this.constants_), +this.inputRowNum_++);for(d=0;e=b.fieldRow[d];d++)a.elements.push(new Blockly.blockRendering.Field(this.constants_,e,b));this.addInput_(b,a);d=b}this.isCollapsed&&(a.hasJaggedEdge=!0,a.elements.push(new Blockly.blockRendering.JaggedEdge(this.constants_)));(a.elements.length||a.hasDummyInput)&&this.rows.push(a);this.populateBottomRow_();this.rows.push(this.bottomRow)}; +Blockly.blockRendering.RenderInfo.prototype.populateTopRow_=function(){var a=!!this.block_.previousConnection,b=(this.block_.hat?"cap"===this.block_.hat:this.constants_.ADD_START_HATS)&&!this.outputConnection&&!a;this.topRow.hasLeftSquareCorner(this.block_)?this.topRow.elements.push(new Blockly.blockRendering.SquareCorner(this.constants_)):this.topRow.elements.push(new Blockly.blockRendering.RoundCorner(this.constants_));b?(a=new Blockly.blockRendering.Hat(this.constants_),this.topRow.elements.push(a), +this.topRow.capline=a.ascenderHeight):a&&(this.topRow.hasPreviousConnection=!0,this.topRow.connection=new Blockly.blockRendering.PreviousConnection(this.constants_,this.block_.previousConnection),this.topRow.elements.push(this.topRow.connection));this.block_.inputList.length&&this.block_.inputList[0].type==Blockly.NEXT_STATEMENT&&!this.block_.isCollapsed()?this.topRow.minHeight=this.constants_.TOP_ROW_PRECEDES_STATEMENT_MIN_HEIGHT:this.topRow.minHeight=this.constants_.TOP_ROW_MIN_HEIGHT;this.topRow.hasRightSquareCorner(this.block_)? +this.topRow.elements.push(new Blockly.blockRendering.SquareCorner(this.constants_,"right")):this.topRow.elements.push(new Blockly.blockRendering.RoundCorner(this.constants_,"right"))}; +Blockly.blockRendering.RenderInfo.prototype.populateBottomRow_=function(){this.bottomRow.hasNextConnection=!!this.block_.nextConnection;this.bottomRow.minHeight=this.block_.inputList.length&&this.block_.inputList[this.block_.inputList.length-1].type==Blockly.NEXT_STATEMENT?this.constants_.BOTTOM_ROW_AFTER_STATEMENT_MIN_HEIGHT:this.constants_.BOTTOM_ROW_MIN_HEIGHT;this.bottomRow.hasLeftSquareCorner(this.block_)?this.bottomRow.elements.push(new Blockly.blockRendering.SquareCorner(this.constants_)): +this.bottomRow.elements.push(new Blockly.blockRendering.RoundCorner(this.constants_));this.bottomRow.hasNextConnection&&(this.bottomRow.connection=new Blockly.blockRendering.NextConnection(this.constants_,this.block_.nextConnection),this.bottomRow.elements.push(this.bottomRow.connection));this.bottomRow.hasRightSquareCorner(this.block_)?this.bottomRow.elements.push(new Blockly.blockRendering.SquareCorner(this.constants_,"right")):this.bottomRow.elements.push(new Blockly.blockRendering.RoundCorner(this.constants_, +"right"))}; +Blockly.blockRendering.RenderInfo.prototype.addInput_=function(a,b){this.isInline&&a.type==Blockly.INPUT_VALUE?(b.elements.push(new Blockly.blockRendering.InlineInput(this.constants_,a)),b.hasInlineInput=!0):a.type==Blockly.NEXT_STATEMENT?(b.elements.push(new Blockly.blockRendering.StatementInput(this.constants_,a)),b.hasStatement=!0):a.type==Blockly.INPUT_VALUE?(b.elements.push(new Blockly.blockRendering.ExternalValueInput(this.constants_,a)),b.hasExternalInput=!0):a.type==Blockly.DUMMY_INPUT&&(b.minHeight= +Math.max(b.minHeight,a.getSourceBlock()&&a.getSourceBlock().isShadow()?this.constants_.DUMMY_INPUT_SHADOW_MIN_HEIGHT:this.constants_.DUMMY_INPUT_MIN_HEIGHT),b.hasDummyInput=!0);null==b.align&&(b.align=a.align)};Blockly.blockRendering.RenderInfo.prototype.shouldStartNewRow_=function(a,b){return b?a.type==Blockly.NEXT_STATEMENT||b.type==Blockly.NEXT_STATEMENT?!0:a.type==Blockly.INPUT_VALUE||a.type==Blockly.DUMMY_INPUT?!this.isInline:!1:!1}; +Blockly.blockRendering.RenderInfo.prototype.addElemSpacing_=function(){for(var a=0,b;b=this.rows[a];a++){var c=b.elements;b.elements=[];b.startsWithElemSpacer()&&b.elements.push(new Blockly.blockRendering.InRowSpacer(this.constants_,this.getInRowSpacing_(null,c[0])));if(c.length){for(var d=0;dthis.highlightOffset_&&(this.steps_+=Blockly.utils.svgPaths.lineOnAxis("V",a.yPos+a.height-this.highlightOffset_)))}; +Blockly.geras.Highlighter.prototype.drawBottomRow=function(a){if(this.RTL_)this.steps_+=Blockly.utils.svgPaths.lineOnAxis("V",a.baseline-this.highlightOffset_);else{var b=this.info_.bottomRow.elements[0];Blockly.blockRendering.Types.isLeftSquareCorner(b)?this.steps_+=Blockly.utils.svgPaths.moveTo(a.xPos+this.highlightOffset_,a.baseline-this.highlightOffset_):Blockly.blockRendering.Types.isLeftRoundedCorner(b)&&(this.steps_+=Blockly.utils.svgPaths.moveTo(a.xPos,a.baseline),this.steps_+=this.outsideCornerPaths_.bottomLeft())}}; +Blockly.geras.Highlighter.prototype.drawLeft=function(){var a=this.info_.outputConnection;a&&(a=a.connectionOffsetY+a.height,this.RTL_?this.steps_+=Blockly.utils.svgPaths.moveTo(this.info_.startX,a):(this.steps_+=Blockly.utils.svgPaths.moveTo(this.info_.startX+this.highlightOffset_,this.info_.bottomRow.baseline-this.highlightOffset_),this.steps_+=Blockly.utils.svgPaths.lineOnAxis("V",a)),this.steps_+=this.puzzleTabPaths_.pathUp(this.RTL_));this.RTL_||(a=this.info_.topRow,Blockly.blockRendering.Types.isLeftRoundedCorner(a.elements[0])? +this.steps_+=Blockly.utils.svgPaths.lineOnAxis("V",this.outsideCornerPaths_.height):this.steps_+=Blockly.utils.svgPaths.lineOnAxis("V",a.capline+this.highlightOffset_))}; +Blockly.geras.Highlighter.prototype.drawInlineInput=function(a){var b=this.highlightOffset_,c=a.xPos+a.connectionWidth,d=a.centerline-a.height/2,e=a.width-a.connectionWidth,f=d+b;this.RTL_?(d=a.connectionOffsetY-b,a=a.height-(a.connectionOffsetY+a.connectionHeight)+b,this.inlineSteps_+=Blockly.utils.svgPaths.moveTo(c-b,f)+Blockly.utils.svgPaths.lineOnAxis("v",d)+this.puzzleTabPaths_.pathDown(this.RTL_)+Blockly.utils.svgPaths.lineOnAxis("v",a)+Blockly.utils.svgPaths.lineOnAxis("h",e)):this.inlineSteps_+= +Blockly.utils.svgPaths.moveTo(a.xPos+a.width+b,f)+Blockly.utils.svgPaths.lineOnAxis("v",a.height)+Blockly.utils.svgPaths.lineOnAxis("h",-e)+Blockly.utils.svgPaths.moveTo(c,d+a.connectionOffsetY)+this.puzzleTabPaths_.pathDown(this.RTL_)};Blockly.geras.InlineInput=function(a,b){Blockly.geras.InlineInput.superClass_.constructor.call(this,a,b);this.connectedBlock&&(this.width+=this.constants_.DARK_PATH_OFFSET,this.height+=this.constants_.DARK_PATH_OFFSET)};Blockly.utils.object.inherits(Blockly.geras.InlineInput,Blockly.blockRendering.InlineInput);Blockly.geras.StatementInput=function(a,b){Blockly.geras.StatementInput.superClass_.constructor.call(this,a,b);this.connectedBlock&&(this.height+=this.constants_.DARK_PATH_OFFSET)}; +Blockly.utils.object.inherits(Blockly.geras.StatementInput,Blockly.blockRendering.StatementInput);Blockly.geras.RenderInfo=function(a,b){Blockly.geras.RenderInfo.superClass_.constructor.call(this,a,b)};Blockly.utils.object.inherits(Blockly.geras.RenderInfo,Blockly.blockRendering.RenderInfo);Blockly.geras.RenderInfo.prototype.getRenderer=function(){return this.renderer_}; +Blockly.geras.RenderInfo.prototype.populateBottomRow_=function(){Blockly.geras.RenderInfo.superClass_.populateBottomRow_.call(this);this.block_.inputList.length&&this.block_.inputList[this.block_.inputList.length-1].type==Blockly.NEXT_STATEMENT||(this.bottomRow.minHeight=this.constants_.MEDIUM_PADDING-this.constants_.DARK_PATH_OFFSET)}; +Blockly.geras.RenderInfo.prototype.addInput_=function(a,b){this.isInline&&a.type==Blockly.INPUT_VALUE?(b.elements.push(new Blockly.geras.InlineInput(this.constants_,a)),b.hasInlineInput=!0):a.type==Blockly.NEXT_STATEMENT?(b.elements.push(new Blockly.geras.StatementInput(this.constants_,a)),b.hasStatement=!0):a.type==Blockly.INPUT_VALUE?(b.elements.push(new Blockly.blockRendering.ExternalValueInput(this.constants_,a)),b.hasExternalInput=!0):a.type==Blockly.DUMMY_INPUT&&(b.minHeight=Math.max(b.minHeight, +this.constants_.DUMMY_INPUT_MIN_HEIGHT),b.hasDummyInput=!0);this.isInline||null!=b.align||(b.align=a.align)}; +Blockly.geras.RenderInfo.prototype.addElemSpacing_=function(){for(var a=!1,b=0,c;c=this.rows[b];b++)c.hasExternalInput&&(a=!0);for(b=0;c=this.rows[b];b++){var d=c.elements;c.elements=[];c.startsWithElemSpacer()&&c.elements.push(new Blockly.blockRendering.InRowSpacer(this.constants_,this.getInRowSpacing_(null,d[0])));if(d.length){for(var e=0;erect:not(.blocklyDropdownRect),",a+" .blocklyEditableText>rect:not(.blocklyDropdownRect) {","fill: "+this.FIELD_BORDER_RECT_COLOUR+";","}",a+" .blocklyNonEditableText>text,",a+" .blocklyEditableText>text,",a+ +" .blocklyNonEditableText>g>text,",a+" .blocklyEditableText>g>text {","fill: #575E75;","}",a+" .blocklyDraggable:not(.blocklyDisabled)"," .blocklyEditableText:not(.editing):hover>rect ,",a+" .blocklyDraggable:not(.blocklyDisabled)"," .blocklyEditableText:not(.editing):hover>.blocklyPath {","stroke: #fff;","stroke-width: 2;","}",a+" .blocklyHtmlInput {","font-family: "+this.FIELD_TEXT_FONTFAMILY+";","font-weight: "+this.FIELD_TEXT_FONTWEIGHT+";","color: #575E75;","}",a+" .blocklyDropdownText {","fill: #fff !important;", +"}",a+".blocklyWidgetDiv .goog-menuitem,",a+".blocklyDropDownDiv .goog-menuitem {","font-family: "+this.FIELD_TEXT_FONTFAMILY+";","}",a+".blocklyDropDownDiv .goog-menuitem-content {","color: #fff;","}",a+" .blocklyHighlightedConnectionPath {","stroke: #fff200;","}",a+" .blocklyDisabled > .blocklyOutlinePath {","fill: url(#blocklyDisabledPattern"+this.randomIdentifier_+")","}"]};Blockly.zelos.TopRow=function(a){Blockly.zelos.TopRow.superClass_.constructor.call(this,a)};Blockly.utils.object.inherits(Blockly.zelos.TopRow,Blockly.blockRendering.TopRow);Blockly.zelos.TopRow.prototype.endsWithElemSpacer=function(){return!1};Blockly.zelos.TopRow.prototype.hasLeftSquareCorner=function(a){var b=(a.hat?"cap"===a.hat:this.constants_.ADD_START_HATS)&&!a.outputConnection&&!a.previousConnection;return!!a.outputConnection||b};Blockly.zelos.TopRow.prototype.hasRightSquareCorner=function(a){return!!a.outputConnection}; +Blockly.zelos.BottomRow=function(a){Blockly.zelos.BottomRow.superClass_.constructor.call(this,a)};Blockly.utils.object.inherits(Blockly.zelos.BottomRow,Blockly.blockRendering.BottomRow);Blockly.zelos.BottomRow.prototype.endsWithElemSpacer=function(){return!1};Blockly.zelos.BottomRow.prototype.hasLeftSquareCorner=function(a){return!!a.outputConnection};Blockly.zelos.BottomRow.prototype.hasRightSquareCorner=function(a){return!!a.outputConnection};Blockly.zelos.RightConnectionShape=function(a){Blockly.zelos.RightConnectionShape.superClass_.constructor.call(this,a);this.type|=Blockly.blockRendering.Types.getType("RIGHT_CONNECTION");this.width=this.height=0};Blockly.utils.object.inherits(Blockly.zelos.RightConnectionShape,Blockly.blockRendering.Measurable);Blockly.zelos.StatementInput=function(a,b){Blockly.zelos.StatementInput.superClass_.constructor.call(this,a,b);if(this.connectedBlock){for(a=this.connectedBlock;a.getNextBlock();)a=a.getNextBlock();a.nextConnection||(this.height=this.connectedBlockHeight,this.connectedBottomNextConnection=!0)}};Blockly.utils.object.inherits(Blockly.zelos.StatementInput,Blockly.blockRendering.StatementInput);Blockly.zelos.RenderInfo=function(a,b){Blockly.zelos.RenderInfo.superClass_.constructor.call(this,a,b);this.topRow=new Blockly.zelos.TopRow(this.constants_);this.bottomRow=new Blockly.zelos.BottomRow(this.constants_);this.isInline=!0;this.isMultiRow=!b.getInputsInline()||b.isCollapsed();this.rightSide=this.outputConnection?new Blockly.zelos.RightConnectionShape(this.constants_):null};Blockly.utils.object.inherits(Blockly.zelos.RenderInfo,Blockly.blockRendering.RenderInfo); +Blockly.zelos.RenderInfo.prototype.getRenderer=function(){return this.renderer_};Blockly.zelos.RenderInfo.prototype.measure=function(){this.createRows_();this.addElemSpacing_();this.addRowSpacing_();this.adjustXPosition_();this.computeBounds_();this.alignRowElements_();this.finalize_()}; +Blockly.zelos.RenderInfo.prototype.shouldStartNewRow_=function(a,b){return b?a.type==Blockly.NEXT_STATEMENT||b.type==Blockly.NEXT_STATEMENT?!0:a.type==Blockly.INPUT_VALUE||a.type==Blockly.DUMMY_INPUT?!this.isInline||this.isMultiRow:!1:!1};Blockly.zelos.RenderInfo.prototype.getDesiredRowWidth_=function(a){return a.hasStatement?this.width-this.startX-(this.constants_.INSIDE_CORNERS.rightWidth||0):Blockly.zelos.RenderInfo.superClass_.getDesiredRowWidth_.call(this,a)}; +Blockly.zelos.RenderInfo.prototype.getInRowSpacing_=function(a,b){return a&&b||!this.outputConnection||!this.outputConnection.isDynamicShape?!a&&b&&Blockly.blockRendering.Types.isStatementInput(b)?this.constants_.STATEMENT_INPUT_PADDING_LEFT:a&&Blockly.blockRendering.Types.isLeftRoundedCorner(a)&&b&&(Blockly.blockRendering.Types.isPreviousConnection(b)||Blockly.blockRendering.Types.isNextConnection(b))?b.notchOffset-this.constants_.CORNER_RADIUS:a&&Blockly.blockRendering.Types.isLeftSquareCorner(a)&& +b&&Blockly.blockRendering.Types.isHat(b)?this.constants_.NO_PADDING:this.constants_.MEDIUM_PADDING:this.constants_.NO_PADDING}; +Blockly.zelos.RenderInfo.prototype.getSpacerRowHeight_=function(a,b){if(Blockly.blockRendering.Types.isTopRow(a)&&Blockly.blockRendering.Types.isBottomRow(b))return this.constants_.EMPTY_BLOCK_SPACER_HEIGHT;var c=Blockly.blockRendering.Types.isInputRow(a)&&a.hasStatement,d=Blockly.blockRendering.Types.isInputRow(b)&&b.hasStatement;return d||c?(a=Math.max(this.constants_.MEDIUM_PADDING,Math.max(this.constants_.NOTCH_HEIGHT,this.constants_.INSIDE_CORNERS.rightHeight||0)),d&&c?Math.max(a,this.constants_.DUMMY_INPUT_MIN_HEIGHT): +a):Blockly.blockRendering.Types.isTopRow(a)?a.hasPreviousConnection||this.outputConnection?this.constants_.NO_PADDING:this.constants_.SMALL_PADDING:Blockly.blockRendering.Types.isBottomRow(b)?this.outputConnection?this.constants_.NO_PADDING:this.constants_.SMALL_PADDING:this.constants_.MEDIUM_PADDING}; +Blockly.zelos.RenderInfo.prototype.getSpacerRowWidth_=function(a,b){var c=this.width-this.startX;return Blockly.blockRendering.Types.isInputRow(a)&&a.hasStatement||Blockly.blockRendering.Types.isInputRow(b)&&b.hasStatement?Math.max(c,this.constants_.STATEMENT_INPUT_SPACER_MIN_WIDTH):c}; +Blockly.zelos.RenderInfo.prototype.getElemCenterline_=function(a,b){return a.hasStatement&&!Blockly.blockRendering.Types.isSpacer(b)?a.yPos+this.constants_.EMPTY_STATEMENT_INPUT_HEIGHT/2:Blockly.zelos.RenderInfo.superClass_.getElemCenterline_.call(this,a,b)}; +Blockly.zelos.RenderInfo.prototype.addInput_=function(a,b){a.type==Blockly.DUMMY_INPUT&&b.hasDummyInput&&b.align==Blockly.ALIGN_LEFT&&a.align==Blockly.ALIGN_RIGHT&&(b.rightAlignedDummyInput=a);this.isInline&&a.type==Blockly.INPUT_VALUE?(b.elements.push(new Blockly.blockRendering.InlineInput(this.constants_,a)),b.hasInlineInput=!0):a.type==Blockly.NEXT_STATEMENT?(b.elements.push(new Blockly.zelos.StatementInput(this.constants_,a)),b.hasStatement=!0):a.type==Blockly.INPUT_VALUE?(b.elements.push(new Blockly.blockRendering.ExternalValueInput(this.constants_, +a)),b.hasExternalInput=!0):a.type==Blockly.DUMMY_INPUT&&(b.minHeight=Math.max(b.minHeight,a.getSourceBlock()&&a.getSourceBlock().isShadow()?this.constants_.DUMMY_INPUT_SHADOW_MIN_HEIGHT:this.constants_.DUMMY_INPUT_MIN_HEIGHT),b.hasDummyInput=!0);null==b.align&&(b.align=a.align)}; +Blockly.zelos.RenderInfo.prototype.addAlignmentPadding_=function(a,b){if(a.rightAlignedDummyInput){for(var c,d=0,e;(e=a.elements[d])&&(Blockly.blockRendering.Types.isSpacer(e)&&(c=e),!Blockly.blockRendering.Types.isField(e)||e.parentInput!=a.rightAlignedDummyInput);d++);if(c){c.width+=b;a.width+=b;return}}Blockly.zelos.RenderInfo.superClass_.addAlignmentPadding_.call(this,a,b)}; +Blockly.zelos.RenderInfo.prototype.adjustXPosition_=function(){for(var a=this.constants_.NOTCH_OFFSET_LEFT+this.constants_.NOTCH_WIDTH,b=a,c=2;c=this.rows.length-1?!!this.bottomRow.hasNextConnection:!!f.precedesStatement;if(Blockly.blockRendering.Types.isInputRow(e)&&e.hasStatement)e.measure(),b=e.width-e.getLastInput().width+a;else if(d&&(2==c||f)&& +Blockly.blockRendering.Types.isInputRow(e)&&!e.hasStatement){f=e.xPos;d=null;for(var g=0,h;h=e.elements[g];g++)Blockly.blockRendering.Types.isSpacer(h)&&(d=h),!(d&&(Blockly.blockRendering.Types.isField(h)||Blockly.blockRendering.Types.isInput(h))&&f=this.rows.length-1?!!this.bottomRow.hasNextConnection:!!d.precedesStatement;if(e?this.topRow.hasPreviousConnection:b.followsStatement){var g=3==c.elements.length&&(c.elements[1].field instanceof Blockly.FieldLabel||c.elements[1].field instanceof Blockly.FieldImage);if(!e&&g)b.height-=this.constants_.SMALL_PADDING, +d.height-=this.constants_.SMALL_PADDING,c.height-=this.constants_.MEDIUM_PADDING;else if(!e&&!f)b.height+=this.constants_.SMALL_PADDING;else if(f){e=!1;for(f=0;g=c.elements[f];f++)if(Blockly.blockRendering.Types.isInlineInput(g)&&g.connectedBlock&&!g.connectedBlock.isShadow()&&40<=g.connectedBlock.getHeightWidth().height){e=!0;break}e&&(b.height-=this.constants_.SMALL_PADDING,d.height-=this.constants_.SMALL_PADDING)}}}}; +Blockly.zelos.RenderInfo.prototype.finalize_=function(){this.finalizeOutputConnection_();this.finalizeHorizontalAlignment_();this.finalizeVerticalAlignment_();Blockly.zelos.RenderInfo.superClass_.finalize_.call(this)};Blockly.zelos.Drawer=function(a,b){Blockly.zelos.Drawer.superClass_.constructor.call(this,a,b)};Blockly.utils.object.inherits(Blockly.zelos.Drawer,Blockly.blockRendering.Drawer); +Blockly.zelos.Drawer.prototype.draw=function(){var a=this.block_.pathObject;a.beginDrawing();this.hideHiddenIcons_();this.drawOutline_();this.drawInternals_();a.setPath(this.outlinePath_+"\n"+this.inlinePath_);this.info_.RTL&&a.flipRTL();Blockly.blockRendering.useDebugger&&this.block_.renderingDebugger.drawDebug(this.block_,this.info_);this.recordSizeOnBlock_();this.info_.outputConnection&&(a.outputShapeType=this.info_.outputConnection.shape.type);a.endDrawing()}; +Blockly.zelos.Drawer.prototype.drawOutline_=function(){this.info_.outputConnection&&this.info_.outputConnection.isDynamicShape?(this.drawFlatTop_(),this.drawRightDynamicConnection_(),this.drawFlatBottom_(),this.drawLeftDynamicConnection_()):Blockly.zelos.Drawer.superClass_.drawOutline_.call(this)}; +Blockly.zelos.Drawer.prototype.drawRightSideRow_=function(a){if(!(0>=a.height))if(a.precedesStatement||a.followsStatement){var b=this.constants_.INSIDE_CORNERS.rightHeight;b=a.height-(a.precedesStatement?b:0);this.outlinePath_+=(a.followsStatement?this.constants_.INSIDE_CORNERS.pathBottomRight:"")+(0'); + document.write(''); +} diff --git a/js/blocks/colour.js b/js/blocks/colour.js new file mode 100644 index 0000000..fdd1966 --- /dev/null +++ b/js/blocks/colour.js @@ -0,0 +1,133 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Colour blocks for Blockly. + * + * This file is scraped to extract a .json file of block definitions. The array + * passed to defineBlocksWithJsonArray(..) must be strict JSON: double quotes + * only, no outside references, no functions, no trailing commas, etc. The one + * exception is end-of-line comments, which the scraper will remove. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Blocks.colour'); // Deprecated +goog.provide('Blockly.Constants.Colour'); + +goog.require('Blockly'); +goog.require('Blockly.Blocks'); +goog.require('Blockly.FieldColour'); +goog.require('Blockly.FieldLabel'); + + +/** + * Unused constant for the common HSV hue for all blocks in this category. + * @deprecated Use Blockly.Msg['COLOUR_HUE']. (2018 April 5) + */ +Blockly.Constants.Colour.HUE = 20; + +Blockly.defineBlocksWithJsonArray([ // BEGIN JSON EXTRACT + // Block for colour picker. + { + "type": "colour_picker", + "message0": "%1", + "args0": [ + { + "type": "field_colour", + "name": "COLOUR", + "colour": "#ff0000" + } + ], + "output": "Colour", + "helpUrl": "%{BKY_COLOUR_PICKER_HELPURL}", + "style": "colour_blocks", + "tooltip": "%{BKY_COLOUR_PICKER_TOOLTIP}", + "extensions": ["parent_tooltip_when_inline"] + }, + + // Block for random colour. + { + "type": "colour_random", + "message0": "%{BKY_COLOUR_RANDOM_TITLE}", + "output": "Colour", + "helpUrl": "%{BKY_COLOUR_RANDOM_HELPURL}", + "style": "colour_blocks", + "tooltip": "%{BKY_COLOUR_RANDOM_TOOLTIP}" + }, + + // Block for composing a colour from RGB components. + { + "type": "colour_rgb", + "message0": "%{BKY_COLOUR_RGB_TITLE} %{BKY_COLOUR_RGB_RED} %1 %{BKY_COLOUR_RGB_GREEN} %2 %{BKY_COLOUR_RGB_BLUE} %3", + "args0": [ + { + "type": "input_value", + "name": "RED", + "check": "Number", + "align": "RIGHT" + }, + { + "type": "input_value", + "name": "GREEN", + "check": "Number", + "align": "RIGHT" + }, + { + "type": "input_value", + "name": "BLUE", + "check": "Number", + "align": "RIGHT" + } + ], + "output": "Colour", + "helpUrl": "%{BKY_COLOUR_RGB_HELPURL}", + "style": "colour_blocks", + "tooltip": "%{BKY_COLOUR_RGB_TOOLTIP}" + }, + + // Block for blending two colours together. + { + "type": "colour_blend", + "message0": "%{BKY_COLOUR_BLEND_TITLE} %{BKY_COLOUR_BLEND_COLOUR1} " + + "%1 %{BKY_COLOUR_BLEND_COLOUR2} %2 %{BKY_COLOUR_BLEND_RATIO} %3", + "args0": [ + { + "type": "input_value", + "name": "COLOUR1", + "check": "Colour", + "align": "RIGHT" + }, + { + "type": "input_value", + "name": "COLOUR2", + "check": "Colour", + "align": "RIGHT" + }, + { + "type": "input_value", + "name": "RATIO", + "check": "Number", + "align": "RIGHT" + } + ], + "output": "Colour", + "helpUrl": "%{BKY_COLOUR_BLEND_HELPURL}", + "style": "colour_blocks", + "tooltip": "%{BKY_COLOUR_BLEND_TOOLTIP}" + } +]); // END JSON EXTRACT (Do not delete this comment.) diff --git a/js/blocks/lists.js b/js/blocks/lists.js new file mode 100644 index 0000000..2e12334 --- /dev/null +++ b/js/blocks/lists.js @@ -0,0 +1,872 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview List blocks for Blockly. + * + * This file is scraped to extract a .json file of block definitions. The array + * passed to defineBlocksWithJsonArray(..) must be strict JSON: double quotes + * only, no outside references, no functions, no trailing commas, etc. The one + * exception is end-of-line comments, which the scraper will remove. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Blocks.lists'); // Deprecated +goog.provide('Blockly.Constants.Lists'); + +goog.require('Blockly'); +goog.require('Blockly.Blocks'); +goog.require('Blockly.FieldDropdown'); +goog.require('Blockly.FieldLabel'); +goog.require('Blockly.Mutator'); + + +/** + * Unused constant for the common HSV hue for all blocks in this category. + * @deprecated Use Blockly.Msg['LISTS_HUE']. (2018 April 5) + */ +Blockly.Constants.Lists.HUE = 260; + +Blockly.defineBlocksWithJsonArray([ // BEGIN JSON EXTRACT + // Block for creating an empty list + // The 'list_create_with' block is preferred as it is more flexible. + // + // + // + { + "type": "lists_create_empty", + "message0": "%{BKY_LISTS_CREATE_EMPTY_TITLE}", + "output": "Array", + "style": "list_blocks", + "tooltip": "%{BKY_LISTS_CREATE_EMPTY_TOOLTIP}", + "helpUrl": "%{BKY_LISTS_CREATE_EMPTY_HELPURL}" + }, + // Block for creating a list with one element repeated. + { + "type": "lists_repeat", + "message0": "%{BKY_LISTS_REPEAT_TITLE}", + "args0": [ + { + "type": "input_value", + "name": "ITEM" + }, + { + "type": "input_value", + "name": "NUM", + "check": "Number" + } + ], + "output": "Array", + "style": "list_blocks", + "tooltip": "%{BKY_LISTS_REPEAT_TOOLTIP}", + "helpUrl": "%{BKY_LISTS_REPEAT_HELPURL}" + }, + // Block for reversing a list. + { + "type": "lists_reverse", + "message0": "%{BKY_LISTS_REVERSE_MESSAGE0}", + "args0": [ + { + "type": "input_value", + "name": "LIST", + "check": "Array" + } + ], + "output": "Array", + "inputsInline": true, + "style": "list_blocks", + "tooltip": "%{BKY_LISTS_REVERSE_TOOLTIP}", + "helpUrl": "%{BKY_LISTS_REVERSE_HELPURL}" + }, + // Block for checking if a list is empty + { + "type": "lists_isEmpty", + "message0": "%{BKY_LISTS_ISEMPTY_TITLE}", + "args0": [ + { + "type": "input_value", + "name": "VALUE", + "check": ["String", "Array"] + } + ], + "output": "Boolean", + "style": "list_blocks", + "tooltip": "%{BKY_LISTS_ISEMPTY_TOOLTIP}", + "helpUrl": "%{BKY_LISTS_ISEMPTY_HELPURL}" + }, + // Block for getting the list length + { + "type": "lists_length", + "message0": "%{BKY_LISTS_LENGTH_TITLE}", + "args0": [ + { + "type": "input_value", + "name": "VALUE", + "check": ["String", "Array"] + } + ], + "output": "Number", + "style": "list_blocks", + "tooltip": "%{BKY_LISTS_LENGTH_TOOLTIP}", + "helpUrl": "%{BKY_LISTS_LENGTH_HELPURL}" + } +]); // END JSON EXTRACT (Do not delete this comment.) + +Blockly.Blocks['lists_create_with'] = { + /** + * Block for creating a list with any number of elements of any type. + * @this {Blockly.Block} + */ + init: function() { + this.setHelpUrl(Blockly.Msg['LISTS_CREATE_WITH_HELPURL']); + this.setStyle('list_blocks'); + this.itemCount_ = 3; + this.updateShape_(); + this.setOutput(true, 'Array'); + this.setMutator(new Blockly.Mutator(['lists_create_with_item'])); + this.setTooltip(Blockly.Msg['LISTS_CREATE_WITH_TOOLTIP']); + }, + /** + * Create XML to represent list inputs. + * @return {!Element} XML storage element. + * @this {Blockly.Block} + */ + mutationToDom: function() { + var container = Blockly.utils.xml.createElement('mutation'); + container.setAttribute('items', this.itemCount_); + return container; + }, + /** + * Parse XML to restore the list inputs. + * @param {!Element} xmlElement XML storage element. + * @this {Blockly.Block} + */ + domToMutation: function(xmlElement) { + this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); + this.updateShape_(); + }, + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @return {!Blockly.Block} Root block in mutator. + * @this {Blockly.Block} + */ + decompose: function(workspace) { + var containerBlock = workspace.newBlock('lists_create_with_container'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 0; i < this.itemCount_; i++) { + var itemBlock = workspace.newBlock('lists_create_with_item'); + itemBlock.initSvg(); + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this {Blockly.Block} + */ + compose: function(containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + // Count number of inputs. + var connections = []; + while (itemBlock) { + connections.push(itemBlock.valueConnection_); + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + // Disconnect any children that don't belong. + for (var i = 0; i < this.itemCount_; i++) { + var connection = this.getInput('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++) { + Blockly.Mutator.reconnect(connections[i], this, 'ADD' + i); + } + }, + /** + * Store pointers to any connected child blocks. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this {Blockly.Block} + */ + saveConnections: function(containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 0; + while (itemBlock) { + var input = this.getInput('ADD' + i); + itemBlock.valueConnection_ = input && input.connection.targetConnection; + i++; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + }, + /** + * Modify this block to have the correct number of inputs. + * @private + * @this {Blockly.Block} + */ + updateShape_: function() { + if (this.itemCount_ && this.getInput('EMPTY')) { + this.removeInput('EMPTY'); + } else if (!this.itemCount_ && !this.getInput('EMPTY')) { + this.appendDummyInput('EMPTY') + .appendField(Blockly.Msg['LISTS_CREATE_EMPTY_TITLE']); + } + // 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++; + } + } +}; + +Blockly.Blocks['lists_create_with_container'] = { + /** + * Mutator block for list container. + * @this {Blockly.Block} + */ + init: function() { + this.setStyle('list_blocks'); + this.appendDummyInput() + .appendField(Blockly.Msg['LISTS_CREATE_WITH_CONTAINER_TITLE_ADD']); + this.appendStatementInput('STACK'); + this.setTooltip(Blockly.Msg['LISTS_CREATE_WITH_CONTAINER_TOOLTIP']); + this.contextMenu = false; + } +}; + +Blockly.Blocks['lists_create_with_item'] = { + /** + * Mutator block for adding items. + * @this {Blockly.Block} + */ + init: function() { + this.setStyle('list_blocks'); + this.appendDummyInput() + .appendField(Blockly.Msg['LISTS_CREATE_WITH_ITEM_TITLE']); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg['LISTS_CREATE_WITH_ITEM_TOOLTIP']); + this.contextMenu = false; + } +}; + +Blockly.Blocks['lists_indexOf'] = { + /** + * Block for finding an item in the list. + * @this {Blockly.Block} + */ + init: function() { + var OPERATORS = + [ + [Blockly.Msg['LISTS_INDEX_OF_FIRST'], 'FIRST'], + [Blockly.Msg['LISTS_INDEX_OF_LAST'], 'LAST'] + ]; + this.setHelpUrl(Blockly.Msg['LISTS_INDEX_OF_HELPURL']); + this.setStyle('list_blocks'); + this.setOutput(true, 'Number'); + this.appendValueInput('VALUE') + .setCheck('Array') + .appendField(Blockly.Msg['LISTS_INDEX_OF_INPUT_IN_LIST']); + this.appendValueInput('FIND') + .appendField(new Blockly.FieldDropdown(OPERATORS), 'END'); + this.setInputsInline(true); + // Assign 'this' to a variable for use in the tooltip closure below. + var thisBlock = this; + this.setTooltip(function() { + return Blockly.Msg['LISTS_INDEX_OF_TOOLTIP'].replace('%1', + thisBlock.workspace.options.oneBasedIndex ? '0' : '-1'); + }); + } +}; + +Blockly.Blocks['lists_getIndex'] = { + /** + * Block for getting element at index. + * @this {Blockly.Block} + */ + init: function() { + var MODE = + [ + [Blockly.Msg['LISTS_GET_INDEX_GET'], 'GET'], + [Blockly.Msg['LISTS_GET_INDEX_GET_REMOVE'], 'GET_REMOVE'], + [Blockly.Msg['LISTS_GET_INDEX_REMOVE'], 'REMOVE'] + ]; + this.WHERE_OPTIONS = + [ + [Blockly.Msg['LISTS_GET_INDEX_FROM_START'], 'FROM_START'], + [Blockly.Msg['LISTS_GET_INDEX_FROM_END'], 'FROM_END'], + [Blockly.Msg['LISTS_GET_INDEX_FIRST'], 'FIRST'], + [Blockly.Msg['LISTS_GET_INDEX_LAST'], 'LAST'], + [Blockly.Msg['LISTS_GET_INDEX_RANDOM'], 'RANDOM'] + ]; + this.setHelpUrl(Blockly.Msg['LISTS_GET_INDEX_HELPURL']); + this.setStyle('list_blocks'); + var modeMenu = new Blockly.FieldDropdown(MODE, function(value) { + var isStatement = (value == 'REMOVE'); + this.getSourceBlock().updateStatement_(isStatement); + }); + this.appendValueInput('VALUE') + .setCheck('Array') + .appendField(Blockly.Msg['LISTS_GET_INDEX_INPUT_IN_LIST']); + this.appendDummyInput() + .appendField(modeMenu, 'MODE') + .appendField('', 'SPACE'); + this.appendDummyInput('AT'); + if (Blockly.Msg['LISTS_GET_INDEX_TAIL']) { + this.appendDummyInput('TAIL') + .appendField(Blockly.Msg['LISTS_GET_INDEX_TAIL']); + } + this.setInputsInline(true); + this.setOutput(true); + this.updateAt_(true); + // Assign 'this' to a variable for use in the tooltip closure below. + var thisBlock = this; + this.setTooltip(function() { + var mode = thisBlock.getFieldValue('MODE'); + var where = thisBlock.getFieldValue('WHERE'); + var tooltip = ''; + switch (mode + ' ' + where) { + case 'GET FROM_START': + case 'GET FROM_END': + tooltip = Blockly.Msg['LISTS_GET_INDEX_TOOLTIP_GET_FROM']; + break; + case 'GET FIRST': + tooltip = Blockly.Msg['LISTS_GET_INDEX_TOOLTIP_GET_FIRST']; + break; + case 'GET LAST': + tooltip = Blockly.Msg['LISTS_GET_INDEX_TOOLTIP_GET_LAST']; + break; + case 'GET RANDOM': + tooltip = Blockly.Msg['LISTS_GET_INDEX_TOOLTIP_GET_RANDOM']; + break; + case 'GET_REMOVE FROM_START': + case 'GET_REMOVE FROM_END': + tooltip = Blockly.Msg['LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM']; + break; + case 'GET_REMOVE FIRST': + tooltip = Blockly.Msg['LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST']; + break; + case 'GET_REMOVE LAST': + tooltip = Blockly.Msg['LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST']; + break; + case 'GET_REMOVE RANDOM': + tooltip = Blockly.Msg['LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM']; + break; + case 'REMOVE FROM_START': + case 'REMOVE FROM_END': + tooltip = Blockly.Msg['LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM']; + break; + case 'REMOVE FIRST': + tooltip = Blockly.Msg['LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST']; + break; + case 'REMOVE LAST': + tooltip = Blockly.Msg['LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST']; + break; + case 'REMOVE RANDOM': + tooltip = Blockly.Msg['LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM']; + break; + } + if (where == 'FROM_START' || where == 'FROM_END') { + var msg = (where == 'FROM_START') ? + Blockly.Msg['LISTS_INDEX_FROM_START_TOOLTIP'] : + Blockly.Msg['LISTS_INDEX_FROM_END_TOOLTIP']; + tooltip += ' ' + msg.replace('%1', + thisBlock.workspace.options.oneBasedIndex ? '#1' : '#0'); + } + return tooltip; + }); + }, + /** + * Create XML to represent whether the block is a statement or a value. + * Also represent whether there is an 'AT' input. + * @return {Element} XML storage element. + * @this {Blockly.Block} + */ + mutationToDom: function() { + var container = Blockly.utils.xml.createElement('mutation'); + var isStatement = !this.outputConnection; + container.setAttribute('statement', isStatement); + var isAt = this.getInput('AT').type == Blockly.INPUT_VALUE; + container.setAttribute('at', isAt); + return container; + }, + /** + * Parse XML to restore the 'AT' input. + * @param {!Element} xmlElement XML storage element. + * @this {Blockly.Block} + */ + domToMutation: function(xmlElement) { + // Note: Until January 2013 this block did not have mutations, + // so 'statement' defaults to false and 'at' defaults to true. + var isStatement = (xmlElement.getAttribute('statement') == 'true'); + this.updateStatement_(isStatement); + var isAt = (xmlElement.getAttribute('at') != 'false'); + this.updateAt_(isAt); + }, + /** + * Switch between a value block and a statement block. + * @param {boolean} newStatement True if the block should be a statement. + * False if the block should be a value. + * @private + * @this {Blockly.Block} + */ + updateStatement_: function(newStatement) { + var oldStatement = !this.outputConnection; + if (newStatement != oldStatement) { + this.unplug(true, true); + if (newStatement) { + this.setOutput(false); + this.setPreviousStatement(true); + this.setNextStatement(true); + } else { + this.setPreviousStatement(false); + this.setNextStatement(false); + this.setOutput(true); + } + } + }, + /** + * Create or delete an input for the numeric index. + * @param {boolean} isAt True if the input should exist. + * @private + * @this {Blockly.Block} + */ + updateAt_: function(isAt) { + // Destroy old 'AT' and 'ORDINAL' inputs. + this.removeInput('AT'); + this.removeInput('ORDINAL', true); + // Create either a value 'AT' input or a dummy input. + if (isAt) { + this.appendValueInput('AT').setCheck('Number'); + if (Blockly.Msg['ORDINAL_NUMBER_SUFFIX']) { + this.appendDummyInput('ORDINAL') + .appendField(Blockly.Msg['ORDINAL_NUMBER_SUFFIX']); + } + } else { + this.appendDummyInput('AT'); + } + var menu = new Blockly.FieldDropdown(this.WHERE_OPTIONS, function(value) { + var newAt = (value == 'FROM_START') || (value == 'FROM_END'); + // The 'isAt' variable is available due to this function being a closure. + if (newAt != isAt) { + var block = this.getSourceBlock(); + block.updateAt_(newAt); + // This menu has been destroyed and replaced. Update the replacement. + block.setFieldValue(value, 'WHERE'); + return null; + } + return undefined; + }); + this.getInput('AT').appendField(menu, 'WHERE'); + if (Blockly.Msg['LISTS_GET_INDEX_TAIL']) { + this.moveInputBefore('TAIL', null); + } + } +}; + +Blockly.Blocks['lists_setIndex'] = { + /** + * Block for setting the element at index. + * @this {Blockly.Block} + */ + init: function() { + var MODE = + [ + [Blockly.Msg['LISTS_SET_INDEX_SET'], 'SET'], + [Blockly.Msg['LISTS_SET_INDEX_INSERT'], 'INSERT'] + ]; + this.WHERE_OPTIONS = + [ + [Blockly.Msg['LISTS_GET_INDEX_FROM_START'], 'FROM_START'], + [Blockly.Msg['LISTS_GET_INDEX_FROM_END'], 'FROM_END'], + [Blockly.Msg['LISTS_GET_INDEX_FIRST'], 'FIRST'], + [Blockly.Msg['LISTS_GET_INDEX_LAST'], 'LAST'], + [Blockly.Msg['LISTS_GET_INDEX_RANDOM'], 'RANDOM'] + ]; + this.setHelpUrl(Blockly.Msg['LISTS_SET_INDEX_HELPURL']); + this.setStyle('list_blocks'); + this.appendValueInput('LIST') + .setCheck('Array') + .appendField(Blockly.Msg['LISTS_SET_INDEX_INPUT_IN_LIST']); + this.appendDummyInput() + .appendField(new Blockly.FieldDropdown(MODE), 'MODE') + .appendField('', 'SPACE'); + this.appendDummyInput('AT'); + this.appendValueInput('TO') + .appendField(Blockly.Msg['LISTS_SET_INDEX_INPUT_TO']); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setTooltip(Blockly.Msg['LISTS_SET_INDEX_TOOLTIP']); + this.updateAt_(true); + // Assign 'this' to a variable for use in the tooltip closure below. + var thisBlock = this; + this.setTooltip(function() { + var mode = thisBlock.getFieldValue('MODE'); + var where = thisBlock.getFieldValue('WHERE'); + var tooltip = ''; + switch (mode + ' ' + where) { + case 'SET FROM_START': + case 'SET FROM_END': + tooltip = Blockly.Msg['LISTS_SET_INDEX_TOOLTIP_SET_FROM']; + break; + case 'SET FIRST': + tooltip = Blockly.Msg['LISTS_SET_INDEX_TOOLTIP_SET_FIRST']; + break; + case 'SET LAST': + tooltip = Blockly.Msg['LISTS_SET_INDEX_TOOLTIP_SET_LAST']; + break; + case 'SET RANDOM': + tooltip = Blockly.Msg['LISTS_SET_INDEX_TOOLTIP_SET_RANDOM']; + break; + case 'INSERT FROM_START': + case 'INSERT FROM_END': + tooltip = Blockly.Msg['LISTS_SET_INDEX_TOOLTIP_INSERT_FROM']; + break; + case 'INSERT FIRST': + tooltip = Blockly.Msg['LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST']; + break; + case 'INSERT LAST': + tooltip = Blockly.Msg['LISTS_SET_INDEX_TOOLTIP_INSERT_LAST']; + break; + case 'INSERT RANDOM': + tooltip = Blockly.Msg['LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM']; + break; + } + if (where == 'FROM_START' || where == 'FROM_END') { + tooltip += ' ' + Blockly.Msg['LISTS_INDEX_FROM_START_TOOLTIP'] + .replace('%1', + thisBlock.workspace.options.oneBasedIndex ? '#1' : '#0'); + } + return tooltip; + }); + }, + /** + * Create XML to represent whether there is an 'AT' input. + * @return {Element} XML storage element. + * @this {Blockly.Block} + */ + mutationToDom: function() { + var container = Blockly.utils.xml.createElement('mutation'); + var isAt = this.getInput('AT').type == Blockly.INPUT_VALUE; + container.setAttribute('at', isAt); + return container; + }, + /** + * Parse XML to restore the 'AT' input. + * @param {!Element} xmlElement XML storage element. + * @this {Blockly.Block} + */ + domToMutation: function(xmlElement) { + // Note: Until January 2013 this block did not have mutations, + // so 'at' defaults to true. + var isAt = (xmlElement.getAttribute('at') != 'false'); + this.updateAt_(isAt); + }, + /** + * Create or delete an input for the numeric index. + * @param {boolean} isAt True if the input should exist. + * @private + * @this {Blockly.Block} + */ + updateAt_: function(isAt) { + // Destroy old 'AT' and 'ORDINAL' input. + this.removeInput('AT'); + this.removeInput('ORDINAL', true); + // Create either a value 'AT' input or a dummy input. + if (isAt) { + this.appendValueInput('AT').setCheck('Number'); + if (Blockly.Msg['ORDINAL_NUMBER_SUFFIX']) { + this.appendDummyInput('ORDINAL') + .appendField(Blockly.Msg['ORDINAL_NUMBER_SUFFIX']); + } + } else { + this.appendDummyInput('AT'); + } + var menu = new Blockly.FieldDropdown(this.WHERE_OPTIONS, function(value) { + var newAt = (value == 'FROM_START') || (value == 'FROM_END'); + // The 'isAt' variable is available due to this function being a closure. + if (newAt != isAt) { + var block = this.getSourceBlock(); + block.updateAt_(newAt); + // This menu has been destroyed and replaced. Update the replacement. + block.setFieldValue(value, 'WHERE'); + return null; + } + return undefined; + }); + this.moveInputBefore('AT', 'TO'); + if (this.getInput('ORDINAL')) { + this.moveInputBefore('ORDINAL', 'TO'); + } + + this.getInput('AT').appendField(menu, 'WHERE'); + } +}; + +Blockly.Blocks['lists_getSublist'] = { + /** + * Block for getting sublist. + * @this {Blockly.Block} + */ + init: function() { + this['WHERE_OPTIONS_1'] = + [ + [Blockly.Msg['LISTS_GET_SUBLIST_START_FROM_START'], 'FROM_START'], + [Blockly.Msg['LISTS_GET_SUBLIST_START_FROM_END'], 'FROM_END'], + [Blockly.Msg['LISTS_GET_SUBLIST_START_FIRST'], 'FIRST'] + ]; + this['WHERE_OPTIONS_2'] = + [ + [Blockly.Msg['LISTS_GET_SUBLIST_END_FROM_START'], 'FROM_START'], + [Blockly.Msg['LISTS_GET_SUBLIST_END_FROM_END'], 'FROM_END'], + [Blockly.Msg['LISTS_GET_SUBLIST_END_LAST'], 'LAST'] + ]; + this.setHelpUrl(Blockly.Msg['LISTS_GET_SUBLIST_HELPURL']); + this.setStyle('list_blocks'); + this.appendValueInput('LIST') + .setCheck('Array') + .appendField(Blockly.Msg['LISTS_GET_SUBLIST_INPUT_IN_LIST']); + this.appendDummyInput('AT1'); + this.appendDummyInput('AT2'); + if (Blockly.Msg['LISTS_GET_SUBLIST_TAIL']) { + this.appendDummyInput('TAIL') + .appendField(Blockly.Msg['LISTS_GET_SUBLIST_TAIL']); + } + this.setInputsInline(true); + this.setOutput(true, 'Array'); + this.updateAt_(1, true); + this.updateAt_(2, true); + this.setTooltip(Blockly.Msg['LISTS_GET_SUBLIST_TOOLTIP']); + }, + /** + * Create XML to represent whether there are 'AT' inputs. + * @return {Element} XML storage element. + * @this {Blockly.Block} + */ + mutationToDom: function() { + var container = Blockly.utils.xml.createElement('mutation'); + var isAt1 = this.getInput('AT1').type == Blockly.INPUT_VALUE; + container.setAttribute('at1', isAt1); + var isAt2 = this.getInput('AT2').type == Blockly.INPUT_VALUE; + container.setAttribute('at2', isAt2); + return container; + }, + /** + * Parse XML to restore the 'AT' inputs. + * @param {!Element} xmlElement XML storage element. + * @this {Blockly.Block} + */ + domToMutation: function(xmlElement) { + var isAt1 = (xmlElement.getAttribute('at1') == 'true'); + var isAt2 = (xmlElement.getAttribute('at2') == 'true'); + this.updateAt_(1, isAt1); + this.updateAt_(2, isAt2); + }, + /** + * Create or delete an input for a numeric index. + * This block has two such inputs, independent of each other. + * @param {number} n Specify first or second input (1 or 2). + * @param {boolean} isAt True if the input should exist. + * @private + * @this {Blockly.Block} + */ + updateAt_: function(n, isAt) { + // Create or delete an input for the numeric index. + // Destroy old 'AT' and 'ORDINAL' inputs. + this.removeInput('AT' + n); + this.removeInput('ORDINAL' + n, true); + // Create either a value 'AT' input or a dummy input. + if (isAt) { + this.appendValueInput('AT' + n).setCheck('Number'); + if (Blockly.Msg['ORDINAL_NUMBER_SUFFIX']) { + this.appendDummyInput('ORDINAL' + n) + .appendField(Blockly.Msg['ORDINAL_NUMBER_SUFFIX']); + } + } else { + this.appendDummyInput('AT' + n); + } + var menu = new Blockly.FieldDropdown(this['WHERE_OPTIONS_' + n], + function(value) { + var newAt = (value == 'FROM_START') || (value == 'FROM_END'); + // The 'isAt' variable is available due to this function being a + // closure. + if (newAt != isAt) { + var block = this.getSourceBlock(); + block.updateAt_(n, newAt); + // This menu has been destroyed and replaced. + // Update the replacement. + block.setFieldValue(value, 'WHERE' + n); + return null; + } + }); + this.getInput('AT' + n) + .appendField(menu, 'WHERE' + n); + if (n == 1) { + this.moveInputBefore('AT1', 'AT2'); + if (this.getInput('ORDINAL1')) { + this.moveInputBefore('ORDINAL1', 'AT2'); + } + } + if (Blockly.Msg['LISTS_GET_SUBLIST_TAIL']) { + this.moveInputBefore('TAIL', null); + } + } +}; + +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", + "style": "list_blocks", + "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. + * @this {Blockly.Block} + */ + init: function() { + // Assign 'this' to a variable for use in the closures below. + var thisBlock = this; + var dropdown = new Blockly.FieldDropdown( + [ + [Blockly.Msg['LISTS_SPLIT_LIST_FROM_TEXT'], 'SPLIT'], + [Blockly.Msg['LISTS_SPLIT_TEXT_FROM_LIST'], 'JOIN'] + ], + function(newMode) { + thisBlock.updateType_(newMode); + }); + this.setHelpUrl(Blockly.Msg['LISTS_SPLIT_HELPURL']); + this.setStyle('list_blocks'); + this.appendValueInput('INPUT') + .setCheck('String') + .appendField(dropdown, 'MODE'); + this.appendValueInput('DELIM') + .setCheck('String') + .appendField(Blockly.Msg['LISTS_SPLIT_WITH_DELIMITER']); + this.setInputsInline(true); + this.setOutput(true, 'Array'); + this.setTooltip(function() { + var mode = thisBlock.getFieldValue('MODE'); + if (mode == 'SPLIT') { + return Blockly.Msg['LISTS_SPLIT_TOOLTIP_SPLIT']; + } else if (mode == 'JOIN') { + return Blockly.Msg['LISTS_SPLIT_TOOLTIP_JOIN']; + } + throw Error('Unknown mode: ' + mode); + }); + }, + /** + * Modify this block to have the correct input and output types. + * @param {string} newMode Either 'SPLIT' or 'JOIN'. + * @private + * @this {Blockly.Block} + */ + updateType_: function(newMode) { + var mode = this.getFieldValue('MODE'); + if (mode != newMode) { + var inputConnection = this.getInput('INPUT').connection; + inputConnection.setShadowDom(null); + var inputBlock = inputConnection.targetBlock(); + if (inputBlock) { + inputConnection.disconnect(); + if (inputBlock.isShadow()) { + inputBlock.dispose(); + } else { + this.bumpNeighbours(); + } + } + } + if (newMode == 'SPLIT') { + this.outputConnection.setCheck('Array'); + this.getInput('INPUT').setCheck('String'); + } else { + this.outputConnection.setCheck('String'); + this.getInput('INPUT').setCheck('Array'); + } + }, + /** + * Create XML to represent the input and output types. + * @return {!Element} XML storage element. + * @this {Blockly.Block} + */ + mutationToDom: function() { + var container = Blockly.utils.xml.createElement('mutation'); + container.setAttribute('mode', this.getFieldValue('MODE')); + return container; + }, + /** + * Parse XML to restore the input and output types. + * @param {!Element} xmlElement XML storage element. + * @this {Blockly.Block} + */ + domToMutation: function(xmlElement) { + this.updateType_(xmlElement.getAttribute('mode')); + } +}; diff --git a/js/blocks/logic.js b/js/blocks/logic.js new file mode 100644 index 0000000..813e8f7 --- /dev/null +++ b/js/blocks/logic.js @@ -0,0 +1,643 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Logic blocks for Blockly. + * + * This file is scraped to extract a .json file of block definitions. The array + * passed to defineBlocksWithJsonArray(..) must be strict JSON: double quotes + * only, no outside references, no functions, no trailing commas, etc. The one + * exception is end-of-line comments, which the scraper will remove. + * @author q.neutron@gmail.com (Quynh Neutron) + */ +'use strict'; + +goog.provide('Blockly.Blocks.logic'); // Deprecated +goog.provide('Blockly.Constants.Logic'); + +goog.require('Blockly'); +goog.require('Blockly.Blocks'); +goog.require('Blockly.FieldDropdown'); +goog.require('Blockly.FieldLabel'); +goog.require('Blockly.Mutator'); + + +/** + * Unused constant for the common HSV hue for all blocks in this category. + * @deprecated Use Blockly.Msg['LOGIC_HUE']. (2018 April 5) + */ +Blockly.Constants.Logic.HUE = 210; + +Blockly.defineBlocksWithJsonArray([ // BEGIN JSON EXTRACT + // Block for boolean data type: true and false. + { + "type": "logic_boolean", + "message0": "%1", + "args0": [ + { + "type": "field_dropdown", + "name": "BOOL", + "options": [ + ["%{BKY_LOGIC_BOOLEAN_TRUE}", "TRUE"], + ["%{BKY_LOGIC_BOOLEAN_FALSE}", "FALSE"] + ] + } + ], + "output": "Boolean", + "style": "logic_blocks", + "tooltip": "%{BKY_LOGIC_BOOLEAN_TOOLTIP}", + "helpUrl": "%{BKY_LOGIC_BOOLEAN_HELPURL}" + }, + // Block for if/elseif/else condition. + { + "type": "controls_if", + "message0": "%{BKY_CONTROLS_IF_MSG_IF} %1", + "args0": [ + { + "type": "input_value", + "name": "IF0", + "check": "Boolean" + } + ], + "message1": "%{BKY_CONTROLS_IF_MSG_THEN} %1", + "args1": [ + { + "type": "input_statement", + "name": "DO0" + } + ], + "previousStatement": null, + "nextStatement": null, + "style": "logic_blocks", + "helpUrl": "%{BKY_CONTROLS_IF_HELPURL}", + "mutator": "controls_if_mutator", + "extensions": ["controls_if_tooltip"] + }, + // If/else block that does not use a mutator. + { + "type": "controls_ifelse", + "message0": "%{BKY_CONTROLS_IF_MSG_IF} %1", + "args0": [ + { + "type": "input_value", + "name": "IF0", + "check": "Boolean" + } + ], + "message1": "%{BKY_CONTROLS_IF_MSG_THEN} %1", + "args1": [ + { + "type": "input_statement", + "name": "DO0" + } + ], + "message2": "%{BKY_CONTROLS_IF_MSG_ELSE} %1", + "args2": [ + { + "type": "input_statement", + "name": "ELSE" + } + ], + "previousStatement": null, + "nextStatement": null, + "style": "logic_blocks", + "tooltip": "%{BKYCONTROLS_IF_TOOLTIP_2}", + "helpUrl": "%{BKY_CONTROLS_IF_HELPURL}", + "extensions": ["controls_if_tooltip"] + }, + // Block for comparison operator. + { + "type": "logic_compare", + "message0": "%1 %2 %3", + "args0": [ + { + "type": "input_value", + "name": "A" + }, + { + "type": "field_dropdown", + "name": "OP", + "options": [ + ["=", "EQ"], + ["\u2260", "NEQ"], + ["\u200F<", "LT"], + ["\u200F\u2264", "LTE"], + ["\u200F>", "GT"], + ["\u200F\u2265", "GTE"] + ] + }, + { + "type": "input_value", + "name": "B" + } + ], + "inputsInline": true, + "output": "Boolean", + "style": "logic_blocks", + "helpUrl": "%{BKY_LOGIC_COMPARE_HELPURL}", + "extensions": ["logic_compare", "logic_op_tooltip"] + }, + // Block for logical operations: 'and', 'or'. + { + "type": "logic_operation", + "message0": "%1 %2 %3", + "args0": [ + { + "type": "input_value", + "name": "A", + "check": "Boolean" + }, + { + "type": "field_dropdown", + "name": "OP", + "options": [ + ["%{BKY_LOGIC_OPERATION_AND}", "AND"], + ["%{BKY_LOGIC_OPERATION_OR}", "OR"] + ] + }, + { + "type": "input_value", + "name": "B", + "check": "Boolean" + } + ], + "inputsInline": true, + "output": "Boolean", + "style": "logic_blocks", + "helpUrl": "%{BKY_LOGIC_OPERATION_HELPURL}", + "extensions": ["logic_op_tooltip"] + }, + // Block for negation. + { + "type": "logic_negate", + "message0": "%{BKY_LOGIC_NEGATE_TITLE}", + "args0": [ + { + "type": "input_value", + "name": "BOOL", + "check": "Boolean" + } + ], + "output": "Boolean", + "style": "logic_blocks", + "tooltip": "%{BKY_LOGIC_NEGATE_TOOLTIP}", + "helpUrl": "%{BKY_LOGIC_NEGATE_HELPURL}" + }, + // Block for null data type. + { + "type": "logic_null", + "message0": "%{BKY_LOGIC_NULL}", + "output": null, + "style": "logic_blocks", + "tooltip": "%{BKY_LOGIC_NULL_TOOLTIP}", + "helpUrl": "%{BKY_LOGIC_NULL_HELPURL}" + }, + // Block for ternary operator. + { + "type": "logic_ternary", + "message0": "%{BKY_LOGIC_TERNARY_CONDITION} %1", + "args0": [ + { + "type": "input_value", + "name": "IF", + "check": "Boolean" + } + ], + "message1": "%{BKY_LOGIC_TERNARY_IF_TRUE} %1", + "args1": [ + { + "type": "input_value", + "name": "THEN" + } + ], + "message2": "%{BKY_LOGIC_TERNARY_IF_FALSE} %1", + "args2": [ + { + "type": "input_value", + "name": "ELSE" + } + ], + "output": null, + "style": "logic_blocks", + "tooltip": "%{BKY_LOGIC_TERNARY_TOOLTIP}", + "helpUrl": "%{BKY_LOGIC_TERNARY_HELPURL}", + "extensions": ["logic_ternary"] + } +]); // END JSON EXTRACT (Do not delete this comment.) + +Blockly.defineBlocksWithJsonArray([ // Mutator blocks. Do not extract. + // Block representing the if statement in the controls_if mutator. + { + "type": "controls_if_if", + "message0": "%{BKY_CONTROLS_IF_IF_TITLE_IF}", + "nextStatement": null, + "enableContextMenu": false, + "style": "logic_blocks", + "tooltip": "%{BKY_CONTROLS_IF_IF_TOOLTIP}" + }, + // Block representing the else-if statement in the controls_if mutator. + { + "type": "controls_if_elseif", + "message0": "%{BKY_CONTROLS_IF_ELSEIF_TITLE_ELSEIF}", + "previousStatement": null, + "nextStatement": null, + "enableContextMenu": false, + "style": "logic_blocks", + "tooltip": "%{BKY_CONTROLS_IF_ELSEIF_TOOLTIP}" + }, + // Block representing the else statement in the controls_if mutator. + { + "type": "controls_if_else", + "message0": "%{BKY_CONTROLS_IF_ELSE_TITLE_ELSE}", + "previousStatement": null, + "enableContextMenu": false, + "style": "logic_blocks", + "tooltip": "%{BKY_CONTROLS_IF_ELSE_TOOLTIP}" + } +]); + +/** + * Tooltip text, keyed by block OP value. Used by logic_compare and + * logic_operation blocks. + * @see {Blockly.Extensions#buildTooltipForDropdown} + * @package + * @readonly + */ +Blockly.Constants.Logic.TOOLTIPS_BY_OP = { + // logic_compare + 'EQ': '%{BKY_LOGIC_COMPARE_TOOLTIP_EQ}', + 'NEQ': '%{BKY_LOGIC_COMPARE_TOOLTIP_NEQ}', + 'LT': '%{BKY_LOGIC_COMPARE_TOOLTIP_LT}', + 'LTE': '%{BKY_LOGIC_COMPARE_TOOLTIP_LTE}', + 'GT': '%{BKY_LOGIC_COMPARE_TOOLTIP_GT}', + 'GTE': '%{BKY_LOGIC_COMPARE_TOOLTIP_GTE}', + + // logic_operation + 'AND': '%{BKY_LOGIC_OPERATION_TOOLTIP_AND}', + 'OR': '%{BKY_LOGIC_OPERATION_TOOLTIP_OR}' +}; + +Blockly.Extensions.register('logic_op_tooltip', + Blockly.Extensions.buildTooltipForDropdown( + 'OP', Blockly.Constants.Logic.TOOLTIPS_BY_OP)); + +/** + * Mutator methods added to controls_if blocks. + * @mixin + * @augments Blockly.Block + * @package + * @readonly + */ +Blockly.Constants.Logic.CONTROLS_IF_MUTATOR_MIXIN = { + elseifCount_: 0, + elseCount_: 0, + + /** + * Don't automatically add STATEMENT_PREFIX and STATEMENT_SUFFIX to generated + * code. These will be handled manually in this block's generators. + */ + suppressPrefixSuffix: true, + + /** + * Create XML to represent the number of else-if and else inputs. + * @return {Element} XML storage element. + * @this {Blockly.Block} + */ + mutationToDom: function() { + if (!this.elseifCount_ && !this.elseCount_) { + return null; + } + var container = Blockly.utils.xml.createElement('mutation'); + if (this.elseifCount_) { + container.setAttribute('elseif', this.elseifCount_); + } + if (this.elseCount_) { + container.setAttribute('else', 1); + } + return container; + }, + /** + * Parse XML to restore the else-if and else inputs. + * @param {!Element} xmlElement XML storage element. + * @this {Blockly.Block} + */ + domToMutation: function(xmlElement) { + this.elseifCount_ = parseInt(xmlElement.getAttribute('elseif'), 10) || 0; + this.elseCount_ = parseInt(xmlElement.getAttribute('else'), 10) || 0; + this.rebuildShape_(); + }, + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @return {!Blockly.Block} Root block in mutator. + * @this {Blockly.Block} + */ + decompose: function(workspace) { + var containerBlock = workspace.newBlock('controls_if_if'); + containerBlock.initSvg(); + var connection = containerBlock.nextConnection; + for (var i = 1; i <= this.elseifCount_; i++) { + var elseifBlock = workspace.newBlock('controls_if_elseif'); + elseifBlock.initSvg(); + connection.connect(elseifBlock.previousConnection); + connection = elseifBlock.nextConnection; + } + if (this.elseCount_) { + var elseBlock = workspace.newBlock('controls_if_else'); + elseBlock.initSvg(); + connection.connect(elseBlock.previousConnection); + } + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this {Blockly.Block} + */ + compose: function(containerBlock) { + var 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_++; + valueConnections.push(clauseBlock.valueConnection_); + statementConnections.push(clauseBlock.statementConnection_); + break; + case 'controls_if_else': + this.elseCount_++; + elseStatementConnection = clauseBlock.statementConnection_; + break; + default: + throw TypeError('Unknown block type: ' + clauseBlock.type); + } + clauseBlock = clauseBlock.nextConnection && + clauseBlock.nextConnection.targetBlock(); + } + this.updateShape_(); + // Reconnect any child blocks. + this.reconnectChildBlocks_(valueConnections, statementConnections, + elseStatementConnection); + }, + /** + * Store pointers to any connected child blocks. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this {Blockly.Block} + */ + saveConnections: function(containerBlock) { + var clauseBlock = containerBlock.nextConnection.targetBlock(); + var i = 1; + while (clauseBlock) { + switch (clauseBlock.type) { + case 'controls_if_elseif': + var inputIf = this.getInput('IF' + i); + var inputDo = this.getInput('DO' + i); + clauseBlock.valueConnection_ = + inputIf && inputIf.connection.targetConnection; + clauseBlock.statementConnection_ = + inputDo && inputDo.connection.targetConnection; + i++; + break; + case 'controls_if_else': + var inputDo = this.getInput('ELSE'); + clauseBlock.statementConnection_ = + inputDo && inputDo.connection.targetConnection; + break; + default: + throw TypeError('Unknown block type: ' + clauseBlock.type); + } + clauseBlock = clauseBlock.nextConnection && + clauseBlock.nextConnection.targetBlock(); + } + }, + /** + * Reconstructs the block with all child blocks attached. + * @this {Blockly.Block} + */ + rebuildShape_: function() { + var valueConnections = [null]; + var statementConnections = [null]; + var elseStatementConnection = null; + + if (this.getInput('ELSE')) { + elseStatementConnection = this.getInput('ELSE').connection.targetConnection; + } + var i = 1; + while (this.getInput('IF' + i)) { + var inputIf = this.getInput('IF' + i); + var inputDo = this.getInput('DO' + i); + valueConnections.push(inputIf.connection.targetConnection); + statementConnections.push(inputDo.connection.targetConnection); + i++; + } + this.updateShape_(); + this.reconnectChildBlocks_(valueConnections, statementConnections, + elseStatementConnection); + }, + /** + * Modify this block to have the correct number of inputs. + * @this {Blockly.Block} + * @private + */ + 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 (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']); + } + }, + /** + * Reconnects child blocks. + * @param {!Array.} valueConnections List of + * value connections for 'if' input. + * @param {!Array.} statementConnections List of + * statement connections for 'do' input. + * @param {?Blockly.RenderedConnection} elseStatementConnection Statement + * connection for else input. + * @this {Blockly.Block} + */ + reconnectChildBlocks_: function(valueConnections, statementConnections, + elseStatementConnection) { + 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'); + } +}; + +Blockly.Extensions.registerMutator('controls_if_mutator', + Blockly.Constants.Logic.CONTROLS_IF_MUTATOR_MIXIN, null, + ['controls_if_elseif', 'controls_if_else']); +/** + * "controls_if" extension function. Adds mutator, shape updating methods, and + * dynamic tooltip to "controls_if" blocks. + * @this {Blockly.Block} + * @package + */ +Blockly.Constants.Logic.CONTROLS_IF_TOOLTIP_EXTENSION = function() { + + this.setTooltip(function() { + if (!this.elseifCount_ && !this.elseCount_) { + return Blockly.Msg['CONTROLS_IF_TOOLTIP_1']; + } else if (!this.elseifCount_ && this.elseCount_) { + return Blockly.Msg['CONTROLS_IF_TOOLTIP_2']; + } else if (this.elseifCount_ && !this.elseCount_) { + return Blockly.Msg['CONTROLS_IF_TOOLTIP_3']; + } else if (this.elseifCount_ && this.elseCount_) { + return Blockly.Msg['CONTROLS_IF_TOOLTIP_4']; + } + return ''; + }.bind(this)); +}; + +Blockly.Extensions.register('controls_if_tooltip', + Blockly.Constants.Logic.CONTROLS_IF_TOOLTIP_EXTENSION); + +/** + * Adds dynamic type validation for the left and right sides of a logic_compare + * block. + * @mixin + * @augments Blockly.Block + * @package + * @readonly + */ +Blockly.Constants.Logic.LOGIC_COMPARE_ONCHANGE_MIXIN = { + /** + * 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(e) { + if (!this.prevBlocks_) { + this.prevBlocks_ = [null, null]; + } + + 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. Revert the block connections, + // bumping away the newly connected block(s). + Blockly.Events.setGroup(e.group); + var prevA = this.prevBlocks_[0]; + if (prevA !== blockA) { + blockA.unplug(); + if (prevA && !prevA.isDisposed() && !prevA.isShadow()) { + // The shadow block is automatically replaced during unplug(). + this.getInput('A').connection.connect(prevA.outputConnection); + } + } + var prevB = this.prevBlocks_[1]; + if (prevB !== blockB) { + blockB.unplug(); + if (prevB && !prevB.isDisposed() && !prevB.isShadow()) { + // The shadow block is automatically replaced during unplug(). + this.getInput('B').connection.connect(prevB.outputConnection); + } + } + this.bumpNeighbours(); + Blockly.Events.setGroup(false); + } + this.prevBlocks_[0] = this.getInputTargetBlock('A'); + this.prevBlocks_[1] = this.getInputTargetBlock('B'); + } +}; + +/** + * "logic_compare" extension function. Adds type left and right side type + * checking to "logic_compare" blocks. + * @this {Blockly.Block} + * @package + * @readonly + */ +Blockly.Constants.Logic.LOGIC_COMPARE_EXTENSION = function() { + // Add onchange handler to ensure types are compatible. + this.mixin(Blockly.Constants.Logic.LOGIC_COMPARE_ONCHANGE_MIXIN); +}; + +Blockly.Extensions.register('logic_compare', + Blockly.Constants.Logic.LOGIC_COMPARE_EXTENSION); + +/** + * Adds type coordination between inputs and output. + * @mixin + * @augments Blockly.Block + * @package + * @readonly + */ +Blockly.Constants.Logic.LOGIC_TERNARY_ONCHANGE_MIXIN = { + prevParentConnection_: null, + + /** + * Called whenever anything on the workspace changes. + * Prevent mismatched types. + * @param {!Blockly.Events.Abstract} e Change event. + * @this {Blockly.Block} + */ + onchange: function(e) { + var blockA = this.getInputTargetBlock('THEN'); + var blockB = this.getInputTargetBlock('ELSE'); + var parentConnection = this.outputConnection.targetConnection; + // Disconnect blocks that existed prior to this change if they don't match. + if ((blockA || blockB) && parentConnection) { + 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.unplug(); + parentConnection.getSourceBlock().bumpNeighbours(); + } else { + block.unplug(); + block.bumpNeighbours(); + } + Blockly.Events.setGroup(false); + } + } + } + this.prevParentConnection_ = parentConnection; + } +}; + +Blockly.Extensions.registerMixin('logic_ternary', + Blockly.Constants.Logic.LOGIC_TERNARY_ONCHANGE_MIXIN); diff --git a/js/blocks/loops.js b/js/blocks/loops.js new file mode 100644 index 0000000..6ec7190 --- /dev/null +++ b/js/blocks/loops.js @@ -0,0 +1,364 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Loop blocks for Blockly. + * + * This file is scraped to extract a .json file of block definitions. The array + * passed to defineBlocksWithJsonArray(..) must be strict JSON: double quotes + * only, no outside references, no functions, no trailing commas, etc. The one + * exception is end-of-line comments, which the scraper will remove. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Blocks.loops'); // Deprecated +goog.provide('Blockly.Constants.Loops'); + +goog.require('Blockly'); +goog.require('Blockly.Blocks'); +goog.require('Blockly.FieldDropdown'); +goog.require('Blockly.FieldLabel'); +goog.require('Blockly.FieldNumber'); +goog.require('Blockly.FieldVariable'); +goog.require('Blockly.Warning'); + + +/** + * Unused constant for the common HSV hue for all blocks in this category. + * @deprecated Use Blockly.Msg['LOOPS_HUE']. (2018 April 5) + */ +Blockly.Constants.Loops.HUE = 120; + +Blockly.defineBlocksWithJsonArray([ // BEGIN JSON EXTRACT + // Block for repeat n times (external number). + { + "type": "controls_repeat_ext", + "message0": "%{BKY_CONTROLS_REPEAT_TITLE}", + "args0": [{ + "type": "input_value", + "name": "TIMES", + "check": "Number" + }], + "message1": "%{BKY_CONTROLS_REPEAT_INPUT_DO} %1", + "args1": [{ + "type": "input_statement", + "name": "DO" + }], + "previousStatement": null, + "nextStatement": null, + "style": "loop_blocks", + "tooltip": "%{BKY_CONTROLS_REPEAT_TOOLTIP}", + "helpUrl": "%{BKY_CONTROLS_REPEAT_HELPURL}" + }, + // Block for repeat n times (internal number). + // The 'controls_repeat_ext' block is preferred as it is more flexible. + { + "type": "controls_repeat", + "message0": "%{BKY_CONTROLS_REPEAT_TITLE}", + "args0": [{ + "type": "field_number", + "name": "TIMES", + "value": 10, + "min": 0, + "precision": 1 + }], + "message1": "%{BKY_CONTROLS_REPEAT_INPUT_DO} %1", + "args1": [{ + "type": "input_statement", + "name": "DO" + }], + "previousStatement": null, + "nextStatement": null, + "style": "loop_blocks", + "tooltip": "%{BKY_CONTROLS_REPEAT_TOOLTIP}", + "helpUrl": "%{BKY_CONTROLS_REPEAT_HELPURL}" + }, + // Block for 'do while/until' loop. + { + "type": "controls_whileUntil", + "message0": "%1 %2", + "args0": [ + { + "type": "field_dropdown", + "name": "MODE", + "options": [ + ["%{BKY_CONTROLS_WHILEUNTIL_OPERATOR_WHILE}", "WHILE"], + ["%{BKY_CONTROLS_WHILEUNTIL_OPERATOR_UNTIL}", "UNTIL"] + ] + }, + { + "type": "input_value", + "name": "BOOL", + "check": "Boolean" + } + ], + "message1": "%{BKY_CONTROLS_REPEAT_INPUT_DO} %1", + "args1": [{ + "type": "input_statement", + "name": "DO" + }], + "previousStatement": null, + "nextStatement": null, + "style": "loop_blocks", + "helpUrl": "%{BKY_CONTROLS_WHILEUNTIL_HELPURL}", + "extensions": ["controls_whileUntil_tooltip"] + }, + // Block for 'for' loop. + { + "type": "controls_for", + "message0": "%{BKY_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" + } + ], + "message1": "%{BKY_CONTROLS_REPEAT_INPUT_DO} %1", + "args1": [{ + "type": "input_statement", + "name": "DO" + }], + "inputsInline": true, + "previousStatement": null, + "nextStatement": null, + "style": "loop_blocks", + "helpUrl": "%{BKY_CONTROLS_FOR_HELPURL}", + "extensions": [ + "contextMenu_newGetVariableBlock", + "controls_for_tooltip" + ] + }, + // Block for 'for each' loop. + { + "type": "controls_forEach", + "message0": "%{BKY_CONTROLS_FOREACH_TITLE}", + "args0": [ + { + "type": "field_variable", + "name": "VAR", + "variable": null + }, + { + "type": "input_value", + "name": "LIST", + "check": "Array" + } + ], + "message1": "%{BKY_CONTROLS_REPEAT_INPUT_DO} %1", + "args1": [{ + "type": "input_statement", + "name": "DO" + }], + "previousStatement": null, + "nextStatement": null, + "style": "loop_blocks", + "helpUrl": "%{BKY_CONTROLS_FOREACH_HELPURL}", + "extensions": [ + "contextMenu_newGetVariableBlock", + "controls_forEach_tooltip" + ] + }, + // Block for flow statements: continue, break. + { + "type": "controls_flow_statements", + "message0": "%1", + "args0": [{ + "type": "field_dropdown", + "name": "FLOW", + "options": [ + ["%{BKY_CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK}", "BREAK"], + ["%{BKY_CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE}", "CONTINUE"] + ] + }], + "previousStatement": null, + "style": "loop_blocks", + "helpUrl": "%{BKY_CONTROLS_FLOW_STATEMENTS_HELPURL}", + "extensions": [ + "controls_flow_tooltip", + "controls_flow_in_loop_check" + ] + } +]); // END JSON EXTRACT (Do not delete this comment.) + +/** + * Tooltips for the 'controls_whileUntil' block, keyed by MODE value. + * @see {Blockly.Extensions#buildTooltipForDropdown} + * @package + * @readonly + */ +Blockly.Constants.Loops.WHILE_UNTIL_TOOLTIPS = { + 'WHILE': '%{BKY_CONTROLS_WHILEUNTIL_TOOLTIP_WHILE}', + 'UNTIL': '%{BKY_CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL}' +}; + +Blockly.Extensions.register('controls_whileUntil_tooltip', + Blockly.Extensions.buildTooltipForDropdown( + 'MODE', Blockly.Constants.Loops.WHILE_UNTIL_TOOLTIPS)); + +/** + * Tooltips for the 'controls_flow_statements' block, keyed by FLOW value. + * @see {Blockly.Extensions#buildTooltipForDropdown} + * @package + * @readonly + */ +Blockly.Constants.Loops.BREAK_CONTINUE_TOOLTIPS = { + 'BREAK': '%{BKY_CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK}', + 'CONTINUE': '%{BKY_CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE}' +}; + +Blockly.Extensions.register('controls_flow_tooltip', + Blockly.Extensions.buildTooltipForDropdown( + 'FLOW', Blockly.Constants.Loops.BREAK_CONTINUE_TOOLTIPS)); + +/** + * Mixin to add a context menu item to create a 'variables_get' block. + * Used by blocks 'controls_for' and 'controls_forEach'. + * @mixin + * @augments Blockly.Block + * @package + * @readonly + */ +Blockly.Constants.Loops.CUSTOM_CONTEXT_MENU_CREATE_VARIABLES_GET_MIXIN = { + /** + * Add context menu option to create getter block for the loop's variable. + * (customContextMenu support limited to web BlockSvg.) + * @param {!Array} options List of menu options to add to. + * @this {Blockly.Block} + */ + customContextMenu: function(options) { + if (this.isInFlyout) { + return; + } + var variable = this.getField('VAR').getVariable(); + var varName = variable.name; + if (!this.isCollapsed() && varName != null) { + var option = {enabled: true}; + option.text = + Blockly.Msg['VARIABLES_SET_CREATE_GET'].replace('%1', varName); + var xmlField = Blockly.Variables.generateVariableFieldDom(variable); + var xmlBlock = Blockly.utils.xml.createElement('block'); + xmlBlock.setAttribute('type', 'variables_get'); + xmlBlock.appendChild(xmlField); + option.callback = Blockly.ContextMenu.callbackFactory(this, xmlBlock); + options.push(option); + } + } +}; + +Blockly.Extensions.registerMixin('contextMenu_newGetVariableBlock', + Blockly.Constants.Loops.CUSTOM_CONTEXT_MENU_CREATE_VARIABLES_GET_MIXIN); + +Blockly.Extensions.register('controls_for_tooltip', + Blockly.Extensions.buildTooltipWithFieldText( + '%{BKY_CONTROLS_FOR_TOOLTIP}', 'VAR')); + +Blockly.Extensions.register('controls_forEach_tooltip', + Blockly.Extensions.buildTooltipWithFieldText( + '%{BKY_CONTROLS_FOREACH_TOOLTIP}', 'VAR')); + +/** + * This mixin adds a check to make sure the 'controls_flow_statements' block + * is contained in a loop. Otherwise a warning is added to the block. + * @mixin + * @augments Blockly.Block + * @package + * @readonly + */ +Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN = { + /** + * 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.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN.LOOP_TYPES.push('custom_loop'); + */ + LOOP_TYPES: [ + 'controls_repeat', + 'controls_repeat_ext', + 'controls_forEach', + 'controls_for', + 'controls_whileUntil' + ], + + /** + * Don't automatically add STATEMENT_PREFIX and STATEMENT_SUFFIX to generated + * code. These will be handled manually in this block's generators. + */ + suppressPrefixSuffix: true, + + /** + * Is the given block enclosed (at any level) by a loop? + * @param {!Blockly.Block} block Current block. + * @return {Blockly.Block} The nearest surrounding loop, or null if none. + */ + getSurroundLoop: function(block) { + // Is the block nested in a loop? + do { + if (Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN.LOOP_TYPES + .indexOf(block.type) != -1) { + return block; + } + block = block.getSurroundParent(); + } while (block); + return null; + }, + + /** + * Called whenever anything on the workspace changes. + * Add warning if this flow block is not nested inside a loop. + * @param {!Blockly.Events.Abstract} _e Change event. + * @this {Blockly.Block} + */ + onchange: function(_e) { + if (!this.workspace.isDragging || this.workspace.isDragging()) { + return; // Don't change state at the start of a drag. + } + if (Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN + .getSurroundLoop(this)) { + this.setWarningText(null); + if (!this.isInFlyout) { + this.setEnabled(true); + } + } else { + this.setWarningText(Blockly.Msg['CONTROLS_FLOW_STATEMENTS_WARNING']); + if (!this.isInFlyout && !this.getInheritedDisabled()) { + this.setEnabled(false); + } + } + } +}; + +Blockly.Extensions.registerMixin('controls_flow_in_loop_check', + Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN); diff --git a/js/blocks/math.js b/js/blocks/math.js new file mode 100644 index 0000000..56ccc6a --- /dev/null +++ b/js/blocks/math.js @@ -0,0 +1,577 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Math blocks for Blockly. + * + * This file is scraped to extract a .json file of block definitions. The array + * passed to defineBlocksWithJsonArray(..) must be strict JSON: double quotes + * only, no outside references, no functions, no trailing commas, etc. The one + * exception is end-of-line comments, which the scraper will remove. + * @author q.neutron@gmail.com (Quynh Neutron) + */ +'use strict'; + +goog.provide('Blockly.Blocks.math'); // Deprecated +goog.provide('Blockly.Constants.Math'); + +goog.require('Blockly'); +goog.require('Blockly.Blocks'); +goog.require('Blockly.FieldDropdown'); +goog.require('Blockly.FieldLabel'); +goog.require('Blockly.FieldNumber'); +goog.require('Blockly.FieldVariable'); + + +/** + * Unused constant for the common HSV hue for all blocks in this category. + * @deprecated Use Blockly.Msg['MATH_HUE']. (2018 April 5) + */ +Blockly.Constants.Math.HUE = 230; + +Blockly.defineBlocksWithJsonArray([ // BEGIN JSON EXTRACT + // Block for numeric value. + { + "type": "math_number", + "message0": "%1", + "args0": [{ + "type": "field_number", + "name": "NUM", + "value": 0 + }], + "output": "Number", + "helpUrl": "%{BKY_MATH_NUMBER_HELPURL}", + "style": "math_blocks", + "tooltip": "%{BKY_MATH_NUMBER_TOOLTIP}", + "extensions": ["parent_tooltip_when_inline"] + }, + + // Block for basic arithmetic operator. + { + "type": "math_arithmetic", + "message0": "%1 %2 %3", + "args0": [ + { + "type": "input_value", + "name": "A", + "check": "Number" + }, + { + "type": "field_dropdown", + "name": "OP", + "options": [ + ["%{BKY_MATH_ADDITION_SYMBOL}", "ADD"], + ["%{BKY_MATH_SUBTRACTION_SYMBOL}", "MINUS"], + ["%{BKY_MATH_MULTIPLICATION_SYMBOL}", "MULTIPLY"], + ["%{BKY_MATH_DIVISION_SYMBOL}", "DIVIDE"], + ["%{BKY_MATH_POWER_SYMBOL}", "POWER"] + ] + }, + { + "type": "input_value", + "name": "B", + "check": "Number" + } + ], + "inputsInline": true, + "output": "Number", + "style": "math_blocks", + "helpUrl": "%{BKY_MATH_ARITHMETIC_HELPURL}", + "extensions": ["math_op_tooltip"] + }, + + // Block for advanced math operators with single operand. + { + "type": "math_single", + "message0": "%1 %2", + "args0": [ + { + "type": "field_dropdown", + "name": "OP", + "options": [ + ["%{BKY_MATH_SINGLE_OP_ROOT}", 'ROOT'], + ["%{BKY_MATH_SINGLE_OP_ABSOLUTE}", 'ABS'], + ['-', 'NEG'], + ['ln', 'LN'], + ['log10', 'LOG10'], + ['e^', 'EXP'], + ['10^', 'POW10'] + ] + }, + { + "type": "input_value", + "name": "NUM", + "check": "Number" + } + ], + "output": "Number", + "style": "math_blocks", + "helpUrl": "%{BKY_MATH_SINGLE_HELPURL}", + "extensions": ["math_op_tooltip"] + }, + + // Block for trigonometry operators. + { + "type": "math_trig", + "message0": "%1 %2", + "args0": [ + { + "type": "field_dropdown", + "name": "OP", + "options": [ + ["%{BKY_MATH_TRIG_SIN}", "SIN"], + ["%{BKY_MATH_TRIG_COS}", "COS"], + ["%{BKY_MATH_TRIG_TAN}", "TAN"], + ["%{BKY_MATH_TRIG_ASIN}", "ASIN"], + ["%{BKY_MATH_TRIG_ACOS}", "ACOS"], + ["%{BKY_MATH_TRIG_ATAN}", "ATAN"] + ] + }, + { + "type": "input_value", + "name": "NUM", + "check": "Number" + } + ], + "output": "Number", + "style": "math_blocks", + "helpUrl": "%{BKY_MATH_TRIG_HELPURL}", + "extensions": ["math_op_tooltip"] + }, + + // Block for constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY. + { + "type": "math_constant", + "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", + "style": "math_blocks", + "tooltip": "%{BKY_MATH_CONSTANT_TOOLTIP}", + "helpUrl": "%{BKY_MATH_CONSTANT_HELPURL}" + }, + + // Block for checking if a number is even, odd, prime, whole, positive, + // negative or if it is divisible by certain number. + { + "type": "math_number_property", + "message0": "%1 %2", + "args0": [ + { + "type": "input_value", + "name": "NUMBER_TO_CHECK", + "check": "Number" + }, + { + "type": "field_dropdown", + "name": "PROPERTY", + "options": [ + ["%{BKY_MATH_IS_EVEN}", "EVEN"], + ["%{BKY_MATH_IS_ODD}", "ODD"], + ["%{BKY_MATH_IS_PRIME}", "PRIME"], + ["%{BKY_MATH_IS_WHOLE}", "WHOLE"], + ["%{BKY_MATH_IS_POSITIVE}", "POSITIVE"], + ["%{BKY_MATH_IS_NEGATIVE}", "NEGATIVE"], + ["%{BKY_MATH_IS_DIVISIBLE_BY}", "DIVISIBLE_BY"] + ] + } + ], + "inputsInline": true, + "output": "Boolean", + "style": "math_blocks", + "tooltip": "%{BKY_MATH_IS_TOOLTIP}", + "mutator": "math_is_divisibleby_mutator" + }, + + // Block for adding to a variable in place. + { + "type": "math_change", + "message0": "%{BKY_MATH_CHANGE_TITLE}", + "args0": [ + { + "type": "field_variable", + "name": "VAR", + "variable": "%{BKY_MATH_CHANGE_TITLE_ITEM}" + }, + { + "type": "input_value", + "name": "DELTA", + "check": "Number" + } + ], + "previousStatement": null, + "nextStatement": null, + "style": "variable_blocks", + "helpUrl": "%{BKY_MATH_CHANGE_HELPURL}", + "extensions": ["math_change_tooltip"] + }, + + // Block for rounding functions. + { + "type": "math_round", + "message0": "%1 %2", + "args0": [ + { + "type": "field_dropdown", + "name": "OP", + "options": [ + ["%{BKY_MATH_ROUND_OPERATOR_ROUND}", "ROUND"], + ["%{BKY_MATH_ROUND_OPERATOR_ROUNDUP}", "ROUNDUP"], + ["%{BKY_MATH_ROUND_OPERATOR_ROUNDDOWN}", "ROUNDDOWN"] + ] + }, + { + "type": "input_value", + "name": "NUM", + "check": "Number" + } + ], + "output": "Number", + "style": "math_blocks", + "helpUrl": "%{BKY_MATH_ROUND_HELPURL}", + "tooltip": "%{BKY_MATH_ROUND_TOOLTIP}" + }, + + // Block for evaluating a list of numbers to return sum, average, min, max, + // etc. Some functions also work on text (min, max, mode, median). + { + "type": "math_on_list", + "message0": "%1 %2", + "args0": [ + { + "type": "field_dropdown", + "name": "OP", + "options": [ + ["%{BKY_MATH_ONLIST_OPERATOR_SUM}", "SUM"], + ["%{BKY_MATH_ONLIST_OPERATOR_MIN}", "MIN"], + ["%{BKY_MATH_ONLIST_OPERATOR_MAX}", "MAX"], + ["%{BKY_MATH_ONLIST_OPERATOR_AVERAGE}", "AVERAGE"], + ["%{BKY_MATH_ONLIST_OPERATOR_MEDIAN}", "MEDIAN"], + ["%{BKY_MATH_ONLIST_OPERATOR_MODE}", "MODE"], + ["%{BKY_MATH_ONLIST_OPERATOR_STD_DEV}", "STD_DEV"], + ["%{BKY_MATH_ONLIST_OPERATOR_RANDOM}", "RANDOM"] + ] + }, + { + "type": "input_value", + "name": "LIST", + "check": "Array" + } + ], + "output": "Number", + "style": "math_blocks", + "helpUrl": "%{BKY_MATH_ONLIST_HELPURL}", + "mutator": "math_modes_of_list_mutator", + "extensions": ["math_op_tooltip"] + }, + + // Block for remainder of a division. + { + "type": "math_modulo", + "message0": "%{BKY_MATH_MODULO_TITLE}", + "args0": [ + { + "type": "input_value", + "name": "DIVIDEND", + "check": "Number" + }, + { + "type": "input_value", + "name": "DIVISOR", + "check": "Number" + } + ], + "inputsInline": true, + "output": "Number", + "style": "math_blocks", + "tooltip": "%{BKY_MATH_MODULO_TOOLTIP}", + "helpUrl": "%{BKY_MATH_MODULO_HELPURL}" + }, + + // Block for constraining a number between two limits. + { + "type": "math_constrain", + "message0": "%{BKY_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": true, + "output": "Number", + "style": "math_blocks", + "tooltip": "%{BKY_MATH_CONSTRAIN_TOOLTIP}", + "helpUrl": "%{BKY_MATH_CONSTRAIN_HELPURL}" + }, + + // Block for random integer between [X] and [Y]. + { + "type": "math_random_int", + "message0": "%{BKY_MATH_RANDOM_INT_TITLE}", + "args0": [ + { + "type": "input_value", + "name": "FROM", + "check": "Number" + }, + { + "type": "input_value", + "name": "TO", + "check": "Number" + } + ], + "inputsInline": true, + "output": "Number", + "style": "math_blocks", + "tooltip": "%{BKY_MATH_RANDOM_INT_TOOLTIP}", + "helpUrl": "%{BKY_MATH_RANDOM_INT_HELPURL}" + }, + + // Block for random integer between [X] and [Y]. + { + "type": "math_random_float", + "message0": "%{BKY_MATH_RANDOM_FLOAT_TITLE_RANDOM}", + "output": "Number", + "style": "math_blocks", + "tooltip": "%{BKY_MATH_RANDOM_FLOAT_TOOLTIP}", + "helpUrl": "%{BKY_MATH_RANDOM_FLOAT_HELPURL}" + }, + + // Block for calculating atan2 of [X] and [Y]. + { + "type": "math_atan2", + "message0": "%{BKY_MATH_ATAN2_TITLE}", + "args0": [ + { + "type": "input_value", + "name": "X", + "check": "Number" + }, + { + "type": "input_value", + "name": "Y", + "check": "Number" + } + ], + "inputsInline": true, + "output": "Number", + "style": "math_blocks", + "tooltip": "%{BKY_MATH_ATAN2_TOOLTIP}", + "helpUrl": "%{BKY_MATH_ATAN2_HELPURL}" + } +]); // END JSON EXTRACT (Do not delete this comment.) + +/** + * Mapping of math block OP value to tooltip message for blocks + * math_arithmetic, math_simple, math_trig, and math_on_lists. + * @see {Blockly.Extensions#buildTooltipForDropdown} + * @package + * @readonly + */ +Blockly.Constants.Math.TOOLTIPS_BY_OP = { + // math_arithmetic + 'ADD': '%{BKY_MATH_ARITHMETIC_TOOLTIP_ADD}', + 'MINUS': '%{BKY_MATH_ARITHMETIC_TOOLTIP_MINUS}', + 'MULTIPLY': '%{BKY_MATH_ARITHMETIC_TOOLTIP_MULTIPLY}', + 'DIVIDE': '%{BKY_MATH_ARITHMETIC_TOOLTIP_DIVIDE}', + 'POWER': '%{BKY_MATH_ARITHMETIC_TOOLTIP_POWER}', + + // math_simple + 'ROOT': '%{BKY_MATH_SINGLE_TOOLTIP_ROOT}', + 'ABS': '%{BKY_MATH_SINGLE_TOOLTIP_ABS}', + 'NEG': '%{BKY_MATH_SINGLE_TOOLTIP_NEG}', + 'LN': '%{BKY_MATH_SINGLE_TOOLTIP_LN}', + 'LOG10': '%{BKY_MATH_SINGLE_TOOLTIP_LOG10}', + 'EXP': '%{BKY_MATH_SINGLE_TOOLTIP_EXP}', + 'POW10': '%{BKY_MATH_SINGLE_TOOLTIP_POW10}', + + // math_trig + 'SIN': '%{BKY_MATH_TRIG_TOOLTIP_SIN}', + 'COS': '%{BKY_MATH_TRIG_TOOLTIP_COS}', + 'TAN': '%{BKY_MATH_TRIG_TOOLTIP_TAN}', + 'ASIN': '%{BKY_MATH_TRIG_TOOLTIP_ASIN}', + 'ACOS': '%{BKY_MATH_TRIG_TOOLTIP_ACOS}', + 'ATAN': '%{BKY_MATH_TRIG_TOOLTIP_ATAN}', + + // math_on_lists + 'SUM': '%{BKY_MATH_ONLIST_TOOLTIP_SUM}', + 'MIN': '%{BKY_MATH_ONLIST_TOOLTIP_MIN}', + 'MAX': '%{BKY_MATH_ONLIST_TOOLTIP_MAX}', + 'AVERAGE': '%{BKY_MATH_ONLIST_TOOLTIP_AVERAGE}', + 'MEDIAN': '%{BKY_MATH_ONLIST_TOOLTIP_MEDIAN}', + 'MODE': '%{BKY_MATH_ONLIST_TOOLTIP_MODE}', + 'STD_DEV': '%{BKY_MATH_ONLIST_TOOLTIP_STD_DEV}', + 'RANDOM': '%{BKY_MATH_ONLIST_TOOLTIP_RANDOM}' +}; + +Blockly.Extensions.register('math_op_tooltip', + Blockly.Extensions.buildTooltipForDropdown( + 'OP', Blockly.Constants.Math.TOOLTIPS_BY_OP)); + + +/** + * Mixin for mutator functions in the 'math_is_divisibleby_mutator' + * extension. + * @mixin + * @augments Blockly.Block + * @package + */ +Blockly.Constants.Math.IS_DIVISIBLEBY_MUTATOR_MIXIN = { + /** + * Create XML to represent whether the 'divisorInput' should be present. + * @return {Element} XML storage element. + * @this {Blockly.Block} + */ + mutationToDom: function() { + var container = Blockly.utils.xml.createElement('mutation'); + var divisorInput = (this.getFieldValue('PROPERTY') == 'DIVISIBLE_BY'); + container.setAttribute('divisor_input', divisorInput); + return container; + }, + /** + * Parse XML to restore the 'divisorInput'. + * @param {!Element} xmlElement XML storage element. + * @this {Blockly.Block} + */ + domToMutation: function(xmlElement) { + var divisorInput = (xmlElement.getAttribute('divisor_input') == 'true'); + this.updateShape_(divisorInput); + }, + /** + * Modify this block to have (or not have) an input for 'is divisible by'. + * @param {boolean} divisorInput True if this block has a divisor input. + * @private + * @this {Blockly.Block} + */ + updateShape_: function(divisorInput) { + // Add or remove a Value Input. + var inputExists = this.getInput('DIVISOR'); + if (divisorInput) { + if (!inputExists) { + this.appendValueInput('DIVISOR') + .setCheck('Number'); + } + } else if (inputExists) { + this.removeInput('DIVISOR'); + } + } +}; + +/** + * 'math_is_divisibleby_mutator' extension to the 'math_property' block that + * can update the block shape (add/remove divisor input) based on whether + * property is "divisble by". + * @this {Blockly.Block} + * @package + */ +Blockly.Constants.Math.IS_DIVISIBLE_MUTATOR_EXTENSION = function() { + this.getField('PROPERTY').setValidator(function(option) { + var divisorInput = (option == 'DIVISIBLE_BY'); + this.getSourceBlock().updateShape_(divisorInput); + }); +}; + +Blockly.Extensions.registerMutator('math_is_divisibleby_mutator', + Blockly.Constants.Math.IS_DIVISIBLEBY_MUTATOR_MIXIN, + Blockly.Constants.Math.IS_DIVISIBLE_MUTATOR_EXTENSION); + +// Update the tooltip of 'math_change' block to reference the variable. +Blockly.Extensions.register('math_change_tooltip', + Blockly.Extensions.buildTooltipWithFieldText( + '%{BKY_MATH_CHANGE_TOOLTIP}', 'VAR')); + +/** + * Mixin with mutator methods to support alternate output based if the + * 'math_on_list' block uses the 'MODE' operation. + * @mixin + * @augments Blockly.Block + * @package + * @readonly + */ +Blockly.Constants.Math.LIST_MODES_MUTATOR_MIXIN = { + /** + * Modify this block to have the correct output type. + * @param {string} newOp Either 'MODE' or some op than returns a number. + * @private + * @this {Blockly.Block} + */ + updateType_: function(newOp) { + if (newOp == 'MODE') { + this.outputConnection.setCheck('Array'); + } else { + this.outputConnection.setCheck('Number'); + } + }, + /** + * Create XML to represent the output type. + * @return {Element} XML storage element. + * @this {Blockly.Block} + */ + mutationToDom: function() { + var container = Blockly.utils.xml.createElement('mutation'); + container.setAttribute('op', this.getFieldValue('OP')); + return container; + }, + /** + * Parse XML to restore the output type. + * @param {!Element} xmlElement XML storage element. + * @this {Blockly.Block} + */ + domToMutation: function(xmlElement) { + this.updateType_(xmlElement.getAttribute('op')); + } +}; + +/** + * Extension to 'math_on_list' blocks that allows support of + * modes operation (outputs a list of numbers). + * @this {Blockly.Block} + * @package + */ +Blockly.Constants.Math.LIST_MODES_MUTATOR_EXTENSION = function() { + this.getField('OP').setValidator(function(newOp) { + this.updateType_(newOp); + }.bind(this)); +}; + +Blockly.Extensions.registerMutator('math_modes_of_list_mutator', + Blockly.Constants.Math.LIST_MODES_MUTATOR_MIXIN, + Blockly.Constants.Math.LIST_MODES_MUTATOR_EXTENSION); diff --git a/js/blocks/myblocks.js b/js/blocks/myblocks.js new file mode 100644 index 0000000..33b3b1f --- /dev/null +++ b/js/blocks/myblocks.js @@ -0,0 +1,17 @@ +Blockly.Blocks['nk'] = { + init: function() { + this.jsonInit({ + "message0": 'nk服务器实例', + "args0": [ + { + "type": "input_value", + "name": "VALUE" + } + ], + "output": "NukkitServer", + "colour": 20, + "tooltip": "返回nukkit的服务器实例", + "helpUrl": "#" + }); + } +}; \ No newline at end of file diff --git a/js/blocks/procedures.js b/js/blocks/procedures.js new file mode 100644 index 0000000..bd1d017 --- /dev/null +++ b/js/blocks/procedures.js @@ -0,0 +1,1071 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Procedure blocks for Blockly. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Blocks.procedures'); + +goog.require('Blockly'); +goog.require('Blockly.Blocks'); +goog.require('Blockly.Comment'); +goog.require('Blockly.FieldCheckbox'); +goog.require('Blockly.FieldLabel'); +goog.require('Blockly.FieldTextInput'); +goog.require('Blockly.Mutator'); +goog.require('Blockly.Warning'); + + +Blockly.Blocks['procedures_defnoreturn'] = { + /** + * Block for defining a procedure with no return value. + * @this {Blockly.Block} + */ + init: function() { + var nameField = new Blockly.FieldTextInput('', + Blockly.Procedures.rename); + nameField.setSpellcheck(false); + this.appendDummyInput() + .appendField(Blockly.Msg['PROCEDURES_DEFNORETURN_TITLE']) + .appendField(nameField, 'NAME') + .appendField('', 'PARAMS'); + this.setMutator(new Blockly.Mutator(['procedures_mutatorarg'])); + if ((this.workspace.options.comments || + (this.workspace.options.parentWorkspace && + this.workspace.options.parentWorkspace.options.comments)) && + Blockly.Msg['PROCEDURES_DEFNORETURN_COMMENT']) { + this.setCommentText(Blockly.Msg['PROCEDURES_DEFNORETURN_COMMENT']); + } + this.setStyle('procedure_blocks'); + this.setTooltip(Blockly.Msg['PROCEDURES_DEFNORETURN_TOOLTIP']); + this.setHelpUrl(Blockly.Msg['PROCEDURES_DEFNORETURN_HELPURL']); + this.arguments_ = []; + this.argumentVarModels_ = []; + this.setStatements_(true); + this.statementConnection_ = null; + }, + /** + * Add or remove the statement block from this function definition. + * @param {boolean} hasStatements True if a statement block is needed. + * @this {Blockly.Block} + */ + setStatements_: function(hasStatements) { + if (this.hasStatements_ === hasStatements) { + return; + } + if (hasStatements) { + this.appendStatementInput('STACK') + .appendField(Blockly.Msg['PROCEDURES_DEFNORETURN_DO']); + if (this.getInput('RETURN')) { + this.moveInputBefore('STACK', 'RETURN'); + } + } else { + this.removeInput('STACK', true); + } + this.hasStatements_ = hasStatements; + }, + /** + * Update the display of parameters for this procedure definition block. + * @private + * @this {Blockly.Block} + */ + updateParams_: function() { + + // Merge the arguments into a human-readable list. + var paramString = ''; + if (this.arguments_.length) { + 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(); + try { + this.setFieldValue(paramString, 'PARAMS'); + } finally { + 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(opt_paramIds) { + var container = Blockly.utils.xml.createElement('mutation'); + if (opt_paramIds) { + container.setAttribute('name', this.getFieldValue('NAME')); + } + for (var i = 0; i < this.argumentVarModels_.length; i++) { + var parameter = Blockly.utils.xml.createElement('arg'); + var argModel = this.argumentVarModels_[i]; + parameter.setAttribute('name', argModel.name); + parameter.setAttribute('varid', argModel.getId()); + if (opt_paramIds && this.paramIds_) { + parameter.setAttribute('paramId', this.paramIds_[i]); + } + container.appendChild(parameter); + } + + // Save whether the statement input is visible. + if (!this.hasStatements_) { + container.setAttribute('statements', 'false'); + } + return container; + }, + /** + * Parse XML to restore the argument inputs. + * @param {!Element} xmlElement XML storage element. + * @this {Blockly.Block} + */ + domToMutation: function(xmlElement) { + this.arguments_ = []; + this.argumentVarModels_ = []; + for (var i = 0, childNode; (childNode = xmlElement.childNodes[i]); i++) { + if (childNode.nodeName.toLowerCase() == 'arg') { + var varName = childNode.getAttribute('name'); + var varId = childNode.getAttribute('varid') || childNode.getAttribute('varId'); + this.arguments_.push(varName); + var variable = Blockly.Variables.getOrCreateVariablePackage( + this.workspace, varId, varName, ''); + if (variable != null) { + this.argumentVarModels_.push(variable); + } else { + console.log('Failed to create a variable with name ' + varName + ', ignoring.'); + } + } + } + this.updateParams_(); + Blockly.Procedures.mutateCallers(this); + + // Show or hide the statement input. + this.setStatements_(xmlElement.getAttribute('statements') !== 'false'); + }, + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @return {!Blockly.Block} Root block in mutator. + * @this {Blockly.Block} + */ + decompose: function(workspace) { + /* + * Creates the following XML: + * + * + * + * arg1_name + * etc... + * + * + * + */ + + var containerBlockNode = Blockly.utils.xml.createElement('block'); + containerBlockNode.setAttribute('type', 'procedures_mutatorcontainer'); + var statementNode = Blockly.utils.xml.createElement('statement'); + statementNode.setAttribute('name', 'STACK'); + containerBlockNode.appendChild(statementNode); + + var node = statementNode; + for (var i = 0; i < this.arguments_.length; i++) { + var argBlockNode = Blockly.utils.xml.createElement('block'); + argBlockNode.setAttribute('type', 'procedures_mutatorarg'); + var fieldNode = Blockly.utils.xml.createElement('field'); + fieldNode.setAttribute('name', 'NAME'); + var argumentName = Blockly.utils.xml.createTextNode(this.arguments_[i]); + fieldNode.appendChild(argumentName); + argBlockNode.appendChild(fieldNode); + var nextNode = Blockly.utils.xml.createElement('next'); + argBlockNode.appendChild(nextNode); + + node.appendChild(argBlockNode); + node = nextNode; + } + + var containerBlock = Blockly.Xml.domToBlock(containerBlockNode, workspace); + + if (this.type == 'procedures_defreturn') { + containerBlock.setFieldValue(this.hasStatements_, 'STATEMENTS'); + } else { + containerBlock.removeInput('STATEMENT_INPUT'); + } + + // Initialize procedure's callers with blank IDs. + Blockly.Procedures.mutateCallers(this); + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this {Blockly.Block} + */ + compose: function(containerBlock) { + // Parameter list. + this.arguments_ = []; + this.paramIds_ = []; + this.argumentVarModels_ = []; + var paramBlock = containerBlock.getInputTargetBlock('STACK'); + while (paramBlock) { + var varName = paramBlock.getFieldValue('NAME'); + this.arguments_.push(varName); + var variable = this.workspace.getVariable(varName, ''); + this.argumentVarModels_.push(variable); + + this.paramIds_.push(paramBlock.id); + paramBlock = paramBlock.nextConnection && + paramBlock.nextConnection.targetBlock(); + } + this.updateParams_(); + Blockly.Procedures.mutateCallers(this); + + // Show/hide the statement input. + var hasStatements = containerBlock.getFieldValue('STATEMENTS'); + if (hasStatements !== null) { + hasStatements = hasStatements == 'TRUE'; + if (this.hasStatements_ != hasStatements) { + if (hasStatements) { + this.setStatements_(true); + // Restore the stack, if one was saved. + 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.unplug(); + stackBlock.bumpNeighbours(); + } + this.setStatements_(false); + } + } + } + }, + /** + * Return the signature of this procedure definition. + * @return {!Array} Tuple containing three elements: + * - the name of the defined procedure, + * - a list of all its arguments, + * - that it DOES NOT have a return value. + * @this {Blockly.Block} + */ + getProcedureDef: function() { + return [this.getFieldValue('NAME'), this.arguments_, false]; + }, + /** + * Return all variables referenced by this block. + * @return {!Array.} List of variable names. + * @this {Blockly.Block} + */ + getVars: function() { + return this.arguments_; + }, + /** + * Return all variables referenced by this block. + * @return {!Array.} List of variable models. + * @this {Blockly.Block} + */ + getVarModels: function() { + return this.argumentVarModels_; + }, + /** + * Notification that a variable is renaming. + * If the ID matches one of this block's variables, rename it. + * @param {string} oldId ID of variable to rename. + * @param {string} newId ID of new variable. May be the same as oldId, but + * with an updated name. Guaranteed to be the same type as the old + * variable. + * @override + * @this {Blockly.Block} + */ + renameVarById: function(oldId, newId) { + var oldVariable = this.workspace.getVariableById(oldId); + if (oldVariable.type != '') { + // Procedure arguments always have the empty type. + return; + } + var oldName = oldVariable.name; + var newVar = this.workspace.getVariableById(newId); + + var change = false; + for (var i = 0; i < this.argumentVarModels_.length; i++) { + if (this.argumentVarModels_[i].getId() == oldId) { + this.arguments_[i] = newVar.name; + this.argumentVarModels_[i] = newVar; + change = true; + } + } + if (change) { + this.displayRenamedVar_(oldName, newVar.name); + Blockly.Procedures.mutateCallers(this); + } + }, + /** + * Notification that a variable is renaming but keeping the same ID. If the + * variable is in use on this block, rerender to show the new name. + * @param {!Blockly.VariableModel} variable The variable being renamed. + * @package + * @override + * @this {Blockly.Block} + */ + updateVarName: function(variable) { + var newName = variable.name; + var change = false; + for (var i = 0; i < this.argumentVarModels_.length; i++) { + if (this.argumentVarModels_[i].getId() == variable.getId()) { + var oldName = this.arguments_[i]; + this.arguments_[i] = newName; + change = true; + } + } + if (change) { + this.displayRenamedVar_(oldName, newName); + Blockly.Procedures.mutateCallers(this); + } + }, + /** + * Update the display to reflect a newly renamed argument. + * @param {string} oldName The old display name of the argument. + * @param {string} newName The new display name of the argument. + * @private + * @this {Blockly.Block} + */ + displayRenamedVar_: function(oldName, newName) { + this.updateParams_(); + // Update the mutator's variables if the mutator is open. + if (this.mutator && this.mutator.isVisible()) { + var blocks = this.mutator.workspace_.getAllBlocks(false); + for (var i = 0, block; (block = blocks[i]); i++) { + if (block.type == 'procedures_mutatorarg' && + Blockly.Names.equals(oldName, block.getFieldValue('NAME'))) { + block.setFieldValue(newName, 'NAME'); + } + } + } + }, + /** + * Add custom menu options to this block's context menu. + * @param {!Array} options List of menu options to add to. + * @this {Blockly.Block} + */ + customContextMenu: function(options) { + if (this.isInFlyout) { + return; + } + // Add option to create caller. + var option = {enabled: true}; + var name = this.getFieldValue('NAME'); + option.text = Blockly.Msg['PROCEDURES_CREATE_DO'].replace('%1', name); + var xmlMutation = Blockly.utils.xml.createElement('mutation'); + xmlMutation.setAttribute('name', name); + for (var i = 0; i < this.arguments_.length; i++) { + var xmlArg = Blockly.utils.xml.createElement('arg'); + xmlArg.setAttribute('name', this.arguments_[i]); + xmlMutation.appendChild(xmlArg); + } + var xmlBlock = Blockly.utils.xml.createElement('block'); + xmlBlock.setAttribute('type', this.callType_); + xmlBlock.appendChild(xmlMutation); + option.callback = Blockly.ContextMenu.callbackFactory(this, xmlBlock); + options.push(option); + + // Add options to create getters for each parameter. + if (!this.isCollapsed()) { + for (var i = 0; i < this.argumentVarModels_.length; i++) { + var argOption = {enabled: true}; + var argVar = this.argumentVarModels_[i]; + argOption.text = Blockly.Msg['VARIABLES_SET_CREATE_GET'] + .replace('%1', argVar.name); + + var argXmlField = Blockly.Variables.generateVariableFieldDom(argVar); + var argXmlBlock = Blockly.utils.xml.createElement('block'); + argXmlBlock.setAttribute('type', 'variables_get'); + argXmlBlock.appendChild(argXmlField); + argOption.callback = + Blockly.ContextMenu.callbackFactory(this, argXmlBlock); + options.push(argOption); + } + } + }, + callType_: 'procedures_callnoreturn' +}; + +Blockly.Blocks['procedures_defreturn'] = { + /** + * Block for defining a procedure with a return value. + * @this {Blockly.Block} + */ + init: function() { + var nameField = new Blockly.FieldTextInput('', + Blockly.Procedures.rename); + nameField.setSpellcheck(false); + this.appendDummyInput() + .appendField(Blockly.Msg['PROCEDURES_DEFRETURN_TITLE']) + .appendField(nameField, 'NAME') + .appendField('', 'PARAMS'); + this.appendValueInput('RETURN') + .setAlign(Blockly.ALIGN_RIGHT) + .appendField(Blockly.Msg['PROCEDURES_DEFRETURN_RETURN']); + this.setMutator(new Blockly.Mutator(['procedures_mutatorarg'])); + if ((this.workspace.options.comments || + (this.workspace.options.parentWorkspace && + this.workspace.options.parentWorkspace.options.comments)) && + Blockly.Msg['PROCEDURES_DEFRETURN_COMMENT']) { + this.setCommentText(Blockly.Msg['PROCEDURES_DEFRETURN_COMMENT']); + } + this.setStyle('procedure_blocks'); + this.setTooltip(Blockly.Msg['PROCEDURES_DEFRETURN_TOOLTIP']); + this.setHelpUrl(Blockly.Msg['PROCEDURES_DEFRETURN_HELPURL']); + this.arguments_ = []; + this.argumentVarModels_ = []; + this.setStatements_(true); + this.statementConnection_ = null; + }, + setStatements_: Blockly.Blocks['procedures_defnoreturn'].setStatements_, + updateParams_: Blockly.Blocks['procedures_defnoreturn'].updateParams_, + mutationToDom: Blockly.Blocks['procedures_defnoreturn'].mutationToDom, + domToMutation: Blockly.Blocks['procedures_defnoreturn'].domToMutation, + decompose: Blockly.Blocks['procedures_defnoreturn'].decompose, + compose: Blockly.Blocks['procedures_defnoreturn'].compose, + /** + * Return the signature of this procedure definition. + * @return {!Array} Tuple containing three elements: + * - the name of the defined procedure, + * - a list of all its arguments, + * - that it DOES have a return value. + * @this {Blockly.Block} + */ + getProcedureDef: function() { + return [this.getFieldValue('NAME'), this.arguments_, true]; + }, + getVars: Blockly.Blocks['procedures_defnoreturn'].getVars, + getVarModels: Blockly.Blocks['procedures_defnoreturn'].getVarModels, + renameVarById: Blockly.Blocks['procedures_defnoreturn'].renameVarById, + updateVarName: Blockly.Blocks['procedures_defnoreturn'].updateVarName, + displayRenamedVar_: Blockly.Blocks['procedures_defnoreturn'].displayRenamedVar_, + customContextMenu: Blockly.Blocks['procedures_defnoreturn'].customContextMenu, + callType_: 'procedures_callreturn' +}; + +Blockly.Blocks['procedures_mutatorcontainer'] = { + /** + * Mutator block for procedure container. + * @this {Blockly.Block} + */ + init: function() { + this.appendDummyInput() + .appendField(Blockly.Msg['PROCEDURES_MUTATORCONTAINER_TITLE']); + this.appendStatementInput('STACK'); + this.appendDummyInput('STATEMENT_INPUT') + .appendField(Blockly.Msg['PROCEDURES_ALLOW_STATEMENTS']) + .appendField(new Blockly.FieldCheckbox('TRUE'), 'STATEMENTS'); + this.setStyle('procedure_blocks'); + this.setTooltip(Blockly.Msg['PROCEDURES_MUTATORCONTAINER_TOOLTIP']); + this.contextMenu = false; + }, +}; + +Blockly.Blocks['procedures_mutatorarg'] = { + /** + * Mutator block for procedure argument. + * @this {Blockly.Block} + */ + init: function() { + var field = new Blockly.FieldTextInput( + Blockly.Procedures.DEFAULT_ARG, this.validator_); + // Hack: override showEditor to do just a little bit more work. + // We don't have a good place to hook into the start of a text edit. + field.oldShowEditorFn_ = field.showEditor_; + var newShowEditorFn = function() { + this.createdVariables_ = []; + this.oldShowEditorFn_(); + }; + field.showEditor_ = newShowEditorFn; + + this.appendDummyInput() + .appendField(Blockly.Msg['PROCEDURES_MUTATORARG_TITLE']) + .appendField(field, 'NAME'); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setStyle('procedure_blocks'); + this.setTooltip(Blockly.Msg['PROCEDURES_MUTATORARG_TOOLTIP']); + this.contextMenu = false; + + // Create the default variable when we drag the block in from the flyout. + // Have to do this after installing the field on the block. + field.onFinishEditing_ = this.deleteIntermediateVars_; + // Create an empty list so onFinishEditing_ has something to look at, even + // though the editor was never opened. + field.createdVariables_ = []; + field.onFinishEditing_('x'); + }, + + /** + * Obtain a valid name for the procedure argument. Create a variable if + * necessary. + * Merge runs of whitespace. Strip leading and trailing whitespace. + * Beyond this, all names are legal. + * @param {string} varName User-supplied name. + * @return {?string} Valid name, or null if a name was not specified. + * @private + * @this Blockly.FieldTextInput + */ + validator_: function(varName) { + var sourceBlock = this.getSourceBlock(); + var outerWs = Blockly.Mutator.findParentWs(sourceBlock.workspace); + varName = varName.replace(/[\s\xa0]+/g, ' ').replace(/^ | $/g, ''); + if (!varName) { + return null; + } + + // Prevents duplicate parameter names in functions + var workspace = sourceBlock.workspace.targetWorkspace || + sourceBlock.workspace; + var blocks = workspace.getAllBlocks(false); + for (var i = 0; i < blocks.length; i++) { + if (blocks[i].id == this.getSourceBlock().id) { + continue; + } + if (blocks[i].getFieldValue('NAME') == varName) { + return null; + } + } + + // Don't create variables for arg blocks that + // only exist in the mutator's flyout. + if (sourceBlock.isInFlyout) { + return varName; + } + + var model = outerWs.getVariable(varName, ''); + if (model && model.name != varName) { + // Rename the variable (case change) + outerWs.renameVariableById(model.getId(), varName); + } + if (!model) { + model = outerWs.createVariable(varName, ''); + if (model && this.createdVariables_) { + this.createdVariables_.push(model); + } + } + return varName; + }, + + /** + * Called when focusing away from the text field. + * Deletes all variables that were created as the user typed their intended + * variable name. + * @param {string} newText The new variable name. + * @private + * @this Blockly.FieldTextInput + */ + deleteIntermediateVars_: function(newText) { + var outerWs = Blockly.Mutator.findParentWs(this.getSourceBlock().workspace); + if (!outerWs) { + return; + } + for (var i = 0; i < this.createdVariables_.length; i++) { + var model = this.createdVariables_[i]; + if (model.name != newText) { + outerWs.deleteVariableById(model.getId()); + } + } + } +}; + +Blockly.Blocks['procedures_callnoreturn'] = { + /** + * Block for calling a procedure with no return value. + * @this {Blockly.Block} + */ + init: function() { + this.appendDummyInput('TOPROW') + .appendField(this.id, 'NAME'); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setStyle('procedure_blocks'); + // Tooltip is set in renameProcedure. + this.setHelpUrl(Blockly.Msg['PROCEDURES_CALLNORETURN_HELPURL']); + this.arguments_ = []; + this.argumentVarModels_ = []; + this.quarkConnections_ = {}; + this.quarkIds_ = null; + this.previousEnabledState_ = true; + }, + + /** + * Returns the name of the procedure this block calls. + * @return {string} Procedure name. + * @this {Blockly.Block} + */ + getProcedureCall: function() { + // The NAME field is guaranteed to exist, null will never be returned. + return /** @type {string} */ (this.getFieldValue('NAME')); + }, + /** + * Notification that a procedure is renaming. + * If the name matches this block's procedure, rename it. + * @param {string} oldName Previous name of procedure. + * @param {string} newName Renamed procedure. + * @this {Blockly.Block} + */ + renameProcedure: function(oldName, newName) { + if (Blockly.Names.equals(oldName, this.getProcedureCall())) { + this.setFieldValue(newName, 'NAME'); + var baseMsg = this.outputConnection ? + Blockly.Msg['PROCEDURES_CALLRETURN_TOOLTIP'] : + Blockly.Msg['PROCEDURES_CALLNORETURN_TOOLTIP']; + this.setTooltip(baseMsg.replace('%1', newName)); + } + }, + /** + * Notification that the procedure's parameters have changed. + * @param {!Array.} paramNames New param names, e.g. ['x', 'y', 'z']. + * @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) { + // 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.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). + return; + } + // Test arguments (arrays of strings) for changes. '\n' is not a valid + // argument name character, so it is a valid delimiter here. + if (paramNames.join('\n') == this.arguments_.join('\n')) { + // No change. + this.quarkIds_ = paramIds; + return; + } + if (paramIds.length != paramNames.length) { + throw RangeError('paramNames and paramIds must be the same length.'); + } + this.setCollapsed(false); + if (!this.quarkIds_) { + // Initialize tracking for this block. + this.quarkConnections_ = {}; + 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 = 0; i < this.arguments_.length; i++) { + var input = this.getInput('ARG' + i); + if (input) { + var connection = input.connection.targetConnection; + 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); + // And rebuild the argument model list. + this.argumentVarModels_ = []; + for (var i = 0; i < this.arguments_.length; i++) { + var variable = Blockly.Variables.getOrCreateVariablePackage( + this.workspace, null, this.arguments_[i], ''); + this.argumentVarModels_.push(variable); + } + + this.updateShape_(); + this.quarkIds_ = paramIds; + // Reconnect any child blocks. + if (this.quarkIds_) { + for (var i = 0; i < this.arguments_.length; i++) { + 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_[quarkId]; + } + } + } + } + // Restore rendering and show the changes. + this.rendered = savedRendered; + if (this.rendered) { + this.render(); + } + }, + /** + * Modify this block to have the correct number of arguments. + * @private + * @this {Blockly.Block} + */ + updateShape_: function() { + for (var i = 0; i < this.arguments_.length; i++) { + 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(); + try { + field.setValue(this.arguments_[i]); + } finally { + 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')) { + topRow.appendField(Blockly.Msg['PROCEDURES_CALL_BEFORE_PARAMS'], 'WITH'); + topRow.init(); + } + } else { + if (this.getField('WITH')) { + topRow.removeField('WITH'); + } + } + } + }, + /** + * Create XML to represent the (non-editable) name and arguments. + * @return {!Element} XML storage element. + * @this {Blockly.Block} + */ + mutationToDom: function() { + var container = Blockly.utils.xml.createElement('mutation'); + container.setAttribute('name', this.getProcedureCall()); + for (var i = 0; i < this.arguments_.length; i++) { + var parameter = Blockly.utils.xml.createElement('arg'); + parameter.setAttribute('name', this.arguments_[i]); + container.appendChild(parameter); + } + return container; + }, + /** + * Parse XML to restore the (non-editable) name and parameters. + * @param {!Element} xmlElement XML storage element. + * @this {Blockly.Block} + */ + domToMutation: function(xmlElement) { + var name = xmlElement.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')); + } + } + this.setProcedureParameters_(args, paramIds); + }, + /** + * Return all variables referenced by this block. + * @return {!Array.} List of variable models. + * @this {Blockly.Block} + */ + getVarModels: function() { + return this.argumentVarModels_; + }, + /** + * Procedure calls cannot exist without the corresponding procedure + * definition. Enforce this link whenever an event is fired. + * @param {!Blockly.Events.Abstract} event Change event. + * @this {Blockly.Block} + */ + onchange: function(event) { + if (!this.workspace || this.workspace.isFlyout) { + // Block is deleted or is in a flyout. + return; + } + if (!event.recordUndo) { + // Events not generated by user. Skip handling. + return; + } + if (event.type == Blockly.Events.BLOCK_CREATE && + event.ids.indexOf(this.id) != -1) { + // Look for the case where a procedure call was created (usually through + // paste) and there is no matching definition. In this case, create + // an empty definition block with the correct signature. + var name = this.getProcedureCall(); + var def = Blockly.Procedures.getDefinition(name, this.workspace); + if (def && (def.type != this.defType_ || + JSON.stringify(def.arguments_) != JSON.stringify(this.arguments_))) { + // The signatures don't match. + def = null; + } + if (!def) { + Blockly.Events.setGroup(event.group); + /** + * Create matching definition block. + * + * + * + * + * + * test + * + * + */ + var xml = Blockly.utils.xml.createElement('xml'); + var block = Blockly.utils.xml.createElement('block'); + block.setAttribute('type', this.defType_); + var xy = this.getRelativeToSurfaceXY(); + var x = xy.x + Blockly.SNAP_RADIUS * (this.RTL ? -1 : 1); + var y = xy.y + Blockly.SNAP_RADIUS * 2; + block.setAttribute('x', x); + block.setAttribute('y', y); + var mutation = this.mutationToDom(); + block.appendChild(mutation); + var field = Blockly.utils.xml.createElement('field'); + field.setAttribute('name', 'NAME'); + field.appendChild(Blockly.utils.xml.createTextNode( + this.getProcedureCall())); + block.appendChild(field); + xml.appendChild(block); + Blockly.Xml.domToWorkspace(xml, this.workspace); + Blockly.Events.setGroup(false); + } + } else if (event.type == Blockly.Events.BLOCK_DELETE) { + // Look for the case where a procedure definition has been deleted, + // leaving this block (a procedure call) orphaned. In this case, delete + // the orphan. + var name = this.getProcedureCall(); + var def = Blockly.Procedures.getDefinition(name, this.workspace); + if (!def) { + Blockly.Events.setGroup(event.group); + this.dispose(true); + Blockly.Events.setGroup(false); + } + } else if (event.type == Blockly.Events.CHANGE && event.element == 'disabled') { + var name = this.getProcedureCall(); + var def = Blockly.Procedures.getDefinition(name, this.workspace); + if (def && def.id == event.blockId) { + // in most cases the old group should be '' + var oldGroup = Blockly.Events.getGroup(); + if (oldGroup) { + // This should only be possible programatically and may indicate a problem + // with event grouping. If you see this message please investigate. If the + // use ends up being valid we may need to reorder events in the undo stack. + console.log('Saw an existing group while responding to a definition change'); + } + Blockly.Events.setGroup(event.group); + if (event.newValue) { + this.previousEnabledState_ = this.isEnabled(); + this.setEnabled(false); + } else { + this.setEnabled(this.previousEnabledState_); + } + Blockly.Events.setGroup(oldGroup); + } + } + }, + /** + * Add menu option to find the definition block for this call. + * @param {!Array} options List of menu options to add to. + * @this {Blockly.Block} + */ + customContextMenu: function(options) { + if (!this.workspace.isMovable()) { + // If we center on the block and the workspace isn't movable we could + // loose blocks at the edges of the workspace. + return; + } + + var option = {enabled: true}; + option.text = Blockly.Msg['PROCEDURES_HIGHLIGHT_DEF']; + var name = this.getProcedureCall(); + var workspace = this.workspace; + option.callback = function() { + var def = Blockly.Procedures.getDefinition(name, workspace); + if (def) { + workspace.centerOnBlock(def.id); + def.select(); + } + }; + options.push(option); + }, + defType_: 'procedures_defnoreturn' +}; + +Blockly.Blocks['procedures_callreturn'] = { + /** + * Block for calling a procedure with a return value. + * @this {Blockly.Block} + */ + init: function() { + this.appendDummyInput('TOPROW') + .appendField('', 'NAME'); + this.setOutput(true); + this.setStyle('procedure_blocks'); + // Tooltip is set in domToMutation. + this.setHelpUrl(Blockly.Msg['PROCEDURES_CALLRETURN_HELPURL']); + this.arguments_ = []; + this.quarkConnections_ = {}; + this.quarkIds_ = null; + this.previousEnabledState_ = true; + }, + + getProcedureCall: Blockly.Blocks['procedures_callnoreturn'].getProcedureCall, + renameProcedure: Blockly.Blocks['procedures_callnoreturn'].renameProcedure, + setProcedureParameters_: + Blockly.Blocks['procedures_callnoreturn'].setProcedureParameters_, + updateShape_: Blockly.Blocks['procedures_callnoreturn'].updateShape_, + mutationToDom: Blockly.Blocks['procedures_callnoreturn'].mutationToDom, + domToMutation: Blockly.Blocks['procedures_callnoreturn'].domToMutation, + getVarModels: Blockly.Blocks['procedures_callnoreturn'].getVarModels, + onchange: Blockly.Blocks['procedures_callnoreturn'].onchange, + customContextMenu: + Blockly.Blocks['procedures_callnoreturn'].customContextMenu, + defType_: 'procedures_defreturn' +}; + +Blockly.Blocks['procedures_ifreturn'] = { + /** + * Block for conditionally returning a value from a procedure. + * @this {Blockly.Block} + */ + init: function() { + this.appendValueInput('CONDITION') + .setCheck('Boolean') + .appendField(Blockly.Msg['CONTROLS_IF_MSG_IF']); + this.appendValueInput('VALUE') + .appendField(Blockly.Msg['PROCEDURES_DEFRETURN_RETURN']); + this.setInputsInline(true); + this.setPreviousStatement(true); + this.setNextStatement(true); + this.setStyle('procedure_blocks'); + this.setTooltip(Blockly.Msg['PROCEDURES_IFRETURN_TOOLTIP']); + this.setHelpUrl(Blockly.Msg['PROCEDURES_IFRETURN_HELPURL']); + this.hasReturnValue_ = true; + }, + /** + * Create XML to represent whether this block has a return value. + * @return {!Element} XML storage element. + * @this {Blockly.Block} + */ + mutationToDom: function() { + var container = Blockly.utils.xml.createElement('mutation'); + container.setAttribute('value', Number(this.hasReturnValue_)); + return container; + }, + /** + * Parse XML to restore whether this block has a return value. + * @param {!Element} xmlElement XML storage element. + * @this {Blockly.Block} + */ + domToMutation: function(xmlElement) { + var value = xmlElement.getAttribute('value'); + this.hasReturnValue_ = (value == 1); + if (!this.hasReturnValue_) { + this.removeInput('VALUE'); + this.appendDummyInput('VALUE') + .appendField(Blockly.Msg['PROCEDURES_DEFRETURN_RETURN']); + } + }, + /** + * Called whenever anything on the workspace changes. + * Add warning if this flow block is not nested inside a loop. + * @param {!Blockly.Events.Abstract} _e Change event. + * @this {Blockly.Block} + */ + onchange: function(_e) { + if (!this.workspace.isDragging || this.workspace.isDragging()) { + return; // Don't change state at the start of a drag. + } + var legal = false; + // Is the block nested in a procedure? + var block = this; + do { + if (this.FUNCTION_TYPES.indexOf(block.type) != -1) { + legal = true; + break; + } + block = block.getSurroundParent(); + } while (block); + if (legal) { + // If needed, toggle whether this block has a return value. + if (block.type == 'procedures_defnoreturn' && this.hasReturnValue_) { + this.removeInput('VALUE'); + this.appendDummyInput('VALUE') + .appendField(Blockly.Msg['PROCEDURES_DEFRETURN_RETURN']); + this.hasReturnValue_ = false; + } else if (block.type == 'procedures_defreturn' && + !this.hasReturnValue_) { + this.removeInput('VALUE'); + this.appendValueInput('VALUE') + .appendField(Blockly.Msg['PROCEDURES_DEFRETURN_RETURN']); + this.hasReturnValue_ = true; + } + this.setWarningText(null); + if (!this.isInFlyout) { + this.setEnabled(true); + } + } else { + this.setWarningText(Blockly.Msg['PROCEDURES_IFRETURN_WARNING']); + if (!this.isInFlyout && !this.getInheritedDisabled()) { + this.setEnabled(false); + } + } + }, + /** + * 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/js/blocks/text.js b/js/blocks/text.js new file mode 100644 index 0000000..fe4b9c9 --- /dev/null +++ b/js/blocks/text.js @@ -0,0 +1,933 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Text blocks for Blockly. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Blocks.texts'); // Deprecated +goog.provide('Blockly.Constants.Text'); + +goog.require('Blockly'); +goog.require('Blockly.Blocks'); +goog.require('Blockly.FieldDropdown'); +goog.require('Blockly.FieldImage'); +goog.require('Blockly.FieldMultilineInput'); +goog.require('Blockly.FieldTextInput'); +goog.require('Blockly.FieldVariable'); +goog.require('Blockly.Mutator'); + + +/** + * Unused constant for the common HSV hue for all blocks in this category. + * @deprecated Use Blockly.Msg['TEXTS_HUE']. (2018 April 5) + */ +Blockly.Constants.Text.HUE = 160; + +Blockly.defineBlocksWithJsonArray([ // BEGIN JSON EXTRACT + // Block for text value + { + "type": "text", + "message0": "%1", + "args0": [{ + "type": "field_input", + "name": "TEXT", + "text": "" + }], + "output": "String", + "style": "text_blocks", + "helpUrl": "%{BKY_TEXT_TEXT_HELPURL}", + "tooltip": "%{BKY_TEXT_TEXT_TOOLTIP}", + "extensions": [ + "text_quotes", + "parent_tooltip_when_inline" + ] + }, + { + "type": "text_multiline", + "message0": "%1 %2", + "args0": [{ + "type": "field_image", + "src": 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAARCAYAAADpP' + + 'U2iAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAdhgAAHYYBXaITgQAAABh0RVh0' + + 'U29mdHdhcmUAcGFpbnQubmV0IDQuMS42/U4J6AAAAP1JREFUOE+Vks0KQUEYhjm' + + 'RIja4ABtZ2dm5A3t3Ia6AUm7CylYuQRaUhZSlLZJiQbFAyRnPN33y01HOW08z88' + + '73zpwzM4F3GWOCruvGIE4/rLaV+Nq1hVGMBqzhqlxgCys4wJA65xnogMHsQ5luj' + + 'nYHTejBBCK2mE4abjCgMGhNxHgDFWjDSG07kdfVa2pZMf4ZyMAdWmpZMfYOsLiD' + + 'MYMjlMB+K613QISRhTnITnsYg5yUd0DETmEoMlkFOeIT/A58iyK5E18BuTBfgYX' + + 'fwNJv4P9/oEBerLylOnRhygmGdPpTTBZAPkde61lbQe4moWUvYUZYLfUNftIY4z' + + 'wA5X2Z9AYnQrEAAAAASUVORK5CYII=', + "width": 12, + "height": 17, + "alt": '\u00B6' + },{ + "type": "field_multilinetext", + "name": "TEXT", + "text": "" + }], + "output": "String", + "style": "text_blocks", + "helpUrl": "%{BKY_TEXT_TEXT_HELPURL}", + "tooltip": "%{BKY_TEXT_TEXT_TOOLTIP}", + "extensions": [ + "parent_tooltip_when_inline" + ] + }, + { + "type": "text_join", + "message0": "", + "output": "String", + "style": "text_blocks", + "helpUrl": "%{BKY_TEXT_JOIN_HELPURL}", + "tooltip": "%{BKY_TEXT_JOIN_TOOLTIP}", + "mutator": "text_join_mutator" + + }, + { + "type": "text_create_join_container", + "message0": "%{BKY_TEXT_CREATE_JOIN_TITLE_JOIN} %1 %2", + "args0": [{ + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "STACK" + }], + "style": "text_blocks", + "tooltip": "%{BKY_TEXT_CREATE_JOIN_TOOLTIP}", + "enableContextMenu": false + }, + { + "type": "text_create_join_item", + "message0": "%{BKY_TEXT_CREATE_JOIN_ITEM_TITLE_ITEM}", + "previousStatement": null, + "nextStatement": null, + "style": "text_blocks", + "tooltip": "%{BKY_TEXT_CREATE_JOIN_ITEM_TOOLTIP}", + "enableContextMenu": false + }, + { + "type": "text_append", + "message0": "%{BKY_TEXT_APPEND_TITLE}", + "args0": [{ + "type": "field_variable", + "name": "VAR", + "variable": "%{BKY_TEXT_APPEND_VARIABLE}" + }, + { + "type": "input_value", + "name": "TEXT" + }], + "previousStatement": null, + "nextStatement": null, + "style": "text_blocks", + "extensions": [ + "text_append_tooltip" + ] + }, + { + "type": "text_length", + "message0": "%{BKY_TEXT_LENGTH_TITLE}", + "args0": [ + { + "type": "input_value", + "name": "VALUE", + "check": ['String', 'Array'] + } + ], + "output": 'Number', + "style": "text_blocks", + "tooltip": "%{BKY_TEXT_LENGTH_TOOLTIP}", + "helpUrl": "%{BKY_TEXT_LENGTH_HELPURL}" + }, + { + "type": "text_isEmpty", + "message0": "%{BKY_TEXT_ISEMPTY_TITLE}", + "args0": [ + { + "type": "input_value", + "name": "VALUE", + "check": ['String', 'Array'] + } + ], + "output": 'Boolean', + "style": "text_blocks", + "tooltip": "%{BKY_TEXT_ISEMPTY_TOOLTIP}", + "helpUrl": "%{BKY_TEXT_ISEMPTY_HELPURL}" + }, + { + "type": "text_indexOf", + "message0": "%{BKY_TEXT_INDEXOF_TITLE}", + "args0": [ + { + "type": "input_value", + "name": "VALUE", + "check": "String" + }, + { + "type": "field_dropdown", + "name": "END", + "options": [ + [ + "%{BKY_TEXT_INDEXOF_OPERATOR_FIRST}", + "FIRST" + ], + [ + "%{BKY_TEXT_INDEXOF_OPERATOR_LAST}", + "LAST" + ] + ] + }, + { + "type": "input_value", + "name": "FIND", + "check": "String" + } + ], + "output": "Number", + "style": "text_blocks", + "helpUrl": "%{BKY_TEXT_INDEXOF_HELPURL}", + "inputsInline": true, + "extensions": [ + "text_indexOf_tooltip" + ] + }, + { + "type": "text_charAt", + "message0": "%{BKY_TEXT_CHARAT_TITLE}", // "in text %1 %2" + "args0": [ + { + "type":"input_value", + "name": "VALUE", + "check": "String" + }, + { + "type": "field_dropdown", + "name": "WHERE", + "options": [ + ["%{BKY_TEXT_CHARAT_FROM_START}", "FROM_START"], + ["%{BKY_TEXT_CHARAT_FROM_END}", "FROM_END"], + ["%{BKY_TEXT_CHARAT_FIRST}", "FIRST"], + ["%{BKY_TEXT_CHARAT_LAST}", "LAST"], + ["%{BKY_TEXT_CHARAT_RANDOM}", "RANDOM"] + ] + } + ], + "output": "String", + "style": "text_blocks", + "helpUrl": "%{BKY_TEXT_CHARAT_HELPURL}", + "inputsInline": true, + "mutator": "text_charAt_mutator" + } +]); // END JSON EXTRACT (Do not delete this comment.) + +Blockly.Blocks['text_getSubstring'] = { + /** + * Block for getting substring. + * @this {Blockly.Block} + */ + init: function() { + this['WHERE_OPTIONS_1'] = [ + [Blockly.Msg['TEXT_GET_SUBSTRING_START_FROM_START'], 'FROM_START'], + [Blockly.Msg['TEXT_GET_SUBSTRING_START_FROM_END'], 'FROM_END'], + [Blockly.Msg['TEXT_GET_SUBSTRING_START_FIRST'], 'FIRST'] + ]; + this['WHERE_OPTIONS_2'] = [ + [Blockly.Msg['TEXT_GET_SUBSTRING_END_FROM_START'], 'FROM_START'], + [Blockly.Msg['TEXT_GET_SUBSTRING_END_FROM_END'], 'FROM_END'], + [Blockly.Msg['TEXT_GET_SUBSTRING_END_LAST'], 'LAST'] + ]; + this.setHelpUrl(Blockly.Msg['TEXT_GET_SUBSTRING_HELPURL']); + this.setStyle('text_blocks'); + this.appendValueInput('STRING') + .setCheck('String') + .appendField(Blockly.Msg['TEXT_GET_SUBSTRING_INPUT_IN_TEXT']); + this.appendDummyInput('AT1'); + this.appendDummyInput('AT2'); + if (Blockly.Msg['TEXT_GET_SUBSTRING_TAIL']) { + this.appendDummyInput('TAIL') + .appendField(Blockly.Msg['TEXT_GET_SUBSTRING_TAIL']); + } + this.setInputsInline(true); + this.setOutput(true, 'String'); + this.updateAt_(1, true); + this.updateAt_(2, true); + this.setTooltip(Blockly.Msg['TEXT_GET_SUBSTRING_TOOLTIP']); + }, + /** + * Create XML to represent whether there are 'AT' inputs. + * @return {!Element} XML storage element. + * @this {Blockly.Block} + */ + mutationToDom: function() { + var container = Blockly.utils.xml.createElement('mutation'); + var isAt1 = this.getInput('AT1').type == Blockly.INPUT_VALUE; + container.setAttribute('at1', isAt1); + var isAt2 = this.getInput('AT2').type == Blockly.INPUT_VALUE; + container.setAttribute('at2', isAt2); + return container; + }, + /** + * Parse XML to restore the 'AT' inputs. + * @param {!Element} xmlElement XML storage element. + * @this {Blockly.Block} + */ + domToMutation: function(xmlElement) { + var isAt1 = (xmlElement.getAttribute('at1') == 'true'); + var isAt2 = (xmlElement.getAttribute('at2') == 'true'); + this.updateAt_(1, isAt1); + this.updateAt_(2, isAt2); + }, + /** + * Create or delete an input for a numeric index. + * This block has two such inputs, independant of each other. + * @param {number} n Specify first or second input (1 or 2). + * @param {boolean} isAt True if the input should exist. + * @private + * @this {Blockly.Block} + */ + updateAt_: function(n, isAt) { + // Create or delete an input for the numeric index. + // Destroy old 'AT' and 'ORDINAL' inputs. + this.removeInput('AT' + n); + this.removeInput('ORDINAL' + n, true); + // Create either a value 'AT' input or a dummy input. + if (isAt) { + this.appendValueInput('AT' + n).setCheck('Number'); + if (Blockly.Msg['ORDINAL_NUMBER_SUFFIX']) { + this.appendDummyInput('ORDINAL' + n) + .appendField(Blockly.Msg['ORDINAL_NUMBER_SUFFIX']); + } + } else { + this.appendDummyInput('AT' + n); + } + // Move tail, if present, to end of block. + if (n == 2 && Blockly.Msg['TEXT_GET_SUBSTRING_TAIL']) { + this.removeInput('TAIL', true); + this.appendDummyInput('TAIL') + .appendField(Blockly.Msg['TEXT_GET_SUBSTRING_TAIL']); + } + var menu = new Blockly.FieldDropdown(this['WHERE_OPTIONS_' + n], + function(value) { + var newAt = (value == 'FROM_START') || (value == 'FROM_END'); + // The 'isAt' variable is available due to this function being a + // closure. + if (newAt != isAt) { + var block = this.getSourceBlock(); + block.updateAt_(n, newAt); + // This menu has been destroyed and replaced. + // Update the replacement. + block.setFieldValue(value, 'WHERE' + n); + return null; + } + return undefined; + }); + + this.getInput('AT' + n) + .appendField(menu, 'WHERE' + n); + if (n == 1) { + this.moveInputBefore('AT1', 'AT2'); + if (this.getInput('ORDINAL1')) { + this.moveInputBefore('ORDINAL1', 'AT2'); + } + } + } +}; + +Blockly.Blocks['text_changeCase'] = { + /** + * Block for changing capitalization. + * @this {Blockly.Block} + */ + init: function() { + var OPERATORS = [ + [Blockly.Msg['TEXT_CHANGECASE_OPERATOR_UPPERCASE'], 'UPPERCASE'], + [Blockly.Msg['TEXT_CHANGECASE_OPERATOR_LOWERCASE'], 'LOWERCASE'], + [Blockly.Msg['TEXT_CHANGECASE_OPERATOR_TITLECASE'], 'TITLECASE'] + ]; + this.setHelpUrl(Blockly.Msg['TEXT_CHANGECASE_HELPURL']); + this.setStyle('text_blocks'); + this.appendValueInput('TEXT') + .setCheck('String') + .appendField(new Blockly.FieldDropdown(OPERATORS), 'CASE'); + this.setOutput(true, 'String'); + this.setTooltip(Blockly.Msg['TEXT_CHANGECASE_TOOLTIP']); + } +}; + +Blockly.Blocks['text_trim'] = { + /** + * Block for trimming spaces. + * @this {Blockly.Block} + */ + init: function() { + var OPERATORS = [ + [Blockly.Msg['TEXT_TRIM_OPERATOR_BOTH'], 'BOTH'], + [Blockly.Msg['TEXT_TRIM_OPERATOR_LEFT'], 'LEFT'], + [Blockly.Msg['TEXT_TRIM_OPERATOR_RIGHT'], 'RIGHT'] + ]; + this.setHelpUrl(Blockly.Msg['TEXT_TRIM_HELPURL']); + this.setStyle('text_blocks'); + this.appendValueInput('TEXT') + .setCheck('String') + .appendField(new Blockly.FieldDropdown(OPERATORS), 'MODE'); + this.setOutput(true, 'String'); + this.setTooltip(Blockly.Msg['TEXT_TRIM_TOOLTIP']); + } +}; + +Blockly.Blocks['text_print'] = { + /** + * Block for print statement. + * @this {Blockly.Block} + */ + init: function() { + this.jsonInit({ + "message0": Blockly.Msg['TEXT_PRINT_TITLE'], + "args0": [ + { + "type": "input_value", + "name": "TEXT" + } + ], + "previousStatement": null, + "nextStatement": null, + "style": "text_blocks", + "tooltip": Blockly.Msg['TEXT_PRINT_TOOLTIP'], + "helpUrl": Blockly.Msg['TEXT_PRINT_HELPURL'] + }); + } +}; + +Blockly.Blocks['text_prompt_ext'] = { + /** + * Block for prompt function (external message). + * @this {Blockly.Block} + */ + init: function() { + var TYPES = [ + [Blockly.Msg['TEXT_PROMPT_TYPE_TEXT'], 'TEXT'], + [Blockly.Msg['TEXT_PROMPT_TYPE_NUMBER'], 'NUMBER'] + ]; + this.setHelpUrl(Blockly.Msg['TEXT_PROMPT_HELPURL']); + this.setStyle('text_blocks'); + // Assign 'this' to a variable for use in the closures below. + var thisBlock = this; + var dropdown = new Blockly.FieldDropdown(TYPES, function(newOp) { + thisBlock.updateType_(newOp); + }); + this.appendValueInput('TEXT') + .appendField(dropdown, 'TYPE'); + this.setOutput(true, 'String'); + this.setTooltip(function() { + return (thisBlock.getFieldValue('TYPE') == 'TEXT') ? + Blockly.Msg['TEXT_PROMPT_TOOLTIP_TEXT'] : + Blockly.Msg['TEXT_PROMPT_TOOLTIP_NUMBER']; + }); + }, + /** + * Modify this block to have the correct output type. + * @param {string} newOp Either 'TEXT' or 'NUMBER'. + * @private + * @this {Blockly.Block} + */ + updateType_: function(newOp) { + this.outputConnection.setCheck(newOp == 'NUMBER' ? 'Number' : 'String'); + }, + /** + * Create XML to represent the output type. + * @return {!Element} XML storage element. + * @this {Blockly.Block} + */ + mutationToDom: function() { + var container = Blockly.utils.xml.createElement('mutation'); + container.setAttribute('type', this.getFieldValue('TYPE')); + return container; + }, + /** + * Parse XML to restore the output type. + * @param {!Element} xmlElement XML storage element. + * @this {Blockly.Block} + */ + domToMutation: function(xmlElement) { + this.updateType_(xmlElement.getAttribute('type')); + } +}; + +Blockly.Blocks['text_prompt'] = { + /** + * Block for prompt function (internal message). + * The 'text_prompt_ext' block is preferred as it is more flexible. + * @this {Blockly.Block} + */ + init: function() { + this.mixin(Blockly.Constants.Text.QUOTE_IMAGE_MIXIN); + var TYPES = [ + [Blockly.Msg['TEXT_PROMPT_TYPE_TEXT'], 'TEXT'], + [Blockly.Msg['TEXT_PROMPT_TYPE_NUMBER'], 'NUMBER'] + ]; + + // Assign 'this' to a variable for use in the closures below. + var thisBlock = this; + this.setHelpUrl(Blockly.Msg['TEXT_PROMPT_HELPURL']); + this.setStyle('text_blocks'); + var dropdown = new Blockly.FieldDropdown(TYPES, function(newOp) { + thisBlock.updateType_(newOp); + }); + this.appendDummyInput() + .appendField(dropdown, 'TYPE') + .appendField(this.newQuote_(true)) + .appendField(new Blockly.FieldTextInput(''), 'TEXT') + .appendField(this.newQuote_(false)); + this.setOutput(true, 'String'); + this.setTooltip(function() { + return (thisBlock.getFieldValue('TYPE') == 'TEXT') ? + Blockly.Msg['TEXT_PROMPT_TOOLTIP_TEXT'] : + Blockly.Msg['TEXT_PROMPT_TOOLTIP_NUMBER']; + }); + }, + updateType_: Blockly.Blocks['text_prompt_ext'].updateType_, + mutationToDom: Blockly.Blocks['text_prompt_ext'].mutationToDom, + domToMutation: Blockly.Blocks['text_prompt_ext'].domToMutation +}; + +Blockly.Blocks['text_count'] = { + /** + * Block for counting how many times one string appears within another string. + * @this {Blockly.Block} + */ + init: function() { + this.jsonInit({ + "message0": Blockly.Msg['TEXT_COUNT_MESSAGE0'], + "args0": [ + { + "type": "input_value", + "name": "SUB", + "check": "String" + }, + { + "type": "input_value", + "name": "TEXT", + "check": "String" + } + ], + "output": "Number", + "inputsInline": true, + "style": "text_blocks", + "tooltip": Blockly.Msg['TEXT_COUNT_TOOLTIP'], + "helpUrl": Blockly.Msg['TEXT_COUNT_HELPURL'] + }); + } +}; + +Blockly.Blocks['text_replace'] = { + /** + * Block for replacing one string with another in the text. + * @this {Blockly.Block} + */ + init: function() { + this.jsonInit({ + "message0": Blockly.Msg['TEXT_REPLACE_MESSAGE0'], + "args0": [ + { + "type": "input_value", + "name": "FROM", + "check": "String" + }, + { + "type": "input_value", + "name": "TO", + "check": "String" + }, + { + "type": "input_value", + "name": "TEXT", + "check": "String" + } + ], + "output": "String", + "inputsInline": true, + "style": "text_blocks", + "tooltip": Blockly.Msg['TEXT_REPLACE_TOOLTIP'], + "helpUrl": Blockly.Msg['TEXT_REPLACE_HELPURL'] + }); + } +}; + +Blockly.Blocks['text_reverse'] = { + /** + * Block for reversing a string. + * @this {Blockly.Block} + */ + init: function() { + this.jsonInit({ + "message0": Blockly.Msg['TEXT_REVERSE_MESSAGE0'], + "args0": [ + { + "type": "input_value", + "name": "TEXT", + "check": "String" + } + ], + "output": "String", + "inputsInline": true, + "style": "text_blocks", + "tooltip": Blockly.Msg['TEXT_REVERSE_TOOLTIP'], + "helpUrl": Blockly.Msg['TEXT_REVERSE_HELPURL'] + }); + } +}; + +/** + * + * @mixin + * @package + * @readonly + */ +Blockly.Constants.Text.QUOTE_IMAGE_MIXIN = { + /** + * Image data URI of an LTR opening double quote (same as RTL closing double quote). + * @readonly + */ + QUOTE_IMAGE_LEFT_DATAURI: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAA' + + 'n0lEQVQI1z3OMa5BURSF4f/cQhAKjUQhuQmFNwGJEUi0RKN5rU7FHKhpjEH3TEMtkdBSCY' + + '1EIv8r7nFX9e29V7EBAOvu7RPjwmWGH/VuF8CyN9/OAdvqIXYLvtRaNjx9mMTDyo+NjAN1' + + 'HNcl9ZQ5oQMM3dgDUqDo1l8DzvwmtZN7mnD+PkmLa+4mhrxVA9fRowBWmVBhFy5gYEjKMf' + + 'z9AylsaRRgGzvZAAAAAElFTkSuQmCC', + /** + * Image data URI of an LTR closing double quote (same as RTL opening double quote). + * @readonly + */ + QUOTE_IMAGE_RIGHT_DATAURI: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAKCAQAAAAqJXdxAAAA' + + 'qUlEQVQI1z3KvUpCcRiA8ef9E4JNHhI0aFEacm1o0BsI0Slx8wa8gLauoDnoBhq7DcfWhg' + + 'gONDmJJgqCPA7neJ7p934EOOKOnM8Q7PDElo/4x4lFb2DmuUjcUzS3URnGib9qaPNbuXvB' + + 'O3sGPHJDRG6fGVdMSeWDP2q99FQdFrz26Gu5Tq7dFMzUvbXy8KXeAj57cOklgA+u1B5Aos' + + 'lLtGIHQMaCVnwDnADZIFIrXsoXrgAAAABJRU5ErkJggg==', + /** + * Pixel width of QUOTE_IMAGE_LEFT_DATAURI and QUOTE_IMAGE_RIGHT_DATAURI. + * @readonly + */ + QUOTE_IMAGE_WIDTH: 12, + /** + * Pixel height of QUOTE_IMAGE_LEFT_DATAURI and QUOTE_IMAGE_RIGHT_DATAURI. + * @readonly + */ + QUOTE_IMAGE_HEIGHT: 12, + + /** + * Inserts appropriate quote images before and after the named field. + * @param {string} fieldName The name of the field to wrap with quotes. + * @this {Blockly.Block} + */ + quoteField_: function(fieldName) { + for (var i = 0, input; (input = this.inputList[i]); i++) { + for (var j = 0, field; (field = input.fieldRow[j]); j++) { + if (fieldName == field.name) { + input.insertFieldAt(j, this.newQuote_(true)); + input.insertFieldAt(j + 2, this.newQuote_(false)); + return; + } + } + } + console.warn('field named "' + fieldName + '" not found in ' + this.toDevString()); + }, + + /** + * A helper function that generates a FieldImage of an opening or + * closing double quote. The selected quote will be adapted for RTL blocks. + * @param {boolean} open If the image should be open quote (“ in LTR). + * Otherwise, a closing quote is used (” in LTR). + * @return {!Blockly.FieldImage} The new field. + * @this {Blockly.Block} + */ + newQuote_: function(open) { + var isLeft = this.RTL ? !open : open; + var dataUri = isLeft ? + this.QUOTE_IMAGE_LEFT_DATAURI : + this.QUOTE_IMAGE_RIGHT_DATAURI; + return new Blockly.FieldImage( + dataUri, + this.QUOTE_IMAGE_WIDTH, + this.QUOTE_IMAGE_HEIGHT, + isLeft ? '\u201C' : '\u201D'); + } +}; + +/** + * Wraps TEXT field with images of double quote characters. + * @this {Blockly.Block} + */ +Blockly.Constants.Text.TEXT_QUOTES_EXTENSION = function() { + this.mixin(Blockly.Constants.Text.QUOTE_IMAGE_MIXIN); + this.quoteField_('TEXT'); +}; + +/** + * Mixin for mutator functions in the 'text_join_mutator' extension. + * @mixin + * @augments Blockly.Block + * @package + */ +Blockly.Constants.Text.TEXT_JOIN_MUTATOR_MIXIN = { + /** + * Create XML to represent number of text inputs. + * @return {!Element} XML storage element. + * @this {Blockly.Block} + */ + mutationToDom: function() { + var container = Blockly.utils.xml.createElement('mutation'); + container.setAttribute('items', this.itemCount_); + return container; + }, + /** + * Parse XML to restore the text inputs. + * @param {!Element} xmlElement XML storage element. + * @this {Blockly.Block} + */ + domToMutation: function(xmlElement) { + this.itemCount_ = parseInt(xmlElement.getAttribute('items'), 10); + this.updateShape_(); + }, + /** + * Populate the mutator's dialog with this block's components. + * @param {!Blockly.Workspace} workspace Mutator's workspace. + * @return {!Blockly.Block} Root block in mutator. + * @this {Blockly.Block} + */ + decompose: function(workspace) { + var containerBlock = workspace.newBlock('text_create_join_container'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 0; i < this.itemCount_; i++) { + var itemBlock = workspace.newBlock('text_create_join_item'); + itemBlock.initSvg(); + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this {Blockly.Block} + */ + compose: function(containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + // Count number of inputs. + var connections = []; + while (itemBlock) { + connections.push(itemBlock.valueConnection_); + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + // Disconnect any children that don't belong. + for (var i = 0; i < this.itemCount_; i++) { + var connection = this.getInput('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++) { + Blockly.Mutator.reconnect(connections[i], this, 'ADD' + i); + } + }, + /** + * Store pointers to any connected child blocks. + * @param {!Blockly.Block} containerBlock Root block in mutator. + * @this {Blockly.Block} + */ + saveConnections: function(containerBlock) { + var itemBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 0; + while (itemBlock) { + var input = this.getInput('ADD' + i); + itemBlock.valueConnection_ = input && input.connection.targetConnection; + i++; + itemBlock = itemBlock.nextConnection && + itemBlock.nextConnection.targetBlock(); + } + }, + /** + * Modify this block to have the correct number of inputs. + * @private + * @this {Blockly.Block} + */ + updateShape_: function() { + if (this.itemCount_ && this.getInput('EMPTY')) { + this.removeInput('EMPTY'); + } else if (!this.itemCount_ && !this.getInput('EMPTY')) { + this.appendDummyInput('EMPTY') + .appendField(this.newQuote_(true)) + .appendField(this.newQuote_(false)); + } + // 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++; + } + } +}; + +/** + * Performs final setup of a text_join block. + * @this {Blockly.Block} + */ +Blockly.Constants.Text.TEXT_JOIN_EXTENSION = function() { + // Add the quote mixin for the itemCount_ = 0 case. + this.mixin(Blockly.Constants.Text.QUOTE_IMAGE_MIXIN); + // Initialize the mutator values. + this.itemCount_ = 2; + this.updateShape_(); + // Configure the mutator UI. + this.setMutator(new Blockly.Mutator(['text_create_join_item'])); +}; + +// Update the tooltip of 'text_append' block to reference the variable. +Blockly.Extensions.register('text_append_tooltip', + Blockly.Extensions.buildTooltipWithFieldText( + '%{BKY_TEXT_APPEND_TOOLTIP}', 'VAR')); + +/** + * Update the tooltip of 'text_append' block to reference the variable. + * @this {Blockly.Block} + */ +Blockly.Constants.Text.TEXT_INDEXOF_TOOLTIP_EXTENSION = function() { + // Assign 'this' to a variable for use in the tooltip closure below. + var thisBlock = this; + this.setTooltip(function() { + return Blockly.Msg['TEXT_INDEXOF_TOOLTIP'].replace('%1', + thisBlock.workspace.options.oneBasedIndex ? '0' : '-1'); + }); +}; + +/** + * Mixin for mutator functions in the 'text_charAt_mutator' extension. + * @mixin + * @augments Blockly.Block + * @package + */ +Blockly.Constants.Text.TEXT_CHARAT_MUTATOR_MIXIN = { + /** + * Create XML to represent whether there is an 'AT' input. + * @return {!Element} XML storage element. + * @this {Blockly.Block} + */ + mutationToDom: function() { + var container = Blockly.utils.xml.createElement('mutation'); + container.setAttribute('at', !!this.isAt_); + return container; + }, + /** + * Parse XML to restore the 'AT' input. + * @param {!Element} xmlElement XML storage element. + * @this {Blockly.Block} + */ + domToMutation: function(xmlElement) { + // Note: Until January 2013 this block did not have mutations, + // so 'at' defaults to true. + var isAt = (xmlElement.getAttribute('at') != 'false'); + this.updateAt_(isAt); + }, + /** + * Create or delete an input for the numeric index. + * @param {boolean} isAt True if the input should exist. + * @private + * @this {Blockly.Block} + */ + updateAt_: function(isAt) { + // Destroy old 'AT' and 'ORDINAL' inputs. + this.removeInput('AT', true); + this.removeInput('ORDINAL', true); + // Create either a value 'AT' input or a dummy input. + if (isAt) { + this.appendValueInput('AT').setCheck('Number'); + if (Blockly.Msg['ORDINAL_NUMBER_SUFFIX']) { + this.appendDummyInput('ORDINAL') + .appendField(Blockly.Msg['ORDINAL_NUMBER_SUFFIX']); + } + } + if (Blockly.Msg['TEXT_CHARAT_TAIL']) { + this.removeInput('TAIL', true); + this.appendDummyInput('TAIL') + .appendField(Blockly.Msg['TEXT_CHARAT_TAIL']); + } + + this.isAt_ = isAt; + } +}; + +/** + * Does the initial mutator update of text_charAt and adds the tooltip + * @this {Blockly.Block} + */ +Blockly.Constants.Text.TEXT_CHARAT_EXTENSION = function() { + var dropdown = this.getField('WHERE'); + dropdown.setValidator(function(value) { + var newAt = (value == 'FROM_START') || (value == 'FROM_END'); + if (newAt != this.isAt_) { + var block = this.getSourceBlock(); + block.updateAt_(newAt); + } + }); + this.updateAt_(true); + // Assign 'this' to a variable for use in the tooltip closure below. + var thisBlock = this; + this.setTooltip(function() { + var where = thisBlock.getFieldValue('WHERE'); + var tooltip = Blockly.Msg['TEXT_CHARAT_TOOLTIP']; + if (where == 'FROM_START' || where == 'FROM_END') { + var msg = (where == 'FROM_START') ? + Blockly.Msg['LISTS_INDEX_FROM_START_TOOLTIP'] : + Blockly.Msg['LISTS_INDEX_FROM_END_TOOLTIP']; + if (msg) { + tooltip += ' ' + msg.replace('%1', + thisBlock.workspace.options.oneBasedIndex ? '#1' : '#0'); + } + } + return tooltip; + }); +}; + +Blockly.Extensions.register('text_indexOf_tooltip', + Blockly.Constants.Text.TEXT_INDEXOF_TOOLTIP_EXTENSION); + +Blockly.Extensions.register('text_quotes', + Blockly.Constants.Text.TEXT_QUOTES_EXTENSION); + +Blockly.Extensions.registerMutator('text_join_mutator', + Blockly.Constants.Text.TEXT_JOIN_MUTATOR_MIXIN, + Blockly.Constants.Text.TEXT_JOIN_EXTENSION); + +Blockly.Extensions.registerMutator('text_charAt_mutator', + Blockly.Constants.Text.TEXT_CHARAT_MUTATOR_MIXIN, + Blockly.Constants.Text.TEXT_CHARAT_EXTENSION); diff --git a/js/blocks/variables.js b/js/blocks/variables.js new file mode 100644 index 0000000..f97b181 --- /dev/null +++ b/js/blocks/variables.js @@ -0,0 +1,174 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Variable blocks for Blockly. + + * This file is scraped to extract a .json file of block definitions. The array + * passed to defineBlocksWithJsonArray(..) must be strict JSON: double quotes + * only, no outside references, no functions, no trailing commas, etc. The one + * exception is end-of-line comments, which the scraper will remove. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Blocks.variables'); // Deprecated. +goog.provide('Blockly.Constants.Variables'); + +goog.require('Blockly'); +goog.require('Blockly.Blocks'); +goog.require('Blockly.FieldLabel'); +goog.require('Blockly.FieldVariable'); + + +/** + * Unused constant for the common HSV hue for all blocks in this category. + * @deprecated Use Blockly.Msg['VARIABLES_HUE']. (2018 April 5) + */ +Blockly.Constants.Variables.HUE = 330; + +Blockly.defineBlocksWithJsonArray([ // BEGIN JSON EXTRACT + // Block for variable getter. + { + "type": "variables_get", + "message0": "%1", + "args0": [ + { + "type": "field_variable", + "name": "VAR", + "variable": "%{BKY_VARIABLES_DEFAULT_NAME}" + } + ], + "output": null, + "style": "variable_blocks", + "helpUrl": "%{BKY_VARIABLES_GET_HELPURL}", + "tooltip": "%{BKY_VARIABLES_GET_TOOLTIP}", + "extensions": ["contextMenu_variableSetterGetter"] + }, + // Block for variable setter. + { + "type": "variables_set", + "message0": "%{BKY_VARIABLES_SET}", + "args0": [ + { + "type": "field_variable", + "name": "VAR", + "variable": "%{BKY_VARIABLES_DEFAULT_NAME}" + }, + { + "type": "input_value", + "name": "VALUE" + } + ], + "previousStatement": null, + "nextStatement": null, + "style": "variable_blocks", + "tooltip": "%{BKY_VARIABLES_SET_TOOLTIP}", + "helpUrl": "%{BKY_VARIABLES_SET_HELPURL}", + "extensions": ["contextMenu_variableSetterGetter"] + } +]); // END JSON EXTRACT (Do not delete this comment.) + +/** + * Mixin to add context menu items to create getter/setter blocks for this + * setter/getter. + * Used by blocks 'variables_set' and 'variables_get'. + * @mixin + * @augments Blockly.Block + * @package + * @readonly + */ +Blockly.Constants.Variables.CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN = { + /** + * Add menu option to create getter/setter block for this setter/getter. + * @param {!Array} options List of menu options to add to. + * @this {Blockly.Block} + */ + customContextMenu: function(options) { + if (!this.isInFlyout) { + // Getter blocks have the option to create a setter block, and vice versa. + if (this.type == 'variables_get') { + var opposite_type = 'variables_set'; + var contextMenuMsg = Blockly.Msg['VARIABLES_GET_CREATE_SET']; + } else { + var opposite_type = 'variables_get'; + var contextMenuMsg = Blockly.Msg['VARIABLES_SET_CREATE_GET']; + } + + var option = {enabled: this.workspace.remainingCapacity() > 0}; + var name = this.getField('VAR').getText(); + option.text = contextMenuMsg.replace('%1', name); + var xmlField = Blockly.utils.xml.createElement('field'); + xmlField.setAttribute('name', 'VAR'); + xmlField.appendChild(Blockly.utils.xml.createTextNode(name)); + var xmlBlock = Blockly.utils.xml.createElement('block'); + xmlBlock.setAttribute('type', opposite_type); + xmlBlock.appendChild(xmlField); + option.callback = Blockly.ContextMenu.callbackFactory(this, xmlBlock); + options.push(option); + // Getter blocks have the option to rename or delete that variable. + } else { + if (this.type == 'variables_get' || this.type == 'variables_get_reporter') { + var renameOption = { + text: Blockly.Msg.RENAME_VARIABLE, + enabled: true, + callback: Blockly.Constants.Variables.RENAME_OPTION_CALLBACK_FACTORY(this) + }; + var name = this.getField('VAR').getText(); + var deleteOption = { + text: Blockly.Msg.DELETE_VARIABLE.replace('%1', name), + enabled: true, + callback: Blockly.Constants.Variables.DELETE_OPTION_CALLBACK_FACTORY(this) + }; + options.unshift(renameOption); + options.unshift(deleteOption); + } + } + } +}; + +/** + * Callback for rename variable dropdown menu option associated with a + * variable getter block. + * @param {!Blockly.Block} block The block with the variable to rename. + * @return {!function()} A function that renames the variable. + */ +Blockly.Constants.Variables.RENAME_OPTION_CALLBACK_FACTORY = function(block) { + return function() { + var workspace = block.workspace; + var variable = block.getField('VAR').getVariable(); + Blockly.Variables.renameVariable(workspace, variable); + }; +}; + +/** + * Callback for delete variable dropdown menu option associated with a + * variable getter block. + * @param {!Blockly.Block} block The block with the variable to delete. + * @return {!function()} A function that deletes the variable. + */ +Blockly.Constants.Variables.DELETE_OPTION_CALLBACK_FACTORY = function(block) { + return function() { + var workspace = block.workspace; + var variable = block.getField('VAR').getVariable(); + workspace.deleteVariableById(variable.getId()); + workspace.refreshToolboxSelection(); + }; +}; + +Blockly.Extensions.registerMixin('contextMenu_variableSetterGetter', + Blockly.Constants.Variables.CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN); diff --git a/js/blocks/variables_dynamic.js b/js/blocks/variables_dynamic.js new file mode 100644 index 0000000..ca236af --- /dev/null +++ b/js/blocks/variables_dynamic.js @@ -0,0 +1,191 @@ +/** + * @license + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Variable blocks for Blockly. + + * This file is scraped to extract a .json file of block definitions. The array + * passed to defineBlocksWithJsonArray(..) must be strict JSON: double quotes + * only, no outside references, no functions, no trailing commas, etc. The one + * exception is end-of-line comments, which the scraper will remove. + * @author duzc2dtw@gmail.com (Du Tian Wei) + */ +'use strict'; + +goog.provide('Blockly.Constants.VariablesDynamic'); + +goog.require('Blockly'); +goog.require('Blockly.Blocks'); +goog.require('Blockly.FieldLabel'); +goog.require('Blockly.FieldVariable'); + + +/** + * Unused constant for the common HSV hue for all blocks in this category. + * @deprecated Use Blockly.Msg['VARIABLES_DYNAMIC_HUE']. (2018 April 5) + */ +Blockly.Constants.VariablesDynamic.HUE = 310; + +Blockly.defineBlocksWithJsonArray([ // BEGIN JSON EXTRACT + // Block for variable getter. + { + "type": "variables_get_dynamic", + "message0": "%1", + "args0": [{ + "type": "field_variable", + "name": "VAR", + "variable": "%{BKY_VARIABLES_DEFAULT_NAME}" + }], + "output": null, + "style": "variable_dynamic_blocks", + "helpUrl": "%{BKY_VARIABLES_GET_HELPURL}", + "tooltip": "%{BKY_VARIABLES_GET_TOOLTIP}", + "extensions": ["contextMenu_variableDynamicSetterGetter"] + }, + // Block for variable setter. + { + "type": "variables_set_dynamic", + "message0": "%{BKY_VARIABLES_SET}", + "args0": [{ + "type": "field_variable", + "name": "VAR", + "variable": "%{BKY_VARIABLES_DEFAULT_NAME}" + }, + { + "type": "input_value", + "name": "VALUE" + } + ], + "previousStatement": null, + "nextStatement": null, + "style": "variable_dynamic_blocks", + "tooltip": "%{BKY_VARIABLES_SET_TOOLTIP}", + "helpUrl": "%{BKY_VARIABLES_SET_HELPURL}", + "extensions": ["contextMenu_variableDynamicSetterGetter"] + } +]); // END JSON EXTRACT (Do not delete this comment.) + +/** + * Mixin to add context menu items to create getter/setter blocks for this + * setter/getter. + * Used by blocks 'variables_set_dynamic' and 'variables_get_dynamic'. + * @mixin + * @augments Blockly.Block + * @package + * @readonly + */ +Blockly.Constants.VariablesDynamic.CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN = { + /** + * Add menu option to create getter/setter block for this setter/getter. + * @param {!Array} options List of menu options to add to. + * @this {Blockly.Block} + */ + customContextMenu: function(options) { + // Getter blocks have the option to create a setter block, and vice versa. + if (!this.isInFlyout) { + var opposite_type; + var contextMenuMsg; + var id = this.getFieldValue('VAR'); + var variableModel = this.workspace.getVariableById(id); + var varType = variableModel.type; + if (this.type == 'variables_get_dynamic') { + opposite_type = 'variables_set_dynamic'; + contextMenuMsg = Blockly.Msg['VARIABLES_GET_CREATE_SET']; + } else { + opposite_type = 'variables_get_dynamic'; + contextMenuMsg = Blockly.Msg['VARIABLES_SET_CREATE_GET']; + } + + var option = {enabled: this.workspace.remainingCapacity() > 0}; + var name = this.getField('VAR').getText(); + option.text = contextMenuMsg.replace('%1', name); + var xmlField = Blockly.utils.xml.createElement('field'); + xmlField.setAttribute('name', 'VAR'); + xmlField.setAttribute('variabletype', varType); + xmlField.appendChild(Blockly.utils.xml.createTextNode(name)); + var xmlBlock = Blockly.utils.xml.createElement('block'); + xmlBlock.setAttribute('type', opposite_type); + xmlBlock.appendChild(xmlField); + option.callback = Blockly.ContextMenu.callbackFactory(this, xmlBlock); + options.push(option); + } else { + if (this.type == 'variables_get_dynamic' || + this.type == 'variables_get_reporter_dynamic') { + var renameOption = { + text: Blockly.Msg.RENAME_VARIABLE, + enabled: true, + callback: Blockly.Constants.Variables.RENAME_OPTION_CALLBACK_FACTORY(this) + }; + var name = this.getField('VAR').getText(); + var deleteOption = { + text: Blockly.Msg.DELETE_VARIABLE.replace('%1', name), + enabled: true, + callback: Blockly.Constants.Variables.DELETE_OPTION_CALLBACK_FACTORY(this) + }; + options.unshift(renameOption); + options.unshift(deleteOption); + } + } + }, + /** + * Called whenever anything on the workspace changes. + * Set the connection type for this block. + * @param {!Blockly.Events.Abstract} _e Change event. + * @this {Blockly.Block} + */ + onchange: function(_e) { + var id = this.getFieldValue('VAR'); + var variableModel = Blockly.Variables.getVariable(this.workspace, id); + if (this.type == 'variables_get_dynamic') { + this.outputConnection.setCheck(variableModel.type); + } else { + this.getInput('VALUE').connection.setCheck(variableModel.type); + } + } +}; + +/** + * Callback for rename variable dropdown menu option associated with a + * variable getter block. + * @param {!Blockly.Block} block The block with the variable to rename. + * @return {!function()} A function that renames the variable. + */ +Blockly.Constants.VariablesDynamic.RENAME_OPTION_CALLBACK_FACTORY = function(block) { + return function() { + var workspace = block.workspace; + var variable = block.getField('VAR').getVariable(); + Blockly.Variables.renameVariable(workspace, variable); + }; +}; + +/** + * Callback for delete variable dropdown menu option associated with a + * variable getter block. + * @param {!Blockly.Block} block The block with the variable to delete. + * @return {!function()} A function that deletes the variable. + */ +Blockly.Constants.VariablesDynamic.DELETE_OPTION_CALLBACK_FACTORY = function(block) { + return function() { + var workspace = block.workspace; + var variable = block.getField('VAR').getVariable(); + workspace.deleteVariableById(variable.getId()); + workspace.refreshToolboxSelection(); + }; +}; + +Blockly.Extensions.registerMixin('contextMenu_variableDynamicSetterGetter', + Blockly.Constants.VariablesDynamic.CUSTOM_CONTEXT_MENU_VARIABLE_GETTER_SETTER_MIXIN); diff --git a/js/blocks_compressed.js b/js/blocks_compressed.js new file mode 100644 index 0000000..b3b29bf --- /dev/null +++ b/js/blocks_compressed.js @@ -0,0 +1,169 @@ +// Do not edit this file; automatically generated by gulp. +'use strict'; + + +Blockly.Blocks.colour={};Blockly.Constants={};Blockly.Constants.Colour={};Blockly.Constants.Colour.HUE=20; +Blockly.defineBlocksWithJsonArray([{type:"colour_picker",message0:"%1",args0:[{type:"field_colour",name:"COLOUR",colour:"#ff0000"}],output:"Colour",helpUrl:"%{BKY_COLOUR_PICKER_HELPURL}",style:"colour_blocks",tooltip:"%{BKY_COLOUR_PICKER_TOOLTIP}",extensions:["parent_tooltip_when_inline"]},{type:"colour_random",message0:"%{BKY_COLOUR_RANDOM_TITLE}",output:"Colour",helpUrl:"%{BKY_COLOUR_RANDOM_HELPURL}",style:"colour_blocks",tooltip:"%{BKY_COLOUR_RANDOM_TOOLTIP}"},{type:"colour_rgb",message0:"%{BKY_COLOUR_RGB_TITLE} %{BKY_COLOUR_RGB_RED} %1 %{BKY_COLOUR_RGB_GREEN} %2 %{BKY_COLOUR_RGB_BLUE} %3", +args0:[{type:"input_value",name:"RED",check:"Number",align:"RIGHT"},{type:"input_value",name:"GREEN",check:"Number",align:"RIGHT"},{type:"input_value",name:"BLUE",check:"Number",align:"RIGHT"}],output:"Colour",helpUrl:"%{BKY_COLOUR_RGB_HELPURL}",style:"colour_blocks",tooltip:"%{BKY_COLOUR_RGB_TOOLTIP}"},{type:"colour_blend",message0:"%{BKY_COLOUR_BLEND_TITLE} %{BKY_COLOUR_BLEND_COLOUR1} %1 %{BKY_COLOUR_BLEND_COLOUR2} %2 %{BKY_COLOUR_BLEND_RATIO} %3",args0:[{type:"input_value",name:"COLOUR1",check:"Colour", +align:"RIGHT"},{type:"input_value",name:"COLOUR2",check:"Colour",align:"RIGHT"},{type:"input_value",name:"RATIO",check:"Number",align:"RIGHT"}],output:"Colour",helpUrl:"%{BKY_COLOUR_BLEND_HELPURL}",style:"colour_blocks",tooltip:"%{BKY_COLOUR_BLEND_TOOLTIP}"}]);Blockly.Blocks.lists={};Blockly.Constants.Lists={};Blockly.Constants.Lists.HUE=260; +Blockly.defineBlocksWithJsonArray([{type:"lists_create_empty",message0:"%{BKY_LISTS_CREATE_EMPTY_TITLE}",output:"Array",style:"list_blocks",tooltip:"%{BKY_LISTS_CREATE_EMPTY_TOOLTIP}",helpUrl:"%{BKY_LISTS_CREATE_EMPTY_HELPURL}"},{type:"lists_repeat",message0:"%{BKY_LISTS_REPEAT_TITLE}",args0:[{type:"input_value",name:"ITEM"},{type:"input_value",name:"NUM",check:"Number"}],output:"Array",style:"list_blocks",tooltip:"%{BKY_LISTS_REPEAT_TOOLTIP}",helpUrl:"%{BKY_LISTS_REPEAT_HELPURL}"},{type:"lists_reverse", +message0:"%{BKY_LISTS_REVERSE_MESSAGE0}",args0:[{type:"input_value",name:"LIST",check:"Array"}],output:"Array",inputsInline:!0,style:"list_blocks",tooltip:"%{BKY_LISTS_REVERSE_TOOLTIP}",helpUrl:"%{BKY_LISTS_REVERSE_HELPURL}"},{type:"lists_isEmpty",message0:"%{BKY_LISTS_ISEMPTY_TITLE}",args0:[{type:"input_value",name:"VALUE",check:["String","Array"]}],output:"Boolean",style:"list_blocks",tooltip:"%{BKY_LISTS_ISEMPTY_TOOLTIP}",helpUrl:"%{BKY_LISTS_ISEMPTY_HELPURL}"},{type:"lists_length",message0:"%{BKY_LISTS_LENGTH_TITLE}", +args0:[{type:"input_value",name:"VALUE",check:["String","Array"]}],output:"Number",style:"list_blocks",tooltip:"%{BKY_LISTS_LENGTH_TOOLTIP}",helpUrl:"%{BKY_LISTS_LENGTH_HELPURL}"}]); +Blockly.Blocks.lists_create_with={init:function(){this.setHelpUrl(Blockly.Msg.LISTS_CREATE_WITH_HELPURL);this.setStyle("list_blocks");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=Blockly.utils.xml.createElement("mutation");a.setAttribute("items",this.itemCount_);return a},domToMutation:function(a){this.itemCount_=parseInt(a.getAttribute("items"), +10);this.updateShape_()},decompose:function(a){var b=a.newBlock("lists_create_with_container");b.initSvg();for(var c=b.getInput("STACK").connection,e=0;e","GT"],["\u200f\u2265","GTE"]]},{type:"input_value",name:"B"}],inputsInline:!0,output:"Boolean",style:"logic_blocks",helpUrl:"%{BKY_LOGIC_COMPARE_HELPURL}",extensions:["logic_compare", +"logic_op_tooltip"]},{type:"logic_operation",message0:"%1 %2 %3",args0:[{type:"input_value",name:"A",check:"Boolean"},{type:"field_dropdown",name:"OP",options:[["%{BKY_LOGIC_OPERATION_AND}","AND"],["%{BKY_LOGIC_OPERATION_OR}","OR"]]},{type:"input_value",name:"B",check:"Boolean"}],inputsInline:!0,output:"Boolean",style:"logic_blocks",helpUrl:"%{BKY_LOGIC_OPERATION_HELPURL}",extensions:["logic_op_tooltip"]},{type:"logic_negate",message0:"%{BKY_LOGIC_NEGATE_TITLE}",args0:[{type:"input_value",name:"BOOL", +check:"Boolean"}],output:"Boolean",style:"logic_blocks",tooltip:"%{BKY_LOGIC_NEGATE_TOOLTIP}",helpUrl:"%{BKY_LOGIC_NEGATE_HELPURL}"},{type:"logic_null",message0:"%{BKY_LOGIC_NULL}",output:null,style:"logic_blocks",tooltip:"%{BKY_LOGIC_NULL_TOOLTIP}",helpUrl:"%{BKY_LOGIC_NULL_HELPURL}"},{type:"logic_ternary",message0:"%{BKY_LOGIC_TERNARY_CONDITION} %1",args0:[{type:"input_value",name:"IF",check:"Boolean"}],message1:"%{BKY_LOGIC_TERNARY_IF_TRUE} %1",args1:[{type:"input_value",name:"THEN"}],message2:"%{BKY_LOGIC_TERNARY_IF_FALSE} %1", +args2:[{type:"input_value",name:"ELSE"}],output:null,style:"logic_blocks",tooltip:"%{BKY_LOGIC_TERNARY_TOOLTIP}",helpUrl:"%{BKY_LOGIC_TERNARY_HELPURL}",extensions:["logic_ternary"]}]); +Blockly.defineBlocksWithJsonArray([{type:"controls_if_if",message0:"%{BKY_CONTROLS_IF_IF_TITLE_IF}",nextStatement:null,enableContextMenu:!1,style:"logic_blocks",tooltip:"%{BKY_CONTROLS_IF_IF_TOOLTIP}"},{type:"controls_if_elseif",message0:"%{BKY_CONTROLS_IF_ELSEIF_TITLE_ELSEIF}",previousStatement:null,nextStatement:null,enableContextMenu:!1,style:"logic_blocks",tooltip:"%{BKY_CONTROLS_IF_ELSEIF_TOOLTIP}"},{type:"controls_if_else",message0:"%{BKY_CONTROLS_IF_ELSE_TITLE_ELSE}",previousStatement:null, +enableContextMenu:!1,style:"logic_blocks",tooltip:"%{BKY_CONTROLS_IF_ELSE_TOOLTIP}"}]);Blockly.Constants.Logic.TOOLTIPS_BY_OP={EQ:"%{BKY_LOGIC_COMPARE_TOOLTIP_EQ}",NEQ:"%{BKY_LOGIC_COMPARE_TOOLTIP_NEQ}",LT:"%{BKY_LOGIC_COMPARE_TOOLTIP_LT}",LTE:"%{BKY_LOGIC_COMPARE_TOOLTIP_LTE}",GT:"%{BKY_LOGIC_COMPARE_TOOLTIP_GT}",GTE:"%{BKY_LOGIC_COMPARE_TOOLTIP_GTE}",AND:"%{BKY_LOGIC_OPERATION_TOOLTIP_AND}",OR:"%{BKY_LOGIC_OPERATION_TOOLTIP_OR}"}; +Blockly.Extensions.register("logic_op_tooltip",Blockly.Extensions.buildTooltipForDropdown("OP",Blockly.Constants.Logic.TOOLTIPS_BY_OP)); +Blockly.Constants.Logic.CONTROLS_IF_MUTATOR_MIXIN={elseifCount_:0,elseCount_:0,suppressPrefixSuffix:!0,mutationToDom:function(){if(!this.elseifCount_&&!this.elseCount_)return null;var a=Blockly.utils.xml.createElement("mutation");this.elseifCount_&&a.setAttribute("elseif",this.elseifCount_);this.elseCount_&&a.setAttribute("else",1);return a},domToMutation:function(a){this.elseifCount_=parseInt(a.getAttribute("elseif"),10)||0;this.elseCount_=parseInt(a.getAttribute("else"),10)||0;this.rebuildShape_()}, +decompose:function(a){var b=a.newBlock("controls_if_if");b.initSvg();for(var c=b.nextConnection,e=1;e<=this.elseifCount_;e++){var d=a.newBlock("controls_if_elseif");d.initSvg();c.connect(d.previousConnection);c=d.nextConnection}this.elseCount_&&(a=a.newBlock("controls_if_else"),a.initSvg(),c.connect(a.previousConnection));return b},compose:function(a){a=a.nextConnection.targetBlock();this.elseCount_=this.elseifCount_=0;for(var b=[null],c=[null],e=null;a;){switch(a.type){case "controls_if_elseif":this.elseifCount_++; +b.push(a.valueConnection_);c.push(a.statementConnection_);break;case "controls_if_else":this.elseCount_++;e=a.statementConnection_;break;default:throw TypeError("Unknown block type: "+a.type);}a=a.nextConnection&&a.nextConnection.targetBlock()}this.updateShape_();this.reconnectChildBlocks_(b,c,e)},saveConnections:function(a){a=a.nextConnection.targetBlock();for(var b=1;a;){switch(a.type){case "controls_if_elseif":var c=this.getInput("IF"+b),e=this.getInput("DO"+b);a.valueConnection_=c&&c.connection.targetConnection; +a.statementConnection_=e&&e.connection.targetConnection;b++;break;case "controls_if_else":e=this.getInput("ELSE");a.statementConnection_=e&&e.connection.targetConnection;break;default:throw TypeError("Unknown block type: "+a.type);}a=a.nextConnection&&a.nextConnection.targetBlock()}},rebuildShape_:function(){var a=[null],b=[null],c=null;this.getInput("ELSE")&&(c=this.getInput("ELSE").connection.targetConnection);for(var e=1;this.getInput("IF"+e);){var d=this.getInput("IF"+e),f=this.getInput("DO"+ +e);a.push(d.connection.targetConnection);b.push(f.connection.targetConnection);e++}this.updateShape_();this.reconnectChildBlocks_(a,b,c)},updateShape_:function(){this.getInput("ELSE")&&this.removeInput("ELSE");for(var a=1;this.getInput("IF"+a);)this.removeInput("IF"+a),this.removeInput("DO"+a),a++;for(a=1;a<=this.elseifCount_;a++)this.appendValueInput("IF"+a).setCheck("Boolean").appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSEIF),this.appendStatementInput("DO"+a).appendField(Blockly.Msg.CONTROLS_IF_MSG_THEN); +this.elseCount_&&this.appendStatementInput("ELSE").appendField(Blockly.Msg.CONTROLS_IF_MSG_ELSE)},reconnectChildBlocks_:function(a,b,c){for(var e=1;e<=this.elseifCount_;e++)Blockly.Mutator.reconnect(a[e],this,"IF"+e),Blockly.Mutator.reconnect(b[e],this,"DO"+e);Blockly.Mutator.reconnect(c,this,"ELSE")}};Blockly.Extensions.registerMutator("controls_if_mutator",Blockly.Constants.Logic.CONTROLS_IF_MUTATOR_MIXIN,null,["controls_if_elseif","controls_if_else"]); +Blockly.Constants.Logic.CONTROLS_IF_TOOLTIP_EXTENSION=function(){this.setTooltip(function(){if(this.elseifCount_||this.elseCount_){if(!this.elseifCount_&&this.elseCount_)return Blockly.Msg.CONTROLS_IF_TOOLTIP_2;if(this.elseifCount_&&!this.elseCount_)return Blockly.Msg.CONTROLS_IF_TOOLTIP_3;if(this.elseifCount_&&this.elseCount_)return Blockly.Msg.CONTROLS_IF_TOOLTIP_4}else return Blockly.Msg.CONTROLS_IF_TOOLTIP_1;return""}.bind(this))};Blockly.Extensions.register("controls_if_tooltip",Blockly.Constants.Logic.CONTROLS_IF_TOOLTIP_EXTENSION); +Blockly.Constants.Logic.LOGIC_COMPARE_ONCHANGE_MIXIN={onchange:function(a){this.prevBlocks_||(this.prevBlocks_=[null,null]);var b=this.getInputTargetBlock("A"),c=this.getInputTargetBlock("B");b&&c&&!b.outputConnection.checkType(c.outputConnection)&&(Blockly.Events.setGroup(a.group),a=this.prevBlocks_[0],a!==b&&(b.unplug(),!a||a.isDisposed()||a.isShadow()||this.getInput("A").connection.connect(a.outputConnection)),b=this.prevBlocks_[1],b!==c&&(c.unplug(),!b||b.isDisposed()||b.isShadow()||this.getInput("B").connection.connect(b.outputConnection)), +this.bumpNeighbours(),Blockly.Events.setGroup(!1));this.prevBlocks_[0]=this.getInputTargetBlock("A");this.prevBlocks_[1]=this.getInputTargetBlock("B")}};Blockly.Constants.Logic.LOGIC_COMPARE_EXTENSION=function(){this.mixin(Blockly.Constants.Logic.LOGIC_COMPARE_ONCHANGE_MIXIN)};Blockly.Extensions.register("logic_compare",Blockly.Constants.Logic.LOGIC_COMPARE_EXTENSION); +Blockly.Constants.Logic.LOGIC_TERNARY_ONCHANGE_MIXIN={prevParentConnection_:null,onchange:function(a){var b=this.getInputTargetBlock("THEN"),c=this.getInputTargetBlock("ELSE"),e=this.outputConnection.targetConnection;if((b||c)&&e)for(var d=0;2>d;d++){var f=1==d?b:c;f&&!f.outputConnection.checkType(e)&&(Blockly.Events.setGroup(a.group),e===this.prevParentConnection_?(this.unplug(),e.getSourceBlock().bumpNeighbours()):(f.unplug(),f.bumpNeighbours()),Blockly.Events.setGroup(!1))}this.prevParentConnection_= +e}};Blockly.Extensions.registerMixin("logic_ternary",Blockly.Constants.Logic.LOGIC_TERNARY_ONCHANGE_MIXIN);Blockly.Blocks.loops={};Blockly.Constants.Loops={};Blockly.Constants.Loops.HUE=120; +Blockly.defineBlocksWithJsonArray([{type:"controls_repeat_ext",message0:"%{BKY_CONTROLS_REPEAT_TITLE}",args0:[{type:"input_value",name:"TIMES",check:"Number"}],message1:"%{BKY_CONTROLS_REPEAT_INPUT_DO} %1",args1:[{type:"input_statement",name:"DO"}],previousStatement:null,nextStatement:null,style:"loop_blocks",tooltip:"%{BKY_CONTROLS_REPEAT_TOOLTIP}",helpUrl:"%{BKY_CONTROLS_REPEAT_HELPURL}"},{type:"controls_repeat",message0:"%{BKY_CONTROLS_REPEAT_TITLE}",args0:[{type:"field_number",name:"TIMES",value:10, +min:0,precision:1}],message1:"%{BKY_CONTROLS_REPEAT_INPUT_DO} %1",args1:[{type:"input_statement",name:"DO"}],previousStatement:null,nextStatement:null,style:"loop_blocks",tooltip:"%{BKY_CONTROLS_REPEAT_TOOLTIP}",helpUrl:"%{BKY_CONTROLS_REPEAT_HELPURL}"},{type:"controls_whileUntil",message0:"%1 %2",args0:[{type:"field_dropdown",name:"MODE",options:[["%{BKY_CONTROLS_WHILEUNTIL_OPERATOR_WHILE}","WHILE"],["%{BKY_CONTROLS_WHILEUNTIL_OPERATOR_UNTIL}","UNTIL"]]},{type:"input_value",name:"BOOL",check:"Boolean"}], +message1:"%{BKY_CONTROLS_REPEAT_INPUT_DO} %1",args1:[{type:"input_statement",name:"DO"}],previousStatement:null,nextStatement:null,style:"loop_blocks",helpUrl:"%{BKY_CONTROLS_WHILEUNTIL_HELPURL}",extensions:["controls_whileUntil_tooltip"]},{type:"controls_for",message0:"%{BKY_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"}],message1:"%{BKY_CONTROLS_REPEAT_INPUT_DO} %1",args1:[{type:"input_statement",name:"DO"}],inputsInline:!0,previousStatement:null,nextStatement:null,style:"loop_blocks",helpUrl:"%{BKY_CONTROLS_FOR_HELPURL}",extensions:["contextMenu_newGetVariableBlock","controls_for_tooltip"]},{type:"controls_forEach",message0:"%{BKY_CONTROLS_FOREACH_TITLE}",args0:[{type:"field_variable",name:"VAR",variable:null},{type:"input_value",name:"LIST",check:"Array"}],message1:"%{BKY_CONTROLS_REPEAT_INPUT_DO} %1", +args1:[{type:"input_statement",name:"DO"}],previousStatement:null,nextStatement:null,style:"loop_blocks",helpUrl:"%{BKY_CONTROLS_FOREACH_HELPURL}",extensions:["contextMenu_newGetVariableBlock","controls_forEach_tooltip"]},{type:"controls_flow_statements",message0:"%1",args0:[{type:"field_dropdown",name:"FLOW",options:[["%{BKY_CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK}","BREAK"],["%{BKY_CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE}","CONTINUE"]]}],previousStatement:null,style:"loop_blocks",helpUrl:"%{BKY_CONTROLS_FLOW_STATEMENTS_HELPURL}", +extensions:["controls_flow_tooltip","controls_flow_in_loop_check"]}]);Blockly.Constants.Loops.WHILE_UNTIL_TOOLTIPS={WHILE:"%{BKY_CONTROLS_WHILEUNTIL_TOOLTIP_WHILE}",UNTIL:"%{BKY_CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL}"};Blockly.Extensions.register("controls_whileUntil_tooltip",Blockly.Extensions.buildTooltipForDropdown("MODE",Blockly.Constants.Loops.WHILE_UNTIL_TOOLTIPS));Blockly.Constants.Loops.BREAK_CONTINUE_TOOLTIPS={BREAK:"%{BKY_CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK}",CONTINUE:"%{BKY_CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE}"}; +Blockly.Extensions.register("controls_flow_tooltip",Blockly.Extensions.buildTooltipForDropdown("FLOW",Blockly.Constants.Loops.BREAK_CONTINUE_TOOLTIPS)); +Blockly.Constants.Loops.CUSTOM_CONTEXT_MENU_CREATE_VARIABLES_GET_MIXIN={customContextMenu:function(a){if(!this.isInFlyout){var b=this.getField("VAR").getVariable(),c=b.name;if(!this.isCollapsed()&&null!=c){var e={enabled:!0};e.text=Blockly.Msg.VARIABLES_SET_CREATE_GET.replace("%1",c);b=Blockly.Variables.generateVariableFieldDom(b);c=Blockly.utils.xml.createElement("block");c.setAttribute("type","variables_get");c.appendChild(b);e.callback=Blockly.ContextMenu.callbackFactory(this,c);a.push(e)}}}}; +Blockly.Extensions.registerMixin("contextMenu_newGetVariableBlock",Blockly.Constants.Loops.CUSTOM_CONTEXT_MENU_CREATE_VARIABLES_GET_MIXIN);Blockly.Extensions.register("controls_for_tooltip",Blockly.Extensions.buildTooltipWithFieldText("%{BKY_CONTROLS_FOR_TOOLTIP}","VAR"));Blockly.Extensions.register("controls_forEach_tooltip",Blockly.Extensions.buildTooltipWithFieldText("%{BKY_CONTROLS_FOREACH_TOOLTIP}","VAR")); +Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN={LOOP_TYPES:["controls_repeat","controls_repeat_ext","controls_forEach","controls_for","controls_whileUntil"],suppressPrefixSuffix:!0,getSurroundLoop:function(a){do{if(-1!=Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN.LOOP_TYPES.indexOf(a.type))return a;a=a.getSurroundParent()}while(a);return null},onchange:function(a){this.workspace.isDragging&&!this.workspace.isDragging()&&(Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN.getSurroundLoop(this)? +(this.setWarningText(null),this.isInFlyout||this.setEnabled(!0)):(this.setWarningText(Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING),this.isInFlyout||this.getInheritedDisabled()||this.setEnabled(!1)))}};Blockly.Extensions.registerMixin("controls_flow_in_loop_check",Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN);Blockly.Blocks.math={};Blockly.Constants.Math={};Blockly.Constants.Math.HUE=230; +Blockly.defineBlocksWithJsonArray([{type:"math_number",message0:"%1",args0:[{type:"field_number",name:"NUM",value:0}],output:"Number",helpUrl:"%{BKY_MATH_NUMBER_HELPURL}",style:"math_blocks",tooltip:"%{BKY_MATH_NUMBER_TOOLTIP}",extensions:["parent_tooltip_when_inline"]},{type:"math_arithmetic",message0:"%1 %2 %3",args0:[{type:"input_value",name:"A",check:"Number"},{type:"field_dropdown",name:"OP",options:[["%{BKY_MATH_ADDITION_SYMBOL}","ADD"],["%{BKY_MATH_SUBTRACTION_SYMBOL}","MINUS"],["%{BKY_MATH_MULTIPLICATION_SYMBOL}", +"MULTIPLY"],["%{BKY_MATH_DIVISION_SYMBOL}","DIVIDE"],["%{BKY_MATH_POWER_SYMBOL}","POWER"]]},{type:"input_value",name:"B",check:"Number"}],inputsInline:!0,output:"Number",style:"math_blocks",helpUrl:"%{BKY_MATH_ARITHMETIC_HELPURL}",extensions:["math_op_tooltip"]},{type:"math_single",message0:"%1 %2",args0:[{type:"field_dropdown",name:"OP",options:[["%{BKY_MATH_SINGLE_OP_ROOT}","ROOT"],["%{BKY_MATH_SINGLE_OP_ABSOLUTE}","ABS"],["-","NEG"],["ln","LN"],["log10","LOG10"],["e^","EXP"],["10^","POW10"]]}, +{type:"input_value",name:"NUM",check:"Number"}],output:"Number",style:"math_blocks",helpUrl:"%{BKY_MATH_SINGLE_HELPURL}",extensions:["math_op_tooltip"]},{type:"math_trig",message0:"%1 %2",args0:[{type:"field_dropdown",name:"OP",options:[["%{BKY_MATH_TRIG_SIN}","SIN"],["%{BKY_MATH_TRIG_COS}","COS"],["%{BKY_MATH_TRIG_TAN}","TAN"],["%{BKY_MATH_TRIG_ASIN}","ASIN"],["%{BKY_MATH_TRIG_ACOS}","ACOS"],["%{BKY_MATH_TRIG_ATAN}","ATAN"]]},{type:"input_value",name:"NUM",check:"Number"}],output:"Number",style:"math_blocks", +helpUrl:"%{BKY_MATH_TRIG_HELPURL}",extensions:["math_op_tooltip"]},{type:"math_constant",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",style:"math_blocks",tooltip:"%{BKY_MATH_CONSTANT_TOOLTIP}",helpUrl:"%{BKY_MATH_CONSTANT_HELPURL}"},{type:"math_number_property",message0:"%1 %2",args0:[{type:"input_value",name:"NUMBER_TO_CHECK",check:"Number"}, +{type:"field_dropdown",name:"PROPERTY",options:[["%{BKY_MATH_IS_EVEN}","EVEN"],["%{BKY_MATH_IS_ODD}","ODD"],["%{BKY_MATH_IS_PRIME}","PRIME"],["%{BKY_MATH_IS_WHOLE}","WHOLE"],["%{BKY_MATH_IS_POSITIVE}","POSITIVE"],["%{BKY_MATH_IS_NEGATIVE}","NEGATIVE"],["%{BKY_MATH_IS_DIVISIBLE_BY}","DIVISIBLE_BY"]]}],inputsInline:!0,output:"Boolean",style:"math_blocks",tooltip:"%{BKY_MATH_IS_TOOLTIP}",mutator:"math_is_divisibleby_mutator"},{type:"math_change",message0:"%{BKY_MATH_CHANGE_TITLE}",args0:[{type:"field_variable", +name:"VAR",variable:"%{BKY_MATH_CHANGE_TITLE_ITEM}"},{type:"input_value",name:"DELTA",check:"Number"}],previousStatement:null,nextStatement:null,style:"variable_blocks",helpUrl:"%{BKY_MATH_CHANGE_HELPURL}",extensions:["math_change_tooltip"]},{type:"math_round",message0:"%1 %2",args0:[{type:"field_dropdown",name:"OP",options:[["%{BKY_MATH_ROUND_OPERATOR_ROUND}","ROUND"],["%{BKY_MATH_ROUND_OPERATOR_ROUNDUP}","ROUNDUP"],["%{BKY_MATH_ROUND_OPERATOR_ROUNDDOWN}","ROUNDDOWN"]]},{type:"input_value",name:"NUM", +check:"Number"}],output:"Number",style:"math_blocks",helpUrl:"%{BKY_MATH_ROUND_HELPURL}",tooltip:"%{BKY_MATH_ROUND_TOOLTIP}"},{type:"math_on_list",message0:"%1 %2",args0:[{type:"field_dropdown",name:"OP",options:[["%{BKY_MATH_ONLIST_OPERATOR_SUM}","SUM"],["%{BKY_MATH_ONLIST_OPERATOR_MIN}","MIN"],["%{BKY_MATH_ONLIST_OPERATOR_MAX}","MAX"],["%{BKY_MATH_ONLIST_OPERATOR_AVERAGE}","AVERAGE"],["%{BKY_MATH_ONLIST_OPERATOR_MEDIAN}","MEDIAN"],["%{BKY_MATH_ONLIST_OPERATOR_MODE}","MODE"],["%{BKY_MATH_ONLIST_OPERATOR_STD_DEV}", +"STD_DEV"],["%{BKY_MATH_ONLIST_OPERATOR_RANDOM}","RANDOM"]]},{type:"input_value",name:"LIST",check:"Array"}],output:"Number",style:"math_blocks",helpUrl:"%{BKY_MATH_ONLIST_HELPURL}",mutator:"math_modes_of_list_mutator",extensions:["math_op_tooltip"]},{type:"math_modulo",message0:"%{BKY_MATH_MODULO_TITLE}",args0:[{type:"input_value",name:"DIVIDEND",check:"Number"},{type:"input_value",name:"DIVISOR",check:"Number"}],inputsInline:!0,output:"Number",style:"math_blocks",tooltip:"%{BKY_MATH_MODULO_TOOLTIP}", +helpUrl:"%{BKY_MATH_MODULO_HELPURL}"},{type:"math_constrain",message0:"%{BKY_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",style:"math_blocks",tooltip:"%{BKY_MATH_CONSTRAIN_TOOLTIP}",helpUrl:"%{BKY_MATH_CONSTRAIN_HELPURL}"},{type:"math_random_int",message0:"%{BKY_MATH_RANDOM_INT_TITLE}",args0:[{type:"input_value",name:"FROM",check:"Number"}, +{type:"input_value",name:"TO",check:"Number"}],inputsInline:!0,output:"Number",style:"math_blocks",tooltip:"%{BKY_MATH_RANDOM_INT_TOOLTIP}",helpUrl:"%{BKY_MATH_RANDOM_INT_HELPURL}"},{type:"math_random_float",message0:"%{BKY_MATH_RANDOM_FLOAT_TITLE_RANDOM}",output:"Number",style:"math_blocks",tooltip:"%{BKY_MATH_RANDOM_FLOAT_TOOLTIP}",helpUrl:"%{BKY_MATH_RANDOM_FLOAT_HELPURL}"},{type:"math_atan2",message0:"%{BKY_MATH_ATAN2_TITLE}",args0:[{type:"input_value",name:"X",check:"Number"},{type:"input_value", +name:"Y",check:"Number"}],inputsInline:!0,output:"Number",style:"math_blocks",tooltip:"%{BKY_MATH_ATAN2_TOOLTIP}",helpUrl:"%{BKY_MATH_ATAN2_HELPURL}"}]); +Blockly.Constants.Math.TOOLTIPS_BY_OP={ADD:"%{BKY_MATH_ARITHMETIC_TOOLTIP_ADD}",MINUS:"%{BKY_MATH_ARITHMETIC_TOOLTIP_MINUS}",MULTIPLY:"%{BKY_MATH_ARITHMETIC_TOOLTIP_MULTIPLY}",DIVIDE:"%{BKY_MATH_ARITHMETIC_TOOLTIP_DIVIDE}",POWER:"%{BKY_MATH_ARITHMETIC_TOOLTIP_POWER}",ROOT:"%{BKY_MATH_SINGLE_TOOLTIP_ROOT}",ABS:"%{BKY_MATH_SINGLE_TOOLTIP_ABS}",NEG:"%{BKY_MATH_SINGLE_TOOLTIP_NEG}",LN:"%{BKY_MATH_SINGLE_TOOLTIP_LN}",LOG10:"%{BKY_MATH_SINGLE_TOOLTIP_LOG10}",EXP:"%{BKY_MATH_SINGLE_TOOLTIP_EXP}",POW10:"%{BKY_MATH_SINGLE_TOOLTIP_POW10}", +SIN:"%{BKY_MATH_TRIG_TOOLTIP_SIN}",COS:"%{BKY_MATH_TRIG_TOOLTIP_COS}",TAN:"%{BKY_MATH_TRIG_TOOLTIP_TAN}",ASIN:"%{BKY_MATH_TRIG_TOOLTIP_ASIN}",ACOS:"%{BKY_MATH_TRIG_TOOLTIP_ACOS}",ATAN:"%{BKY_MATH_TRIG_TOOLTIP_ATAN}",SUM:"%{BKY_MATH_ONLIST_TOOLTIP_SUM}",MIN:"%{BKY_MATH_ONLIST_TOOLTIP_MIN}",MAX:"%{BKY_MATH_ONLIST_TOOLTIP_MAX}",AVERAGE:"%{BKY_MATH_ONLIST_TOOLTIP_AVERAGE}",MEDIAN:"%{BKY_MATH_ONLIST_TOOLTIP_MEDIAN}",MODE:"%{BKY_MATH_ONLIST_TOOLTIP_MODE}",STD_DEV:"%{BKY_MATH_ONLIST_TOOLTIP_STD_DEV}",RANDOM:"%{BKY_MATH_ONLIST_TOOLTIP_RANDOM}"}; +Blockly.Extensions.register("math_op_tooltip",Blockly.Extensions.buildTooltipForDropdown("OP",Blockly.Constants.Math.TOOLTIPS_BY_OP)); +Blockly.Constants.Math.IS_DIVISIBLEBY_MUTATOR_MIXIN={mutationToDom:function(){var a=Blockly.utils.xml.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.Constants.Math.IS_DIVISIBLE_MUTATOR_EXTENSION=function(){this.getField("PROPERTY").setValidator(function(a){a="DIVISIBLE_BY"==a;this.getSourceBlock().updateShape_(a)})};Blockly.Extensions.registerMutator("math_is_divisibleby_mutator",Blockly.Constants.Math.IS_DIVISIBLEBY_MUTATOR_MIXIN,Blockly.Constants.Math.IS_DIVISIBLE_MUTATOR_EXTENSION);Blockly.Extensions.register("math_change_tooltip",Blockly.Extensions.buildTooltipWithFieldText("%{BKY_MATH_CHANGE_TOOLTIP}","VAR")); +Blockly.Constants.Math.LIST_MODES_MUTATOR_MIXIN={updateType_:function(a){"MODE"==a?this.outputConnection.setCheck("Array"):this.outputConnection.setCheck("Number")},mutationToDom:function(){var a=Blockly.utils.xml.createElement("mutation");a.setAttribute("op",this.getFieldValue("OP"));return a},domToMutation:function(a){this.updateType_(a.getAttribute("op"))}};Blockly.Constants.Math.LIST_MODES_MUTATOR_EXTENSION=function(){this.getField("OP").setValidator(function(a){this.updateType_(a)}.bind(this))}; +Blockly.Extensions.registerMutator("math_modes_of_list_mutator",Blockly.Constants.Math.LIST_MODES_MUTATOR_MIXIN,Blockly.Constants.Math.LIST_MODES_MUTATOR_EXTENSION);Blockly.Blocks.procedures={}; +Blockly.Blocks.procedures_defnoreturn={init:function(){var a=new Blockly.FieldTextInput("",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"]));(this.workspace.options.comments||this.workspace.options.parentWorkspace&&this.workspace.options.parentWorkspace.options.comments)&&Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT&&this.setCommentText(Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT); +this.setStyle("procedure_blocks");this.setTooltip(Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP);this.setHelpUrl(Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL);this.arguments_=[];this.argumentVarModels_=[];this.setStatements_(!0);this.statementConnection_=null},setStatements_:function(a){this.hasStatements_!==a&&(a?(this.appendStatementInput("STACK").appendField(Blockly.Msg.PROCEDURES_DEFNORETURN_DO),this.getInput("RETURN")&&this.moveInputBefore("STACK","RETURN")):this.removeInput("STACK",!0),this.hasStatements_= +a)},updateParams_:function(){var a="";this.arguments_.length&&(a=Blockly.Msg.PROCEDURES_BEFORE_PARAMS+" "+this.arguments_.join(", "));Blockly.Events.disable();try{this.setFieldValue(a,"PARAMS")}finally{Blockly.Events.enable()}},mutationToDom:function(a){var b=Blockly.utils.xml.createElement("mutation");a&&b.setAttribute("name",this.getFieldValue("NAME"));for(var c=0;c +# build.py with no parameters builds all files. +# core builds blockly_compressed, blockly_uncompressed, and blocks_compressed. +# generators builds every _compressed.js. +# langfiles builds every msg/js/.js file. + +# This script generates two versions of Blockly's core files: +# blockly_compressed.js +# blockly_uncompressed.js +# The compressed file is a concatenation of all of Blockly's core files which +# have been run through Google's Closure Compiler. This is done using the +# online API (which takes a few seconds and requires an Internet connection). +# The uncompressed file is a script that loads in each of Blockly's core files +# one by one. This takes much longer for a browser to load, but is useful +# when debugging code since line numbers are meaningful and variables haven't +# been renamed. The uncompressed file also allows for a faster development +# cycle since there is no need to rebuild or recompile, just reload. +# +# 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. +# php_compressed.js: The compressed PHP generator. +# lua_compressed.js: The compressed Lua generator. +# dart_compressed.js: The compressed Dart generator. +# msg/js/.js for every language defined in msg/js/.json. + +import argparse +import codecs +import glob +import json +import os +import re +import subprocess +import sys +import threading + +if sys.version_info[0] == 2: + import httplib + from urllib import urlencode +else: + import http.client as httplib + from urllib.parse import urlencode + from importlib import reload + +# Read package.json and extract the current Blockly version. +blocklyVersion = json.loads(open('package.json', 'r').read())['version'] + +def import_path(fullpath): + """Import a file with full path specification. + Allows one to import from any directory, something __import__ does not do. + + Args: + fullpath: Path and filename of import. + + Returns: + An imported module. + """ + path, filename = os.path.split(fullpath) + filename, ext = os.path.splitext(filename) + sys.path.append(path) + module = __import__(filename) + reload(module) # Might be out of date. + del sys.path[-1] + return module + + +HEADER = ("// Do not edit this file; automatically generated by build.py.\n" + "'use strict';\n") + + +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, target_filename): + threading.Thread.__init__(self) + self.search_paths = search_paths + self.target_filename = target_filename + + def run(self): + f = open(self.target_filename, 'w') + f.write(HEADER) + f.write(""" +this.IS_NODE_JS = !!(typeof module !== 'undefined' && module.exports); + +this.BLOCKLY_DIR = (function(root) { + if (!root.IS_NODE_JS) { + // Find name of current directory. + var scripts = document.getElementsByTagName('script'); + var re = new RegExp('(.+)[\/]blockly_(.*)uncompressed\.js$'); + for (var i = 0, script; script = scripts[i]; i++) { + var match = re.exec(script.src); + if (match) { + return match[1]; + } + } + alert('Could not detect Blockly\\'s directory name.'); + } + return ''; +})(this); + +this.BLOCKLY_BOOT = function(root) { + // Execute after Closure has loaded. +""") + add_dependency = [] + base_path = calcdeps.FindClosureBasePath(self.search_paths) + for dep in calcdeps.BuildDependenciesFromFiles(self.search_paths): + add_dependency.append(calcdeps.GetDepsLine(dep, base_path)) + add_dependency.sort() # Deterministic build. + add_dependency = '\n'.join(add_dependency) + f.write(add_dependency + '\n') + + f.write('\n') + f.write('// Load Blockly.\n') + f.write('goog.require(\'Blockly.requires\')\n') + + f.write(""" +delete root.BLOCKLY_DIR; +delete root.BLOCKLY_BOOT; +delete root.IS_NODE_JS; +}; + +if (this.IS_NODE_JS) { + this.BLOCKLY_BOOT(this); + module.exports = Blockly; +} else { + document.write(''); + document.write(''); +} +""") + f.close() + print("SUCCESS: " + self.target_filename) + + +class Gen_compressed(threading.Thread): + """Generate a JavaScript file that contains all of Blockly's core and all + required parts of Closure, compiled together. + Uses the Closure Compiler's online API. + Runs in a separate thread. + """ + def __init__(self, search_paths, bundles): + threading.Thread.__init__(self) + self.search_paths = search_paths + self.bundles = bundles + + def run(self): + if (self.bundles.core): + self.gen_core() + self.gen_blocks() + + if (self.bundles.generators): + self.gen_generator("javascript") + self.gen_generator("python") + self.gen_generator("php") + self.gen_generator("lua") + self.gen_generator("dart") + + def gen_core(self): + target_filename = "blockly_compressed.js" + # Define the parameters for the POST request. + params = [ + ("compilation_level", "SIMPLE_OPTIMIZATIONS"), + ("use_closure_library", "false"), + ("output_format", "json"), + ("output_info", "compiled_code"), + ("output_info", "warnings"), + ("output_info", "errors"), + ("output_info", "statistics"), + ("warning_level", "DEFAULT"), + ] + + # Read in all the source files. + filenames = calcdeps.CalculateDependencies(self.search_paths, + [os.path.join("core", "requires.js")]) + filenames.sort() # Deterministic build. + for filename in filenames: + # Filter out the Closure files (the compiler will add them). + if filename.startswith("closure"): + continue + f = codecs.open(filename, encoding="utf-8") + code = "".join(f.readlines()) + # Inject the Blockly version. + if filename == "core/blockly.js": + code = code.replace("Blockly.VERSION = 'uncompiled';", + "Blockly.VERSION = '%s';" % blocklyVersion) + # Strip out all requireType calls. + code = re.sub(r"goog.requireType(.*)", "", code) + params.append(("js_code", code.encode("utf-8"))) + f.close() + + self.do_compile(params, target_filename, filenames, "") + + def gen_blocks(self): + target_filename = "blocks_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"), + ("warning_level", "DEFAULT"), + ] + + # Add Blockly, Blockly.Blocks, and all fields to be compatible with the compiler. + params.append(("js_code", """ +goog.provide('Blockly'); +goog.provide('Blockly.Blocks'); +goog.provide('Blockly.Comment'); +goog.provide('Blockly.FieldCheckbox'); +goog.provide('Blockly.FieldColour'); +goog.provide('Blockly.FieldDropdown'); +goog.provide('Blockly.FieldImage'); +goog.provide('Blockly.FieldLabel'); +goog.provide('Blockly.FieldMultilineInput'); +goog.provide('Blockly.FieldNumber'); +goog.provide('Blockly.FieldTextInput'); +goog.provide('Blockly.FieldVariable'); +goog.provide('Blockly.Mutator'); +goog.provide('Blockly.Warning'); +""")) + # Read in all the source files. + filenames = glob.glob(os.path.join("blocks", "*.js")) + filenames.sort() # Deterministic build. + for filename in filenames: + f = codecs.open(filename, encoding="utf-8") + params.append(("js_code", "".join(f.readlines()).encode("utf-8"))) + f.close() + + # Remove Blockly, Blockly.Blocks and all fields to be compatible with Blockly. + remove = r"var Blockly=\{[^;]*\};\n?" + 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"), + ("warning_level", "DEFAULT"), + ] + + # Read in all the source files. + # Add Blockly.Generator and Blockly.utils.string to be compatible + # with the compiler. + params.append(("js_code", """ +goog.provide('Blockly.Generator'); +goog.provide('Blockly.utils.global'); +goog.provide('Blockly.utils.string'); +""")) + filenames = glob.glob( + os.path.join("generators", language, "*.js")) + filenames.sort() # Deterministic build. + filenames.insert(0, os.path.join("generators", language + ".js")) + for filename in filenames: + f = codecs.open(filename, encoding="utf-8") + params.append(("js_code", "".join(f.readlines()).encode("utf-8"))) + f.close() + filenames.insert(0, "[goog.provide]") + + # Remove Blockly.Generator and Blockly.utils.string to be compatible + # with Blockly. + remove = r"var Blockly=\{[^;]*\};\s*Blockly.utils.global={};\s*Blockly.utils.string={};\n?" + 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"} + conn = httplib.HTTPSConnection("closure-compiler.appspot.com") + conn.request("POST", "/compile", urlencode(params), headers) + response = conn.getresponse() + + # Decode is necessary for Python 3.4 compatibility + json_str = response.read().decode("utf-8") + conn.close() + + # Parse the JSON response. + try: + json_data = json.loads(json_str) + except ValueError: + print("ERROR: Could not parse JSON for %s. Raw data:" % target_filename) + print(json_str) + return + + def file_lookup(name): + if not name.startswith("Input_"): + return "???" + n = int(name[6:]) - 1 + return filenames[n] + + if "serverErrors" in json_data: + errors = json_data["serverErrors"] + for error in errors: + print("SERVER ERROR: %s" % target_filename) + print(error["error"]) + elif "errors" in json_data: + errors = json_data["errors"] + for error in errors: + print("FATAL ERROR") + print(error["error"]) + if error["file"]: + print("%s at line %d:" % ( + file_lookup(error["file"]), error["lineno"])) + print(error["line"]) + print((" " * error["charno"]) + "^") + sys.exit(1) + else: + if "warnings" in json_data: + warnings = json_data["warnings"] + for warning in warnings: + print("WARNING") + print(warning["warning"]) + if warning["file"]: + print("%s at line %d:" % ( + file_lookup(warning["file"]), warning["lineno"])) + print(warning["line"]) + print((" " * warning["charno"]) + "^") + print() + + if not "compiledCode" in json_data: + print("FATAL ERROR: Compiler did not return compiledCode.") + sys.exit(1) + + code = HEADER + "\n" + json_data["compiledCode"] + # Remove Blockly definitions to be compatible with Blockly. + code = re.sub(remove, "", code) + code = self.trim_licence(code) + + stats = json_data["statistics"] + original_b = stats["originalSize"] + compressed_b = stats["compressedSize"] + if original_b > 0 and compressed_b > 0: + f = open(target_filename, "w") + f.write(code) + f.close() + + original_kb = int(original_b / 1024 + 0.5) + compressed_kb = int(compressed_b / 1024 + 0.5) + ratio = int(float(compressed_b) / float(original_b) * 100 + 0.5) + print("SUCCESS: " + target_filename) + print("Size changed from %d KB to %d KB (%d%%)." % ( + original_kb, compressed_kb, ratio)) + else: + print("UNKNOWN ERROR") + + def trim_licence(self, code): + """Strip out Google's and MIT's Apache licences. + + JS Compiler preserves dozens of Apache licences in the Blockly code. + Remove these if they belong to Google or MIT. + MIT's permission to do this is logged in Blockly issue 2412. + + Args: + code: Large blob of compiled source code. + + Returns: + Code with Google's and MIT's Apache licences trimmed. + """ + apache2 = re.compile("""/\\* + + (Copyright \\d+ (Google LLC|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. +\\*/""") + return re.sub(apache2, "", code) + + +class Gen_langfiles(threading.Thread): + """Generate JavaScript file for each natural language supported. + + Runs in a separate thread. + """ + + def __init__(self): + threading.Thread.__init__(self) + + def run(self): + # The files msg/json/{en,qqq,synonyms}.json depend on msg/messages.js. + try: + subprocess.check_call([ + "python", + os.path.join("i18n", "js_to_json.py"), + "--input_file", "msg/messages.js", + "--output_dir", "msg/json/", + "--quiet"]) + except (subprocess.CalledProcessError, OSError) as e: + # Documentation for subprocess.check_call says that CalledProcessError + # will be raised on failure, but I found that OSError is also possible. + print("Error running i18n/js_to_json.py: ", e) + sys.exit(1) + + # Checking whether it is necessary to rebuild the js files would be a lot of + # work since we would have to compare each .json file with each + # .js file. Rebuilding is easy and cheap, so just go ahead and do it. + try: + # Use create_messages.py to create .js files from .json files. + cmd = [ + "python", + os.path.join("i18n", "create_messages.py"), + "--source_lang_file", os.path.join("msg", "json", "en.json"), + "--source_synonym_file", os.path.join("msg", "json", "synonyms.json"), + "--source_constants_file", os.path.join("msg", "json", "constants.json"), + "--key_file", os.path.join("msg", "json", "keys.json"), + "--output_dir", os.path.join("msg", "js"), + "--quiet"] + json_files = glob.glob(os.path.join("msg", "json", "*.json")) + json_files = [file for file in json_files if not + (file.endswith(("keys.json", "synonyms.json", "qqq.json", "constants.json")))] + cmd.extend(json_files) + subprocess.check_call(cmd) + except (subprocess.CalledProcessError, OSError) as e: + print("Error running i18n/create_messages.py: ", e) + sys.exit(1) + + # Output list of .js files created. + for f in json_files: + # This assumes the path to the current directory does not contain "json". + f = f.replace("json", "js") + if os.path.isfile(f): + print("SUCCESS: " + f) + else: + print("FAILED to create " + f) + +# Class to hold arguments if user passes in old argument style. +class Arguments: + def __init__(self): + self.core = False + self.generators = False + self.langfiles = False + +# Gets the command line arguments. +def get_args(): + parser = argparse.ArgumentParser(description="Decide which files to build.") + parser.add_argument('-core', action="store_true", default=False, help="Build core") + parser.add_argument('-generators', action="store_true", default=False, help="Build the generators") + parser.add_argument('-langfiles', action="store_true", default=False, help="Build all the language files") + + # New argument style: ./build.py -core + # Old argument style: ./build.py core + # Changed as of July 2019. + try: + args = parser.parse_args() + if (not args.core) and (not args.generators) and (not args.langfiles): + # No arguments, use these defaults: + args.core = True + args.generators = True + args.langfiles = True + except SystemExit: + # Fall back to old argument style. + args = Arguments() + args.core = 'core' in sys.argv + args.generators = 'generators' in sys.argv + args.langfiles = 'langfiles' in sys.argv + if 'accessible' in sys.argv: + print("The Blockly accessibility demo has moved to https://github.com/google/blockly-experimental") + return args + +if __name__ == "__main__": + args = get_args() + calcdeps = import_path(os.path.join("closure", "bin", "calcdeps.py")) + full_search_paths = calcdeps.ExpandDirectories(["core", "closure"]) + full_search_paths = sorted(full_search_paths) # Deterministic build. + + # Uncompressed and compressed are run in parallel threads. + # Uncompressed is limited by processor speed. + if (args.core): + Gen_uncompressed(full_search_paths, 'blockly_uncompressed.js').start() + + # Compressed is limited by network and server speed. + Gen_compressed(full_search_paths, args).start() + + # This is run locally in a separate thread + if (args.langfiles): + Gen_langfiles().start() diff --git a/js/closure/bin/calcdeps.py b/js/closure/bin/calcdeps.py new file mode 100644 index 0000000..67e5e8d --- /dev/null +++ b/js/closure/bin/calcdeps.py @@ -0,0 +1,325 @@ +#!/usr/bin/env python +# +# Copyright 2006 The Closure Library Authors. 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. + + +"""Calculates JavaScript dependencies without requiring Google's build system. + +It iterates over a number of search paths and builds a dependency tree. With +the inputs provided, it walks the dependency tree and outputs all the files +required for compilation. +""" + + +import logging +import os +import re +import sys + + +_BASE_REGEX_STRING = '^\s*goog\.%s\(\s*[\'"](.+)[\'"]\s*\)' +req_regex = re.compile(_BASE_REGEX_STRING % 'require') +prov_regex = re.compile(_BASE_REGEX_STRING % 'provide') +ns_regex = re.compile('^ns:((\w+\.)*(\w+))$') + + +def IsValidFile(ref): + """Returns true if the provided reference is a file and exists.""" + return os.path.isfile(ref) + + +def IsJsFile(ref): + """Returns true if the provided reference is a JavaScript file.""" + return ref.endswith('.js') + + +def IsNamespace(ref): + """Returns true if the provided reference is a namespace.""" + return re.match(ns_regex, ref) is not None + + +def IsDirectory(ref): + """Returns true if the provided reference is a directory.""" + return os.path.isdir(ref) + + +def ExpandDirectories(refs): + """Expands any directory references into inputs. + + Description: + Looks for any directories in the provided references. Found directories + are recursively searched for .js files, which are then added to the result + list. + + Args: + refs: a list of references such as files, directories, and namespaces + + Returns: + A list of references with directories removed and replaced by any + .js files that are found in them. Also, the paths will be normalized. + """ + result = [] + for ref in refs: + if IsDirectory(ref): + # Disable 'Unused variable' for subdirs + # pylint: disable=unused-variable + for (directory, subdirs, filenames) in os.walk(ref): + for filename in filenames: + if IsJsFile(filename): + result.append(os.path.join(directory, filename)) + else: + result.append(ref) + return map(os.path.normpath, result) + + +class DependencyInfo(object): + """Represents a dependency that is used to build and walk a tree.""" + + def __init__(self, filename): + self.filename = filename + self.provides = [] + self.requires = [] + + def __str__(self): + return '%s Provides: %s Requires: %s' % (self.filename, + repr(self.provides), + repr(self.requires)) + + +def BuildDependenciesFromFiles(files): + """Build a list of dependencies from a list of files. + + Description: + Takes a list of files, extracts their provides and requires, and builds + out a list of dependency objects. + + Args: + files: a list of files to be parsed for goog.provides and goog.requires. + + Returns: + A list of dependency objects, one for each file in the files argument. + """ + result = [] + filenames = set() + for filename in files: + if filename in filenames: + continue + + # Python 3 requires the file encoding to be specified + if (sys.version_info[0] < 3): + file_handle = open(filename, 'r') + else: + file_handle = open(filename, 'r', encoding='utf8') + + try: + dep = CreateDependencyInfo(filename, file_handle) + result.append(dep) + finally: + file_handle.close() + + filenames.add(filename) + + return result + + +def CreateDependencyInfo(filename, source): + """Create dependency info. + + Args: + filename: Filename for source. + source: File-like object containing source. + + Returns: + A DependencyInfo object with provides and requires filled. + """ + dep = DependencyInfo(filename) + for line in source: + if re.match(req_regex, line): + dep.requires.append(re.search(req_regex, line).group(1)) + if re.match(prov_regex, line): + dep.provides.append(re.search(prov_regex, line).group(1)) + return dep + + +def BuildDependencyHashFromDependencies(deps): + """Builds a hash for searching dependencies by the namespaces they provide. + + Description: + Dependency objects can provide multiple namespaces. This method enumerates + the provides of each dependency and adds them to a hash that can be used + to easily resolve a given dependency by a namespace it provides. + + Args: + deps: a list of dependency objects used to build the hash. + + Raises: + Exception: If a multiple files try to provide the same namepace. + + Returns: + A hash table { namespace: dependency } that can be used to resolve a + dependency by a namespace it provides. + """ + dep_hash = {} + for dep in deps: + for provide in dep.provides: + if provide in dep_hash: + raise Exception('Duplicate provide (%s) in (%s, %s)' % ( + provide, + dep_hash[provide].filename, + dep.filename)) + dep_hash[provide] = dep + return dep_hash + + +def CalculateDependencies(paths, inputs): + """Calculates the dependencies for given inputs. + + Description: + This method takes a list of paths (files, directories) and builds a + searchable data structure based on the namespaces that each .js file + provides. It then parses through each input, resolving dependencies + against this data structure. The final output is a list of files, + including the inputs, that represent all of the code that is needed to + compile the given inputs. + + Args: + paths: the references (files, directories) that are used to build the + dependency hash. + inputs: the inputs (files, directories, namespaces) that have dependencies + that need to be calculated. + + Raises: + Exception: if a provided input is invalid. + + Returns: + A list of all files, including inputs, that are needed to compile the given + inputs. + """ + deps = BuildDependenciesFromFiles(paths + inputs) + search_hash = BuildDependencyHashFromDependencies(deps) + result_list = [] + seen_list = [] + for input_file in inputs: + if IsNamespace(input_file): + namespace = re.search(ns_regex, input_file).group(1) + if namespace not in search_hash: + raise Exception('Invalid namespace (%s)' % namespace) + input_file = search_hash[namespace].filename + if not IsValidFile(input_file) or not IsJsFile(input_file): + raise Exception('Invalid file (%s)' % input_file) + seen_list.append(input_file) + file_handle = open(input_file, 'r') + try: + for line in file_handle: + if re.match(req_regex, line): + require = re.search(req_regex, line).group(1) + ResolveDependencies(require, search_hash, result_list, seen_list) + finally: + file_handle.close() + result_list.append(input_file) + + return result_list + + +def FindClosureBasePath(paths): + """Given a list of file paths, return Closure base.js path, if any. + + Args: + paths: A list of paths. + + Returns: + The path to Closure's base.js file including filename, if found. + """ + + for path in paths: + pathname, filename = os.path.split(path) + + if filename == 'base.js': + f = open(path) + + is_base = False + + # Sanity check that this is the Closure base file. Check that this + # is where goog is defined. This is determined by the @provideGoog + # flag. + for line in f: + if '@provideGoog' in line: + is_base = True + break + + f.close() + + if is_base: + return path + +def ResolveDependencies(require, search_hash, result_list, seen_list): + """Takes a given requirement and resolves all of the dependencies for it. + + Description: + A given requirement may require other dependencies. This method + recursively resolves all dependencies for the given requirement. + + Raises: + Exception: when require does not exist in the search_hash. + + Args: + require: the namespace to resolve dependencies for. + search_hash: the data structure used for resolving dependencies. + result_list: a list of filenames that have been calculated as dependencies. + This variable is the output for this function. + seen_list: a list of filenames that have been 'seen'. This is required + for the dependency->dependent ordering. + """ + if require not in search_hash: + raise Exception('Missing provider for (%s)' % require) + + dep = search_hash[require] + if not dep.filename in seen_list: + seen_list.append(dep.filename) + for sub_require in dep.requires: + ResolveDependencies(sub_require, search_hash, result_list, seen_list) + result_list.append(dep.filename) + + +def GetDepsLine(dep, base_path): + """Returns a JS string for a dependency statement in the deps.js file. + + Args: + dep: The dependency that we're printing. + base_path: The path to Closure's base.js including filename. + """ + return 'goog.addDependency("%s", %s, %s);' % ( + GetRelpath(dep.filename, base_path), dep.provides, dep.requires) + + +def GetRelpath(path, start): + """Return a relative path to |path| from |start|.""" + # NOTE: Python 2.6 provides os.path.relpath, which has almost the same + # functionality as this function. Since we want to support 2.4, we have + # to implement it manually. :( + path_list = os.path.abspath(os.path.normpath(path)).split(os.sep) + start_list = os.path.abspath( + os.path.normpath(os.path.dirname(start))).split(os.sep) + + common_prefix_count = 0 + for i in range(0, min(len(path_list), len(start_list))): + if path_list[i] != start_list[i]: + break + common_prefix_count += 1 + + # Always use forward slashes, because this will get expanded to a url, + # not a file path. + return '/'.join(['..'] * (len(start_list) - common_prefix_count) + + path_list[common_prefix_count:]) diff --git a/js/closure/goog/base.js b/js/closure/goog/base.js new file mode 100644 index 0000000..52a15db --- /dev/null +++ b/js/closure/goog/base.js @@ -0,0 +1,531 @@ +// Copyright 2006 The Closure Library Authors. 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 Bootstrap for the Google JS Library (Closure). + * + * In uncompiled mode base.js will attempt to load Closure's deps file, unless + * the global CLOSURE_NO_DEPS is set to true. This allows projects + * to include their own deps file(s) from different locations. + * + * Avoid including base.js more than once. This is strictly discouraged and not + * supported. goog.require(...) won't work properly in that case. + * + * @provideGoog + */ + + +/** + * Base namespace for the Closure library. Checks to see goog is already + * defined in the current scope before assigning to prevent clobbering if + * base.js is loaded more than once. + * + * @const + */ +var goog = goog || {}; + +/** + * Reference to the global object. + * https://www.ecma-international.org/ecma-262/9.0/index.html#sec-global-object + * + * More info on this implementation here: + * https://docs.google.com/document/d/1NAeW4Wk7I7FV0Y2tcUFvQdGMc89k2vdgSXInw8_nvCI/edit + * + * @const + * @suppress {undefinedVars} self won't be referenced unless `this` is falsy. + * @type {!Global} + */ +goog.global = + // Check `this` first for backwards compatibility. + // Valid unless running as an ES module or in a function wrapper called + // without setting `this` properly. + // Note that base.js can't usefully be imported as an ES module, but it may + // be compiled into bundles that are loadable as ES modules. + this || + // https://developer.mozilla.org/en-US/docs/Web/API/Window/self + // For in-page browser environments and workers. + self; + +/** + * Builds an object structure for the provided namespace path, ensuring that + * names that already exist are not overwritten. For example: + * "a.b.c" -> a = {};a.b={};a.b.c={}; + * Used by goog.provide and goog.exportSymbol. + * @param {string} name name of the object that this file defines. + * @private + */ +goog.exportPath_ = function(name) { + var parts = name.split('.'); + var cur = goog.global; + + // Internet Explorer exhibits strange behavior when throwing errors from + // methods externed in this manner. See the testExportSymbolExceptions in + // base_test.html for an example. + if (!(parts[0] in cur) && typeof cur.execScript != 'undefined') { + cur.execScript('var ' + parts[0]); + } + + for (var part; parts.length && (part = parts.shift());) { + if (cur[part] && cur[part] !== Object.prototype[part]) { + cur = cur[part]; + } else { + cur = cur[part] = {}; + } + } +}; + +/** + * Defines a namespace in Closure. + * + * A namespace may only be defined once in a codebase. It may be defined using + * goog.provide() or goog.module(). + * + * The presence of one or more goog.provide() calls in a file indicates + * that the file defines the given objects/namespaces. + * Provided symbols must not be null or undefined. + * + * In addition, goog.provide() creates the object stubs for a namespace + * (for example, goog.provide("goog.foo.bar") will create the object + * goog.foo.bar if it does not already exist). + * + * Build tools also scan for provide/require/module statements + * to discern dependencies, build dependency files (see deps.js), etc. + * + * @see goog.require + * @see goog.module + * @param {string} name Namespace provided by this file in the form + * "goog.package.part". + */ +goog.provide = function(name) { + // Ensure that the same namespace isn't provided twice. + // A goog.module/goog.provide maps a goog.require to a specific file + if (goog.isProvided_(name)) { + throw Error('Namespace "' + name + '" already declared.'); + } + + delete goog.implicitNamespaces_[name]; + + var namespace = name; + while ((namespace = namespace.substring(0, namespace.lastIndexOf('.')))) { + if (goog.getObjectByName(namespace)) { + break; + } + goog.implicitNamespaces_[namespace] = true; + } + + goog.exportPath_(name); +}; + +/** + * @private {?{ + * moduleName: (string|undefined), + * declareLegacyNamespace:boolean, + * type: ?goog.ModuleType + * }} + */ +goog.moduleLoaderState_ = null; + +/** + * Check if the given name has been goog.provided. This will return false for + * names that are available only as implicit namespaces. + * @param {string} name name of the object to look for. + * @return {boolean} Whether the name has been provided. + * @private + */ +goog.isProvided_ = function(name) { + return (!goog.implicitNamespaces_[name] && + goog.isDefAndNotNull(goog.getObjectByName(name))); +}; + +/** + * Namespaces implicitly defined by goog.provide. For example, + * goog.provide('goog.events.Event') implicitly declares that 'goog' and + * 'goog.events' must be namespaces. + * + * @type {!Object} + * @private + */ +goog.implicitNamespaces_ = {}; + +// NOTE: We add goog.module as an implicit namespace as goog.module is defined +// here and because the existing module package has not been moved yet out of +// the goog.module namespace. This satisfies both the debug loader and +// ahead-of-time dependency management. + + +/** + * Returns an object based on its fully qualified external name. The object + * is not found if null or undefined. If you are using a compilation pass that + * renames property names beware that using this function will not find renamed + * properties. + * + * @param {string} name The fully qualified name. + * @param {Object=} opt_obj The object within which to look; default is + * |goog.global|. + * @return {?} The value (object or primitive) or, if not found, null. + */ +goog.getObjectByName = function(name, opt_obj) { + var parts = name.split('.'); + var cur = opt_obj || goog.global; + for (var i = 0; i < parts.length; i++) { + cur = cur[parts[i]]; + if (!goog.isDefAndNotNull(cur)) { + return null; + } + } + return cur; +}; + + +/** + * Adds a dependency from a file to the files it requires. + * @param {string} relPath The path to the js file. + * @param {!Array} provides An array of strings with + * the names of the objects this file provides. + * @param {!Array} requires An array of strings with + * the names of the objects this file requires. + */ +goog.addDependency = function(relPath, provides, requires) { + goog.debugLoader_.addDependency(relPath, provides, requires); +}; + + + + +// NOTE(nnaze): The debug DOM loader was included in base.js as an original way +// to do "debug-mode" development. The dependency system can sometimes be +// confusing, as can the debug DOM loader's asynchronous nature. +// +// With the DOM loader, a call to goog.require() is not blocking -- the script +// will not load until some point after the current script. If a namespace is +// needed at runtime, it needs to be defined in a previous script, or loaded via +// require() with its registered dependencies. +// +// User-defined namespaces may need their own deps file. For a reference on +// creating a deps file, see: +// Externally: https://developers.google.com/closure/library/docs/depswriter +// +// Because of legacy clients, the DOM loader can't be easily removed from +// base.js. Work was done to make it disableable or replaceable for +// different environments (DOM-less JavaScript interpreters like Rhino or V8, +// for example). See bootstrap/ for more information. + + +/** + * Implements a system for the dynamic resolution of dependencies that works in + * parallel with the BUILD system. + * + * Note that all calls to goog.require will be stripped by the compiler. + * + * @see goog.provide + * @param {string} namespace Namespace (as was given in goog.provide, + * goog.module, or goog.declareModuleId) in the form + * "goog.package.part". + * @return {?} If called within a goog.module or ES6 module file, the associated + * namespace or module otherwise null. + */ +goog.require = function(namespace) { + // If the object already exists we do not need to do anything. + if (!goog.isProvided_(namespace)) { + var moduleLoaderState = goog.moduleLoaderState_; + goog.moduleLoaderState_ = null; + try { + goog.debugLoader_.load_(namespace); + } finally { + goog.moduleLoaderState_ = moduleLoaderState; + } + } + + return null; +}; + +/** + * Requires a symbol for its type information. This is an indication to the + * compiler that the symbol may appear in type annotations, yet it is not + * referenced at runtime. + * + * When called within a goog.module or ES6 module file, the return value may be + * assigned to or destructured into a variable, but it may not be otherwise used + * in code outside of a type annotation. + * + * Note that all calls to goog.requireType will be stripped by the compiler. + * + * @param {string} namespace Namespace (as was given in goog.provide, + * goog.module, or goog.declareModuleId) in the form + * "goog.package.part". + * @return {?} + */ +goog.requireType = function(namespace) { + // Return an empty object so that single-level destructuring of the return + // value doesn't crash at runtime when using the debug loader. Multi-level + // destructuring isn't supported. + return {}; +}; + +/** + * Path for included scripts. + * @type {string} + */ +goog.basePath = ''; + +/** + * Normalize a file path by removing redundant ".." and extraneous "." file + * path components. + * @param {string} path + * @return {string} + * @private + */ +goog.normalizePath_ = function(path) { + var components = path.split('/'); + var i = 0; + while (i < components.length) { + if (components[i] == '.') { + components.splice(i, 1); + } else if ( + i && components[i] == '..' && components[i - 1] && + components[i - 1] != '..') { + components.splice(--i, 2); + } else { + i++; + } + } + return components.join('/'); +}; + + +//============================================================================== +// Language Enhancements +//============================================================================== + + +/** + * Returns true if the specified value is defined and not null. + * @param {?} val Variable to test. + * @return {boolean} Whether variable is defined and not null. + */ +goog.isDefAndNotNull = function(val) { + // Note that undefined == null. + return val != null; +}; + +//============================================================================== +// goog.defineClass implementation +//============================================================================== + + +// There's a bug in the compiler where without collapse properties the +// Closure namespace defines do not guard code correctly. To help reduce code +// size also check for !COMPILED even though it redundant until this is fixed. + +/** + * Tries to detect the base path of base.js script that bootstraps Closure. + * @private + */ +goog.findBasePath_ = function() { + /** @type {!Document} */ + var doc = goog.global.document; + // If we have a currentScript available, use it exclusively. + var currentScript = doc.currentScript; + if (currentScript) { + var scripts = [currentScript]; + } else { + var scripts = doc.getElementsByTagName('SCRIPT'); + } + // Search backwards since the current script is in almost all cases the one + // that has base.js. + for (var i = scripts.length - 1; i >= 0; --i) { + var script = /** @type {!HTMLScriptElement} */ (scripts[i]); + var src = script.src; + var qmark = src.lastIndexOf('?'); + var l = qmark == -1 ? src.length : qmark; + if (src.substr(l - 7, 7) == 'base.js') { + goog.basePath = src.substr(0, l - 7); + return; + } + } +}; + +goog.findBasePath_(); + +/** + * A debug loader is responsible for downloading and executing javascript + * files in an unbundled, uncompiled environment. + * + * @struct @constructor @final @private + */ +goog.DebugLoader_ = function() { + /** @private @const {!Object} */ + this.dependencies_ = {}; + /** @private @const {!Object} */ + this.idToPath_ = {}; + /** @private @const {!Object} */ + this.written_ = {}; + /** @private {!Array} */ + this.depsToLoad_ = []; +}; + + +/** + * Travserses the dependency graph and queues the given dependency, and all of + * its transitive dependencies, for loading and then starts loading if not + * paused. + * + * @param {string} namespace + * @private + */ +goog.DebugLoader_.prototype.load_ = function(namespace) { + if (!this.getPathFromDeps_(namespace)) { + throw Error('goog.require could not find: ' + namespace); + } else { + var loader = this; + + var deps = []; + + /** @param {string} namespace */ + var visit = function(namespace) { + var path = loader.getPathFromDeps_(namespace); + + if (!path) { + throw Error('Bad dependency path or symbol: ' + namespace); + } + + if (loader.written_[path]) { + return; + } + + loader.written_[path] = true; + + var dep = loader.dependencies_[path]; + for (var i = 0; i < dep.requires.length; i++) { + if (!goog.isProvided_(dep.requires[i])) { + visit(dep.requires[i]); + } + } + + deps.push(dep); + }; + + visit(namespace); + + var wasLoading = !!this.depsToLoad_.length; + this.depsToLoad_ = this.depsToLoad_.concat(deps); + + if (!wasLoading) { + this.loadDeps_(); + } + } +}; + + +/** + * Loads any queued dependencies until they are all loaded or paused. + * + * @private + */ +goog.DebugLoader_.prototype.loadDeps_ = function() { + var loader = this; + + while (this.depsToLoad_.length) { + (function() { + var loadCallDone = false; + var dep = loader.depsToLoad_.shift(); + + try { + dep.load(); + } finally { + loadCallDone = true; + } + })(); + } +}; + + +/** + * @param {string} absPathOrId + * @return {?string} + * @private + */ +goog.DebugLoader_.prototype.getPathFromDeps_ = function(absPathOrId) { + return this.idToPath_[absPathOrId]; +}; + + +/** + * Basic super class for all dependencies Closure Library can load. + * + * This default implementation is designed to load untranspiled, non-module + * scripts in a web broswer. + * + * For transpiled non-goog.module files {@see goog.TranspiledDependency}. + * For goog.modules see {@see goog.GoogModuleDependency}. + * For untranspiled ES6 modules {@see goog.Es6ModuleDependency}. + * + * @param {string} path Absolute path of this script. + * @param {!Array} requires goog symbols or relative paths to Closure + * this depends on. + * @struct @constructor + */ +goog.Dependency = function(path, requires) { + /** @const */ + this.path = path; + /** @const */ + this.requires = requires; +}; + +/** + * Map of script ready / state change callbacks. Old IE cannot handle putting + * these properties on goog.global. + * + * @private @const {!Object} + */ +goog.Dependency.callbackMap_ = {}; + + +/** + * Starts loading this dependency. This dependency can pause loading if it + * needs to and resume it later via the controller interface. + * + * When this is loaded it should call controller.loaded(). Note that this will + * end up calling the loaded method of this dependency; there is no need to + * call it explicitly. + */ +goog.Dependency.prototype.load = function() { + /** @type {!HTMLDocument} */ + var doc = goog.global.document; + doc.write(' +// +// Call with: +// +// + +var cp_grid = [ + ['ffffff', 'ffcccc', 'ffcc99', 'ffff99', 'ffffcc', '99ff99', '99ffff', 'ccffff', 'ccccff', 'ffccff'], + ['cccccc', 'ff6666', 'ff9966', 'ffff66', 'ffff33', '66ff99', '33ffff', '66ffff', '9999ff', 'ff99ff'], + ['c0c0c0', 'ff0000', 'ff9900', 'ffcc66', 'ffff00', '33ff33', '66cccc', '33ccff', '6666cc', 'cc66cc'], + ['999999', 'cc0000', 'ff6600', 'ffcc33', 'ffcc00', '33cc00', '00cccc', '3366ff', '6633ff', 'cc33cc'], + ['666666', '990000', 'cc6600', 'cc9933', '999900', '009900', '339999', '3333ff', '6600cc', '993399'], + ['333333', '660000', '993300', '996633', '666600', '006600', '336666', '000099', '333399', '663366'], + ['000000', '330000', '663300', '663333', '333300', '003300', '003333', '000066', '330099', '330033'], + [''] +]; + +var cp_popupDom = null; +var cp_activeSwatch = null; +var cp_closePid = null; + +function cp_init(id) { + var input = document.getElementById(id); + if (!input) { + throw Error('Colour picker can\'t find "' + id + '"'); + } + if (!input.cp_swatch) { + // Hide the input. + input.type = 'hidden'; + // + var swatch = document.createElement('span'); + swatch.className = 'cp_swatch'; + swatch.addEventListener('click', cp_open); + swatch.addEventListener('mouseover', cp_cancelclose); + swatch.addEventListener('mouseout', cp_closesoon); + input.parentNode.insertBefore(swatch, input); + // Cross-link the swatch and input. + swatch.cp_input = input; + input.cp_swatch = swatch; + } + cp_updateSwatch(input.cp_swatch); +} + +function cp_updateSwatch(swatch) { + var colour = swatch.cp_input.value; + if (colour) { + swatch.style.backgroundColor = '#' + colour; + swatch.textContent = '\xa0'; + } else { + swatch.style.backgroundColor = '#fff'; + swatch.innerHTML = 'X'; + } +} + +function cp_open(e) { + // Create a table of colours. + if (cp_popupDom) { + cp_close(); + return; + } + cp_activeSwatch = e.currentTarget; + var currentColour = cp_activeSwatch.cp_input.value.toLowerCase(); + var element = cp_activeSwatch; + var posX = 0; + var posY = element.offsetHeight; + while (element) { + posX += element.offsetLeft; + posY += element.offsetTop; + element = element.offsetParent; + } + cp_popupDom = document.createElement('div'); + cp_popupDom.id = 'cp_popup'; + var table = document.createElement('table'); + table.addEventListener('mouseover', cp_cancelclose); + table.addEventListener('mouseout', cp_closesoon); + table.addEventListener('click', cp_onclick); + var tbody = document.createElement('tbody'); + var row, cell, div; + for (var y = 0; y < cp_grid.length; y++) { + row = document.createElement('tr'); + tbody.appendChild(row); + for (var x = 0; x < cp_grid[y].length; x++) { + var colour = cp_grid[y][x]; + if (colour === undefined) continue; + cell = document.createElement('td'); + row.appendChild(cell); + div = document.createElement('div'); + cell.appendChild(div); + cell.cp_colour = colour; + if (colour) { + div.style.backgroundColor = '#' + colour; + div.innerHTML = '\xa0'; + } else { + div.innerHTML = 'X'; + } + if (currentColour == colour.toLowerCase()) { + div.className = 'cp_current' + } + } + } + table.appendChild(tbody); + cp_popupDom.appendChild(table); + + document.body.appendChild(cp_popupDom); + // Don't widen the screen. + var rightOverhang = (posX + cp_popupDom.offsetWidth) - + (window.innerWidth + window.scrollX) + 15; // Scrollbar is 15px. + if (rightOverhang > 0) { + posX -= rightOverhang; + } + // Flip to above swatch if no room below. + if (posY + cp_popupDom.offsetHeight >= window.innerHeight + window.scrollY) { + posY -= cp_popupDom.offsetHeight + cp_activeSwatch.offsetHeight; + if (posY < window.scrollY) { + posY = window.scrollY; + } + } + cp_popupDom.style.left = posX + 'px'; + cp_popupDom.style.top = posY + 'px'; +} + +function cp_close() { + // Close the table now. + cp_cancelclose(); + if (cp_popupDom) { + document.body.removeChild(cp_popupDom) + } + cp_popupDom = null; + cp_activeSwatch = null; +} + +function cp_closesoon() { + // Close the table a split-second from now. + cp_closePid = setTimeout(cp_close, 250); +} + +function cp_cancelclose() { + // Don't close the colour table after all. + if (cp_closePid) { + clearTimeout(cp_closePid); + } +} + +function cp_onclick(e) { + // Clicked on a colour. + var element = e.target; + var colour; + // Walk up the DOM, looking for a colour. + while (element) { + colour = element.cp_colour; + if (colour !== undefined) { + break; + } + element = element.parentNode; + } + if (colour !== undefined) { + // Set the colour. + cp_activeSwatch.cp_input.value = colour; + cp_updateSwatch(cp_activeSwatch); + // Fire a change event. + var evt = document.createEvent('HTMLEvents'); + evt.initEvent('change', false, true); + cp_activeSwatch.cp_input.dispatchEvent(evt); + } + // Close the table. + cp_close(); +} diff --git a/js/demos/blockfactory/factory.css b/js/demos/blockfactory/factory.css new file mode 100644 index 0000000..751f6f0 --- /dev/null +++ b/js/demos/blockfactory/factory.css @@ -0,0 +1,579 @@ +/** + * @license + * Copyright 2016 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +html, body { + height: 100%; + min-height: 375px; +} + +body { + background-color: #fff; + font-family: sans-serif; + margin: 0 5px; + overflow: hidden; +} + +h1 { + font-weight: normal; + font-size: 140%; +} + +h3 { + margin-top: 5px; + margin-bottom: 0; +} + +table { + border: none; + border-collapse: collapse; + height: 100%; + margin: 0; + padding: 0; + width: 100%; +} + +td { + vertical-align: top; + padding: 0; +} + +p { + display: block; + -webkit-margin-before: 0; + -webkit-margin-after: 0; + -webkit-margin-start: 0; + -webkit-margin-end: 0; + padding: 5px 0; +} + +#factoryHeader { + display: table; + height: 10%; +} + +#blockly { + position: absolute; +} + +#blocklyMask { + background-color: #000; + cursor: not-allowed; + display: none; + position: fixed; + opacity: 0.2; + z-index: 9; +} + +#preview { + position: absolute; +} + +pre, +#languageTA { + border: #ddd 1px solid; + margin-top: 0; + position: absolute; + overflow: scroll; +} + +#languageTA { + display: none; + font: 10pt monospace; +} + +.downloadButton { + padding: 5px; +} + +.disabled { + color: #888; +} + +button:disabled, .buttonStyle:disabled { + opacity: 0.6; +} + +button>*, .buttonStyle>* { + opacity: 1; + vertical-align: text-bottom; +} + +button, .buttonStyle { + border-radius: 4px; + border: 1px solid #ddd; + background-color: #eee; + color: #000; + padding: 10px; + margin: 10px 5px; + font-size: small; +} + +.buttonStyle:hover:not(:disabled), button:hover:not(:disabled) { + box-shadow: 2px 2px 5px #888; +} + +.buttonStyle:hover:not(:disabled)>*, button:hover:not(:disabled)>* { + opacity: 1; +} + +#linkButton { + display: none; +} + +#helpButton { + float: right; +} + +#blockFactoryContent { + height: 85%; + width: 100%; + overflow: hidden; +} + +#blockFactoryPreview { + height: 100%; + width: 100%; +} + +#blockLibraryContainer { + vertical-align: bottom; +} + +#blockLibraryControls { + text-align: right; + vertical-align: middle; +} + +#previewContainer { + vertical-align: bottom; +} + +#buttonContainer { + text-align: right; + vertical-align: middle; +} + +#files { + position: absolute; + visibility: hidden; +} + +.toolbox { + display: none; +} + +#blocklyWorkspaceContainer { + width: 50%; +} + +#workspaceFactoryContent { + clear: both; + display: none; + height: 90%; + overflow-x: hidden; + overflow-y: scroll; +} + +/* Exporter */ + +#blockLibraryExporter { + clear: both; + display: none; + height: 90%; + overflow-x: hidden; + overflow-y: scroll; +} + +#exportSelector { + display: inline-block; + float: left; + height: 70%; + width: 30%; +} + +#exportSettings { + float: left; + overflow: hidden; + padding-left: 16px; + width: 20%; +} + +#selectedBlocksTextContainer { + max-height: 200px; + overflow-y: scroll; + padding-bottom: 2em; +} + +::-webkit-scrollbar { + -webkit-appearance: none; + width: 7px; +} + +::-webkit-scrollbar-thumb { + border-radius: 4px; + background-color: #ccc; + -webkit-box-shadow: 0 0 1px rgba(255,255,255,.5); +} + +.subsettings { + margin: 0 25px; +} + +#exporterHiddenWorkspace { + display: none; +} + +#exportPreview { + float: right; + height: 90%; + overflow: hidden; + width: 45%; +} + +.exportPreviewTextArea { + display: block; + float: right; + height: 40%; + width: 100%; +} + +#genStubs_textArea, #blockDefs_textArea { + display: block; + height: 80%; + margin-right: 20px; + max-height: 300px; + overflow: scroll; + position: static; +} + +#blockDefs_label, #genStubs_label { + display: block; +} + +#blockSelector { + background-color: #eee; + border: 1px solid lightgrey; + width: 80%; + height: 90%; + overflow-y: scroll; + position: relative; +} + +/* Exporter Block Option */ + +.blockOption { + background-color: #eee; + padding: 0px 20px; + width: 95%; +} + +.blockOption_check_label { + position: relative; +} + +.blockOption_check { + float: left; + display:inline; + padding: 4px; +} + +.blockOption_label { + display:inline; + max-width: inherit; + word-wrap: break-word; +} + +.blockOption_preview { + height: 100px; + padding-top: 10px; + width: 90%; +} + +/* Block Library */ + +#dropdownDiv_blockLib { + max-height: 65%; + overflow-y: scroll; +} + +#button_blockLib { + border-color: darkgrey; + font-size: large; +} + +.button_alert { + background-color: #fcc; + border-color: #f99; +} + +.button_warn { + background-color: #aea; + border-color: #5d5; +} + +/* Tabs */ + +.tab { + float: left; + padding: 5px 19px; +} + +.tab:hover:not(.tabon) { + background-color: #e8e8e8; +} + +.tab.tabon { + background-color: #ccc; +} + +.tab.taboff { + cursor: pointer; +} + +#tabContainer { + background-color: #f8f8f8; + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + display: table; + width: 100%; +} + +/* Workspace Factory */ + +section { + float: left; +} + +aside { + float: right; +} + +#categoryTable>table { + border: 1px solid #ccc; + border-bottom: none; + width: auto; +} + +td.tabon { + background-color: #ccc; + border-bottom-color: #ccc; + padding: 5px 19px; +} + +td.taboff { + cursor: pointer; + padding: 5px 19px; +} + +td.taboff:hover { + background-color: #eee; +} + +.large { + font-size: large; +} + +.inputfile { + height: 0; + opacity: 0; + overflow: hidden; + position: absolute; + width: 0; + z-index: -1; +} +#wfactoryHeader { + height: 29%; + padding: 0.5%; +} + +#workspaceTabs { + background-color: #f8f8f8; + border: 1px solid #ccc; + display: table; + width: auto; +} + +#toolbox_section { + height: 85%; + width: 60%; +} + +#previewHelp { + padding: 10px; + width: 98%; +} + +#toolbox_blocks { + height: 100%; + width: 100%; +} + +#preview_blocks { + height: 80%; + padding: 10px; + width: 100%; +} + +#createDiv { + height: 79%; + padding: 0.5%; + width: 60%; +} + +#previewDiv { + border: 10px solid #eee; + height: 77%; + margin-right: 0.5%; + padding-bottom: 10px; + width: 35%; +} + +#previewBorder { + border: 5px solid #ddd; + height: 100%; + padding-right: 20px; +} + +.disabled { + background-color: white; + opacity: 0.5; +} + +#toolbox_div { + display: table; + height: auto; + margin-right: 5%; + overflow: hidden; + width: 35%; +} + +#preload_div { + display: table; + height: 75%; + margin-left: 2%; + margin-right: 2%; + max-height: 500px; + overflow: hidden; + overflow-y: scroll; + width: 30%; +} + +#shadowBlockDropdown { + height: 15%; +} + +#preloadHelp { + display: table-row; + height: 30%; +} + +#workspace_options { + display: table-row; + margin-top: 2%; +} + +#disable_div { + background-color: white; + height: 100%; + left: 0; + opacity: .5; + position: absolute; + top: 0; + width: 100%; + z-index: -1; /* Start behind workspace */ +} + +#grid_options, #zoom_options, #maxBlockNumber_option { + padding-left: 15px; +} + +#modalShadow { + display: none; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: rgba(0, 0, 0, 0.1); + z-index: 100; +} + +/* The container
- needed to position the dropdown content */ +.dropdown { + display: inline-block; +} + +/* Dropdown Content (Hidden by Default) */ +.dropdown-content { + background-color: #fff; + box-shadow: 0 8px 16px 0 rgba(0,0,0,.2); + display: none; + min-width: 170px; + opacity: 1; + position: absolute; + z-index: 101; /* On top of the modal Shadow. */ +} + +/* Links inside the dropdown */ +.dropdown-content a, .dropdown-content label { + color: black; + display: block; + font-size: small; + padding: 12px 16px; + text-decoration: none; +} + +/* Change color of dropdown links on hover. */ +.dropdown-content a:hover, .dropdown-content label:hover { + background-color: #EEE; +} + +/* Change color of dropdown links on selected. */ +.dropdown-content-selected { + background-color: #DDD; +} + +/* Show the dropdown menu */ +.show { + display: block; +} + +#dropdownDiv_editCategory { + padding: 0 1ex; +} + +#dropdownDiv_editCategory>img { + vertical-align: middle; +} + +.cp_swatch { + vertical-align: middle !important; +} + +#cp_popup { + z-index: 999; +} + +.shadowBlock>.blocklyPath { + fill-opacity: .5; + stroke-opacity: .5; +} + +.shadowBlock>.blocklyPathLight, +.shadowBlock>.blocklyPathDark { + display: none; +} diff --git a/js/demos/blockfactory/factory.js b/js/demos/blockfactory/factory.js new file mode 100644 index 0000000..77ab56f --- /dev/null +++ b/js/demos/blockfactory/factory.js @@ -0,0 +1,337 @@ +/** + * @license + * Copyright 2016 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview JavaScript for Blockly's Block Factory application through + * which users can build blocks using a visual interface and dynamically + * generate a preview block and starter code for the block (block definition and + * generator stub. Uses the Block Factory namespace. Depends on the FactoryUtils + * for its code generation functions. + * + * @author fraser@google.com (Neil Fraser), quachtina96 (Tina Quach) + */ +'use strict'; + +/** + * Namespace for Block Factory. + */ +var BlockFactory = BlockFactory || Object.create(null); + +/** + * Workspace for user to build block. + * @type {Blockly.Workspace} + */ +BlockFactory.mainWorkspace = null; + +/** + * Workspace for preview of block. + * @type {Blockly.Workspace} + */ +BlockFactory.previewWorkspace = null; + +/** + * Name of block if not named. + * @type string + */ +BlockFactory.UNNAMED = 'unnamed'; + +/** + * Existing direction ('ltr' vs 'rtl') of preview. + * @type string + */ +BlockFactory.oldDir = null; + +/** + * Flag to signal that an update came from a manual update to the JSON or JavaScript. + * definition manually. + * @type boolean + */ +// TODO: Replace global state with parameter passed to functions. +BlockFactory.updateBlocksFlag = false; + +/** + * Delayed flag to avoid infinite update after updating the JSON or JavaScript. + * definition manually. + * @type boolean + */ +// TODO: Replace global state with parameter passed to functions. +BlockFactory.updateBlocksFlagDelayed = false; + +/** + * The starting XML for the Block Factory main workspace. Contains the + * unmovable, undeletable factory_base block. + */ +BlockFactory.STARTER_BLOCK_XML_TEXT = + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '230' + + ''; + +/** + * Change the language code format. + */ +BlockFactory.formatChange = function() { + var mask = document.getElementById('blocklyMask'); + var languagePre = document.getElementById('languagePre'); + var languageTA = document.getElementById('languageTA'); + if (document.getElementById('format').value == 'Manual-JSON' || + document.getElementById('format').value == 'Manual-JS') { + Blockly.hideChaff(); + mask.style.display = 'block'; + languagePre.style.display = 'none'; + languageTA.style.display = 'block'; + var code = languagePre.textContent.trim(); + languageTA.value = code; + languageTA.focus(); + BlockFactory.updatePreview(); + } else { + mask.style.display = 'none'; + languageTA.style.display = 'none'; + languagePre.style.display = 'block'; + var code = languagePre.textContent.trim(); + languageTA.value = code; + + BlockFactory.updateLanguage(); + } + BlockFactory.disableEnableLink(); +}; + +/** + * Update the language code based on constructs made in Blockly. + */ +BlockFactory.updateLanguage = function() { + var rootBlock = FactoryUtils.getRootBlock(BlockFactory.mainWorkspace); + if (!rootBlock) { + return; + } + var blockType = rootBlock.getFieldValue('NAME').trim().toLowerCase(); + if (!blockType) { + blockType = BlockFactory.UNNAMED; + } + + if (!BlockFactory.updateBlocksFlag) { + var format = document.getElementById('format').value; + if (format == 'Manual-JSON') { + format = 'JSON'; + } else if (format == 'Manual-JS') { + format = 'JavaScript'; + } + + var code = FactoryUtils.getBlockDefinition(blockType, rootBlock, format, + BlockFactory.mainWorkspace); + FactoryUtils.injectCode(code, 'languagePre'); + if (!BlockFactory.updateBlocksFlagDelayed) { + var languagePre = document.getElementById('languagePre'); + var languageTA = document.getElementById('languageTA'); + code = languagePre.innerText.trim(); + languageTA.value = code; + } + } + + BlockFactory.updatePreview(); +}; + +/** + * Update the generator code. + * @param {!Blockly.Block} block Rendered block in preview workspace. + */ +BlockFactory.updateGenerator = function(block) { + var language = document.getElementById('language').value; + var generatorStub = FactoryUtils.getGeneratorStub(block, language); + FactoryUtils.injectCode(generatorStub, 'generatorPre'); +}; + +/** + * Update the preview display. + */ +BlockFactory.updatePreview = function() { + // Toggle between LTR/RTL if needed (also used in first display). + var newDir = document.getElementById('direction').value; + if (BlockFactory.oldDir != newDir) { + if (BlockFactory.previewWorkspace) { + BlockFactory.previewWorkspace.dispose(); + } + var rtl = newDir == 'rtl'; + BlockFactory.previewWorkspace = Blockly.inject('preview', + {rtl: rtl, + media: '../../media/', + scrollbars: true}); + BlockFactory.oldDir = newDir; + } + BlockFactory.previewWorkspace.clear(); + + var format = BlockFactory.getBlockDefinitionFormat(); + var code = document.getElementById('languageTA').value; + 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 = Object.create(null); + for (var prop in backupBlocks) { + Blockly.Blocks[prop] = backupBlocks[prop]; + } + + if (format == 'JSON') { + var json = JSON.parse(code); + Blockly.Blocks[json.type || BlockFactory.UNNAMED] = { + init: function() { + this.jsonInit(json); + } + }; + } else if (format == 'JavaScript') { + try { + eval(code); + } catch (e) { + // TODO: Display error in the UI + console.error("Error while evaluating JavaScript formatted block definition", e); + return; + } + } + + // 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 = BlockFactory.previewWorkspace.newBlock(blockType); + previewBlock.initSvg(); + previewBlock.render(); + previewBlock.setMovable(false); + previewBlock.setDeletable(false); + previewBlock.moveBy(15, 10); + BlockFactory.previewWorkspace.clearUndo(); + BlockFactory.updateGenerator(previewBlock); + + // Warn user only if their block type is already exists in Blockly's + // standard library. + var rootBlock = FactoryUtils.getRootBlock(BlockFactory.mainWorkspace); + if (StandardCategories.coreBlockTypes.indexOf(blockType) != -1) { + rootBlock.setWarningText('A core Blockly block already exists ' + + 'under this name.'); + + } else if (blockType == 'block_type') { + // Warn user to let them know they can't save a block under the default + // name 'block_type' + rootBlock.setWarningText('You cannot save a block with the default ' + + 'name, "block_type"'); + + } else { + rootBlock.setWarningText(null); + } + } catch(err) { + // TODO: Show error on the UI + console.log(err); + BlockFactory.updateBlocksFlag = false + BlockFactory.updateBlocksFlagDelayed = false + } finally { + Blockly.Blocks = backupBlocks; + } +}; + +/** + * Gets the format from the Block Definitions' format selector/drop-down. + * @return Either 'JavaScript' or 'JSON'. + * @throws If selector value is not recognized. + */ +BlockFactory.getBlockDefinitionFormat = function() { + switch (document.getElementById('format').value) { + case 'JSON': + case 'Manual-JSON': + return 'JSON'; + + case 'JavaScript': + case 'Manual-JS': + return 'JavaScript'; + + default: + throw 'Unknown format: ' + format; + } +} + +/** + * Disable link and save buttons if the format is 'Manual', enable otherwise. + */ +BlockFactory.disableEnableLink = function() { + var linkButton = document.getElementById('linkButton'); + var saveBlockButton = document.getElementById('localSaveButton'); + var saveToLibButton = document.getElementById('saveToBlockLibraryButton'); + var disabled = document.getElementById('format').value.substr(0, 6) == 'Manual'; + linkButton.disabled = disabled; + saveBlockButton.disabled = disabled; + saveToLibButton.disabled = disabled; +}; + +/** + * Render starter block (factory_base). + */ +BlockFactory.showStarterBlock = function() { + BlockFactory.mainWorkspace.clear(); + var xml = Blockly.Xml.textToDom(BlockFactory.STARTER_BLOCK_XML_TEXT); + Blockly.Xml.domToWorkspace(xml, BlockFactory.mainWorkspace); +}; + +/** + * Returns whether or not the current block open is the starter block. + */ +BlockFactory.isStarterBlock = function() { + var rootBlock = FactoryUtils.getRootBlock(BlockFactory.mainWorkspace); + return rootBlock && !( + // The starter block does not have blocks nested into the factory_base block. + rootBlock.getChildren().length > 0 || + // The starter block's name is the default, 'block_type'. + rootBlock.getFieldValue('NAME').trim().toLowerCase() != 'block_type' || + // The starter block has no connections. + rootBlock.getFieldValue('CONNECTIONS') != 'NONE' || + // The starter block has automatic inputs. + rootBlock.getFieldValue('INLINE') != 'AUTO' + ); +}; + +/** + * Updates blocks from the manually edited js or json from their text area. + */ +BlockFactory.manualEdit = function() { + // TODO(#1267): Replace these global state flags with parameters passed to + // the right functions. + BlockFactory.updateBlocksFlag = true; + BlockFactory.updateBlocksFlagDelayed = true; + BlockFactory.updateLanguage(); +} diff --git a/js/demos/blockfactory/factory_utils.js b/js/demos/blockfactory/factory_utils.js new file mode 100644 index 0000000..92f5a33 --- /dev/null +++ b/js/demos/blockfactory/factory_utils.js @@ -0,0 +1,1070 @@ +/** + * @license + * Copyright 2016 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview FactoryUtils is a namespace that holds block starter code + * generation functions shared by the Block Factory, Workspace Factory, and + * Exporter applications within Blockly Factory. Holds functions to generate + * block definitions and generator stubs and to create and download files. + * + * @author fraser@google.com (Neil Fraser), quachtina96 (Tina Quach), JC-Orozco + * (Juan Carlos Orozco) + */ +'use strict'; + +/** + * Namespace for FactoryUtils. + */ +var FactoryUtils = FactoryUtils || Object.create(null); + +/** + * Get block definition code for the current block. + * @param {string} blockType Type of block. + * @param {!Blockly.Block} rootBlock RootBlock from main workspace in which + * user uses Block Factory Blocks to create a custom block. + * @param {string} format 'JSON' or 'JavaScript'. + * @param {!Blockly.Workspace} workspace Where the root block lives. + * @return {string} Block definition. + */ +FactoryUtils.getBlockDefinition = function(blockType, rootBlock, format, workspace) { + blockType = FactoryUtils.cleanBlockType(blockType); + switch (format) { + case 'JSON': + var code = FactoryUtils.formatJson_(blockType, rootBlock); + break; + case 'JavaScript': + var code = FactoryUtils.formatJavaScript_(blockType, rootBlock, workspace); + break; + } + return code; +}; + +/** + * Convert invalid block name to a valid one. Replaces whitespace + * and prepend names that start with a digit with an '_'. + * @param {string} blockType Type of block. + * @return {string} Cleaned up block type. + */ +FactoryUtils.cleanBlockType = function(blockType) { + if (!blockType) { + return ''; + } + return blockType.replace(/\W/g, '_').replace(/^(\d)/, '_$1'); +}; + +/** + * Get the generator code for a given block. + * @param {!Blockly.Block} block Rendered block in preview workspace. + * @param {string} generatorLanguage 'JavaScript', 'Python', 'PHP', 'Lua', + * or 'Dart'. + * @return {string} Generator code for multiple blocks. + */ +FactoryUtils.getGeneratorStub = function(block, generatorLanguage) { + // Build factory blocks from block + if (BlockFactory.updateBlocksFlag) { // TODO: Move this to updatePreview() + BlockFactory.mainWorkspace.clear(); + var xml = BlockDefinitionExtractor.buildBlockFactoryWorkspace(block); + Blockly.Xml.domToWorkspace(xml, BlockFactory.mainWorkspace); + // Calculate timer to avoid infinite update loops + // TODO(#1267): Remove the global variables and any infinite loops. + BlockFactory.updateBlocksFlag = false; + setTimeout( + function() {BlockFactory.updateBlocksFlagDelayed = false;}, 3000); + } + BlockFactory.lastUpdatedBlock = block; // Variable to share the block value. + + function makeVar(root, name) { + name = name.toLowerCase().replace(/\W/g, '_'); + return ' var ' + root + '_' + name; + } + // The makevar function lives in the original update generator. + var language = generatorLanguage; + 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.FieldNumber) { + code.push(makeVar('number', 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 + "');"); + } + } + } + // Most languages end lines with a semicolon. Python & Lua do not. + var lineEnd = { + 'JavaScript': ';', + 'Python': '', + 'PHP': ';', + 'Lua': '', + 'Dart': ';' + }; + code.push(" // TODO: Assemble " + language + " into code variable."); + if (block.outputConnection) { + code.push(" var code = '...';"); + code.push(" // TODO: Change ORDER_NONE to the correct strength."); + code.push(" return [code, Blockly." + language + ".ORDER_NONE];"); + } else { + code.push(" var code = '..." + (lineEnd[language] || '') + "\\n';"); + code.push(" return code;"); + } + code.push("};"); + + return code.join('\n'); +}; + +/** + * 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 + */ +FactoryUtils.formatJson_ = function(blockType, rootBlock) { + var JS = {}; + // Type is not used by Blockly, but may be used by a loader. + JS.type = blockType; + // Generate inputs. + var message = []; + var args = []; + var contentsBlock = rootBlock.getInputTargetBlock('INPUTS'); + var lastInput = null; + while (contentsBlock) { + if (!contentsBlock.disabled && !contentsBlock.getInheritedDisabled()) { + var fields = FactoryUtils.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( + FactoryUtils.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 && FactoryUtils.getFieldsJson_(fields).join('').trim() != '') { + var align = lastInput.getFieldValue('ALIGN'); + if (align != 'LEFT') { + JS.lastDummyAlign0 = align; + } + args.pop(); + message.pop(); + } + } + JS.message0 = message.join(' '); + if (args.length) { + 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( + FactoryUtils.getOptTypesFrom(rootBlock, 'OUTPUTTYPE') || 'null'); + break; + case 'BOTH': + JS.previousStatement = + JSON.parse( + FactoryUtils.getOptTypesFrom(rootBlock, 'TOPTYPE') || 'null'); + JS.nextStatement = + JSON.parse( + FactoryUtils.getOptTypesFrom(rootBlock, 'BOTTOMTYPE') || 'null'); + break; + case 'TOP': + JS.previousStatement = + JSON.parse( + FactoryUtils.getOptTypesFrom(rootBlock, 'TOPTYPE') || 'null'); + break; + case 'BOTTOM': + JS.nextStatement = + JSON.parse( + FactoryUtils.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 = FactoryUtils.getTooltipFromRootBlock_(rootBlock); + JS.helpUrl = FactoryUtils.getHelpUrlFromRootBlock_(rootBlock); + + return JSON.stringify(JS, null, ' '); +}; + +/** + * Update the language code as JavaScript. + * @param {string} blockType Name of block. + * @param {!Blockly.Block} rootBlock Factory_base block. + * @param {!Blockly.Workspace} workspace Where the root block lives. + * @return {string} Generated language code. + * @private + */ +FactoryUtils.formatJavaScript_ = function(blockType, rootBlock, workspace) { + 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 = + JSON.stringify(contentsBlock.getFieldValue('INPUTNAME')); + } + code.push(' this.' + TYPES[contentsBlock.type] + '(' + name + ')'); + var check = FactoryUtils.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 = FactoryUtils.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(FactoryUtils.connectionLineJs_('setOutput', 'OUTPUTTYPE', workspace)); + break; + case 'BOTH': + code.push( + FactoryUtils.connectionLineJs_('setPreviousStatement', 'TOPTYPE', workspace)); + code.push( + FactoryUtils.connectionLineJs_('setNextStatement', 'BOTTOMTYPE', workspace)); + break; + case 'TOP': + code.push( + FactoryUtils.connectionLineJs_('setPreviousStatement', 'TOPTYPE', workspace)); + break; + case 'BOTTOM': + code.push( + FactoryUtils.connectionLineJs_('setNextStatement', 'BOTTOMTYPE', workspace)); + break; + } + // Generate colour. + var colourBlock = rootBlock.getInputTargetBlock('COLOUR'); + if (colourBlock && !colourBlock.disabled) { + var hue = parseInt(colourBlock.getFieldValue('HUE'), 10); + if (!isNaN(hue)) { + code.push(' this.setColour(' + hue + ');'); + } + } + + var tooltip = FactoryUtils.getTooltipFromRootBlock_(rootBlock); + var helpUrl = FactoryUtils.getHelpUrlFromRootBlock_(rootBlock); + code.push(' this.setTooltip(' + JSON.stringify(tooltip) + ');'); + code.push(' this.setHelpUrl(' + JSON.stringify(helpUrl) + ');'); + 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. + * @param {!Blockly.Workspace} workspace Where the root block lives. + * @return {string} Line of JavaScript code to create connection. + * @private + */ +FactoryUtils.connectionLineJs_ = function(functionName, typeName, workspace) { + var type = FactoryUtils.getOptTypesFrom( + FactoryUtils.getRootBlock(workspace), 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 + */ +FactoryUtils.getFieldsJs_ = function(block) { + var fields = []; + while (block) { + if (!block.disabled && !block.getInheritedDisabled()) { + switch (block.type) { + case 'field_static': + // Result: 'hello' + fields.push(JSON.stringify(block.getFieldValue('TEXT'))); + break; + case 'field_label_serializable': + // Result: new Blockly.FieldLabelSerializable('Hello'), 'GREET' + fields.push('new Blockly.FieldLabelSerializable(' + + JSON.stringify(block.getFieldValue('TEXT')) + '), ' + + JSON.stringify(block.getFieldValue('FIELDNAME'))); + break; + case 'field_input': + // Result: new Blockly.FieldTextInput('Hello'), 'GREET' + fields.push('new Blockly.FieldTextInput(' + + JSON.stringify(block.getFieldValue('TEXT')) + '), ' + + JSON.stringify(block.getFieldValue('FIELDNAME'))); + break; + case 'field_number': + // Result: new Blockly.FieldNumber(10, 0, 100, 1), 'NUMBER' + var args = [ + Number(block.getFieldValue('VALUE')), + Number(block.getFieldValue('MIN')), + Number(block.getFieldValue('MAX')), + Number(block.getFieldValue('PRECISION')) + ]; + // Remove any trailing arguments that aren't needed. + if (args[3] == 0) { + args.pop(); + if (args[2] == Infinity) { + args.pop(); + if (args[1] == -Infinity) { + args.pop(); + } + } + } + fields.push('new Blockly.FieldNumber(' + args.join(', ') + '), ' + + JSON.stringify(block.getFieldValue('FIELDNAME'))); + break; + case 'field_angle': + // Result: new Blockly.FieldAngle(90), 'ANGLE' + fields.push('new Blockly.FieldAngle(' + + Number(block.getFieldValue('ANGLE')) + '), ' + + JSON.stringify(block.getFieldValue('FIELDNAME'))); + break; + case 'field_checkbox': + // Result: new Blockly.FieldCheckbox('TRUE'), 'CHECK' + fields.push('new Blockly.FieldCheckbox(' + + JSON.stringify(block.getFieldValue('CHECKED')) + + '), ' + + JSON.stringify(block.getFieldValue('FIELDNAME'))); + break; + case 'field_colour': + // Result: new Blockly.FieldColour('#ff0000'), 'COLOUR' + fields.push('new Blockly.FieldColour(' + + JSON.stringify(block.getFieldValue('COLOUR')) + + '), ' + + JSON.stringify(block.getFieldValue('FIELDNAME'))); + break; + case 'field_date': + // Result: new Blockly.FieldDate('2015-02-04'), 'DATE' + fields.push('new Blockly.FieldDate(' + + JSON.stringify(block.getFieldValue('DATE')) + '), ' + + JSON.stringify(block.getFieldValue('FIELDNAME'))); + break; + case 'field_variable': + // Result: new Blockly.FieldVariable('item'), 'VAR' + var varname + = JSON.stringify(block.getFieldValue('TEXT') || null); + fields.push('new Blockly.FieldVariable(' + varname + '), ' + + JSON.stringify(block.getFieldValue('FIELDNAME'))); + break; + case 'field_dropdown': + // Result: + // new Blockly.FieldDropdown([['yes', '1'], ['no', '0']]), 'TOGGLE' + var options = []; + for (var i = 0; i < block.optionList_.length; i++) { + options[i] = JSON.stringify([block.getUserData(i), + block.getFieldValue('CPU' + i)]); + } + if (options.length) { + fields.push('new Blockly.FieldDropdown([' + + options.join(', ') + ']), ' + + JSON.stringify(block.getFieldValue('FIELDNAME'))); + } + break; + case 'field_image': + // Result: new Blockly.FieldImage('http://...', 80, 60, '*') + var src = JSON.stringify(block.getFieldValue('SRC')); + var width = Number(block.getFieldValue('WIDTH')); + var height = Number(block.getFieldValue('HEIGHT')); + var alt = JSON.stringify(block.getFieldValue('ALT')); + var flipRtl = JSON.stringify(block.getFieldValue('FLIP_RTL')); + fields.push('new Blockly.FieldImage(' + + src + ', ' + width + ', ' + height + + ', { alt: ' + alt + ', flipRtl: ' + flipRtl + ' })'); + 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 + */ +FactoryUtils.getFieldsJson_ = function(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_label_serializable': + fields.push({ + type: block.type, + name: block.getFieldValue('FIELDNAME'), + text: block.getFieldValue('TEXT') + }); + break; + case 'field_input': + fields.push({ + type: block.type, + name: block.getFieldValue('FIELDNAME'), + text: block.getFieldValue('TEXT') + }); + break; + case 'field_number': + var obj = { + type: block.type, + name: block.getFieldValue('FIELDNAME'), + value: Number(block.getFieldValue('VALUE')) + }; + var min = Number(block.getFieldValue('MIN')); + if (min > -Infinity) { + obj.min = min; + } + var max = Number(block.getFieldValue('MAX')); + if (max < Infinity) { + obj.max = max; + } + var precision = Number(block.getFieldValue('PRECISION')); + if (precision) { + obj.precision = precision; + } + fields.push(obj); + 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.optionList_.length; i++) { + options[i] = [block.getUserData(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'), + flipRtl: block.getFieldValue('FLIP_RTL') == 'TRUE' + }); + break; + } + } + block = block.nextConnection && block.nextConnection.targetBlock(); + } + return fields; +}; + +/** + * 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. + */ +FactoryUtils.getOptTypesFrom = function(block, name) { + var types = FactoryUtils.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 + */ +FactoryUtils.getTypesFrom_ = function(block, name) { + var typeBlock = block.getInputTargetBlock(name); + var types; + if (!typeBlock || typeBlock.disabled) { + types = []; + } else if (typeBlock.type == 'type_other') { + types = [JSON.stringify(typeBlock.getFieldValue('TYPE'))]; + } else if (typeBlock.type == 'type_group') { + types = []; + for (var n = 0; n < typeBlock.typeCount_; n++) { + types = types.concat(FactoryUtils.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 = [JSON.stringify(typeBlock.valueType)]; + } + return types; +}; + +/** + * Return the uneditable container block that everything else attaches to in + * given workspace. + * @param {!Blockly.Workspace} workspace Where the root block lives. + * @return {Blockly.Block} Root block. + */ +FactoryUtils.getRootBlock = function(workspace) { + var blocks = workspace.getTopBlocks(false); + for (var i = 0, block; block = blocks[i]; i++) { + if (block.type == 'factory_base') { + return block; + } + } + return null; +}; + +// TODO(quachtina96): Move hide, show, makeInvisible, and makeVisible to a new +// AppView namespace. + +/** + * Hides element so that it's invisible and doesn't take up space. + * @param {string} elementID ID of element to hide. + */ +FactoryUtils.hide = function(elementID) { + document.getElementById(elementID).style.display = 'none'; +}; + +/** + * Un-hides an element. + * @param {string} elementID ID of element to hide. + */ +FactoryUtils.show = function(elementID) { + document.getElementById(elementID).style.display = 'block'; +}; + +/** + * Hides element so that it's invisible but still takes up space. + * @param {string} elementID ID of element to hide. + */ +FactoryUtils.makeInvisible = function(elementID) { + document.getElementById(elementID).visibility = 'hidden'; +}; + +/** + * Makes element visible. + * @param {string} elementID ID of element to hide. + */ +FactoryUtils.makeVisible = function(elementID) { + document.getElementById(elementID).visibility = 'visible'; +}; + +/** + * Create a file with the given attributes and download it. + * @param {string} contents The contents of the file. + * @param {string} filename The name of the file to save to. + * @param {string} fileType The type of the file to save. + */ +FactoryUtils.createAndDownloadFile = function(contents, filename, fileType) { + var data = new Blob([contents], {type: 'text/' + fileType}); + var clickEvent = new MouseEvent("click", { + "view": window, + "bubbles": true, + "cancelable": false + }); + + var a = document.createElement('a'); + a.href = window.URL.createObjectURL(data); + a.download = filename; + a.textContent = 'Download file!'; + a.dispatchEvent(clickEvent); +}; + +/** + * Get Blockly Block by rendering pre-defined block in workspace. + * @param {!Element} blockType Type of block that has already been defined. + * @param {!Blockly.Workspace} workspace Workspace on which to render + * the block. + * @return {!Blockly.Block} The Blockly.Block of desired type. + */ +FactoryUtils.getDefinedBlock = function(blockType, workspace) { + workspace.clear(); + return workspace.newBlock(blockType); +}; + +/** + * Parses a block definition get the type of the block it defines. + * @param {string} blockDef A single block definition. + * @return {string} Type of block defined by the given definition. + */ +FactoryUtils.getBlockTypeFromJsDefinition = function(blockDef) { + var indexOfStartBracket = blockDef.indexOf('[\''); + var indexOfEndBracket = blockDef.indexOf('\']'); + if (indexOfStartBracket != -1 && indexOfEndBracket != -1) { + return blockDef.substring(indexOfStartBracket + 2, indexOfEndBracket); + } else { + throw Error('Could not parse block type out of JavaScript block ' + + 'definition. Brackets normally enclosing block type not found.'); + } +}; + +/** + * Generates a category containing blocks of the specified block types. + * @param {!Array.} blocks Blocks to include in the category. + * @param {string} categoryName Name to use for the generated category. + * @return {!Element} Category XML containing the given block types. + */ +FactoryUtils.generateCategoryXml = function(blocks, categoryName) { + // Create category DOM element. + var categoryElement = Blockly.utils.xml.createElement('category'); + categoryElement.setAttribute('name', categoryName); + + // For each block, add block element to category. + for (var i = 0, block; block = blocks[i]; i++) { + + // Get preview block XML. + var blockXml = Blockly.Xml.blockToDom(block); + blockXml.removeAttribute('id'); + + // Add block to category and category to XML. + categoryElement.appendChild(blockXml); + } + return categoryElement; +}; + +/** + * Parses a string containing JavaScript block definition(s) to create an array + * in which each element is a single block definition. + * @param {string} blockDefsString JavaScript block definition(s). + * @return {!Array.} Array of block definitions. + */ +FactoryUtils.parseJsBlockDefinitions = function(blockDefsString) { + var blockDefArray = []; + var defStart = blockDefsString.indexOf('Blockly.Blocks'); + + while (blockDefsString.indexOf('Blockly.Blocks', defStart) != -1) { + var nextStart = blockDefsString.indexOf('Blockly.Blocks', defStart + 1); + if (nextStart == -1) { + // This is the last block definition. + nextStart = blockDefsString.length; + } + var blockDef = blockDefsString.substring(defStart, nextStart); + blockDefArray.push(blockDef); + defStart = nextStart; + } + return blockDefArray; +}; + +/** + * Parses a string containing JSON block definition(s) to create an array + * in which each element is a single block definition. Expected input is + * one or more block definitions in the form of concatenated, stringified + * JSON objects. + * @param {string} blockDefsString String containing JSON block + * definition(s). + * @return {!Array.} Array of block definitions. + */ +FactoryUtils.parseJsonBlockDefinitions = function(blockDefsString) { + var blockDefArray = []; + var unbalancedBracketCount = 0; + var defStart = 0; + // Iterate through the blockDefs string. Keep track of whether brackets + // are balanced. + for (var i = 0; i < blockDefsString.length; i++) { + var currentChar = blockDefsString[i]; + if (currentChar == '{') { + unbalancedBracketCount++; + } + else if (currentChar == '}') { + unbalancedBracketCount--; + if (unbalancedBracketCount == 0 && i > 0) { + // The brackets are balanced. We've got a complete block defintion. + var blockDef = blockDefsString.substring(defStart, i + 1); + blockDefArray.push(blockDef); + defStart = i + 1; + } + } + } + return blockDefArray; +}; + +/** + * Define blocks from imported block definitions. + * @param {string} blockDefsString Block definition(s). + * @param {string} format Block definition format ('JSON' or 'JavaScript'). + * @return {!Array.} Array of block types defined. + */ +FactoryUtils.defineAndGetBlockTypes = function(blockDefsString, format) { + var blockTypes = []; + + // Define blocks and get block types. + if (format == 'JSON') { + var blockDefArray = FactoryUtils.parseJsonBlockDefinitions(blockDefsString); + + // Populate array of blocktypes and define each block. + for (var i = 0, blockDef; blockDef = blockDefArray[i]; i++) { + var json = JSON.parse(blockDef); + blockTypes.push(json.type); + + // Define the block. + Blockly.Blocks[json.type] = { + init: function() { + this.jsonInit(json); + } + }; + } + } else if (format == 'JavaScript') { + var blockDefArray = FactoryUtils.parseJsBlockDefinitions(blockDefsString); + + // Populate array of block types. + for (var i = 0, blockDef; blockDef = blockDefArray[i]; i++) { + var blockType = FactoryUtils.getBlockTypeFromJsDefinition(blockDef); + blockTypes.push(blockType); + } + + // Define all blocks. + eval(blockDefsString); + } + + return blockTypes; +}; + +/** + * 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.
+ */
+FactoryUtils.injectCode = function(code, id) {
+  var pre = document.getElementById(id);
+  pre.textContent = code;
+  // Remove the 'prettyprinted' class, so that Prettify will recalculate.
+  pre.className = pre.className.replace('prettyprinted', '');
+  PR.prettyPrint();
+};
+
+/**
+ * Returns whether or not two blocks are the same based on their XML. Expects
+ * XML with a single child node that is a factory_base block, the XML found on
+ * Block Factory's main workspace.
+ * @param {!Element} blockXml1 An XML element with a single child node that
+ *    is a factory_base block.
+ * @param {!Element} blockXml2 An XML element with a single child node that
+ *    is a factory_base block.
+ * @return {boolean} Whether or not two blocks are the same based on their XML.
+ */
+FactoryUtils.sameBlockXml = function(blockXml1, blockXml2) {
+  // Each XML element should contain a single child element with a 'block' tag
+  if (blockXml1.tagName.toLowerCase() != 'xml' ||
+      blockXml2.tagName.toLowerCase() != 'xml') {
+    throw Error('Expected two XML elements, received elements with tag ' +
+        'names: ' + blockXml1.tagName + ' and ' + blockXml2.tagName + '.');
+  }
+
+  // Compare the block elements directly. The XML tags may include other meta
+  // information we want to ignore.
+  var blockElement1 = blockXml1.getElementsByTagName('block')[0];
+  var blockElement2 = blockXml2.getElementsByTagName('block')[0];
+
+  if (!(blockElement1 && blockElement2)) {
+    throw Error('Could not get find block element in XML.');
+  }
+
+  var cleanBlockXml1 = FactoryUtils.cleanXml(blockElement1);
+  var cleanBlockXml2 = FactoryUtils.cleanXml(blockElement2);
+
+  var blockXmlText1 = Blockly.Xml.domToText(cleanBlockXml1);
+  var blockXmlText2 = Blockly.Xml.domToText(cleanBlockXml2);
+
+  // Strip white space.
+  blockXmlText1 = blockXmlText1.replace(/\s+/g, '');
+  blockXmlText2 = blockXmlText2.replace(/\s+/g, '');
+
+  // Return whether or not changes have been saved.
+  return blockXmlText1 == blockXmlText2;
+};
+
+/**
+ * Strips the provided xml of any attributes that don't describe the
+ * 'structure' of the blocks (i.e. block order, field values, etc).
+ * @param {Node} xml The xml to clean.
+ * @return {Node}
+ */
+FactoryUtils.cleanXml = function(xml) {
+  var newXml = xml.cloneNode(true);
+  var node = newXml;
+  while (node) {
+    // Things like text inside tags are still treated as nodes, but they
+    // don't have attributes (or the removeAttribute function) so we can
+    // skip removing attributes from them.
+    if (node.removeAttribute) {
+      node.removeAttribute('xmlns');
+      node.removeAttribute('x');
+      node.removeAttribute('y');
+      node.removeAttribute('id');
+    }
+
+    // Try to go down the tree
+    var nextNode = node.firstChild || node.nextSibling;
+    // If we can't go down, try to go back up the tree.
+    if (!nextNode) {
+      nextNode = node.parentNode;
+      while (nextNode) {
+        // We are valid again!
+        if (nextNode.nextSibling) {
+          nextNode = nextNode.nextSibling;
+          break;
+        }
+        // Try going up again. If parentNode is null that means we have
+        // reached the top, and we will break out of both loops.
+        nextNode = nextNode.parentNode;
+      }
+    }
+    node = nextNode;
+  }
+  return newXml;
+};
+
+/**
+ * Checks if a block has a variable field. Blocks with variable fields cannot
+ * be shadow blocks.
+ * @param {Blockly.Block} block The block to check if a variable field exists.
+ * @return {boolean} True if the block has a variable field, false otherwise.
+ */
+FactoryUtils.hasVariableField = function(block) {
+  if (!block) {
+    return false;
+  }
+  return block.getVars().length > 0;
+};
+
+/**
+ * Checks if a block is a procedures block. If procedures block names are
+ * ever updated or expanded, this function should be updated as well (no
+ * other known markers for procedure blocks beyond name).
+ * @param {Blockly.Block} block The block to check.
+ * @return {boolean} True if the block is a procedure block, false otherwise.
+ */
+FactoryUtils.isProcedureBlock = function(block) {
+  return block &&
+      (block.type == 'procedures_defnoreturn' ||
+      block.type == 'procedures_defreturn' ||
+      block.type == 'procedures_callnoreturn' ||
+      block.type == 'procedures_callreturn' ||
+      block.type == 'procedures_ifreturn');
+};
+
+/**
+ * Returns whether or not a modified block's changes has been saved to the
+ * Block Library.
+ * TODO(quachtina96): move into the Block Factory Controller once made.
+ * @param {!BlockLibraryController} blockLibraryController Block Library
+ *    Controller storing custom blocks.
+ * @return {boolean} True if all changes made to the block have been saved to
+ *    the given Block Library.
+ */
+FactoryUtils.savedBlockChanges = function(blockLibraryController) {
+  if (BlockFactory.isStarterBlock()) {
+    return true;
+  }
+  var blockType = blockLibraryController.getCurrentBlockType();
+  var currentXml = Blockly.Xml.workspaceToDom(BlockFactory.mainWorkspace);
+
+  if (blockLibraryController.has(blockType)) {
+    // Block is saved in block library.
+    var savedXml = blockLibraryController.getBlockXml(blockType);
+    return FactoryUtils.sameBlockXml(savedXml, currentXml);
+  }
+  return false;
+};
+
+/**
+ * Given the root block of the factory, return the tooltip specified by the user
+ * or the empty string if no tooltip is found.
+ * @param {!Blockly.Block} rootBlock Factory_base block.
+ * @return {string} The tooltip for the generated block, or the empty string.
+ */
+FactoryUtils.getTooltipFromRootBlock_ = function(rootBlock) {
+  var tooltipBlock = rootBlock.getInputTargetBlock('TOOLTIP');
+  if (tooltipBlock && !tooltipBlock.disabled) {
+    return tooltipBlock.getFieldValue('TEXT');
+  }
+  return '';
+};
+
+/**
+ * Given the root block of the factory, return the help url specified by the
+ * user or the empty string if no tooltip is found.
+ * @param {!Blockly.Block} rootBlock Factory_base block.
+ * @return {string} The help url for the generated block, or the empty string.
+ */
+FactoryUtils.getHelpUrlFromRootBlock_ = function(rootBlock) {
+  var helpUrlBlock = rootBlock.getInputTargetBlock('HELPURL');
+  if (helpUrlBlock && !helpUrlBlock.disabled) {
+    return helpUrlBlock.getFieldValue('TEXT');
+  }
+  return '';
+};
diff --git a/js/demos/blockfactory/icon.png b/js/demos/blockfactory/icon.png
new file mode 100644
index 0000000..2fcb25e
Binary files /dev/null and b/js/demos/blockfactory/icon.png differ
diff --git a/js/demos/blockfactory/index.html b/js/demos/blockfactory/index.html
new file mode 100644
index 0000000..0c1fc87
--- /dev/null
+++ b/js/demos/blockfactory/index.html
@@ -0,0 +1,763 @@
+
+
+
+  
+  
+  Blockly Demo: Blockly Developer Tools
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+
+
+  

Blockly > + Demos > Blockly Developer Tools + +

+
+
Block Factory
+
Block Exporter
+
Workspace Factory
+
+ + +
+
+

+ First, select blocks from your block library by clicking on them. Then, use the Export Settings form to download starter code for selected blocks. +

+
+
+

Block Selector

+ + +
+
+ + +
+
+

Export Settings

+
+ +
+

Currently Selected:

+

+
+
+
+ +
+ +
+
+ +
+
+ +
+
+
+
+
+ +
+
+
+

Export Preview

+
+

Block Definitions:

+

+      
+
+

Generator Stubs:

+

+      
+
+
+ + + +
+
+

+

+ + + + + + +

+
+ +
+
+

Edit

+

Drag blocks into the workspace to configure the toolbox in your custom workspace.

+
+ + + + + +
ToolboxWorkspace
+
+
+
+ + + + + + + +
+ + +
+ + + + + + + + + + + +
+ + + + + +
+ + + + + + + +
+
+ + + + + +
+

Preview: + +

+
+ + + + + +
+
+
+
+
+ + + + + + + + + + + + + + + + +
+
+
+

Block Definition: + + +

+
+

+              
+            
+

Generator stub: + +

+
+

+            
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 20 + 65 + 120 + 160 + 210 + 230 + 260 + 290 + 330 + + + + + + + + + + + + + + + + + + 10 + + + + + + + + 1 + + + + + 10 + + + + + 1 + + + + + + + + + + + + 1 + + + + + 1 + + + + + + + 9 + + + + + + + 45 + + + + + + + + 0 + + + + + + + 3.1 + + + + + + + + 64 + + + + + 10 + + + + + + + 50 + + + + + 1 + + + + + 100 + + + + + + + 1 + + + + + 100 + + + + + + + + + + + + + + + + + abc + + + + + + + + + + + + + + text + + + + + abc + + + + + + + text + + + + + + + text + + + + + + + abc + + + + + + + abc + + + + + + + abc + + + + + + + abc + + + + + + + + + + + + + 5 + + + + + + + + + list + + + + + + + list + + + + + + + list + + + + + + + list + + + + + + + , + + + + + + + + + + + + 100 + + + + + 50 + + + + + 0 + + + + + + + #ff0000 + + + + + #3333ff + + + + + 0.5 + + + + + + + + + + + + + diff --git a/js/demos/blockfactory/link.png b/js/demos/blockfactory/link.png new file mode 100644 index 0000000..11dfd82 Binary files /dev/null and b/js/demos/blockfactory/link.png differ diff --git a/js/demos/blockfactory/standard_categories.js b/js/demos/blockfactory/standard_categories.js new file mode 100644 index 0000000..95c3324 --- /dev/null +++ b/js/demos/blockfactory/standard_categories.js @@ -0,0 +1,392 @@ +/** + * @license + * Copyright 2016 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Contains a map of standard Blockly categories used to load + * standard Blockly categories into the user's toolbox. The map is keyed by + * the lower case name of the category, and contains the Category object for + * that particular category. Also has a list of core block types provided + * by Blockly. + * + * @author Emma Dauterman (evd2014) + */ + 'use strict'; + +/** + * Namespace for StandardCategories + */ +var StandardCategories = StandardCategories || Object.create(null); + + +// Map of standard category information necessary to add a standard category +// to the toolbox. +StandardCategories.categoryMap = Object.create(null); + +StandardCategories.categoryMap['logic'] = + new ListElement(ListElement.TYPE_CATEGORY, 'Logic'); +StandardCategories.categoryMap['logic'].xml = + Blockly.Xml.textToDom( + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + ''); +StandardCategories.categoryMap['logic'].hue = 210; + +StandardCategories.categoryMap['loops'] = + new ListElement(ListElement.TYPE_CATEGORY, 'Loops'); +StandardCategories.categoryMap['loops'].xml = + Blockly.Xml.textToDom( + '' + + '' + + '' + + '' + + '10' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '1' + + '' + + '' + + '' + + '' + + '10' + + '' + + '' + + '' + + '' + + '1' + + '' + + '' + + '' + + '' + + '' + + ''); +StandardCategories.categoryMap['loops'].hue = 120; + +StandardCategories.categoryMap['math'] = + new ListElement(ListElement.TYPE_CATEGORY, 'Math'); +StandardCategories.categoryMap['math'].xml = + Blockly.Xml.textToDom( + '' + + '' + + '' + + '' + + '' + + '1' + + '' + + '' + + '' + + '' + + '1' + + '' + + '' + + '' + + '' + + '' + + '' + + '9' + + '' + + '' + + '' + + '' + + '' + + '' + + '45' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '0' + + '' + + '' + + '' + + '' + + '' + + '' + + '3.1' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '64' + + '' + + '' + + '' + + '' + + '10'+ + '' + + '' + + '' + + '' + + '' + + '' + + '50' + + '' + + '' + + '' + + '' + + '1' + + '' + + '' + + '' + + '' + + '100' + + '' + + '' + + '' + + '' + + '' + + '' + + '1' + + '' + + '' + + '' + + '' + + '100' + + '' + + '' + + '' + + '' + + ''); +StandardCategories.categoryMap['math'].hue = 230; + +StandardCategories.categoryMap['text'] = + new ListElement(ListElement.TYPE_CATEGORY, 'Text'); +StandardCategories.categoryMap['text'].xml = + Blockly.Xml.textToDom( + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + 'abc' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + 'text' + + '' + + '' + + '' + + '' + + 'abc' + + '' + + '' + + '' + + '' + + '' + + '' + + 'text' + + '' + + '' + + '' + + '' + + '' + + '' + + 'text' + + '' + + '' + + '' + + '' + + '' + + '' + + 'abc' + + '' + + '' + + '' + + '' + + '' + + '' + + 'abc' + + '' + + '' + + '' + + '' + + '' + + '' + + 'abc' + + '' + + '' + + '' + + '' + + '' + + '' + + 'abc' + + '' + + '' + + '' + + ''); +StandardCategories.categoryMap['text'].hue = 160; + +StandardCategories.categoryMap['lists'] = + new ListElement(ListElement.TYPE_CATEGORY, 'Lists'); +StandardCategories.categoryMap['lists'].xml = + Blockly.Xml.textToDom( + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '5' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + 'list' + + '' + + '' + + '' + + '' + + '' + + '' + + 'list' + + '' + + '' + + '' + + '' + + '' + + '' + + 'list' + + '' + + '' + + '' + + '' + + '' + + '' + + 'list' + + '' + + '' + + '' + + '' + + '' + + '' + + ',' + + '' + + '' + + '' + + '' + + ''); +StandardCategories.categoryMap['lists'].hue = 260; + +StandardCategories.categoryMap['colour'] = + new ListElement(ListElement.TYPE_CATEGORY, 'Colour'); +StandardCategories.categoryMap['colour'].xml = + Blockly.Xml.textToDom( + '' + + '' + + '' + + '' + + '' + + '' + + '100' + + '' + + '' + + '' + + '' + + '50' + + '' + + '' + + '' + + '' + + '0' + + '' + + '' + + '' + + '' + + '' + + '' + + '#ff0000' + + '' + + '' + + '' + + '' + + '#3333ff' + + '' + + '' + + '' + + '' + + '0.5' + + '' + + '' + + '' + + ''); +StandardCategories.categoryMap['colour'].hue = 20; + +StandardCategories.categoryMap['functions'] = + new ListElement(ListElement.TYPE_CATEGORY, 'Functions'); +StandardCategories.categoryMap['functions'].hue = 290; +StandardCategories.categoryMap['functions'].custom = 'PROCEDURE'; + +StandardCategories.categoryMap['variables'] = + new ListElement(ListElement.TYPE_CATEGORY, 'Variables'); +StandardCategories.categoryMap['variables'].hue = 330; +StandardCategories.categoryMap['variables'].custom = 'VARIABLE'; + +// All standard block types in provided in Blockly core. +StandardCategories.coreBlockTypes = ["controls_if", "logic_compare", + "logic_operation", "logic_negate", "logic_boolean", "logic_null", + "logic_ternary", "controls_repeat_ext", "controls_whileUntil", + "controls_for", "controls_forEach", "controls_flow_statements", + "math_number", "math_arithmetic", "math_single", "math_trig", + "math_constant", "math_number_property", "math_change", "math_round", + "math_on_list", "math_modulo", "math_constrain", "math_random_int", + "math_random_float", "text", "text_join", "text_append", "text_length", + "text_isEmpty", "text_indexOf", "variables_get", "text_charAt", + "text_getSubstring", "text_changeCase", "text_trim", "text_print", + "text_prompt_ext", "colour_picker", "colour_random", "colour_rgb", + "colour_blend", "lists_create_with", "lists_repeat", "lists_length", + "lists_isEmpty", "lists_indexOf", "lists_getIndex", "lists_setIndex", + "lists_getSublist", "lists_split", "lists_sort", "variables_set", + "procedures_defreturn", "procedures_ifreturn", "procedures_defnoreturn", + "procedures_callreturn"]; diff --git a/js/demos/blockfactory/workspacefactory/wfactory_controller.js b/js/demos/blockfactory/workspacefactory/wfactory_controller.js new file mode 100644 index 0000000..30f032e --- /dev/null +++ b/js/demos/blockfactory/workspacefactory/wfactory_controller.js @@ -0,0 +1,1348 @@ +/** + * @license + * Copyright 2016 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Contains the controller code for workspace factory. Depends + * on the model and view objects (created as internal variables) and interacts + * with previewWorkspace and toolboxWorkspace (internal references stored to + * both). Also depends on standard_categories.js for standard Blockly + * categories. Provides the functionality for the actions the user can initiate: + * - adding and removing categories + * - switching between categories + * - printing and downloading configuration xml + * - updating the preview workspace + * - changing a category name + * - moving the position of a category. + * + * @author Emma Dauterman (evd2014) + */ + +/** + * Class for a WorkspaceFactoryController + * @param {string} toolboxName Name of workspace toolbox XML. + * @param {string} toolboxDiv Name of div to inject toolbox workspace in. + * @param {string} previewDiv Name of div to inject preview workspace in. + * @constructor + */ +WorkspaceFactoryController = function(toolboxName, toolboxDiv, previewDiv) { + // Toolbox XML element for the editing workspace. + this.toolbox = document.getElementById(toolboxName); + + // Workspace for user to drag blocks in for a certain category. + this.toolboxWorkspace = Blockly.inject(toolboxDiv, + {grid: + {spacing: 25, + length: 3, + colour: '#ccc', + snap: true}, + media: '../../media/', + toolbox: this.toolbox + }); + + // Workspace for user to preview their changes. + this.previewWorkspace = Blockly.inject(previewDiv, + {grid: + {spacing: 25, + length: 3, + colour: '#ccc', + snap: true}, + media: '../../media/', + toolbox: '', + zoom: + {controls: true, + wheel: true} + }); + + // Model to keep track of categories and blocks. + this.model = new WorkspaceFactoryModel(); + // Updates the category tabs. + this.view = new WorkspaceFactoryView(); + // Generates XML for categories. + this.generator = new WorkspaceFactoryGenerator(this.model); + // Tracks which editing mode the user is in. Toolbox mode on start. + this.selectedMode = WorkspaceFactoryController.MODE_TOOLBOX; + // True if key events are enabled, false otherwise. + this.keyEventsEnabled = true; + // True if there are unsaved changes in the toolbox, false otherwise. + this.hasUnsavedToolboxChanges = false; + // True if there are unsaved changes in the preloaded blocks, false otherwise. + this.hasUnsavedPreloadChanges = false; +}; + +// Toolbox editing mode. Changes the user makes to the workspace updates the +// toolbox. +WorkspaceFactoryController.MODE_TOOLBOX = 'toolbox'; +// Pre-loaded workspace editing mode. Changes the user makes to the workspace +// udpates the pre-loaded blocks. +WorkspaceFactoryController.MODE_PRELOAD = 'preload'; + +/** + * Currently prompts the user for a name, checking that it's valid (not used + * before), and then creates a tab and switches to it. + */ +WorkspaceFactoryController.prototype.addCategory = function() { + // Transfers the user's blocks to a flyout if it's the first category created. + this.transferFlyoutBlocksToCategory(); + + // After possibly creating a category, check again if it's the first category. + var isFirstCategory = !this.model.hasElements(); + // Get name from user. + var name = this.promptForNewCategoryName('Enter the name of your new category:'); + if (!name) { // Exit if cancelled. + return; + } + // Create category. + this.createCategory(name); + // Switch to category. + this.switchElement(this.model.getCategoryIdByName(name)); + + // Sets the default options for injecting the workspace + // when there are categories if adding the first category. + if (isFirstCategory) { + this.view.setCategoryOptions(this.model.hasElements()); + this.generateNewOptions(); + } + // Update preview. + this.updatePreview(); +}; + +/** + * Helper method for addCategory. Adds a category to the view given a name, ID, + * and a boolean for if it's the first category created. Assumes the category + * has already been created in the model. Does not switch to category. + * @param {string} name Name of category being added. + * @param {string} id The ID of the category being added. + */ +WorkspaceFactoryController.prototype.createCategory = function(name) { + // Create empty category + var category = new ListElement(ListElement.TYPE_CATEGORY, name); + this.model.addElementToList(category); + // Create new category. + var tab = this.view.addCategoryRow(name, category.id); + this.addClickToSwitch(tab, category.id); +}; + +/** + * Given a tab and a ID to be associated to that tab, adds a listener to + * that tab so that when the user clicks on the tab, it switches to the + * element associated with that ID. + * @param {!Element} tab The DOM element to add the listener to. + * @param {string} id The ID of the element to switch to when tab is clicked. + */ +WorkspaceFactoryController.prototype.addClickToSwitch = function(tab, id) { + var self = this; + var clickFunction = function(id) { // Keep this in scope for switchElement. + return function() { + self.switchElement(id); + }; + }; + this.view.bindClick(tab, clickFunction(id)); +}; + +/** + * Transfers the blocks in the user's flyout to a new category if + * the user is creating their first category and their workspace is not + * empty. Should be called whenever it is possible to switch from single flyout + * to categories (not including importing). + */ +WorkspaceFactoryController.prototype.transferFlyoutBlocksToCategory = + function() { + // Saves the user's blocks from the flyout in a category if there is no + // toolbox and the user has dragged in blocks. + if (!this.model.hasElements() && + this.toolboxWorkspace.getAllBlocks(false).length > 0) { + // Create the new category. + this.createCategory('Category 1', true); + // Set the new category as selected. + var id = this.model.getCategoryIdByName('Category 1'); + this.model.setSelectedById(id); + this.view.setCategoryTabSelection(id, true); + // Allow user to use the default options for injecting with categories. + this.view.setCategoryOptions(this.model.hasElements()); + this.generateNewOptions(); + // Update preview here in case exit early. + this.updatePreview(); + } +}; + +/** + * Attached to "-" button. Checks if the user wants to delete + * the current element. Removes the element and switches to another element. + * When the last element is removed, it switches to a single flyout mode. + */ +WorkspaceFactoryController.prototype.removeElement = function() { + // Check that there is a currently selected category to remove. + if (!this.model.getSelected()) { + return; + } + + // Check if user wants to remove current category. + var check = confirm('Are you sure you want to delete the currently selected ' + + this.model.getSelected().type + '?'); + if (!check) { // If cancelled, exit. + return; + } + + var selectedId = this.model.getSelectedId(); + var selectedIndex = this.model.getIndexByElementId(selectedId); + // Delete element visually. + this.view.deleteElementRow(selectedId, selectedIndex); + // Delete element in model. + this.model.deleteElementFromList(selectedIndex); + + // Find next logical element to switch to. + var next = this.model.getElementByIndex(selectedIndex); + if (!next && this.model.hasElements()) { + next = this.model.getElementByIndex(selectedIndex - 1); + } + var nextId = next ? next.id : null; + + // Open next element. + this.clearAndLoadElement(nextId); + + // If no element to switch to, display message, clear the workspace, and + // set a default selected element not in toolbox list in the model. + if (!nextId) { + alert('You currently have no categories or separators. All your blocks' + + ' will be displayed in a single flyout.'); + this.toolboxWorkspace.clear(); + this.toolboxWorkspace.clearUndo(); + this.model.createDefaultSelectedIfEmpty(); + } + // Update preview. + this.updatePreview(); +}; + +/** + * Gets a valid name for a new category from the user. + * @param {string} promptString Prompt for the user to enter a name. + * @param {string=} opt_oldName The current name. + * @return {string?} Valid name for a new category, or null if cancelled. + */ +WorkspaceFactoryController.prototype.promptForNewCategoryName = + function(promptString, opt_oldName) { + var defaultName = opt_oldName; + do { + var name = prompt(promptString, defaultName); + if (!name) { // If cancelled. + return null; + } + defaultName = name; + } while (this.model.hasCategoryByName(name)); + return name; +}; + +/** + * Switches to a new tab for the element given by ID. Stores XML and blocks + * to reload later, updates selected accordingly, and clears the workspace + * and clears undo, then loads the new element. + * @param {string} id ID of tab to be opened, must be valid element ID. + */ +WorkspaceFactoryController.prototype.switchElement = function(id) { + // Disables events while switching so that Blockly delete and create events + // don't update the preview repeatedly. + Blockly.Events.disable(); + // Caches information to reload or generate XML if switching to/from element. + // Only saves if a category is selected. + if (this.model.getSelectedId() != null && id != null) { + this.model.getSelected().saveFromWorkspace(this.toolboxWorkspace); + } + // Load element. + this.clearAndLoadElement(id); + // Enable Blockly events again. + Blockly.Events.enable(); +}; + +/** + * Switches to a new tab for the element by ID. Helper for switchElement. + * Updates selected, clears the workspace and clears undo, loads a new element. + * @param {string} id ID of category to load. + */ +WorkspaceFactoryController.prototype.clearAndLoadElement = function(id) { + // Unselect current tab if switching to and from an element. + if (this.model.getSelectedId() != null && id != null) { + this.view.setCategoryTabSelection(this.model.getSelectedId(), false); + } + + // If switching to another category, set category selection in the model and + // view. + if (id != null) { + // Set next category. + this.model.setSelectedById(id); + + // Clears workspace and loads next category. + this.clearAndLoadXml_(this.model.getSelectedXml()); + + // Selects the next tab. + this.view.setCategoryTabSelection(id, true); + + // Order blocks as shown in flyout. + this.toolboxWorkspace.cleanUp(); + + // Update category editing buttons. + this.view.updateState(this.model.getIndexByElementId + (this.model.getSelectedId()), this.model.getSelected()); + } else { + // Update category editing buttons for no categories. + this.view.updateState(-1, null); + } +}; + +/** + * Tied to "Export" button. Gets a file name from the user and downloads + * the corresponding configuration XML to that file. + * @param {string} exportMode The type of file to export + * (WorkspaceFactoryController.MODE_TOOLBOX for the toolbox configuration, + * and WorkspaceFactoryController.MODE_PRELOAD for the pre-loaded workspace + * configuration) + */ +WorkspaceFactoryController.prototype.exportXmlFile = function(exportMode) { + // Get file name. + if (exportMode == WorkspaceFactoryController.MODE_TOOLBOX) { + var fileName = prompt('File Name for toolbox XML:', 'toolbox.xml'); + } else { + var fileName = prompt('File Name for pre-loaded workspace XML:', + 'workspace.xml'); + } + if (!fileName) { // If cancelled. + return; + } + + // Generate XML. + if (exportMode == WorkspaceFactoryController.MODE_TOOLBOX) { + // Export the toolbox XML. + var configXml = Blockly.Xml.domToPrettyText( + this.generator.generateToolboxXml()); + this.hasUnsavedToolboxChanges = false; + } else if (exportMode == WorkspaceFactoryController.MODE_PRELOAD) { + // Export the pre-loaded block XML. + var configXml = Blockly.Xml.domToPrettyText( + this.generator.generateWorkspaceXml()); + this.hasUnsavedPreloadChanges = false; + } else { + // Unknown mode. Throw error. + var msg = 'Unknown export mode: ' + exportMode; + BlocklyDevTools.Analytics.onError(msg); + throw Error(msg); + } + + // Unpack self-closing tags. These tags fail when embedded in HTML. + // -> + configXml = configXml.replace(/<(\w+)([^<]*)\/>/g, '<$1$2>'); + + // Download file. + var data = new Blob([configXml], {type: 'text/xml'}); + this.view.createAndDownloadFile(fileName, data); + + if (exportMode == WorkspaceFactoryController.MODE_TOOLBOX) { + BlocklyDevTools.Analytics.onExport( + BlocklyDevTools.Analytics.TOOLBOX, + { format: BlocklyDevTools.Analytics.FORMAT_XML }); + } else if (exportMode == WorkspaceFactoryController.MODE_PRELOAD) { + BlocklyDevTools.Analytics.onExport( + BlocklyDevTools.Analytics.WORKSPACE_CONTENTS, + { format: BlocklyDevTools.Analytics.FORMAT_XML }); + } +}; + +/** + * Export the options object to be used for the Blockly inject call. Gets a + * file name from the user and downloads the options object to that file. + */ +WorkspaceFactoryController.prototype.exportInjectFile = function() { + var fileName = prompt('File Name for starter Blockly workspace code:', + 'workspace.js'); + if (!fileName) { // If cancelled. + return; + } + // Generate new options to remove toolbox XML from options object (if + // necessary). + this.generateNewOptions(); + var printableOptions = this.generator.generateInjectString() + var data = new Blob([printableOptions], {type: 'text/javascript'}); + this.view.createAndDownloadFile(fileName, data); + + BlocklyDevTools.Analytics.onExport( + BlocklyDevTools.Analytics.STARTER_CODE, + { + format: BlocklyDevTools.Analytics.FORMAT_JS, + platform: BlocklyDevTools.Analytics.PLATFORM_WEB + }); +}; + +/** + * Tied to "Print" button. Mainly used for debugging purposes. Prints + * the configuration XML to the console. + */ +WorkspaceFactoryController.prototype.printConfig = function() { + // Capture any changes made by user before generating XML. + this.saveStateFromWorkspace(); + // Print XML. + console.log(Blockly.Xml.domToPrettyText(this.generator.generateToolboxXml())); +}; + +/** + * Updates the preview workspace based on the toolbox workspace. If switching + * from no categories to categories or categories to no categories, reinjects + * Blockly with reinjectPreview, otherwise just updates without reinjecting. + * Called whenever a list element is created, removed, or modified and when + * Blockly move and delete events are fired. Do not call on create events + * or disabling will cause the user to "drop" their current blocks. Make sure + * that no changes have been made to the workspace since updating the model + * (if this might be the case, call saveStateFromWorkspace). + */ +WorkspaceFactoryController.prototype.updatePreview = function() { + // Disable events to stop updatePreview from recursively calling itself + // through event handlers. + Blockly.Events.disable(); + + // Only update the toolbox if not in read only mode. + if (!this.model.options['readOnly']) { + // Get toolbox XML. + var tree = Blockly.Options.parseToolboxTree( + this.generator.generateToolboxXml()); + + // No categories, creates a simple flyout. + if (tree.getElementsByTagName('category').length == 0) { + // No categories, creates a simple flyout. + if (this.previewWorkspace.toolbox_) { + this.reinjectPreview(tree); // Switch to simple flyout, expensive. + } else { + this.previewWorkspace.updateToolbox(tree); + } + } else { + // Uses categories, creates a toolbox. + if (!this.previewWorkspace.toolbox_) { + this.reinjectPreview(tree); // Create a toolbox, expensive. + } else { + // Close the toolbox before updating it so that the user has to reopen + // the flyout and see their updated toolbox (open flyout doesn't update) + this.previewWorkspace.toolbox_.clearSelection(); + this.previewWorkspace.updateToolbox(tree); + } + } + } + + // Update pre-loaded blocks in the preview workspace. + this.previewWorkspace.clear(); + Blockly.Xml.domToWorkspace(this.generator.generateWorkspaceXml(), + this.previewWorkspace); + + // Reenable events. + Blockly.Events.enable(); +}; + +/** + * Saves the state from the workspace depending on the current mode. Should + * be called after making changes to the workspace. + */ +WorkspaceFactoryController.prototype.saveStateFromWorkspace = function() { + if (this.selectedMode == WorkspaceFactoryController.MODE_TOOLBOX) { + // If currently editing the toolbox. + // Update flags if toolbox has been changed. + if (this.model.getSelectedXml() != + Blockly.Xml.workspaceToDom(this.toolboxWorkspace)) { + this.hasUnsavedToolboxChanges = true; + } + + this.model.getSelected().saveFromWorkspace(this.toolboxWorkspace); + + } else if (this.selectedMode == WorkspaceFactoryController.MODE_PRELOAD) { + // If currently editing the pre-loaded workspace. + // Update flags if preloaded blocks have been changed. + if (this.model.getPreloadXml() != + Blockly.Xml.workspaceToDom(this.toolboxWorkspace)) { + this.hasUnsavedPreloadChanges = true; + } + + this.model.savePreloadXml( + Blockly.Xml.workspaceToDom(this.toolboxWorkspace)); + } +}; + +/** + * Used to completely reinject the preview workspace. This should be used only + * when switching from simple flyout to categories, or categories to simple + * flyout. More expensive than simply updating the flyout or toolbox. + * @param {!Element} Tree of XML elements + * @package + */ +WorkspaceFactoryController.prototype.reinjectPreview = function(tree) { + this.previewWorkspace.dispose(); + var injectOptions = this.readOptions_(); + injectOptions['toolbox'] = Blockly.Xml.domToPrettyText(tree); + this.previewWorkspace = Blockly.inject('preview_blocks', injectOptions); + Blockly.Xml.domToWorkspace(this.generator.generateWorkspaceXml(), + this.previewWorkspace); +}; + +/** + * Changes the name and colour of the selected category. + * Return if selected element is a separator. + * @param {string} name New name for selected category. + * @param {?string} colour New colour for selected category, or null if none. + * Must be a valid CSS string, or '' for none. + */ +WorkspaceFactoryController.prototype.changeSelectedCategory = function(name, + colour) { + var selected = this.model.getSelected(); + // Return if a category is not selected. + if (selected.type != ListElement.TYPE_CATEGORY) { + return; + } + // Change colour of selected category. + selected.changeColor(colour); + this.view.setBorderColor(this.model.getSelectedId(), colour); + // Change category name. + selected.changeName(name); + this.view.updateCategoryName(name, this.model.getSelectedId()); + // Update preview. + this.updatePreview(); +}; + +/** + * Tied to arrow up and arrow down buttons. Swaps with the element above or + * below the currently selected element (offset categories away from the + * current element). Updates state to enable the correct element editing + * buttons. + * @param {number} offset The index offset from the currently selected element + * to swap with. Positive if the element to be swapped with is below, negative + * if the element to be swapped with is above. + */ +WorkspaceFactoryController.prototype.moveElement = function(offset) { + var curr = this.model.getSelected(); + if (!curr) { // Return if no selected element. + return; + } + var currIndex = this.model.getIndexByElementId(curr.id); + var swapIndex = this.model.getIndexByElementId(curr.id) + offset; + var swap = this.model.getElementByIndex(swapIndex); + if (!swap) { // Return if cannot swap in that direction. + return; + } + // Move currently selected element to index of other element. + // Indexes must be valid because confirmed that curr and swap exist. + this.moveElementToIndex(curr, swapIndex, currIndex); + // Update element editing buttons. + this.view.updateState(swapIndex, this.model.getSelected()); + // Update preview. + this.updatePreview(); +}; + +/** + * Moves a element to a specified index and updates the model and view + * accordingly. Helper functions throw an error if indexes are out of bounds. + * @param {!Element} element The element to move. + * @param {number} newIndex The index to insert the element at. + * @param {number} oldIndex The index the element is currently at. + */ +WorkspaceFactoryController.prototype.moveElementToIndex = function(element, + newIndex, oldIndex) { + this.model.moveElementToIndex(element, newIndex, oldIndex); + this.view.moveTabToIndex(element.id, newIndex, oldIndex); +}; + +/** + * Tied to the "Standard Category" dropdown option, this function prompts + * the user for a name of a standard Blockly category (case insensitive) and + * loads it as a new category and switches to it. Leverages StandardCategories. + */ +WorkspaceFactoryController.prototype.loadCategory = function() { + // Prompt user for the name of the standard category to load. + do { + var name = prompt('Enter the name of the category you would like to import ' + + '(Logic, Loops, Math, Text, Lists, Colour, Variables, or Functions)'); + if (!name) { + return; // Exit if cancelled. + } + } while (!this.isStandardCategoryName(name)); + + // Load category. + this.loadCategoryByName(name); +}; + +/** + * Loads a Standard Category by name and switches to it. Leverages + * StandardCategories. Returns if cannot load standard category. + * @param {string} name Name of the standard category to load. + */ +WorkspaceFactoryController.prototype.loadCategoryByName = function(name) { + // Check if the user can load that standard category. + if (!this.isStandardCategoryName(name)) { + return; + } + if (this.model.hasVariables() && name.toLowerCase() == 'variables') { + alert('A Variables category already exists. You cannot create multiple' + + ' variables categories.'); + return; + } + if (this.model.hasProcedures() && name.toLowerCase() == 'functions') { + alert('A Functions category already exists. You cannot create multiple' + + ' functions categories.'); + return; + } + // Check if the user can create a category with that name. + var standardCategory = StandardCategories.categoryMap[name.toLowerCase()] + if (this.model.hasCategoryByName(standardCategory.name)) { + alert('You already have a category with the name ' + standardCategory.name + + '. Rename your category and try again.'); + return; + } + if (!standardCategory.color && standardCategory.hue !== undefined) { + // Calculate the hex colour based on the hue. + standardCategory.color = Blockly.hueToHex(standardCategory.hue); + } + // Transfers current flyout blocks to a category if it's the first category + // created. + this.transferFlyoutBlocksToCategory(); + + var isFirstCategory = !this.model.hasElements(); + // Copy the standard category in the model. + var copy = standardCategory.copy(); + + // Add it to the model. + this.model.addElementToList(copy); + + // Update the copy in the view. + var tab = this.view.addCategoryRow(copy.name, copy.id); + this.addClickToSwitch(tab, copy.id); + // Color the category tab in the view. + if (copy.color) { + this.view.setBorderColor(copy.id, copy.color); + } + // Switch to loaded category. + this.switchElement(copy.id); + // Convert actual shadow blocks to user-generated shadow blocks. + this.convertShadowBlocks(); + // Save state from workspace before updating preview. + this.saveStateFromWorkspace(); + if (isFirstCategory) { + // Allow the user to use the default options for injecting the workspace + // when there are categories. + this.view.setCategoryOptions(this.model.hasElements()); + this.generateNewOptions(); + } + // Update preview. + this.updatePreview(); +}; + +/** + * Loads the standard Blockly toolbox into the editing space. Should only + * be called when the mode is set to toolbox. + */ +WorkspaceFactoryController.prototype.loadStandardToolbox = function() { + this.loadCategoryByName('Logic'); + this.loadCategoryByName('Loops'); + this.loadCategoryByName('Math'); + this.loadCategoryByName('Text'); + this.loadCategoryByName('Lists'); + this.loadCategoryByName('Colour'); + this.addSeparator(); + this.loadCategoryByName('Variables'); + this.loadCategoryByName('Functions'); +}; + +/** + * Given the name of a category, determines if it's the name of a standard + * category (case insensitive). + * @param {string} name The name of the category that should be checked if it's + * in StandardCategories categoryMap + * @return {boolean} True if name is a standard category name, false otherwise. + */ +WorkspaceFactoryController.prototype.isStandardCategoryName = function(name) { + return !!StandardCategories.categoryMap[name.toLowerCase()]; +}; + +/** + * Connected to the "add separator" dropdown option. If categories already + * exist, adds a separator to the model and view. Does not switch to select + * the separator, and updates the preview. + */ +WorkspaceFactoryController.prototype.addSeparator = function() { + // If adding the first element in the toolbox, transfers the user's blocks + // in a flyout to a category. + this.transferFlyoutBlocksToCategory(); + // Create the separator in the model. + var separator = new ListElement(ListElement.TYPE_SEPARATOR); + this.model.addElementToList(separator); + // Create the separator in the view. + var tab = this.view.addSeparatorTab(separator.id); + this.addClickToSwitch(tab, separator.id); + // Switch to the separator and update the preview. + this.switchElement(separator.id); + this.updatePreview(); +}; + +/** + * Connected to the import button. Given the file path inputted by the user + * from file input, if the import mode is for the toolbox, this function loads + * that toolbox XML to the workspace, creating category and separator tabs as + * necessary. If the import mode is for pre-loaded blocks in the workspace, + * this function loads that XML to the workspace to be edited further. This + * function switches mode to whatever the import mode is. Catches errors from + * file reading and prints an error message alerting the user. + * @param {string} file The path for the file to be imported into the workspace. + * Should contain valid toolbox XML. + * @param {string} importMode The mode corresponding to the type of file the + * user is importing (WorkspaceFactoryController.MODE_TOOLBOX or + * WorkspaceFactoryController.MODE_PRELOAD). + */ +WorkspaceFactoryController.prototype.importFile = function(file, importMode) { + // Exit if cancelled. + if (!file) { + return; + } + + Blockly.Events.disable(); + var controller = this; + var reader = new FileReader(); + + // To be executed when the reader has read the file. + reader.onload = function() { + // Try to parse XML from file and load it into toolbox editing area. + // Print error message if fail. + try { + var tree = Blockly.Xml.textToDom(reader.result); + if (importMode == WorkspaceFactoryController.MODE_TOOLBOX) { + // Switch mode. + controller.setMode(WorkspaceFactoryController.MODE_TOOLBOX); + + // Confirm that the user wants to override their current toolbox. + var hasToolboxElements = controller.model.hasElements() || + controller.toolboxWorkspace.getAllBlocks(false).length > 0; + if (hasToolboxElements) { + var msg = 'Are you sure you want to import? You will lose your ' + + 'current toolbox.'; + BlocklyDevTools.Analytics.onWarning(msg); + var continueAnyway = confirm(); + if (!continueAnyway) { + return; + } + } + // Import toolbox XML. + controller.importToolboxFromTree_(tree); + BlocklyDevTools.Analytics.onImport('Toolbox.xml'); + + } else if (importMode == WorkspaceFactoryController.MODE_PRELOAD) { + // Switch mode. + controller.setMode(WorkspaceFactoryController.MODE_PRELOAD); + + // Confirm that the user wants to override their current blocks. + if (controller.toolboxWorkspace.getAllBlocks(false).length > 0) { + var msg = 'Are you sure you want to import? You will lose your ' + + 'current workspace blocks.'; + var continueAnyway = confirm(msg); + BlocklyDevTools.Analytics.onWarning(msg); + if (!continueAnyway) { + return; + } + } + + // Import pre-loaded workspace XML. + controller.importPreloadFromTree_(tree); + BlocklyDevTools.Analytics.onImport('WorkspaceContents.xml'); + } else { + // Throw error if invalid mode. + throw Error('Unknown import mode: ' + importMode); + } + } catch(e) { + var msg = 'Cannot load XML from file.'; + alert(msg); + BlocklyDevTools.Analytics.onError(msg); + console.log(e); + } finally { + Blockly.Events.enable(); + } + } + + // Read the file asynchronously. + reader.readAsText(file); +}; + +/** + * Given a XML DOM tree, loads it into the toolbox editing area so that the + * user can continue editing their work. Assumes that tree is in valid toolbox + * XML format. Assumes that the mode is MODE_TOOLBOX. + * @param {!Element} tree XML tree to be loaded to toolbox editing area. + * @private + */ +WorkspaceFactoryController.prototype.importToolboxFromTree_ = function(tree) { + // Clear current editing area. + this.model.clearToolboxList(); + this.view.clearToolboxTabs(); + + if (tree.getElementsByTagName('category').length == 0) { + // No categories present. + // Load all the blocks into a single category evenly spaced. + Blockly.Xml.domToWorkspace(tree, this.toolboxWorkspace); + this.toolboxWorkspace.cleanUp(); + + // Convert actual shadow blocks to user-generated shadow blocks. + this.convertShadowBlocks(); + + // Add message to denote empty category. + this.view.addEmptyCategoryMessage(); + + } else { + // Categories/separators present. + for (var i = 0, item; item = tree.children[i]; i++) { + + if (item.tagName == 'category') { + // If the element is a category, create a new category and switch to it. + this.createCategory(item.getAttribute('name'), false); + var category = this.model.getElementByIndex(i); + this.switchElement(category.id); + + // Load all blocks in that category to the workspace to be evenly + // spaced and saved to that category. + for (var j = 0, blockXml; blockXml = item.children[j]; j++) { + Blockly.Xml.domToBlock(blockXml, this.toolboxWorkspace); + } + + // Evenly space the blocks. + this.toolboxWorkspace.cleanUp(); + + // Convert actual shadow blocks to user-generated shadow blocks. + this.convertShadowBlocks(); + + // Set category color. + if (item.getAttribute('colour')) { + category.changeColor(item.getAttribute('colour')); + this.view.setBorderColor(category.id, category.color); + } + // Set any custom tags. + if (item.getAttribute('custom')) { + this.model.addCustomTag(category, item.getAttribute('custom')); + } + } else { + // If the element is a separator, add the separator and switch to it. + this.addSeparator(); + this.switchElement(this.model.getElementByIndex(i).id); + } + } + } + this.view.updateState(this.model.getIndexByElementId + (this.model.getSelectedId()), this.model.getSelected()); + + this.saveStateFromWorkspace(); + + // Set default configuration options for a single flyout or multiple + // categories. + this.view.setCategoryOptions(this.model.hasElements()); + this.generateNewOptions(); + + this.updatePreview(); +}; + +/** + * Given a XML DOM tree, loads it into the pre-loaded workspace editing area. + * Assumes that tree is in valid XML format and that the selected mode is + * MODE_PRELOAD. + * @param {!Element} tree XML tree to be loaded to pre-loaded block editing + * area. + */ +WorkspaceFactoryController.prototype.importPreloadFromTree_ = function(tree) { + this.clearAndLoadXml_(tree); + this.model.savePreloadXml(tree); + this.updatePreview(); +}; + +/** + * Given a XML DOM tree, loads it into the pre-loaded workspace editing area. + * Assumes that tree is in valid XML format and that the selected mode is + * MODE_PRELOAD. + * @param {!Element} tree XML tree to be loaded to pre-loaded block editing + * area. + */ +WorkspaceFactoryController.prototype.importPreloadFromTree_ = function(tree) { + this.clearAndLoadXml_(tree); + this.model.savePreloadXml(tree); + this.saveStateFromWorkspace(); + this.updatePreview(); +}; + +/** + * Given a XML DOM tree, loads it into the pre-loaded workspace editing area. + * Assumes that tree is in valid XML format and that the selected mode is + * MODE_PRELOAD. + * @param {!Element} tree XML tree to be loaded to pre-loaded block editing + * area. + */ +WorkspaceFactoryController.prototype.importPreloadFromTree_ = function(tree) { + this.clearAndLoadXml_(tree); + this.model.savePreloadXml(tree); + this.saveStateFromWorkspace(); + this.updatePreview(); +}; + +/** + * Clears the editing area completely, deleting all categories and all + * blocks in the model and view and all pre-loaded blocks. Tied to the + * "Clear" button. + */ +WorkspaceFactoryController.prototype.clearAll = function() { + var msg = 'Are you sure you want to clear all of your work in Workspace' + + ' Factory?'; + BlocklyDevTools.Analytics.onWarning(msg); + if (!confirm(msg)) { + return; + } + var hasCategories = this.model.hasElements(); + this.model.clearToolboxList(); + this.view.clearToolboxTabs(); + this.model.savePreloadXml(Blockly.utils.xml.createElement('xml')); + this.view.addEmptyCategoryMessage(); + this.view.updateState(-1, null); + this.toolboxWorkspace.clear(); + this.toolboxWorkspace.clearUndo(); + this.saveStateFromWorkspace(); + this.hasUnsavedToolboxChanges = false; + this.hasUnsavedPreloadChanges = false; + this.view.setCategoryOptions(this.model.hasElements()); + this.generateNewOptions(); + this.updatePreview(); +}; + +/** + * Makes the currently selected block a user-generated shadow block. These + * blocks are not made into real shadow blocks, but recorded in the model + * and visually marked as shadow blocks, allowing the user to move and edit + * them (which would be impossible with actual shadow blocks). Updates the + * preview when done. + */ +WorkspaceFactoryController.prototype.addShadow = function() { + // No block selected to make a shadow block. + if (!Blockly.selected) { + return; + } + // Clear any previous warnings on the block (would only have warnings on + // a non-shadow block if it was nested inside another shadow block). + Blockly.selected.setWarningText(null); + // Set selected block and all children as shadow blocks. + this.addShadowForBlockAndChildren_(Blockly.selected); + + // Save and update the preview. + this.saveStateFromWorkspace(); + this.updatePreview(); +}; + +/** + * Sets a block and all of its children to be user-generated shadow blocks, + * both in the model and view. + * @param {!Blockly.Block} block The block to be converted to a user-generated + * shadow block. + * @private + */ +WorkspaceFactoryController.prototype.addShadowForBlockAndChildren_ = + function(block) { + // Convert to shadow block. + this.view.markShadowBlock(block); + this.model.addShadowBlock(block.id); + + if (FactoryUtils.hasVariableField(block)) { + block.setWarningText('Cannot make variable blocks shadow blocks.'); + } + + // Convert all children to shadow blocks recursively. + var children = block.getChildren(); + for (var i = 0; i < children.length; i++) { + this.addShadowForBlockAndChildren_(children[i]); + } +}; + +/** + * If the currently selected block is a user-generated shadow block, this + * function makes it a normal block again, removing it from the list of + * shadow blocks and loading the workspace again. Updates the preview again. + */ +WorkspaceFactoryController.prototype.removeShadow = function() { + // No block selected to modify. + if (!Blockly.selected) { + return; + } + this.model.removeShadowBlock(Blockly.selected.id); + this.view.unmarkShadowBlock(Blockly.selected); + + // If turning invalid shadow block back to normal block, remove warning. + Blockly.selected.setWarningText(null); + + this.saveStateFromWorkspace(); + this.updatePreview(); +}; + +/** + * Given a unique block ID, uses the model to determine if a block is a + * user-generated shadow block. + * @param {string} blockId The unique ID of the block to examine. + * @return {boolean} True if the block is a user-generated shadow block, false + * otherwise. + */ +WorkspaceFactoryController.prototype.isUserGenShadowBlock = function(blockId) { + return this.model.isShadowBlock(blockId); +}; + +/** + * Call when importing XML containing real shadow blocks. This function turns + * all real shadow blocks loaded in the workspace into user-generated shadow + * blocks, meaning they are marked as shadow blocks by the model and appear as + * shadow blocks in the view but are still editable and movable. + */ +WorkspaceFactoryController.prototype.convertShadowBlocks = function() { + var blocks = this.toolboxWorkspace.getAllBlocks(false); + for (var i = 0, block; block = blocks[i]; i++) { + if (block.isShadow()) { + block.setShadow(false); + // Delete the shadow DOM attached to the block so that the shadow block + // does not respawn. Dependent on implementation details. + var parentConnection = block.outputConnection ? + block.outputConnection.targetConnection : + block.previousConnection.targetConnection; + if (parentConnection) { + parentConnection.setShadowDom(null); + } + this.model.addShadowBlock(block.id); + this.view.markShadowBlock(block); + } + } +}; + +/** + * Sets the currently selected mode that determines what the toolbox workspace + * is being used to edit. Updates the view and then saves and loads XML + * to and from the toolbox and updates the help text. + * @param {string} tab The type of tab being switched to + * (WorkspaceFactoryController.MODE_TOOLBOX or + * WorkspaceFactoryController.MODE_PRELOAD). + */ +WorkspaceFactoryController.prototype.setMode = function(mode) { + // No work to change mode that's currently set. + if (this.selectedMode == mode) { + return; + } + + // No work to change mode that's currently set. + if (this.selectedMode == mode) { + return; + } + + // Set tab selection and display appropriate tab. + this.view.setModeSelection(mode); + + // Update selected tab. + this.selectedMode = mode; + + // Update help text above workspace. + this.view.updateHelpText(mode); + + if (mode == WorkspaceFactoryController.MODE_TOOLBOX) { + // Open the toolbox editing space. + this.model.savePreloadXml + (Blockly.Xml.workspaceToDom(this.toolboxWorkspace)); + this.clearAndLoadXml_(this.model.getSelectedXml()); + this.view.disableWorkspace(this.view.shouldDisableWorkspace + (this.model.getSelected())); + } else { + // Open the pre-loaded workspace editing space. + if (this.model.getSelected()) { + this.model.getSelected().saveFromWorkspace(this.toolboxWorkspace); + } + this.clearAndLoadXml_(this.model.getPreloadXml()); + this.view.disableWorkspace(false); + } +}; + +/** + * Clears the toolbox workspace and loads XML to it, marking shadow blocks + * as necessary. + * @private + * @param {!Element} xml The XML to be loaded to the workspace. + */ +WorkspaceFactoryController.prototype.clearAndLoadXml_ = function(xml) { + this.toolboxWorkspace.clear(); + this.toolboxWorkspace.clearUndo(); + Blockly.Xml.domToWorkspace(xml, this.toolboxWorkspace); + this.view.markShadowBlocks(this.model.getShadowBlocksInWorkspace + (this.toolboxWorkspace.getAllBlocks(false))); + this.warnForUndefinedBlocks_(); +}; + +/** + * Sets the standard default options for the options object and updates + * the preview workspace. The default values depends on if categories are + * present. + */ +WorkspaceFactoryController.prototype.setStandardOptionsAndUpdate = function() { + this.view.setBaseOptions(); + this.view.setCategoryOptions(this.model.hasElements()); + this.generateNewOptions(); +}; + +/** + * Generates a new options object for injecting a Blockly workspace based + * on user input. Should be called every time a change has been made to + * an input field. Updates the model and reinjects the preview workspace. + */ +WorkspaceFactoryController.prototype.generateNewOptions = function() { + this.model.setOptions(this.readOptions_()); + + this.reinjectPreview(Blockly.Options.parseToolboxTree( + this.generator.generateToolboxXml())); +}; + +/** + * Generates a new options object for injecting a Blockly workspace based on + * user input. + * @return {!Object} Blockly injection options object. + * @private + */ +WorkspaceFactoryController.prototype.readOptions_ = function() { + var optionsObj = Object.create(null); + + // Add all standard options to the options object. + // Use parse int to get numbers from value inputs. + var readonly = document.getElementById('option_readOnly_checkbox').checked; + if (readonly) { + optionsObj['readOnly'] = true; + } else { + optionsObj['collapse'] = + document.getElementById('option_collapse_checkbox').checked; + optionsObj['comments'] = + document.getElementById('option_comments_checkbox').checked; + optionsObj['disable'] = + document.getElementById('option_disable_checkbox').checked; + if (document.getElementById('option_infiniteBlocks_checkbox').checked) { + optionsObj['maxBlocks'] = Infinity; + } else { + var maxBlocksValue = + document.getElementById('option_maxBlocks_number').value; + optionsObj['maxBlocks'] = typeof maxBlocksValue == 'string' ? + parseInt(maxBlocksValue) : maxBlocksValue; + } + optionsObj['trashcan'] = + document.getElementById('option_trashcan_checkbox').checked; + optionsObj['horizontalLayout'] = + document.getElementById('option_horizontalLayout_checkbox').checked; + optionsObj['toolboxPosition'] = + document.getElementById('option_toolboxPosition_checkbox').checked ? + 'end' : 'start'; + } + + optionsObj['css'] = document.getElementById('option_css_checkbox').checked; + optionsObj['media'] = document.getElementById('option_media_text').value; + optionsObj['rtl'] = document.getElementById('option_rtl_checkbox').checked; + optionsObj['scrollbars'] = + document.getElementById('option_scrollbars_checkbox').checked; + optionsObj['sounds'] = + document.getElementById('option_sounds_checkbox').checked; + optionsObj['oneBasedIndex'] = + document.getElementById('option_oneBasedIndex_checkbox').checked; + + // If using a grid, add all grid options. + if (document.getElementById('option_grid_checkbox').checked) { + var grid = Object.create(null); + var spacingValue = + document.getElementById('gridOption_spacing_number').value; + grid['spacing'] = typeof spacingValue == 'string' ? + parseInt(spacingValue) : spacingValue; + var lengthValue = document.getElementById('gridOption_length_number').value; + grid['length'] = typeof lengthValue == 'string' ? + parseInt(lengthValue) : lengthValue; + grid['colour'] = document.getElementById('gridOption_colour_text').value; + if (!readonly) { + grid['snap'] = + document.getElementById('gridOption_snap_checkbox').checked; + } + optionsObj['grid'] = grid; + } + + // If using zoom, add all zoom options. + if (document.getElementById('option_zoom_checkbox').checked) { + var zoom = Object.create(null); + zoom['controls'] = + document.getElementById('zoomOption_controls_checkbox').checked; + zoom['wheel'] = + document.getElementById('zoomOption_wheel_checkbox').checked; + var startScaleValue = + document.getElementById('zoomOption_startScale_number').value; + zoom['startScale'] = typeof startScaleValue == 'string' ? + Number(startScaleValue) : startScaleValue; + var maxScaleValue = + document.getElementById('zoomOption_maxScale_number').value; + zoom['maxScale'] = typeof maxScaleValue == 'string' ? + Number(maxScaleValue) : maxScaleValue; + var minScaleValue = + document.getElementById('zoomOption_minScale_number').value; + zoom['minScale'] = typeof minScaleValue == 'string' ? + Number(minScaleValue) : minScaleValue; + var scaleSpeedValue = + document.getElementById('zoomOption_scaleSpeed_number').value; + zoom['scaleSpeed'] = typeof scaleSpeedValue == 'string' ? + Number(scaleSpeedValue) : scaleSpeedValue; + optionsObj['zoom'] = zoom; + } + + return optionsObj; +}; + +/** + * Imports blocks from a file, generating a category in the toolbox workspace + * to allow the user to use imported blocks in the toolbox and in pre-loaded + * blocks. + * @param {!File} file File object for the blocks to import. + * @param {string} format The format of the file to import, either 'JSON' or + * 'JavaScript'. + */ +WorkspaceFactoryController.prototype.importBlocks = function(file, format) { + // Generate category name from file name. + var categoryName = file.name; + + var controller = this; + var reader = new FileReader(); + + // To be executed when the reader has read the file. + reader.onload = function() { + try { + // Define blocks using block types from file. + var blockTypes = FactoryUtils.defineAndGetBlockTypes(reader.result, + format); + + // If an imported block type is already defined, check if the user wants + // to override the current block definition. + if (controller.model.hasDefinedBlockTypes(blockTypes)) { + var msg = 'An imported block uses the same name as a block ' + + 'already in your toolbox. Are you sure you want to override the ' + + 'currently defined block?'; + var continueAnyway = confirm(msg); + BlocklyDevTools.Analytics.onWarning(msg); + if (!continueAnyway) { + return; + } + } + + var blocks = controller.generator.getDefinedBlocks(blockTypes); + // Generate category XML and append to toolbox. + var categoryXml = FactoryUtils.generateCategoryXml(blocks, categoryName); + // Get random color for category between 0 and 360. Gives each imported + // category a different color. + var randomColor = Math.floor(Math.random() * 360); + categoryXml.setAttribute('colour', randomColor); + controller.toolbox.appendChild(categoryXml); + controller.toolboxWorkspace.updateToolbox(controller.toolbox); + // Update imported block types. + controller.model.addImportedBlockTypes(blockTypes); + // Reload current category to possibly reflect any newly defined blocks. + controller.clearAndLoadXml_ + (Blockly.Xml.workspaceToDom(controller.toolboxWorkspace)); + + BlocklyDevTools.Analytics.onImport('BlockDefinitions' + + (format == 'JSON' ? '.json' : '.js')); + } catch (e) { + msg = 'Cannot read blocks from file.'; + alert(msg); + BlocklyDevTools.Analytics.onError(msg); + window.console.log(e); + } + } + + // Read the file asynchronously. + reader.readAsText(file); +}; + +/** + * Updates the block library category in the toolbox workspace toolbox. + * @param {!Element} categoryXml XML for the block library category. + * @param {!Array.} libBlockTypes Array of block types from the block + * library. + */ +WorkspaceFactoryController.prototype.setBlockLibCategory = + function(categoryXml, libBlockTypes) { + var blockLibCategory = document.getElementById('blockLibCategory'); + + // Set category ID so that it can be easily replaced, and set a standard, + // arbitrary block library color. + categoryXml.id = 'blockLibCategory'; + categoryXml.setAttribute('colour', 260); + + // Update the toolbox and toolboxWorkspace. + this.toolbox.replaceChild(categoryXml, blockLibCategory); + this.toolboxWorkspace.toolbox_.clearSelection(); + this.toolboxWorkspace.updateToolbox(this.toolbox); + + // Update the block library types. + this.model.updateLibBlockTypes(libBlockTypes); + + // Reload XML on page to account for blocks now defined or undefined in block + // library. + this.clearAndLoadXml_(Blockly.Xml.workspaceToDom(this.toolboxWorkspace)); +}; + +/** + * Return the block types used in the custom toolbox and pre-loaded workspace. + * @return {!Array.} Block types used in the custom toolbox and + * pre-loaded workspace. + */ +WorkspaceFactoryController.prototype.getAllUsedBlockTypes = function() { + return this.model.getAllUsedBlockTypes(); +}; + +/** + * Determines if a block loaded in the workspace has a definition (if it + * is a standard block, is defined in the block library, or has a definition + * imported). + * @param {!Blockly.Block} block The block to examine. + */ +WorkspaceFactoryController.prototype.isDefinedBlock = function(block) { + return this.model.isDefinedBlockType(block.type); +}; + +/** + * Sets a warning on blocks loaded to the workspace that are not defined. + * @private + */ +WorkspaceFactoryController.prototype.warnForUndefinedBlocks_ = function() { + var blocks = this.toolboxWorkspace.getAllBlocks(false); + for (var i = 0, block; block = blocks[i]; i++) { + if (!this.isDefinedBlock(block)) { + block.setWarningText(block.type + ' is not defined (it is not a ' + + 'standard block,\nin your block library, or an imported block)'); + } + } +}; + +/** + * Determines if a standard variable category is in the custom toolbox. + * @return {boolean} True if a variables category is in use, false otherwise. + */ +WorkspaceFactoryController.prototype.hasVariablesCategory = function() { + return this.model.hasVariables(); +}; + +/** + * Determines if a standard procedures category is in the custom toolbox. + * @return {boolean} True if a procedures category is in use, false otherwise. + */ +WorkspaceFactoryController.prototype.hasProceduresCategory = function() { + return this.model.hasProcedures(); +}; + +/** + * Determines if there are any unsaved changes in workspace factory. + * @return {boolean} True if there are unsaved changes, false otherwise. + */ +WorkspaceFactoryController.prototype.hasUnsavedChanges = function() { + return this.hasUnsavedToolboxChanges || this.hasUnsavedPreloadChanges; +}; diff --git a/js/demos/blockfactory/workspacefactory/wfactory_generator.js b/js/demos/blockfactory/workspacefactory/wfactory_generator.js new file mode 100644 index 0000000..a58c565 --- /dev/null +++ b/js/demos/blockfactory/workspacefactory/wfactory_generator.js @@ -0,0 +1,237 @@ +/** + * @license + * Copyright 2016 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generates the configuration XML used to update the preview + * workspace or print to the console or download to a file. Leverages + * Blockly.Xml and depends on information in the model (holds a reference). + * Depends on a hidden workspace created in the generator to load saved XML in + * order to generate toolbox XML. + * + * @author Emma Dauterman (evd2014) + */ + + +/** + * Class for a WorkspaceFactoryGenerator + * @constructor + */ +WorkspaceFactoryGenerator = function(model) { + // Model to share information about categories and shadow blocks. + this.model = model; + // Create hidden workspace to load saved XML to generate toolbox XML. + var hiddenBlocks = document.createElement('div'); + // Generate a globally unique ID for the hidden div element to avoid + // collisions. + var hiddenBlocksId = Blockly.utils.genUid(); + hiddenBlocks.id = hiddenBlocksId; + hiddenBlocks.style.display = 'none'; + document.body.appendChild(hiddenBlocks); + this.hiddenWorkspace = Blockly.inject(hiddenBlocksId); +}; + +/** + * Generates the XML for the toolbox or flyout with information from + * toolboxWorkspace and the model. Uses the hiddenWorkspace to generate XML. + * Save state of workspace in model (saveFromWorkspace) before calling if + * changes might have been made to the selected category. + * @param {!Blockly.workspace} toolboxWorkspace Toolbox editing workspace where + * blocks are added by user to be part of the toolbox. + * @return {!Element} XML element representing toolbox or flyout corresponding + * to toolbox workspace. + */ +WorkspaceFactoryGenerator.prototype.generateToolboxXml = function() { + // Create DOM for XML. + var xmlDom = Blockly.utils.xml.createElement('xml'); + xmlDom.id = 'toolbox'; + xmlDom.setAttribute('style', 'display: none'); + + if (!this.model.hasElements()) { + // Toolbox has no categories. Use XML directly from workspace. + this.loadToHiddenWorkspace_(this.model.getSelectedXml()); + this.appendHiddenWorkspaceToDom_(xmlDom); + } else { + // Toolbox has categories. + // Assert that selected != null + if (!this.model.getSelected()) { + throw Error('Selected is null when the toolbox is empty.'); + } + + var xml = this.model.getSelectedXml(); + var toolboxList = this.model.getToolboxList(); + + // Iterate through each category to generate XML for each using the + // hidden workspace. Load each category to the hidden workspace to make sure + // that all the blocks that are not top blocks are also captured as block + // groups in the flyout. + for (var i = 0; i < toolboxList.length; i++) { + var element = toolboxList[i]; + if (element.type == ListElement.TYPE_SEPARATOR) { + // If the next element is a separator. + var nextElement = Blockly.utils.xml.createElement('sep'); + } else if (element.type == ListElement.TYPE_CATEGORY) { + // If the next element is a category. + var nextElement = Blockly.utils.xml.createElement('category'); + nextElement.setAttribute('name', element.name); + // Add a colour attribute if one exists. + if (element.color != null) { + nextElement.setAttribute('colour', element.color); + } + // Add a custom attribute if one exists. + if (element.custom != null) { + nextElement.setAttribute('custom', element.custom); + } + // Load that category to hidden workspace, setting user-generated shadow + // blocks as real shadow blocks. + this.loadToHiddenWorkspace_(element.xml); + this.appendHiddenWorkspaceToDom_(nextElement); + } + xmlDom.appendChild(nextElement); + } + } + return xmlDom; + }; + + + /** + * Generates XML for the workspace (different from generateConfigXml in that + * it includes XY and ID attributes). Uses a workspace and converts user + * generated shadow blocks to actual shadow blocks. + * @return {!Element} XML element representing toolbox or flyout corresponding + * to toolbox workspace. + */ +WorkspaceFactoryGenerator.prototype.generateWorkspaceXml = function() { + // Load workspace XML to hidden workspace with user-generated shadow blocks + // as actual shadow blocks. + this.hiddenWorkspace.clear(); + Blockly.Xml.domToWorkspace(this.model.getPreloadXml(), this.hiddenWorkspace); + this.setShadowBlocksInHiddenWorkspace_(); + + // Generate XML and set attributes. + var xmlDom = Blockly.Xml.workspaceToDom(this.hiddenWorkspace); + xmlDom.id = 'workspaceBlocks'; + xmlDom.setAttribute('style', 'display: none'); + return xmlDom; +}; + +/** + * Generates a string representation of the options object for injecting the + * workspace and starter code. + * @return {string} String representation of starter code for injecting. + */ +WorkspaceFactoryGenerator.prototype.generateInjectString = function() { + var addAttributes = function(obj, tabChar) { + if (!obj) { + return '{}\n'; + } + var str = ''; + for (var key in obj) { + if (key == 'grid' || key == 'zoom') { + var temp = tabChar + key + ' : {\n' + addAttributes(obj[key], + tabChar + '\t') + tabChar + '}, \n'; + } else if (typeof obj[key] == 'string') { + var temp = tabChar + key + ' : \'' + obj[key] + '\', \n'; + } else { + var temp = tabChar + key + ' : ' + obj[key] + ', \n'; + } + str += temp; + } + var lastCommaIndex = str.lastIndexOf(','); + str = str.slice(0, lastCommaIndex) + '\n'; + return str; + }; + + var attributes = addAttributes(this.model.options, '\t'); + if (!this.model.options['readOnly']) { + attributes = '\ttoolbox : toolbox, \n' + + attributes; + } + var finalStr = '/* TODO: Change toolbox XML ID if necessary. Can export ' + + 'toolbox XML from Workspace Factory. */\n' + + 'var toolbox = document.getElementById("toolbox");\n\n'; + finalStr += 'var options = { \n' + attributes + '};'; + finalStr += '\n\n/* Inject your workspace */ \nvar workspace = Blockly.' + + 'inject(/* TODO: Add ID of div to inject Blockly into */, options);'; + finalStr += '\n\n/* Load Workspace Blocks from XML to workspace. ' + + 'Remove all code below if no blocks to load */\n\n' + + '/* TODO: Change workspace blocks XML ID if necessary. Can export' + + ' workspace blocks XML from Workspace Factory. */\n' + + 'var workspaceBlocks = document.getElementById("workspaceBlocks"); \n\n' + + '/* Load blocks to workspace. */\n' + + 'Blockly.Xml.domToWorkspace(workspaceBlocks, workspace);'; + return finalStr; +}; + +/** + * Loads the given XML to the hidden workspace and sets any user-generated + * shadow blocks to be actual shadow blocks. + * @param {!Element} xml The XML to be loaded to the hidden workspace. + * @private + */ +WorkspaceFactoryGenerator.prototype.loadToHiddenWorkspace_ = function(xml) { + this.hiddenWorkspace.clear(); + Blockly.Xml.domToWorkspace(xml, this.hiddenWorkspace); + this.setShadowBlocksInHiddenWorkspace_(); +}; + +/** + * Encodes blocks in the hidden workspace in a XML DOM element. Very + * similar to workspaceToDom, but doesn't capture IDs. Uses the top-level + * blocks loaded in hiddenWorkspace. + * @private + * @param {!Element} xmlDom Tree of XML elements to be appended to. + */ +WorkspaceFactoryGenerator.prototype.appendHiddenWorkspaceToDom_ = + function(xmlDom) { + var blocks = this.hiddenWorkspace.getTopBlocks(); + for (var i = 0, block; block = blocks[i]; i++) { + var blockChild = Blockly.Xml.blockToDom(block, /* opt_noId */ true); + xmlDom.appendChild(blockChild); + } +}; + +/** + * Sets the user-generated shadow blocks loaded into hiddenWorkspace to be + * actual shadow blocks. This is done so that blockToDom records them as + * shadow blocks instead of regular blocks. + * @private + */ +WorkspaceFactoryGenerator.prototype.setShadowBlocksInHiddenWorkspace_ = + function() { + var blocks = this.hiddenWorkspace.getAllBlocks(false); + for (var i = 0; i < blocks.length; i++) { + if (this.model.isShadowBlock(blocks[i].id)) { + blocks[i].setShadow(true); + } + } +}; + +/** + * Given a set of block types, gets the Blockly.Block objects for each block + * type. + * @param {!Array.} blockTypes Array of blocks that have been defined. + * @return {!Array.} Array of Blockly.Block objects corresponding + * to the array of blockTypes. + */ +WorkspaceFactoryGenerator.prototype.getDefinedBlocks = function(blockTypes) { + var blocks = []; + for (var i = 0; i < blockTypes.length ; i++) { + blocks.push(FactoryUtils.getDefinedBlock(blockTypes[i], + this.hiddenWorkspace)); + } + return blocks; +}; diff --git a/js/demos/blockfactory/workspacefactory/wfactory_init.js b/js/demos/blockfactory/workspacefactory/wfactory_init.js new file mode 100644 index 0000000..f99e856 --- /dev/null +++ b/js/demos/blockfactory/workspacefactory/wfactory_init.js @@ -0,0 +1,554 @@ +/** + * @license + * Copyright 2016 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Contains the init functions for the workspace factory tab. + * Adds click handlers to buttons and dropdowns, adds event listeners for + * keydown events and Blockly events, and configures the initial setup of + * the page. + * + * @author Emma Dauterman (evd2014) + */ + +/** + * Namespace for workspace factory initialization methods. + * @namespace + */ +WorkspaceFactoryInit = {}; + +/** + * Initialization for workspace factory tab. + * @param {!FactoryController} controller The controller for the workspace + * factory tab. + */ +WorkspaceFactoryInit.initWorkspaceFactory = function(controller) { + // Disable category editing buttons until categories are created. + document.getElementById('button_remove').disabled = true; + document.getElementById('button_up').disabled = true; + document.getElementById('button_down').disabled = true; + document.getElementById('button_editCategory').disabled = true; + + this.initColourPicker_(controller); + this.addWorkspaceFactoryEventListeners_(controller); + this.assignWorkspaceFactoryClickHandlers_(controller); + this.addWorkspaceFactoryOptionsListeners_(controller); + + // Check standard options and apply the changes to update the view. + controller.setStandardOptionsAndUpdate(); +}; + +/** + * Initialize the colour picker in workspace factory. + * @param {!FactoryController} controller The controller for the workspace + * factory tab. + * @private + */ +WorkspaceFactoryInit.initColourPicker_ = function(controller) { + // Array of Blockly category colours, consistent with the colour defaults. + var colours = [20, 65, 120, 160, 210, 230, 260, 290, 330, '']; + // Convert hue numbers to RRGGBB strings. + for (var i = 0; i < colours.length; i++) { + if (colours[i] !== '') { + colours[i] = Blockly.hueToHex(colours[i]).substring(1); + } + } + // Convert to 2D array. + var maxCols = Math.ceil(Math.sqrt(colours.length)); + var grid = []; + var row = []; + for (var i = 0; i < colours.length; i++) { + row.push(colours[i]); + if (row.length == maxCols) { + grid.push(row); + row = []; + } + } + if (row.length) { + grid.push(row); + } + + // Override the default colours. + cp_grid = grid; +}; + +/** + * Assign click handlers for workspace factory. + * @param {!FactoryController} controller The controller for the workspace + * factory tab. + * @private + */ +WorkspaceFactoryInit.assignWorkspaceFactoryClickHandlers_ = + function(controller) { + + // Import Custom Blocks button. + document.getElementById('button_importBlocks').addEventListener + ('click', + function() { + blocklyFactory.openModal('dropdownDiv_importBlocks'); + }); + document.getElementById('input_importBlocksJson').addEventListener + ('change', + function() { + controller.importBlocks(event.target.files[0], 'JSON'); + }); + document.getElementById('input_importBlocksJson').addEventListener + ('click', function() {blocklyFactory.closeModal()}); + document.getElementById('input_importBlocksJs').addEventListener + ('change', + function() { + controller.importBlocks(event.target.files[0], 'JavaScript'); + }); + document.getElementById('input_importBlocksJs').addEventListener + ('click', function() {blocklyFactory.closeModal()}); + + // Load to Edit button. + document.getElementById('button_load').addEventListener + ('click', + function() { + blocklyFactory.openModal('dropdownDiv_load'); + }); + document.getElementById('input_loadToolbox').addEventListener + ('change', + function() { + controller.importFile(event.target.files[0], + WorkspaceFactoryController.MODE_TOOLBOX); + }); + document.getElementById('input_loadToolbox').addEventListener + ('click', function() {blocklyFactory.closeModal()}); + document.getElementById('input_loadPreload').addEventListener + ('change', + function() { + controller.importFile(event.target.files[0], + WorkspaceFactoryController.MODE_PRELOAD); + }); + document.getElementById('input_loadPreload').addEventListener + ('click', function() {blocklyFactory.closeModal()}); + + // Export button. + document.getElementById('dropdown_exportOptions').addEventListener + ('click', + function() { + controller.exportInjectFile(); + blocklyFactory.closeModal(); + }); + document.getElementById('dropdown_exportToolbox').addEventListener + ('click', + function() { + controller.exportXmlFile(WorkspaceFactoryController.MODE_TOOLBOX); + blocklyFactory.closeModal(); + }); + document.getElementById('dropdown_exportPreload').addEventListener + ('click', + function() { + controller.exportXmlFile(WorkspaceFactoryController.MODE_PRELOAD); + blocklyFactory.closeModal(); + }); + document.getElementById('dropdown_exportAll').addEventListener + ('click', + function() { + controller.exportInjectFile(); + controller.exportXmlFile(WorkspaceFactoryController.MODE_TOOLBOX); + controller.exportXmlFile(WorkspaceFactoryController.MODE_PRELOAD); + blocklyFactory.closeModal(); + }); + document.getElementById('button_export').addEventListener + ('click', + function() { + blocklyFactory.openModal('dropdownDiv_export'); + }); + + // Clear button. + document.getElementById('button_clear').addEventListener + ('click', + function() { + controller.clearAll(); + }); + + // Toolbox and Workspace tabs. + document.getElementById('tab_toolbox').addEventListener + ('click', + function() { + controller.setMode(WorkspaceFactoryController.MODE_TOOLBOX); + }); + document.getElementById('tab_preload').addEventListener + ('click', + function() { + controller.setMode(WorkspaceFactoryController.MODE_PRELOAD); + }); + + // '+' button. + document.getElementById('button_add').addEventListener + ('click', + function() { + blocklyFactory.openModal('dropdownDiv_add'); + }); + document.getElementById('dropdown_newCategory').addEventListener + ('click', + function() { + controller.addCategory(); + blocklyFactory.closeModal(); + }); + document.getElementById('dropdown_loadCategory').addEventListener + ('click', + function() { + controller.loadCategory(); + blocklyFactory.closeModal(); + }); + document.getElementById('dropdown_separator').addEventListener + ('click', + function() { + controller.addSeparator(); + blocklyFactory.closeModal(); + }); + document.getElementById('dropdown_loadStandardToolbox').addEventListener + ('click', + function() { + controller.loadStandardToolbox(); + blocklyFactory.closeModal(); + }); + + // '-' button. + document.getElementById('button_remove').addEventListener + ('click', + function() { + controller.removeElement(); + }); + + // Up/Down buttons. + document.getElementById('button_up').addEventListener + ('click', + function() { + controller.moveElement(-1); + }); + document.getElementById('button_down').addEventListener + ('click', + function() { + controller.moveElement(1); + }); + + // Edit Category button. + document.getElementById('button_editCategory').addEventListener + ('click', + function() { + var selected = controller.model.getSelected(); + // Return if a category is not selected. + if (selected.type != ListElement.TYPE_CATEGORY) { + return; + } + document.getElementById('categoryName').value = selected.name; + document.getElementById('categoryColour').value = selected.color ? + selected.color.substring(1).toLowerCase() : ''; + console.log(document.getElementById('categoryColour').value); + // Link the colour picker to the field. + cp_init('categoryColour'); + blocklyFactory.openModal('dropdownDiv_editCategory'); + }); + + document.getElementById('categorySave').addEventListener + ('click', + function() { + var name = document.getElementById('categoryName').value.trim(); + var colour = document.getElementById('categoryColour').value; + colour = colour ? '#' + colour : null; + controller.changeSelectedCategory(name, colour); + blocklyFactory.closeModal(); + }); + + // Make/Remove Shadow buttons. + document.getElementById('button_addShadow').addEventListener + ('click', + function() { + controller.addShadow(); + WorkspaceFactoryInit.displayAddShadow_(false); + WorkspaceFactoryInit.displayRemoveShadow_(true); + }); + document.getElementById('button_removeShadow').addEventListener + ('click', + function() { + controller.removeShadow(); + WorkspaceFactoryInit.displayAddShadow_(true); + WorkspaceFactoryInit.displayRemoveShadow_(false); + + // Disable shadow editing button if turning invalid shadow block back + // to normal block. + if (!Blockly.selected.getSurroundParent()) { + document.getElementById('button_addShadow').disabled = true; + } + }); + + // Help button on workspace tab. + document.getElementById('button_optionsHelp').addEventListener + ('click', function() { + open('https://developers.google.com/blockly/guides/get-started/web#configuration'); + }); + + // Reset to Default button on workspace tab. + document.getElementById('button_standardOptions').addEventListener + ('click', function() { + controller.setStandardOptionsAndUpdate(); + }); +}; + +/** + * Add event listeners for workspace factory. + * @param {!FactoryController} controller The controller for the workspace + * factory tab. + * @private + */ +WorkspaceFactoryInit.addWorkspaceFactoryEventListeners_ = function(controller) { + // Use up and down arrow keys to move categories. + window.addEventListener('keydown', function(e) { + // Don't let arrow keys have any effect if not in Workspace Factory + // editing the toolbox. + if (!(controller.keyEventsEnabled && controller.selectedMode + == WorkspaceFactoryController.MODE_TOOLBOX)) { + return; + } + + if (e.keyCode == 38) { + // Arrow up. + controller.moveElement(-1); + } else if (e.keyCode == 40) { + // Arrow down. + controller.moveElement(1); + } + }); + + // Determines if a block breaks shadow block placement rules. + // Breaks rules if (1) a shadow block no longer has a valid + // parent, or (2) a normal block is inside of a shadow block. + var isInvalidBlockPlacement = function(block) { + return ((controller.isUserGenShadowBlock(block.id) && + !block.getSurroundParent()) || + (!controller.isUserGenShadowBlock(block.id) && + block.getSurroundParent() && + controller.isUserGenShadowBlock(block.getSurroundParent().id))); + }; + + // Add change listeners for toolbox workspace in workspace factory. + controller.toolboxWorkspace.addChangeListener(function(e) { + // Listen for Blockly move and delete events to update preview. + // Not listening for Blockly create events because causes the user to drop + // blocks when dragging them into workspace. Could cause problems if ever + // load blocks into workspace directly without calling updatePreview. + if (e.type == Blockly.Events.BLOCK_MOVE || + e.type == Blockly.Events.BLOCK_DELETE || + e.type == Blockly.Events.BLOCK_CHANGE) { + controller.saveStateFromWorkspace(); + controller.updatePreview(); + } + + // Listen for Blockly UI events to correctly enable the "Edit Block" button. + // Only enable "Edit Block" when a block is selected and it has a + // surrounding parent, meaning it is nested in another block (blocks that + // are not nested in parents cannot be shadow blocks). + if (e.type == Blockly.Events.BLOCK_MOVE || (e.type == Blockly.Events.UI && + e.element == 'selected')) { + var selected = Blockly.selected; + + // Show shadow button if a block is selected. Show "Add Shadow" if + // a block is not a shadow block, show "Remove Shadow" if it is a + // shadow block. + if (selected) { + var isShadow = controller.isUserGenShadowBlock(selected.id); + WorkspaceFactoryInit.displayAddShadow_(!isShadow); + WorkspaceFactoryInit.displayRemoveShadow_(isShadow); + } else { + WorkspaceFactoryInit.displayAddShadow_(false); + WorkspaceFactoryInit.displayRemoveShadow_(false); + } + + if (selected != null && selected.getSurroundParent() != null && + !controller.isUserGenShadowBlock(selected.getSurroundParent().id)) { + // Selected block is a valid shadow block or could be a valid shadow + // block. + + // Enable block editing and remove warnings if the block is not a + // variable user-generated shadow block. + document.getElementById('button_addShadow').disabled = false; + document.getElementById('button_removeShadow').disabled = false; + + if (!FactoryUtils.hasVariableField(selected) && + controller.isDefinedBlock(selected)) { + selected.setWarningText(null); + } + } else { + // Selected block cannot be a valid shadow block. + + if (selected != null && isInvalidBlockPlacement(selected)) { + // Selected block breaks shadow block rules. + // Invalid shadow block if (1) a shadow block no longer has a valid + // parent, or (2) a normal block is inside of a shadow block. + + if (!controller.isUserGenShadowBlock(selected.id)) { + // Warn if a non-shadow block is nested inside a shadow block. + selected.setWarningText('Only shadow blocks can be nested inside\n' + + 'other shadow blocks.'); + } else if (!FactoryUtils.hasVariableField(selected)) { + // Warn if a shadow block is invalid only if not replacing + // warning for variables. + selected.setWarningText('Shadow blocks must be nested inside other' + + ' blocks.') + } + + // Give editing options so that the user can make an invalid shadow + // block a normal block. + document.getElementById('button_removeShadow').disabled = false; + document.getElementById('button_addShadow').disabled = true; + } else { + // Selected block does not break any shadow block rules, but cannot + // be a shadow block. + + // Remove possible 'invalid shadow block placement' warning. + if (selected != null && controller.isDefinedBlock(selected) && + (!FactoryUtils.hasVariableField(selected) || + !controller.isUserGenShadowBlock(selected.id))) { + selected.setWarningText(null); + } + + // No block selected that is a shadow block or could be a valid shadow + // block. Disable block editing. + document.getElementById('button_addShadow').disabled = true; + document.getElementById('button_removeShadow').disabled = true; + } + } + } + + // Convert actual shadow blocks added from the toolbox to user-generated + // shadow blocks. + if (e.type == Blockly.Events.BLOCK_CREATE) { + controller.convertShadowBlocks(); + + // Let the user create a Variables or Functions category if they use + // blocks from either category. + + // Get all children of a block and add them to childList. + var getAllChildren = function(block, childList) { + childList.push(block); + var children = block.getChildren(); + for (var i = 0, child; child = children[i]; i++) { + getAllChildren(child, childList); + } + }; + + var newBaseBlock = controller.toolboxWorkspace.getBlockById(e.blockId); + var allNewBlocks = []; + getAllChildren(newBaseBlock, allNewBlocks); + var variableCreated = false; + var procedureCreated = false; + + // Check if the newly created block or any of its children are variable + // or procedure blocks. + for (var i = 0, block; block = allNewBlocks[i]; i++) { + if (FactoryUtils.hasVariableField(block)) { + variableCreated = true; + } else if (FactoryUtils.isProcedureBlock(block)) { + procedureCreated = true; + } + } + + // If any of the newly created blocks are variable or procedure blocks, + // prompt the user to create the corresponding standard category. + if (variableCreated && !controller.hasVariablesCategory()) { + if (confirm('Your new block has a variables field. To use this block ' + + 'fully, you will need a Variables category. Do you want to add ' + + 'a Variables category to your custom toolbox?')) { + controller.setMode(WorkspaceFactoryController.MODE_TOOLBOX); + controller.loadCategoryByName('variables'); + } + } + + if (procedureCreated && !controller.hasProceduresCategory()) { + if (confirm('Your new block is a function block. To use this block ' + + 'fully, you will need a Functions category. Do you want to add ' + + 'a Functions category to your custom toolbox?')) { + controller.setMode(WorkspaceFactoryController.MODE_TOOLBOX); + controller.loadCategoryByName('functions'); + } + } + } + }); +}; + +/** + * Display or hide the add shadow button. + * @param {boolean} show True if the add shadow button should be shown, false + * otherwise. + */ +WorkspaceFactoryInit.displayAddShadow_ = function(show) { + document.getElementById('button_addShadow').style.display = + show ? 'inline-block' : 'none'; +}; + +/** + * Display or hide the remove shadow button. + * @param {boolean} show True if the remove shadow button should be shown, false + * otherwise. + */ +WorkspaceFactoryInit.displayRemoveShadow_ = function(show) { + document.getElementById('button_removeShadow').style.display = + show ? 'inline-block' : 'none'; +}; + +/** + * Add listeners for workspace factory options input elements. + * @param {!FactoryController} controller The controller for the workspace + * factory tab. + * @private + */ +WorkspaceFactoryInit.addWorkspaceFactoryOptionsListeners_ = + function(controller) { + // Checking the grid checkbox displays grid options. + document.getElementById('option_grid_checkbox').addEventListener('change', + function(e) { + document.getElementById('grid_options').style.display = + document.getElementById('option_grid_checkbox').checked ? + 'block' : 'none'; + }); + + // Checking the zoom checkbox displays zoom options. + document.getElementById('option_zoom_checkbox').addEventListener('change', + function(e) { + document.getElementById('zoom_options').style.display = + document.getElementById('option_zoom_checkbox').checked ? + 'block' : 'none'; + }); + + // Checking the readonly checkbox enables/disables other options. + document.getElementById('option_readOnly_checkbox').addEventListener('change', + function(e) { + var checkbox = document.getElementById('option_readOnly_checkbox'); + blocklyFactory.ifCheckedEnable(!checkbox.checked, + ['readonly1', 'readonly2']); + }); + + document.getElementById('option_infiniteBlocks_checkbox').addEventListener('change', + function(e) { + document.getElementById('maxBlockNumber_option').style.display = + document.getElementById('option_infiniteBlocks_checkbox').checked ? + 'none' : 'block'; + }); + + // Generate new options every time an options input is updated. + var div = document.getElementById('workspace_options'); + var options = div.getElementsByTagName('input'); + for (var i = 0, option; option = options[i]; i++) { + option.addEventListener('change', function() { + controller.generateNewOptions(); + }); + } +}; diff --git a/js/demos/blockfactory/workspacefactory/wfactory_model.js b/js/demos/blockfactory/workspacefactory/wfactory_model.js new file mode 100644 index 0000000..ff9eaff --- /dev/null +++ b/js/demos/blockfactory/workspacefactory/wfactory_model.js @@ -0,0 +1,561 @@ +/** + * @license + * Copyright 2016 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Stores and updates information about state and categories + * in workspace factory. Each list element is either a separator or a category, + * and each category stores its name, XML to load that category, color, + * custom tags, and a unique ID making it possible to change category names and + * move categories easily. Keeps track of the currently selected list + * element. Also keeps track of all the user-created shadow blocks and + * manipulates them as necessary. + * + * @author Emma Dauterman (evd2014) + */ + +/** + * Class for a WorkspaceFactoryModel + * @constructor + */ +WorkspaceFactoryModel = function() { + // Ordered list of ListElement objects. Empty if there is a single flyout. + this.toolboxList = []; + // ListElement for blocks in a single flyout. Null if a toolbox exists. + this.flyout = new ListElement(ListElement.TYPE_FLYOUT); + // Array of block IDs for all user created shadow blocks. + this.shadowBlocks = []; + // Reference to currently selected ListElement. Stored in this.toolboxList if + // there are categories, or in this.flyout if blocks are displayed in a single + // flyout. + this.selected = this.flyout; + // Boolean for if a Variable category has been added. + this.hasVariableCategory = false; + // Boolean for if a Procedure category has been added. + this.hasProcedureCategory = false; + // XML to be pre-loaded to workspace. Empty on default; + this.preloadXml = Blockly.utils.xml.createElement('xml'); + // Options object to be configured for Blockly inject call. + this.options = new Object(null); + // Block Library block types. + this.libBlockTypes = []; + // Imported block types. + this.importedBlockTypes = []; + // +}; + +/** + * Given a name, determines if it is the name of a category already present. + * Used when getting a valid category name from the user. + * @param {string} name String name to be compared against. + * @return {boolean} True if string is a used category name, false otherwise. + */ +WorkspaceFactoryModel.prototype.hasCategoryByName = function(name) { + for (var i = 0; i < this.toolboxList.length; i++) { + if (this.toolboxList[i].type == ListElement.TYPE_CATEGORY && + this.toolboxList[i].name == name) { + return true; + } + } + return false; +}; + +/** + * Determines if a category with the 'VARIABLE' tag exists. + * @return {boolean} True if there exists a category with the Variables tag, + * false otherwise. + */ +WorkspaceFactoryModel.prototype.hasVariables = function() { + return this.hasVariableCategory; +}; + +/** + * Determines if a category with the 'PROCEDURE' tag exists. + * @return {boolean} True if there exists a category with the Procedures tag, + * false otherwise. + */ +WorkspaceFactoryModel.prototype.hasProcedures = function() { + return this.hasProcedureCategory; +}; + +/** + * Determines if the user has any elements in the toolbox. Uses the length of + * toolboxList. + * @return {boolean} True if elements exist, false otherwise. + */ +WorkspaceFactoryModel.prototype.hasElements = function() { + return this.toolboxList.length > 0; +}; + +/** + * Given a ListElement, adds it to the toolbox list. + * @param {!ListElement} element The element to be added to the list. + */ +WorkspaceFactoryModel.prototype.addElementToList = function(element) { + // Update state if the copied category has a custom tag. + this.hasVariableCategory = element.custom == 'VARIABLE' ? true : + this.hasVariableCategory; + this.hasProcedureCategory = element.custom == 'PROCEDURE' ? true : + this.hasProcedureCategory; + // Add element to toolboxList. + this.toolboxList.push(element); + // Empty single flyout. + this.flyout = null; +}; + +/** + * Given an index, deletes a list element and all associated data. + * @param {number} index The index of the list element to delete. + */ +WorkspaceFactoryModel.prototype.deleteElementFromList = function(index) { + // Check if index is out of bounds. + if (index < 0 || index >= this.toolboxList.length) { + return; // No entry to delete. + } + // Check if need to update flags. + this.hasVariableCategory = this.toolboxList[index].custom == 'VARIABLE' ? + false : this.hasVariableCategory; + this.hasProcedureCategory = this.toolboxList[index].custom == 'PROCEDURE' ? + false : this.hasProcedureCategory; + // Remove element. + this.toolboxList.splice(index, 1); +}; + +/** + * Sets selected to be an empty category not in toolbox list if toolbox list + * is empty. Should be called when removing the last element from toolbox list. + * If the toolbox list is empty, selected stores the XML for the single flyout + * of blocks displayed. + */ +WorkspaceFactoryModel.prototype.createDefaultSelectedIfEmpty = function() { + if (this.toolboxList.length == 0) { + this.flyout = new ListElement(ListElement.TYPE_FLYOUT); + this.selected = this.flyout; + } +}; + +/** + * Moves a list element to a certain position in toolboxList by removing it + * and then inserting it at the correct index. Checks that indices are in + * bounds (throws error if not), but assumes that oldIndex is the correct index + * for list element. + * @param {!ListElement} element The element to move in toolboxList. + * @param {number} newIndex The index to insert the element at. + * @param {number} oldIndex The index the element is currently at. + */ +WorkspaceFactoryModel.prototype.moveElementToIndex = function(element, newIndex, + oldIndex) { + // Check that indexes are in bounds. + if (newIndex < 0 || newIndex >= this.toolboxList.length || oldIndex < 0 || + oldIndex >= this.toolboxList.length) { + throw Error('Index out of bounds when moving element in the model.'); + } + this.deleteElementFromList(oldIndex); + this.toolboxList.splice(newIndex, 0, element); +}; + +/** + * Returns the ID of the currently selected element. Returns null if there are + * no categories (if selected == null). + * @return {string} The ID of the element currently selected. + */ +WorkspaceFactoryModel.prototype.getSelectedId = function() { + return this.selected ? this.selected.id : null; +}; + +/** + * Returns the name of the currently selected category. Returns null if there + * are no categories (if selected == null) or the selected element is not + * a category (in which case its name is null). + * @return {string} The name of the category currently selected. + */ +WorkspaceFactoryModel.prototype.getSelectedName = function() { + return this.selected ? this.selected.name : null; +}; + +/** + * Returns the currently selected list element object. + * @return {ListElement} The currently selected ListElement + */ +WorkspaceFactoryModel.prototype.getSelected = function() { + return this.selected; +}; + +/** + * Sets list element currently selected by id. + * @param {string} id ID of list element that should now be selected. + */ +WorkspaceFactoryModel.prototype.setSelectedById = function(id) { + this.selected = this.getElementById(id); +}; + +/** + * Given an ID of a list element, returns the index of that list element in + * toolboxList. Returns -1 if ID is not present. + * @param {string} id The ID of list element to search for. + * @return {number} The index of the list element in toolboxList, or -1 if it + * doesn't exist. + */ +WorkspaceFactoryModel.prototype.getIndexByElementId = function(id) { + for (var i = 0; i < this.toolboxList.length; i++) { + if (this.toolboxList[i].id == id) { + return i; + } + } + return -1; // ID not present in toolboxList. +}; + +/** + * Given the ID of a list element, returns that ListElement object. + * @param {string} id The ID of element to search for. + * @return {ListElement} Corresponding ListElement object in toolboxList, or + * null if that element does not exist. + */ +WorkspaceFactoryModel.prototype.getElementById = function(id) { + for (var i = 0; i < this.toolboxList.length; i++) { + if (this.toolboxList[i].id == id) { + return this.toolboxList[i]; + } + } + return null; // ID not present in toolboxList. +}; + +/** + * Given the index of a list element in toolboxList, returns that ListElement + * object. + * @param {number} index The index of the element to return. + * @return {ListElement} The corresponding ListElement object in toolboxList. + */ +WorkspaceFactoryModel.prototype.getElementByIndex = function(index) { + if (index < 0 || index >= this.toolboxList.length) { + return null; + } + return this.toolboxList[index]; +}; + +/** + * Returns the XML to load the selected element. + * @return {!Element} The XML of the selected element, or null if there is + * no selected element. + */ +WorkspaceFactoryModel.prototype.getSelectedXml = function() { + return this.selected ? this.selected.xml : null; +}; + +/** + * Return ordered list of ListElement objects. + * @return {!Array.} ordered list of ListElement objects + */ +WorkspaceFactoryModel.prototype.getToolboxList = function() { + return this.toolboxList; +}; + +/** + * Gets the ID of a category given its name. + * @param {string} name Name of category. + * @return {number} ID of category + */ +WorkspaceFactoryModel.prototype.getCategoryIdByName = function(name) { + for (var i = 0; i < this.toolboxList.length; i++) { + if (this.toolboxList[i].name == name) { + return this.toolboxList[i].id; + } + } + return null; // Name not present in toolboxList. +}; + +/** + * Clears the toolbox list, deleting all ListElements. + */ +WorkspaceFactoryModel.prototype.clearToolboxList = function() { + this.toolboxList = []; + this.hasVariableCategory = false; + this.hasProcedureCategory = false; + this.shadowBlocks = []; + this.selected.xml = Blockly.utils.xml.createElement('xml'); +}; + +/** + * Class for a ListElement + * Adds a shadow block to the list of shadow blocks. + * @param {string} blockId The unique ID of block to be added. + */ +WorkspaceFactoryModel.prototype.addShadowBlock = function(blockId) { + this.shadowBlocks.push(blockId); +}; + +/** + * Removes a shadow block ID from the list of shadow block IDs if that ID is + * in the list. + * @param {string} blockId The unique ID of block to be removed. + */ +WorkspaceFactoryModel.prototype.removeShadowBlock = function(blockId) { + for (var i = 0; i < this.shadowBlocks.length; i++) { + if (this.shadowBlocks[i] == blockId) { + this.shadowBlocks.splice(i, 1); + return; + } + } +}; + +/** + * Determines if a block is a shadow block given a unique block ID. + * @param {string} blockId The unique ID of the block to examine. + * @return {boolean} True if the block is a user-generated shadow block, false + * otherwise. + */ +WorkspaceFactoryModel.prototype.isShadowBlock = function(blockId) { + for (var i = 0; i < this.shadowBlocks.length; i++) { + if (this.shadowBlocks[i] == blockId) { + return true; + } + } + return false; +}; + +/** + * Given a set of blocks currently loaded, returns all blocks in the workspace + * that are user generated shadow blocks. + * @param {!} blocks Array of blocks currently loaded. + * @return {!} Array of user-generated shadow blocks currently + * loaded. + */ +WorkspaceFactoryModel.prototype.getShadowBlocksInWorkspace = + function(workspaceBlocks) { + var shadowsInWorkspace = []; + for (var i = 0; i < workspaceBlocks.length; i++) { + if (this.isShadowBlock(workspaceBlocks[i].id)) { + shadowsInWorkspace.push(workspaceBlocks[i]); + } + } + return shadowsInWorkspace; +}; + +/** + * Adds a custom tag to a category, updating state variables accordingly. + * Only accepts 'VARIABLE' and 'PROCEDURE' tags. + * @param {!ListElement} category The category to add the tag to. + * @param {string} tag The custom tag to add to the category. + */ +WorkspaceFactoryModel.prototype.addCustomTag = function(category, tag) { + // Only update list elements that are categories. + if (category.type != ListElement.TYPE_CATEGORY) { + return; + } + // Only update the tag to be 'VARIABLE' or 'PROCEDURE'. + if (tag == 'VARIABLE') { + this.hasVariableCategory = true; + category.custom = 'VARIABLE'; + } else if (tag == 'PROCEDURE') { + this.hasProcedureCategory = true; + category.custom = 'PROCEDURE'; + } +}; + +/** + * Have basic pre-loaded workspace working + * Saves XML as XML to be pre-loaded into the workspace. + * @param {!Element} xml The XML to be saved. + */ +WorkspaceFactoryModel.prototype.savePreloadXml = function(xml) { + this.preloadXml = xml +}; + +/** + * Gets the XML to be pre-loaded into the workspace. + * @return {!Element} The XML for the workspace. + */ +WorkspaceFactoryModel.prototype.getPreloadXml = function() { + return this.preloadXml; +}; + +/** + * Sets a new options object for injecting a Blockly workspace. + * @param {Object} options Options object for injecting a Blockly workspace. + */ +WorkspaceFactoryModel.prototype.setOptions = function(options) { + this.options = options; +}; + +/** + * Returns an array of all the block types currently being used in the toolbox + * and the pre-loaded blocks. No duplicates. + * TODO(evd2014): Move pushBlockTypesToList to FactoryUtils. + * @return {!Array.} Array of block types currently being used. + */ +WorkspaceFactoryModel.prototype.getAllUsedBlockTypes = function() { + var blockTypeList = []; + + // Given XML for the workspace, adds all block types included in the XML + // to the list, not including duplicates. + var pushBlockTypesToList = function(xml, list) { + // Get all block XML nodes. + var blocks = xml.getElementsByTagName('block'); + + // Add block types if not already in list. + for (var i = 0; i < blocks.length; i++) { + var type = blocks[i].getAttribute('type'); + if (list.indexOf(type) == -1) { + list.push(type); + } + } + }; + + if (this.flyout) { + // If has a single flyout, add block types for the single flyout. + pushBlockTypesToList(this.getSelectedXml(), blockTypeList); + } else { + // If has categories, add block types for each category. + + for (var i = 0, category; category = this.toolboxList[i]; i++) { + if (category.type == ListElement.TYPE_CATEGORY) { + pushBlockTypesToList(category.xml, blockTypeList); + } + } + } + + // Add the block types from any pre-loaded blocks. + pushBlockTypesToList(this.getPreloadXml(), blockTypeList); + + return blockTypeList; +}; + +/** + * Adds new imported block types to the list of current imported block types. + * @param {!Array.} blockTypes Array of block types imported. + */ +WorkspaceFactoryModel.prototype.addImportedBlockTypes = function(blockTypes) { + this.importedBlockTypes = this.importedBlockTypes.concat(blockTypes); +}; + +/** + * Updates block types in block library. + * @param {!Array.} blockTypes Array of block types in block library. + */ +WorkspaceFactoryModel.prototype.updateLibBlockTypes = function(blockTypes) { + this.libBlockTypes = blockTypes; +}; + +/** + * Determines if a block type is defined as a standard block, in the block + * library, or as an imported block. + * @param {string} blockType Block type to check. + * @return {boolean} True if blockType is defined, false otherwise. + */ +WorkspaceFactoryModel.prototype.isDefinedBlockType = function(blockType) { + var isStandardBlock = StandardCategories.coreBlockTypes.indexOf(blockType) + != -1; + var isLibBlock = this.libBlockTypes.indexOf(blockType) != -1; + var isImportedBlock = this.importedBlockTypes.indexOf(blockType) != -1; + return (isStandardBlock || isLibBlock || isImportedBlock); +}; + +/** + * Checks if any of the block types are already defined. + * @param {!Array.} blockTypes Array of block types. + * @return {boolean} True if a block type in the array is already defined, + * false if none of the blocks are already defined. + */ +WorkspaceFactoryModel.prototype.hasDefinedBlockTypes = function(blockTypes) { + for (var i = 0, blockType; blockType = blockTypes[i]; i++) { + if (this.isDefinedBlockType(blockType)) { + return true; + } + } + return false; +}; + +/** + * Class for a ListElement. + * @constructor + */ +ListElement = function(type, opt_name) { + this.type = type; + // XML DOM element to load the element. + this.xml = Blockly.utils.xml.createElement('xml'); + // Name of category. Can be changed by user. Null if separator. + this.name = opt_name ? opt_name : null; + // Unique ID of element. Does not change. + this.id = Blockly.utils.genUid(); + // Color of category. Default is no color. Null if separator. + this.color = null; + // Stores a custom tag, if necessary. Null if no custom tag or separator. + this.custom = null; +}; + +// List element types. +ListElement.TYPE_CATEGORY = 'category'; +ListElement.TYPE_SEPARATOR = 'separator'; +ListElement.TYPE_FLYOUT = 'flyout'; + +/** + * Saves a category by updating its XML (does not save XML for + * elements that are not categories). + * @param {!Blockly.workspace} workspace The workspace to save category entry + * from. + */ +ListElement.prototype.saveFromWorkspace = function(workspace) { + // Only save XML for categories and flyouts. + if (this.type == ListElement.TYPE_FLYOUT || + this.type == ListElement.TYPE_CATEGORY) { + this.xml = Blockly.Xml.workspaceToDom(workspace); + } +}; + + +/** + * Changes the name of a category object given a new name. Returns if + * not a category. + * @param {string} name New name of category. + */ +ListElement.prototype.changeName = function (name) { + // Only update list elements that are categories. + if (this.type != ListElement.TYPE_CATEGORY) { + return; + } + this.name = name; +}; + +/** + * Sets the color of a category. If tries to set the color of something other + * than a category, returns. + * @param {?string} color The color that should be used for that category, + * or null if none. + */ +ListElement.prototype.changeColor = function (color) { + if (this.type != ListElement.TYPE_CATEGORY) { + return; + } + this.color = color; +}; + +/** + * Makes a copy of the original element and returns it. Everything about the + * copy is identical except for its ID. + * @return {!ListElement} The copy of the ListElement. + */ +ListElement.prototype.copy = function() { + copy = new ListElement(this.type); + // Generate a unique ID for the element. + copy.id = Blockly.utils.genUid(); + // Copy all attributes except ID. + copy.name = this.name; + copy.xml = this.xml; + copy.color = this.color; + copy.custom = this.custom; + // Return copy. + return copy; +}; diff --git a/js/demos/blockfactory/workspacefactory/wfactory_view.js b/js/demos/blockfactory/workspacefactory/wfactory_view.js new file mode 100644 index 0000000..287fb3d --- /dev/null +++ b/js/demos/blockfactory/workspacefactory/wfactory_view.js @@ -0,0 +1,438 @@ +/** + * @license + * Copyright 2016 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Controls the UI elements for workspace factory, mainly the category tabs. + * Also includes downloading files because that interacts directly with the DOM. + * Depends on WorkspaceFactoryController (for adding mouse listeners). Tabs for + * each category are stored in tab map, which associates a unique ID for a + * category with a particular tab. + * + * @author Emma Dauterman (edauterman) + */ + + +/** + * Class for a WorkspaceFactoryView + * @constructor + */ +WorkspaceFactoryView = function() { + // For each tab, maps ID of a ListElement to the td DOM element. + this.tabMap = Object.create(null); +}; + +/** + * Adds a category tab to the UI, and updates tabMap accordingly. + * @param {string} name The name of the category being created + * @param {string} id ID of category being created + * @return {!Element} DOM element created for tab + */ +WorkspaceFactoryView.prototype.addCategoryRow = function(name, id) { + var table = document.getElementById('categoryTable'); + var count = table.rows.length; + + // Delete help label and enable category buttons if it's the first category. + if (count == 0) { + document.getElementById('categoryHeader').textContent = 'Your categories:'; + } + + // Create tab. + var row = table.insertRow(count); + var nextEntry = row.insertCell(0); + // Configure tab. + nextEntry.id = this.createCategoryIdName(name); + nextEntry.textContent = name; + // Store tab. + this.tabMap[id] = table.rows[count].cells[0]; + // Return tab. + return nextEntry; +}; + +/** + * Deletes a category tab from the UI and updates tabMap accordingly. + * @param {string} id ID of category to be deleted. + * @param {string} name The name of the category to be deleted. + */ +WorkspaceFactoryView.prototype.deleteElementRow = function(id, index) { + // Delete tab entry. + delete this.tabMap[id]; + // Delete tab row. + var table = document.getElementById('categoryTable'); + var count = table.rows.length; + table.deleteRow(index); + + // If last category removed, add category help text and disable category + // buttons. + this.addEmptyCategoryMessage(); +}; + +/** + * If there are no toolbox elements created, adds a help message to show + * where categories will appear. Should be called when deleting list elements + * in case the last element is deleted. + */ +WorkspaceFactoryView.prototype.addEmptyCategoryMessage = function() { + var table = document.getElementById('categoryTable'); + if (!table.rows.length) { + document.getElementById('categoryHeader').textContent = + 'You currently have no categories.'; + } +}; + +/** + * Given the index of the currently selected element, updates the state of + * the buttons that allow the user to edit the list elements. Updates the edit + * and arrow buttons. Should be called when adding or removing elements + * or when changing to a new element or when swapping to a different element. + * TODO(evd2014): Switch to using CSS to add/remove styles. + * @param {number} selectedIndex The index of the currently selected category, + * -1 if no categories created. + * @param {ListElement} selected The selected ListElement. + */ +WorkspaceFactoryView.prototype.updateState = function(selectedIndex, selected) { + // Disable/enable editing buttons as necessary. + document.getElementById('button_editCategory').disabled = selectedIndex < 0 || + selected.type != ListElement.TYPE_CATEGORY; + document.getElementById('button_remove').disabled = selectedIndex < 0; + document.getElementById('button_up').disabled = selectedIndex <= 0; + var table = document.getElementById('categoryTable'); + document.getElementById('button_down').disabled = selectedIndex >= + table.rows.length - 1 || selectedIndex < 0; + // Disable/enable the workspace as necessary. + this.disableWorkspace(this.shouldDisableWorkspace(selected)); +}; + +/** + * Determines the DOM ID for a category given its name. + * @param {string} name Name of category + * @return {string} ID of category tab + */ +WorkspaceFactoryView.prototype.createCategoryIdName = function(name) { + return 'tab_' + name; +}; + +/** + * Switches a tab on or off. + * @param {string} id ID of the tab to switch on or off. + * @param {boolean} selected True if tab should be on, false if tab should be + * off. + */ +WorkspaceFactoryView.prototype.setCategoryTabSelection = + function(id, selected) { + if (!this.tabMap[id]) { + return; // Exit if tab does not exist. + } + this.tabMap[id].className = selected ? 'tabon' : 'taboff'; +}; + +/** + * Used to bind a click to a certain DOM element (used for category tabs). + * Taken directly from code.js + * @param {string|!Element} e1 Tab element or corresponding ID string. + * @param {!Function} func Function to be executed on click. + */ +WorkspaceFactoryView.prototype.bindClick = function(el, func) { + if (typeof el == 'string') { + el = document.getElementById(el); + } + el.addEventListener('click', func, true); + el.addEventListener('touchend', func, true); +}; + +/** + * Creates a file and downloads it. In some browsers downloads, and in other + * browsers, opens new tab with contents. + * @param {string} filename Name of file + * @param {!Blob} data Blob containing contents to download + */ +WorkspaceFactoryView.prototype.createAndDownloadFile = + function(filename, data) { + var clickEvent = new MouseEvent('click', { + 'view': window, + 'bubbles': true, + 'cancelable': false + }); + var a = document.createElement('a'); + a.href = window.URL.createObjectURL(data); + a.download = filename; + a.textContent = 'Download file!'; + a.dispatchEvent(clickEvent); +}; + +/** + * Given the ID of a certain category, updates the corresponding tab in + * the DOM to show a new name. + * @param {string} newName Name of string to be displayed on tab + * @param {string} id ID of category to be updated + */ +WorkspaceFactoryView.prototype.updateCategoryName = function(newName, id) { + this.tabMap[id].textContent = newName; + this.tabMap[id].id = this.createCategoryIdName(newName); +}; + +/** + * Moves a tab from one index to another. Adjusts index inserting before + * based on if inserting before or after. Checks that the indexes are in + * bounds, throws error if not. + * @param {string} id The ID of the category to move. + * @param {number} newIndex The index to move the category to. + * @param {number} oldIndex The index the category is currently at. + */ +WorkspaceFactoryView.prototype.moveTabToIndex = + function(id, newIndex, oldIndex) { + var table = document.getElementById('categoryTable'); + // Check that indexes are in bounds. + if (newIndex < 0 || newIndex >= table.rows.length || oldIndex < 0 || + oldIndex >= table.rows.length) { + throw Error('Index out of bounds when moving tab in the view.'); + } + + if (newIndex < oldIndex) { + // Inserting before. + var row = table.insertRow(newIndex); + row.appendChild(this.tabMap[id]); + table.deleteRow(oldIndex + 1); + } else { + // Inserting after. + var row = table.insertRow(newIndex + 1); + row.appendChild(this.tabMap[id]); + table.deleteRow(oldIndex); + } +}; + +/** + * Given a category ID and color, use that color to color the left border of the + * tab for that category. + * @param {string} id The ID of the category to color. + * @param {?string} colour The colour for to be used for the border of the tab, + * or null if none. Must be a valid CSS string. + */ +WorkspaceFactoryView.prototype.setBorderColor = function(id, colour) { + var style = this.tabMap[id].style; + if (colour) { + style.borderLeftWidth = '8px'; + style.borderLeftStyle = 'solid'; + style.borderColor = colour; + } else { + style.borderLeftWidth = ''; + style.borderLeftStyle = ''; + style.borderColor = ''; + } +}; + +/** + * Given a separator ID, creates a corresponding tab in the view, updates + * tab map, and returns the tab. + * @param {string} id The ID of the separator. + * @param {!Element} The td DOM element representing the separator. + */ +WorkspaceFactoryView.prototype.addSeparatorTab = function(id) { + var table = document.getElementById('categoryTable'); + var count = table.rows.length; + + if (count == 0) { + document.getElementById('categoryHeader').textContent = 'Your categories:'; + } + // Create separator. + var row = table.insertRow(count); + var nextEntry = row.insertCell(0); + // Configure separator. + nextEntry.style.height = '10px'; + // Store and return separator. + this.tabMap[id] = table.rows[count].cells[0]; + return nextEntry; +}; + +/** + * Disables or enables the workspace by putting a div over or under the + * toolbox workspace, depending on the value of disable. Used when switching + * to/from separators where the user shouldn't be able to drag blocks into + * the workspace. + * @param {boolean} disable True if the workspace should be disabled, false + * if it should be enabled. + */ +WorkspaceFactoryView.prototype.disableWorkspace = function(disable) { + if (disable) { + document.getElementById('toolbox_section').className = 'disabled'; + document.getElementById('toolbox_blocks').style.pointerEvents = 'none'; + } else { + document.getElementById('toolbox_section').className = ''; + document.getElementById('toolbox_blocks').style.pointerEvents = 'auto'; + } + +}; + +/** + * Determines if the workspace should be disabled. The workspace should be + * disabled if category is a separator or has VARIABLE or PROCEDURE tags. + * @return {boolean} True if the workspace should be disabled, false otherwise. + */ +WorkspaceFactoryView.prototype.shouldDisableWorkspace = function(category) { + return category != null && category.type != ListElement.TYPE_FLYOUT && + (category.type == ListElement.TYPE_SEPARATOR || + category.custom == 'VARIABLE' || category.custom == 'PROCEDURE'); +}; + +/** + * Removes all categories and separators in the view. Clears the tabMap to + * reflect this. + */ +WorkspaceFactoryView.prototype.clearToolboxTabs = function() { + this.tabMap = []; + var oldCategoryTable = document.getElementById('categoryTable'); + var newCategoryTable = document.createElement('table'); + newCategoryTable.id = 'categoryTable'; + newCategoryTable.style.width = 'auto'; + oldCategoryTable.parentElement.replaceChild(newCategoryTable, + oldCategoryTable); +}; + +/** + * Given a set of blocks currently loaded user-generated shadow blocks, visually + * marks them without making them actual shadow blocks (allowing them to still + * be editable and movable). + * @param {!Array.} blocks Array of user-generated shadow blocks + * currently loaded. + */ +WorkspaceFactoryView.prototype.markShadowBlocks = function(blocks) { + for (var i = 0; i < blocks.length; i++) { + this.markShadowBlock(blocks[i]); + } +}; + +/** + * Visually marks a user-generated shadow block as a shadow block in the + * workspace without making the block an actual shadow block (allowing it + * to be moved and edited). + * @param {!Blockly.Block} block The block that should be marked as a shadow + * block (must be rendered). + */ +WorkspaceFactoryView.prototype.markShadowBlock = function(block) { + // Add Blockly CSS for user-generated shadow blocks. + Blockly.utils.dom.addClass(block.svgGroup_, 'shadowBlock'); + // If not a valid shadow block, add a warning message. + if (!block.getSurroundParent()) { + block.setWarningText('Shadow blocks must be nested inside' + + ' other blocks to be displayed.'); + } + if (FactoryUtils.hasVariableField(block)) { + block.setWarningText('Cannot make variable blocks shadow blocks.'); + } +}; + +/** + * Removes visual marking for a shadow block given a rendered block. + * @param {!Blockly.Block} block The block that should be unmarked as a shadow + * block (must be rendered). + */ +WorkspaceFactoryView.prototype.unmarkShadowBlock = function(block) { + // Remove Blockly CSS for user-generated shadow blocks. + Blockly.utils.dom.removeClass(block.svgGroup_, 'shadowBlock'); +}; + +/** + * Sets the tabs for modes according to which mode the user is currenly + * editing in. + * @param {string} mode The mode being switched to + * (WorkspaceFactoryController.MODE_TOOLBOX or WorkspaceFactoryController.MODE_PRELOAD). + */ +WorkspaceFactoryView.prototype.setModeSelection = function(mode) { + document.getElementById('tab_preload').className = mode == + WorkspaceFactoryController.MODE_PRELOAD ? 'tabon' : 'taboff'; + document.getElementById('preload_div').style.display = mode == + WorkspaceFactoryController.MODE_PRELOAD ? 'block' : 'none'; + document.getElementById('tab_toolbox').className = mode == + WorkspaceFactoryController.MODE_TOOLBOX ? 'tabon' : 'taboff'; + document.getElementById('toolbox_div').style.display = mode == + WorkspaceFactoryController.MODE_TOOLBOX ? 'block' : 'none'; +}; + +/** + * Updates the help text above the workspace depending on the selected mode. + * @param {string} mode The selected mode (WorkspaceFactoryController.MODE_TOOLBOX or + * WorkspaceFactoryController.MODE_PRELOAD). + */ +WorkspaceFactoryView.prototype.updateHelpText = function(mode) { + if (mode == WorkspaceFactoryController.MODE_TOOLBOX) { + var helpText = 'Drag blocks into the workspace to configure the toolbox ' + + 'in your custom workspace.'; + } else { + var helpText = 'Drag blocks into the workspace to pre-load them in your ' + + 'custom workspace.' + } + document.getElementById('editHelpText').textContent = helpText; +}; + +/** + * Sets the basic options that are not dependent on if there are categories + * or a single flyout of blocks. Updates checkboxes and text fields. + */ +WorkspaceFactoryView.prototype.setBaseOptions = function() { + // Readonly mode. + document.getElementById('option_readOnly_checkbox').checked = false; + blocklyFactory.ifCheckedEnable(true, ['readonly1', 'readonly2']); + + // Set basic options. + document.getElementById('option_css_checkbox').checked = true; + document.getElementById('option_maxBlocks_number').value = 100; + document.getElementById('option_media_text').value = + 'https://blockly-demo.appspot.com/static/media/'; + document.getElementById('option_rtl_checkbox').checked = false; + document.getElementById('option_sounds_checkbox').checked = true; + document.getElementById('option_oneBasedIndex_checkbox').checked = true; + document.getElementById('option_horizontalLayout_checkbox').checked = false; + document.getElementById('option_toolboxPosition_checkbox').checked = false; + + // Check infinite blocks and hide suboption. + document.getElementById('option_infiniteBlocks_checkbox').checked = true; + document.getElementById('maxBlockNumber_option').style.display = + 'none'; + + // Uncheck grid and zoom options and hide suboptions. + document.getElementById('option_grid_checkbox').checked = false; + document.getElementById('grid_options').style.display = 'none'; + document.getElementById('option_zoom_checkbox').checked = false; + document.getElementById('zoom_options').style.display = 'none'; + + // Set grid options. + document.getElementById('gridOption_spacing_number').value = 20; + document.getElementById('gridOption_length_number').value = 1; + document.getElementById('gridOption_colour_text').value = '#888'; + document.getElementById('gridOption_snap_checkbox').checked = false; + + // Set zoom options. + document.getElementById('zoomOption_controls_checkbox').checked = true; + document.getElementById('zoomOption_wheel_checkbox').checked = true; + document.getElementById('zoomOption_startScale_number').value = 1.0; + document.getElementById('zoomOption_maxScale_number').value = 3; + document.getElementById('zoomOption_minScale_number').value = 0.3; + document.getElementById('zoomOption_scaleSpeed_number').value = 1.2; +}; + +/** + * Updates category specific options depending on if there are categories + * currently present. Updates checkboxes and text fields in the view. + * @param {boolean} hasCategories True if categories are present, false if all + * blocks are displayed in a single flyout. + */ +WorkspaceFactoryView.prototype.setCategoryOptions = function(hasCategories) { + document.getElementById('option_collapse_checkbox').checked = hasCategories; + document.getElementById('option_comments_checkbox').checked = hasCategories; + document.getElementById('option_disable_checkbox').checked = hasCategories; + document.getElementById('option_scrollbars_checkbox').checked = hasCategories; + document.getElementById('option_trashcan_checkbox').checked = hasCategories; +}; diff --git a/js/demos/blockfactory_old/blocks.js b/js/demos/blockfactory_old/blocks.js new file mode 100644 index 0000000..58c7ca3 --- /dev/null +++ b/js/demos/blockfactory_old/blocks.js @@ -0,0 +1,824 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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('block_type'), '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); + // Connect a shadow block to this new input. + this.sourceBlock_.spawnOutputShadow_(option); + }); + this.appendDummyInput() + .appendField(dropdown, 'CONNECTIONS'); + this.appendValueInput('COLOUR') + .setCheck('Colour') + .appendField('colour'); + this.setTooltip('Build a custom block by plugging\n' + + 'fields, inputs and other blocks here.'); + this.setHelpUrl( + 'https://developers.google.com/blockly/guides/create-custom-blocks/block-factory'); + }, + mutationToDom: function() { + var container = Blockly.utils.xml.createElement('mutation'); + container.setAttribute('connections', this.getFieldValue('CONNECTIONS')); + return container; + }, + domToMutation: function(xmlElement) { + var connections = xmlElement.getAttribute('connections'); + this.updateShape_(connections); + }, + spawnOutputShadow_: function(option) { + // Helper method for deciding which type of outputs this block needs + // to attach shaddow blocks to. + switch (option) { + case 'LEFT': + this.connectOutputShadow_('OUTPUTTYPE'); + break; + case 'TOP': + this.connectOutputShadow_('TOPTYPE'); + break; + case 'BOTTOM': + this.connectOutputShadow_('BOTTOMTYPE'); + break; + case 'BOTH': + this.connectOutputShadow_('TOPTYPE'); + this.connectOutputShadow_('BOTTOMTYPE'); + break; + } + }, + connectOutputShadow_: function(outputType) { + // Helper method to create & connect shadow block. + var type = this.workspace.newBlock('type_null'); + type.setShadow(true); + type.outputConnection.connect(this.getInput(outputType).connection); + type.initSvg(); + type.render(); + }, + updateShape_: function(option) { + var outputExists = this.getInput('OUTPUTTYPE'); + var topExists = this.getInput('TOPTYPE'); + var bottomExists = this.getInput('BOTTOMTYPE'); + if (option == 'LEFT') { + if (!outputExists) { + this.addTypeInput_('OUTPUTTYPE', 'output type'); + } + } else if (outputExists) { + this.removeInput('OUTPUTTYPE'); + } + if (option == 'TOP' || option == 'BOTH') { + if (!topExists) { + this.addTypeInput_('TOPTYPE', 'top type'); + } + } else if (topExists) { + this.removeInput('TOPTYPE'); + } + if (option == 'BOTTOM' || option == 'BOTH') { + if (!bottomExists) { + this.addTypeInput_('BOTTOMTYPE', 'bottom type'); + } + } else if (bottomExists) { + this.removeInput('BOTTOMTYPE'); + } + }, + addTypeInput_: function(name, label) { + this.appendValueInput(name) + .setCheck('Type') + .appendField(label); + this.moveInputBefore(name, 'COLOUR'); + } +}; + +var FIELD_MESSAGE = 'fields %1 %2'; +var FIELD_ARGS = [ + { + "type": "field_dropdown", + "name": "ALIGN", + "options": [['left', 'LEFT'], ['right', 'RIGHT'], ['centre', 'CENTRE']], + }, + { + "type": "input_statement", + "name": "FIELDS", + "check": "Field" + } +]; + +var TYPE_MESSAGE = 'type %1'; +var TYPE_ARGS = [ + { + "type": "input_value", + "name": "TYPE", + "check": "Type", + "align": "RIGHT" + } +]; + +Blockly.Blocks['input_value'] = { + // Value input. + init: function() { + this.jsonInit({ + "message0": "value input %1 %2", + "args0": [ + { + "type": "field_input", + "name": "INPUTNAME", + "text": "NAME" + }, + { + "type": "input_dummy" + } + ], + "message1": FIELD_MESSAGE, + "args1": FIELD_ARGS, + "message2": TYPE_MESSAGE, + "args2": TYPE_ARGS, + "previousStatement": "Input", + "nextStatement": "Input", + "colour": 210, + "tooltip": "A value socket for horizontal connections.", + "helpUrl": "https://www.youtube.com/watch?v=s2_xaEvcVI0#t=71" + }); + }, + onchange: function() { + inputNameCheck(this); + } +}; + +Blockly.Blocks['input_statement'] = { + // Statement input. + init: function() { + this.jsonInit({ + "message0": "statement input %1 %2", + "args0": [ + { + "type": "field_input", + "name": "INPUTNAME", + "text": "NAME" + }, + { + "type": "input_dummy" + }, + ], + "message1": FIELD_MESSAGE, + "args1": FIELD_ARGS, + "message2": TYPE_MESSAGE, + "args2": TYPE_ARGS, + "previousStatement": "Input", + "nextStatement": "Input", + "colour": 210, + "tooltip": "A statement socket for enclosed vertical stacks.", + "helpUrl": "https://www.youtube.com/watch?v=s2_xaEvcVI0#t=246" + }); + }, + onchange: function() { + inputNameCheck(this); + } +}; + +Blockly.Blocks['input_dummy'] = { + // Dummy input. + init: function() { + this.jsonInit({ + "message0": "dummy input", + "message1": FIELD_MESSAGE, + "args1": FIELD_ARGS, + "previousStatement": "Input", + "nextStatement": "Input", + "colour": 210, + "tooltip": "For adding fields on a separate row with no " + + "connections. Alignment options (left, right, centre) " + + "apply only to multi-line fields.", + "helpUrl": "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() { + fieldNameCheck(this); + } +}; + +Blockly.Blocks['field_number'] = { + // Numeric input. + init: function() { + this.setColour(160); + this.appendDummyInput() + .appendField('numeric input') + .appendField(new Blockly.FieldNumber(0), 'VALUE') + .appendField(',') + .appendField(new Blockly.FieldTextInput('NAME'), 'FIELDNAME'); + this.appendDummyInput() + .appendField('min') + .appendField(new Blockly.FieldNumber(-Infinity), 'MIN') + .appendField('max') + .appendField(new Blockly.FieldNumber(Infinity), 'MAX') + .appendField('precision') + .appendField(new Blockly.FieldNumber(0, 0), 'PRECISION'); + this.setPreviousStatement(true, 'Field'); + this.setNextStatement(true, 'Field'); + this.setTooltip('An input field for the user to enter a number.'); + this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=319'); + }, + onchange: function() { + fieldNameCheck(this); + } +}; + +Blockly.Blocks['field_angle'] = { + // Angle input. + init: function() { + 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() { + fieldNameCheck(this); + } +}; + +Blockly.Blocks['field_dropdown'] = { + // Dropdown menu. + init: function() { + this.appendDummyInput() + .appendField('dropdown') + .appendField(new Blockly.FieldTextInput('NAME'), 'FIELDNAME'); + this.optionCount_ = 3; + this.updateShape_(); + this.setPreviousStatement(true, 'Field'); + this.setNextStatement(true, 'Field'); + this.setMutator(new Blockly.Mutator(['field_dropdown_option'])); + this.setColour(160); + this.setTooltip('Dropdown menu with a list of options.'); + this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=386'); + }, + mutationToDom: function(workspace) { + // Create XML to represent menu options. + var container = Blockly.utils.xml.createElement('mutation'); + container.setAttribute('options', this.optionCount_); + return container; + }, + domToMutation: function(container) { + // Parse XML to restore the menu options. + this.optionCount_ = parseInt(container.getAttribute('options'), 10); + this.updateShape_(); + }, + decompose: function(workspace) { + // Populate the mutator's dialog with this block's components. + var containerBlock = workspace.newBlock('field_dropdown_container'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 0; i < this.optionCount_; i++) { + var optionBlock = workspace.newBlock('field_dropdown_option'); + optionBlock.initSvg(); + connection.connect(optionBlock.previousConnection); + connection = optionBlock.nextConnection; + } + return containerBlock; + }, + compose: function(containerBlock) { + // Reconfigure this block based on the mutator dialog's components. + var optionBlock = containerBlock.getInputTargetBlock('STACK'); + // Count number of inputs. + var data = []; + while (optionBlock) { + data.push([optionBlock.userData_, optionBlock.cpuData_]); + optionBlock = optionBlock.nextConnection && + optionBlock.nextConnection.targetBlock(); + } + this.optionCount_ = data.length; + this.updateShape_(); + // Restore any data. + for (var i = 0; i < this.optionCount_; i++) { + this.setFieldValue(data[i][0] || 'option', 'USER' + i); + this.setFieldValue(data[i][1] || 'OPTIONNAME', 'CPU' + i); + } + }, + saveConnections: function(containerBlock) { + // Store names and values for each option. + var optionBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 0; + while (optionBlock) { + optionBlock.userData_ = this.getFieldValue('USER' + i); + optionBlock.cpuData_ = this.getFieldValue('CPU' + i); + i++; + optionBlock = optionBlock.nextConnection && + optionBlock.nextConnection.targetBlock(); + } + }, + updateShape_: function() { + // Modify this block to have the correct number of options. + // Add new options. + for (var i = 0; i < this.optionCount_; i++) { + if (!this.getInput('OPTION' + i)) { + this.appendDummyInput('OPTION' + i) + .appendField(new Blockly.FieldTextInput('option'), 'USER' + i) + .appendField(',') + .appendField(new Blockly.FieldTextInput('OPTIONNAME'), 'CPU' + i); + } + } + // Remove deleted options. + while (this.getInput('OPTION' + i)) { + this.removeInput('OPTION' + i); + i++; + } + }, + onchange: function() { + if (this.workspace && 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() { + 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() { + 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() { + 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() { + 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.FieldNumber('15', 0, NaN, 1), 'WIDTH') + .appendField('height') + .appendField(new Blockly.FieldNumber('15', 0, NaN, 1), '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.typeCount_ = 2; + this.updateShape_(); + this.setOutput(true, 'Type'); + this.setMutator(new Blockly.Mutator(['type_group_item'])); + this.setColour(230); + this.setTooltip('Allows more than one type to be accepted.'); + this.setHelpUrl('https://www.youtube.com/watch?v=s2_xaEvcVI0#t=677'); + }, + mutationToDom: function(workspace) { + // Create XML to represent a group of types. + var container = Blockly.utils.xml.createElement('mutation'); + container.setAttribute('types', this.typeCount_); + return container; + }, + domToMutation: function(container) { + // Parse XML to restore the group of types. + this.typeCount_ = parseInt(container.getAttribute('types'), 10); + this.updateShape_(); + for (var i = 0; i < this.typeCount_; i++) { + this.removeInput('TYPE' + i); + } + for (var i = 0; i < this.typeCount_; i++) { + var input = this.appendValueInput('TYPE' + i) + .setCheck('Type'); + if (i == 0) { + input.appendField('any of'); + } + } + }, + decompose: function(workspace) { + // Populate the mutator's dialog with this block's components. + var containerBlock = workspace.newBlock('type_group_container'); + containerBlock.initSvg(); + var connection = containerBlock.getInput('STACK').connection; + for (var i = 0; i < this.typeCount_; i++) { + var typeBlock = workspace.newBlock('type_group_item'); + typeBlock.initSvg(); + connection.connect(typeBlock.previousConnection); + connection = typeBlock.nextConnection; + } + return containerBlock; + }, + compose: function(containerBlock) { + // Reconfigure this block based on the mutator dialog's components. + var typeBlock = containerBlock.getInputTargetBlock('STACK'); + // Count number of inputs. + var connections = []; + while (typeBlock) { + connections.push(typeBlock.valueConnection_); + typeBlock = typeBlock.nextConnection && + typeBlock.nextConnection.targetBlock(); + } + // Disconnect any children that don't belong. + for (var i = 0; i < this.typeCount_; i++) { + var connection = this.getInput('TYPE' + i).connection.targetConnection; + if (connection && connections.indexOf(connection) == -1) { + connection.disconnect(); + } + } + this.typeCount_ = connections.length; + this.updateShape_(); + // Reconnect any child blocks. + for (var i = 0; i < this.typeCount_; i++) { + Blockly.Mutator.reconnect(connections[i], this, 'TYPE' + i); + } + }, + saveConnections: function(containerBlock) { + // Store a pointer to any connected child blocks. + var typeBlock = containerBlock.getInputTargetBlock('STACK'); + var i = 0; + while (typeBlock) { + var input = this.getInput('TYPE' + i); + typeBlock.valueConnection_ = input && input.connection.targetConnection; + i++; + typeBlock = typeBlock.nextConnection && + typeBlock.nextConnection.targetBlock(); + } + }, + updateShape_: function() { + // Modify this block to have the correct number of inputs. + // Add new inputs. + for (var i = 0; i < this.typeCount_; i++) { + if (!this.getInput('TYPE' + i)) { + var input = this.appendValueInput('TYPE' + i); + if (i == 0) { + input.appendField('any of'); + } + } + } + // Remove deleted inputs. + while (this.getInput('TYPE' + i)) { + this.removeInput('TYPE' + i); + i++; + } + } +}; + +Blockly.Blocks['type_group_container'] = { + // Container. + init: function() { + this.jsonInit({ + "message0": "add types %1 %2", + "args0": [ + {"type": "input_dummy"}, + {"type": "input_statement", "name": "STACK"} + ], + "colour": 230, + "tooltip": "Add, or remove allowed type.", + "helpUrl": "https://www.youtube.com/watch?v=s2_xaEvcVI0#t=677" + }); + } +}; + +Blockly.Blocks['type_group_item'] = { + // Add type. + init: function() { + this.jsonInit({ + "message0": "type", + "previousStatement": null, + "nextStatement": null, + "colour": 230, + "tooltip": "Add a new allowed type.", + "helpUrl": "https://www.youtube.com/watch?v=s2_xaEvcVI0#t=677" + }); + } +}; + +Blockly.Blocks['type_null'] = { + // Null type. + valueType: null, + init: function() { + this.jsonInit({ + "message0": "any", + "output": "Type", + "colour": 230, + "tooltip": "Any type is allowed.", + "helpUrl": "https://www.youtube.com/watch?v=s2_xaEvcVI0#t=602" + }); + } +}; + +Blockly.Blocks['type_boolean'] = { + // Boolean type. + valueType: 'Boolean', + init: function() { + this.jsonInit({ + "message0": "Boolean", + "output": "Type", + "colour": 230, + "tooltip": "Booleans (true/false) are allowed.", + "helpUrl": "https://www.youtube.com/watch?v=s2_xaEvcVI0#t=602" + }); + } +}; + +Blockly.Blocks['type_number'] = { + // Number type. + valueType: 'Number', + init: function() { + this.jsonInit({ + "message0": "Number", + "output": "Type", + "colour": 230, + "tooltip": "Numbers (int/float) are allowed.", + "helpUrl": "https://www.youtube.com/watch?v=s2_xaEvcVI0#t=602" + }); + } +}; + +Blockly.Blocks['type_string'] = { + // String type. + valueType: 'String', + init: function() { + this.jsonInit({ + "message0": "String", + "output": "Type", + "colour": 230, + "tooltip": "Strings (text) are allowed.", + "helpUrl": "https://www.youtube.com/watch?v=s2_xaEvcVI0#t=602" + }); + } +}; + +Blockly.Blocks['type_list'] = { + // List type. + valueType: 'Array', + init: function() { + this.jsonInit({ + "message0": "Array", + "output": "Type", + "colour": 230, + "tooltip": "Arrays (lists) are allowed.", + "helpUrl": "https://www.youtube.com/watch?v=s2_xaEvcVI0#t=602" + }); + } +}; + +Blockly.Blocks['type_other'] = { + // Other type. + init: function() { + this.jsonInit({ + "message0": "other %1", + "args0": [{"type": "field_input", "name": "TYPE", "text": ""}], + "output": "Type", + "colour": 230, + "tooltip": "Custom type to allow.", + "helpUrl": "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. + var hue = parseInt(text, 10); + if (!isNaN(hue)) { + this.sourceBlock_.setColour(hue); + } + }, + mutationToDom: function(workspace) { + var container = Blockly.utils.xml.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) { + if (!referenceBlock.workspace) { + // Block has been deleted. + return; + } + var name = referenceBlock.getFieldValue('FIELDNAME').toLowerCase(); + var count = 0; + var blocks = referenceBlock.workspace.getAllBlocks(false); + for (var i = 0, block; block = blocks[i]; i++) { + 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) { + if (!referenceBlock.workspace) { + // Block has been deleted. + return; + } + var name = referenceBlock.getFieldValue('INPUTNAME').toLowerCase(); + var count = 0; + var blocks = referenceBlock.workspace.getAllBlocks(false); + for (var i = 0, block; block = blocks[i]; i++) { + 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/js/demos/blockfactory_old/factory.js b/js/demos/blockfactory_old/factory.js new file mode 100644 index 0000000..fce170a --- /dev/null +++ b/js/demos/blockfactory_old/factory.js @@ -0,0 +1,848 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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 = {}; + // Type is not used by Blockly, but may be used by a loader. + JS.type = 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(' '); + if (args.length) { + 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); + if (!isNaN(hue)) { + 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_number': + // Result: new Blockly.FieldNumber(10, 0, 100, 1), 'NUMBER' + var args = [ + Number(block.getFieldValue('VALUE')), + Number(block.getFieldValue('MIN')), + Number(block.getFieldValue('MAX')), + Number(block.getFieldValue('PRECISION')) + ]; + // Remove any trailing arguments that aren't needed. + if (args[3] == 0) { + args.pop(); + if (args[2] == Infinity) { + args.pop(); + if (args[1] == -Infinity) { + args.pop(); + } + } + } + fields.push('new Blockly.FieldNumber(' + args.join(', ') + '), ' + + escapeString(block.getFieldValue('FIELDNAME'))); + break; + case 'field_angle': + // Result: new Blockly.FieldAngle(90), 'ANGLE' + fields.push('new Blockly.FieldAngle(' + + Number(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_number': + var obj = { + type: block.type, + name: block.getFieldValue('FIELDNAME'), + value: Number(block.getFieldValue('VALUE')) + }; + var min = Number(block.getFieldValue('MIN')); + if (min > -Infinity) { + obj.min = min; + } + var max = Number(block.getFieldValue('MAX')); + if (max < Infinity) { + obj.max = max; + } + var precision = Number(block.getFieldValue('PRECISION')); + if (precision) { + obj.precision = precision; + } + fields.push(obj); + 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 i = 0; i < typeBlock.typeCount_; i++) { + types = types.concat(getTypesFrom_(typeBlock, 'TYPE' + i)); + } + // 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.FieldNumber) { + code.push(makeVar('number', 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 + "');"); + } + } + } + // Most languages end lines with a semicolon. Python does not. + var lineEnd = { + 'JavaScript': ';', + 'Python': '', + 'PHP': ';', + 'Dart': ';' + }; + code.push(" // TODO: Assemble " + language + " into code variable."); + if (block.outputConnection) { + code.push(" var code = '...';"); + code.push(" // TODO: Change ORDER_NONE to the correct strength."); + code.push(" return [code, Blockly." + language + ".ORDER_NONE];"); + } else { + code.push(" var code = '..." + (lineEnd[language] || '') + "\\n';"); + 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.type || 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); + previewWorkspace.clearUndo(); + + 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) {
+  var pre = document.getElementById(id);
+  pre.textContent = code;
+  // Remove the 'prettyprinted' class, so that Prettify will recalculate.
+  pre.className = pre.className.replace('prettyprinted', '');
+  PR.prettyPrint();
+}
+
+/**
+ * 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/guides/create-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',
+      {collapse: false,
+       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(Blockly.Xml.textToDom(xml), mainWorkspace);
+  }
+  mainWorkspace.clearUndo();
+
+  mainWorkspace.addChangeListener(Blockly.Events.disableOrphans);
+  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/js/demos/blockfactory_old/icon.png b/js/demos/blockfactory_old/icon.png
new file mode 100644
index 0000000..4f8b72f
Binary files /dev/null and b/js/demos/blockfactory_old/icon.png differ
diff --git a/js/demos/blockfactory_old/index.html b/js/demos/blockfactory_old/index.html
new file mode 100644
index 0000000..b03db91
--- /dev/null
+++ b/js/demos/blockfactory_old/index.html
@@ -0,0 +1,229 @@
+
+
+
+  
+  
+  Blockly Demo: Block Factory
+  
+  
+  
+  
+  
+  
+  
+
+
+  
+    
+      
+      
+    
+    
+      
+      
+    
+  
+

Blockly > + Demos > Block Factory

+
+ + + + + +
+

Preview: + +

+
+ + + +
+
+
+
+
+ + + + + + + + + + + + + + + + +
+
+
+

Language code: + +

+
+

+              
+            
+

Generator stub: + +

+
+

+            
+
+ + + diff --git a/js/demos/blockfactory_old/link.png b/js/demos/blockfactory_old/link.png new file mode 100644 index 0000000..11dfd82 Binary files /dev/null and b/js/demos/blockfactory_old/link.png differ diff --git a/js/demos/code/code.js b/js/demos/code/code.js new file mode 100644 index 0000000..e19b9f5 --- /dev/null +++ b/js/demos/code/code.js @@ -0,0 +1,600 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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', + 'et': 'Eesti', + 'fa': 'فارسی', + 'fr': 'Français', + 'he': 'עברית', + 'hrx': 'Hunsrik', + 'hu': 'Magyar', + 'ia': 'Interlingua', + 'is': 'Íslenska', + 'it': 'Italiano', + 'ja': '日本語', + 'kab': 'Kabyle', + '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 parameter 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(xml, Code.workspace); + } else if (defaultXml) { + // Load the editor with default starting blocks. + var xml = Blockly.Xml.textToDom(defaultXml); + Blockly.Xml.domToWorkspace(xml, Code.workspace); + } 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. + // MSIE 11 does not support sessionStorage on file:// URLs. + if (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; +}; + +/** + * Changes the output language by clicking the tab matching + * the selected language in the codeMenu. + */ +Code.changeCodingLanguage = function() { + var codeMenu = document.getElementById('code_menu'); + Code.tabClick(codeMenu.options[codeMenu.selectedIndex].value); +} + +/** + * 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 script = document.createElement('script'); + script.setAttribute('src', 'https://cdn.rawgit.com/google/code-prettify/master/loader/run_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', 'lua', 'xml']; + +/** + * List of tab names with casing, for display in the UI. + * @private + */ +Code.TABS_DISPLAY_ = [ + 'Blocks', 'JavaScript', 'PHP', 'Python', 'Dart', 'Lua', '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').classList.contains('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(xmlDom, Code.workspace); + } + } + + if (document.getElementById('tab_blocks').classList.contains('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]; + var tab = document.getElementById('tab_' + name); + tab.classList.add('taboff'); + tab.classList.remove('tabon'); + document.getElementById('content_' + name).style.visibility = 'hidden'; + } + + // Select the active tab. + Code.selected = clickedName; + var selectedTab = document.getElementById('tab_' + clickedName); + selectedTab.classList.remove('taboff'); + selectedTab.classList.add('tabon'); + // Show the selected pane. + document.getElementById('content_' + clickedName).style.visibility = + 'visible'; + Code.renderContent(); + // The code menu tab is on if the blocks tab is off. + var codeMenuTab = document.getElementById('tab_code'); + if (clickedName == 'blocks') { + Code.workspace.setVisible(true); + codeMenuTab.className = 'taboff'; + } else { + codeMenuTab.className = 'tabon'; + } + // Sync the menu's value with the clicked tab value if needed. + var codeMenu = document.getElementById('code_menu'); + for (var i = 0; i < codeMenu.options.length; i++) { + if (codeMenu.options[i].value == clickedName) { + codeMenu.selectedIndex = i; + break; + } + } + Blockly.svgResize(Code.workspace); +}; + +/** + * 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') { + Code.attemptCodeGeneration(Blockly.JavaScript); + } else if (content.id == 'content_python') { + Code.attemptCodeGeneration(Blockly.Python); + } else if (content.id == 'content_php') { + Code.attemptCodeGeneration(Blockly.PHP); + } else if (content.id == 'content_dart') { + Code.attemptCodeGeneration(Blockly.Dart); + } else if (content.id == 'content_lua') { + Code.attemptCodeGeneration(Blockly.Lua); + } + if (typeof PR == 'object') { + PR.prettyPrint(); + } +}; + +/** + * Attempt to generate the code and display it in the UI, pretty printed. + * @param generator {!Blockly.Generator} The generator to use. + */ +Code.attemptCodeGeneration = function(generator) { + var content = document.getElementById('content_' + Code.selected); + content.textContent = ''; + if (Code.checkAllGeneratorFunctionsDefined(generator)) { + var code = generator.workspaceToCode(Code.workspace); + content.textContent = code; + // Remove the 'prettyprinted' class, so that Prettify will recalculate. + content.className = content.className.replace('prettyprinted', ''); + } +}; + +/** + * Check whether all blocks in use have generator functions. + * @param generator {!Blockly.Generator} The generator to use. + */ +Code.checkAllGeneratorFunctionsDefined = function(generator) { + var blocks = Code.workspace.getAllBlocks(false); + var missingBlockGenerators = []; + for (var i = 0; i < blocks.length; i++) { + var blockType = blocks[i].type; + if (!generator[blockType]) { + if (missingBlockGenerators.indexOf(blockType) == -1) { + missingBlockGenerators.push(blockType); + } + } + } + + var valid = missingBlockGenerators.length == 0; + if (!valid) { + var msg = 'The generator code for the following blocks not specified for ' + + generator.name_ + ':\n - ' + missingBlockGenerators.join('\n - '); + Blockly.alert(msg); // Assuming synchronous. No callback. + } + return valid; +}; + +/** + * 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.getToolbox().width) { + document.getElementById('tab_blocks').style.minWidth = + (Code.workspace.getToolbox().width - 38) + 'px'; + // Account for the 19 pixel margin and on each side. + } + }; + window.addEventListener('resize', onresize, false); + + // The toolbox XML specifies each category name using Blockly's messaging + // format (eg. ``). + // These message keys need to be defined in `Blockly.Msg` in order to + // be decoded by the library. Therefore, we'll use the `MSG` dictionary that's + // been defined for each language to import each category name message + // into `Blockly.Msg`. + // TODO: Clean up the message files so this is done explicitly instead of + // through this for-loop. + for (var messageKey in MSG) { + if (messageKey.indexOf('cat') == 0) { + Blockly.Msg[messageKey.toUpperCase()] = MSG[messageKey]; + } + } + + // Construct the toolbox XML, replacing translated variable names. + var toolboxText = document.getElementById('toolbox').outerHTML; + toolboxText = toolboxText.replace(/(^|[^%]){(\w+)}/g, + function(m, p1, p2) {return p1 + MSG[p2];}); + var toolboxXml = Blockly.Xml.textToDom(toolboxText); + + Code.workspace = Blockly.inject('content_blocks', + {grid: + {spacing: 25, + length: 3, + colour: '#ccc', + snap: true}, + media: '../../media/', + rtl: rtl, + toolbox: toolboxXml, + 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)); + } + Code.bindClick('tab_code', function(e) { + if (e.target !== document.getElementById('tab_code')) { + // Prevent clicks on child codeMenu from triggering a tab click. + return; + } + Code.changeCodingLanguage(); + }); + + onresize(); + Blockly.svgResize(Code.workspace); + + // 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); + + // Populate the coding language selection menu. + var codeMenu = document.getElementById('code_menu'); + codeMenu.options.length = 0; + for (var i = 1; i < Code.TABS_.length; i++) { + codeMenu.options.add(new Option(Code.TABS_DISPLAY_[i], Code.TABS_[i])); + } + codeMenu.addEventListener('change', Code.changeCodingLanguage); + + // 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']; +}; + +/** + * 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(false).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/js/demos/code/icon.png b/js/demos/code/icon.png new file mode 100644 index 0000000..feaa929 Binary files /dev/null and b/js/demos/code/icon.png differ diff --git a/js/demos/code/icons.png b/js/demos/code/icons.png new file mode 100644 index 0000000..7cced7a Binary files /dev/null and b/js/demos/code/icons.png differ diff --git a/js/demos/code/index.html b/js/demos/code/index.html new file mode 100644 index 0000000..298613f --- /dev/null +++ b/js/demos/code/index.html @@ -0,0 +1,393 @@ + + + + + + + Blockly Demo: + + + + + + + + + + + + + + + + + + + + + + + +
+

Blockly‏ > + Demos‏ > + ... +

+
+ +
+ + + + + + + + + + + + + + + + + + + +
... JavaScript Python PHP Lua Dart XML  + + + + + +
+
+
+
+

+  

+  

+  

+  

+  
+
+  
+
+
+
diff --git a/js/demos/code/msg/ar.js b/js/demos/code/msg/ar.js
new file mode 100644
index 0000000..952198b
--- /dev/null
+++ b/js/demos/code/msg/ar.js
@@ -0,0 +1,24 @@
+var MSG = {
+  title: "كود",
+  blocks: "البلوكات",
+  linkTooltip: "احفظ ووصلة إلى البلوكات.",
+  runTooltip: "شغل البرنامج المعرف بواسطة البلوكات في مساحة العمل.",
+  badCode: "خطأ في البرنامج:\n %1",
+  timeout: "تم تجاوز الحد الأقصى لتكرارات التنفيذ .",
+  trashTooltip: "تجاهل كل البلوكات.",
+  catLogic: "منطق",
+  catLoops: "الحلقات",
+  catMath: "رياضيات",
+  catText: "نص",
+  catLists: "قوائم",
+  catColour: "لون",
+  catVariables: "متغيرات",
+  catFunctions: "إجراءات",
+  listVariable: "قائمة",
+  textVariable: "نص",
+  httpRequestError: "كانت هناك مشكلة مع هذا الطلب.",
+  linkAlert: "مشاركة كود بلوكلي الخاص بك مع هذا الرابط:\n %1",
+  hashError: "عذراً،ال '%1' لا تتوافق مع أي برنامج تم حفظه.",
+  xmlError: "تعذر تحميل الملف المحفوظة الخاصة بك.  ربما تم إنشاؤه باستخدام إصدار مختلف من بلوكلي؟",
+  badXml: "خطأ في توزيع ال \"XML\":\n %1\n\nحدد 'موافق' للتخلي عن التغييرات أو 'إلغاء الأمر' لمواصلة تحرير ال\"XML\"."
+};
diff --git a/js/demos/code/msg/be-tarask.js b/js/demos/code/msg/be-tarask.js
new file mode 100644
index 0000000..5c8d722
--- /dev/null
+++ b/js/demos/code/msg/be-tarask.js
@@ -0,0 +1,24 @@
+var MSG = {
+  title: "Код",
+  blocks: "Блёкі",
+  linkTooltip: "Захаваць і зьвязаць з блёкамі.",
+  runTooltip: "Запусьціце праграму, вызначаную блёкамі ў працоўнай вобласьці.",
+  badCode: "Памылка праграмы:\n%1",
+  timeout: "Перавышана максымальная колькасьць ітэрацыяў.",
+  trashTooltip: "Выдаліць усе блёкі.",
+  catLogic: "Лёгіка",
+  catLoops: "Петлі",
+  catMath: "Матэматычныя формулы",
+  catText: "Тэкст",
+  catLists: "Сьпісы",
+  catColour: "Колер",
+  catVariables: "Зьменныя",
+  catFunctions: "Функцыі",
+  listVariable: "сьпіс",
+  textVariable: "тэкст",
+  httpRequestError: "Узьнікла праблема з запытам.",
+  linkAlert: "Падзяліцца Вашым блёкам праз гэтую спасылку:\n\n%1",
+  hashError: "Прабачце, '%1' не адпавядае ніводнай захаванай праграме.",
+  xmlError: "Не атрымалася загрузіць захаваны файл. Магчыма, ён быў створаны з іншай вэрсіяй Блёклі?",
+  badXml: "Памылка сынтаксічнага аналізу XML:\n%1\n\nАбярыце \"ОК\", каб адмовіцца ад зьменаў ці \"Скасаваць\" для далейшага рэдагаваньня XML."
+};
diff --git a/js/demos/code/msg/br.js b/js/demos/code/msg/br.js
new file mode 100644
index 0000000..321e28e
--- /dev/null
+++ b/js/demos/code/msg/br.js
@@ -0,0 +1,24 @@
+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/js/demos/code/msg/ca.js b/js/demos/code/msg/ca.js
new file mode 100644
index 0000000..2b6d973
--- /dev/null
+++ b/js/demos/code/msg/ca.js
@@ -0,0 +1,24 @@
+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/js/demos/code/msg/cs.js b/js/demos/code/msg/cs.js
new file mode 100644
index 0000000..1026511
--- /dev/null
+++ b/js/demos/code/msg/cs.js
@@ -0,0 +1,24 @@
+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/js/demos/code/msg/da.js b/js/demos/code/msg/da.js
new file mode 100644
index 0000000..089450b
--- /dev/null
+++ b/js/demos/code/msg/da.js
@@ -0,0 +1,24 @@
+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/js/demos/code/msg/de.js b/js/demos/code/msg/de.js
new file mode 100644
index 0000000..422f918
--- /dev/null
+++ b/js/demos/code/msg/de.js
@@ -0,0 +1,24 @@
+var MSG = {
+  title: "Code",
+  blocks: "Bausteine",
+  linkTooltip: "Speichern und auf Bausteine verlinken.",
+  runTooltip: "Das Programm ausführen, das von den Bausteinen im Arbeitsbereich definiert ist.",
+  badCode: "Programmfehler:\n%1",
+  timeout: "Die maximalen Ausführungswiederholungen wurden überschritten.",
+  trashTooltip: "Alle Bausteine verwerfen.",
+  catLogic: "Logik",
+  catLoops: "Schleifen",
+  catMath: "Mathematik",
+  catText: "Text",
+  catLists: "Listen",
+  catColour: "Farbe",
+  catVariables: "Variablen",
+  catFunctions: "Funktionen",
+  listVariable: "Liste",
+  textVariable: "Text",
+  httpRequestError: "Mit der Anfrage gab es ein Problem.",
+  linkAlert: "Teile deine Bausteine mit diesem Link:\n\n%1",
+  hashError: "„%1“ stimmt leider mit keinem gespeicherten Programm überein.",
+  xmlError: "Deine gespeicherte Datei konnte nicht geladen werden. Vielleicht wurde sie mit einer anderen Version von Blockly erstellt.",
+  badXml: "Fehler beim Parsen von XML:\n%1\n\nWähle 'OK' zum Verwerfen deiner Änderungen oder 'Abbrechen' zum weiteren Bearbeiten des XML."
+};
diff --git a/js/demos/code/msg/el.js b/js/demos/code/msg/el.js
new file mode 100644
index 0000000..c63b7a6
--- /dev/null
+++ b/js/demos/code/msg/el.js
@@ -0,0 +1,24 @@
+var MSG = {
+  title: "Κώδικας",
+  blocks: "Μπλοκ",
+  linkTooltip: "Αποθηκεύει και συνδέει σε μπλοκ.",
+  runTooltip: "Εκτελεί το πρόγραμμα που ορίζεται από τα μπλοκ στον χώρο εργασίας.",
+  badCode: "Σφάλμα προγράμματος:\n%1",
+  timeout: "Υπέρβαση μέγιστου αριθμού επαναλήψεων.",
+  trashTooltip: "Απόρριψη όλων των μπλοκ.",
+  catLogic: "Λογική",
+  catLoops: "Επαναλήψεις",
+  catMath: "Μαθηματικά",
+  catText: "Κείμενο",
+  catLists: "Λίστες",
+  catColour: "Χρώμα",
+  catVariables: "Μεταβλητές",
+  catFunctions: "Συναρτήσεις",
+  listVariable: "λίστα",
+  textVariable: "κείμενο",
+  httpRequestError: "Υπήρξε πρόβλημα με το αίτημα.",
+  linkAlert: "Κοινοποίησε τα μπλοκ σου με αυτόν τον σύνδεσμο:\n\n%1",
+  hashError: "Λυπάμαι, το «%1» δεν αντιστοιχεί σε κανένα αποθηκευμένο πρόγραμμα.",
+  xmlError: "Δεν μπορώ να φορτώσω το αποθηκευμένο αρχείο σου.  Μήπως δημιουργήθηκε από μία παλιότερη έκδοση του Blockly;",
+  badXml: "Σφάλμα ανάλυσης XML:\n%1\n\nΕπίλεξε «Εντάξει» για να εγκαταλείψεις τις αλλαγές σου ή «Ακύρωση» για να επεξεργαστείς το XML κι άλλο."
+};
diff --git a/js/demos/code/msg/en.js b/js/demos/code/msg/en.js
new file mode 100644
index 0000000..8d52cf3
--- /dev/null
+++ b/js/demos/code/msg/en.js
@@ -0,0 +1,24 @@
+var MSG = {
+  title: "Code",
+  blocks: "Blocks",
+  linkTooltip: "Save and link to blocks.",
+  runTooltip: "Run the program defined by the blocks in the workspace.",
+  badCode: "Program error:\n%1",
+  timeout: "Maximum execution iterations exceeded.",
+  trashTooltip: "Discard all blocks.",
+  catLogic: "Logic",
+  catLoops: "Loops",
+  catMath: "Math",
+  catText: "Text",
+  catLists: "Lists",
+  catColour: "Colour",
+  catVariables: "Variables",
+  catFunctions: "Functions",
+  listVariable: "list",
+  textVariable: "text",
+  httpRequestError: "There was a problem with the request.",
+  linkAlert: "Share your blocks with this link:\n\n%1",
+  hashError: "Sorry, '%1' doesn't correspond with any saved program.",
+  xmlError: "Could not load your saved file. Perhaps it was created with a different version of Blockly?",
+  badXml: "Error parsing XML:\n%1\n\nSelect 'OK' to abandon your changes or 'Cancel' to further edit the XML."
+};
diff --git a/js/demos/code/msg/es.js b/js/demos/code/msg/es.js
new file mode 100644
index 0000000..24358e3
--- /dev/null
+++ b/js/demos/code/msg/es.js
@@ -0,0 +1,24 @@
+var MSG = {
+  title: "Código",
+  blocks: "Bloques",
+  linkTooltip: "Guarda conexión a los bloques.",
+  runTooltip: "Ejecute el programa definido por los bloques en el área de trabajo.",
+  badCode: "Error del programa:\n%1",
+  timeout: "Se excedio el máximo de iteraciones ejecutadas permitidas.",
+  trashTooltip: "Descartar todos los bloques.",
+  catLogic: "Lógica",
+  catLoops: "Secuencias",
+  catMath: "Matemáticas",
+  catText: "Texto",
+  catLists: "Listas",
+  catColour: "Color",
+  catVariables: "Variables",
+  catFunctions: "Funciones",
+  listVariable: "lista",
+  textVariable: "texto",
+  httpRequestError: "Hubo un problema con la petición.",
+  linkAlert: "Comparte tus bloques con este enlace:\n\n%1",
+  hashError: "«%1» no corresponde con ningún programa guardado.",
+  xmlError: "No se pudo cargar el archivo guardado.  ¿Quizá fue creado con otra versión de Blockly?",
+  badXml: "Error de análisis XML:\n%1\n\nSelecciona OK para abandonar tus cambios o Cancelar para seguir editando el XML."
+};
diff --git a/js/demos/code/msg/et.js b/js/demos/code/msg/et.js
new file mode 100644
index 0000000..320c391
--- /dev/null
+++ b/js/demos/code/msg/et.js
@@ -0,0 +1,24 @@
+var MSG = {
+  title: "Kood",
+  blocks: "Plokid",
+  linkTooltip: "Salvesta ja tekita link plokkidele.",
+  runTooltip: "Käivita töölaual olevate plokkidega defineeritud programm.",
+  badCode: "Viga programmis:\n%1",
+  timeout: "Käivitatavate iteratsioonide maksimaalne arv on ületatud.",
+  trashTooltip: "Eemalda kõik plokid.",
+  catLogic: "Loogika",
+  catLoops: "Kordus",
+  catMath: "Matemaatika",
+  catText: "Tekst",
+  catLists: "Loendid",
+  catColour: "Värv",
+  catVariables: "Muutujad",
+  catFunctions: "Funktsioonid",
+  listVariable: "loend",
+  textVariable: "tekst",
+  httpRequestError: "Probleem päringuga.",
+  linkAlert: "Oma plokke saad jagada selle lingiga:\n\n%1",
+  hashError: "Vabandust, kuid '%1' ei vasta ühelegi salvestatud programmile.",
+  xmlError: "Su salvestatud faili ei õnnestunud laadida. Võibolla on see loodud mõne teise Blockly versiooniga?",
+  badXml: "Viga XML-i parsimisel:\n%1\n\nTehtud muudatustest loobumiseks vajuta 'OK', XML-i muudatuste tegemise jätkamiseks 'Katkesta'."
+};
diff --git a/js/demos/code/msg/fa.js b/js/demos/code/msg/fa.js
new file mode 100644
index 0000000..96dd966
--- /dev/null
+++ b/js/demos/code/msg/fa.js
@@ -0,0 +1,24 @@
+var MSG = {
+  title: "کد",
+  blocks: "بلوک‌ها",
+  linkTooltip: "ذخیره و پیوند به بلوک‌ها.",
+  runTooltip: "اجرای برنامهٔ تعریف‌شده توسط بلوک‌ها در فضای کار.",
+  badCode: "خطای برنامه:\n%1",
+  timeout: "حداکثر تکرارهای اجرا رد شده‌است.",
+  trashTooltip: "دورریختن همهٔ بلوک‌ها.",
+  catLogic: "منطق",
+  catLoops: "حلقه‌ها",
+  catMath: "ریاضی",
+  catText: "متن",
+  catLists: "فهرست‌ها",
+  catColour: "رنگ",
+  catVariables: "متغییرها",
+  catFunctions: "توابع",
+  listVariable: "فهرست",
+  textVariable: "متن",
+  httpRequestError: "مشکلی با درخواست وجود داشت.",
+  linkAlert: "اشتراک‌گذاری بلاک‌هایتان با این پیوند:\n\n%1",
+  hashError: "شرمنده، «%1» با هیچ برنامهٔ ذخیره‌شده‌ای تطبیق پیدا نکرد.",
+  xmlError: "نتوانست پروندهٔ ذخیرهٔ شما بارگیری شود.  احتمالاً با نسخهٔ متفاوتی از بلوکی درست شده‌است؟",
+  badXml: "خطای تجزیهٔ اکس‌ام‌ال:\n%1\n\n«باشد» را برای ذخیره و «فسخ» را برای ویرایش بیشتر اکس‌ام‌ال انتخاب کنید."
+};
diff --git a/js/demos/code/msg/fr.js b/js/demos/code/msg/fr.js
new file mode 100644
index 0000000..6018113
--- /dev/null
+++ b/js/demos/code/msg/fr.js
@@ -0,0 +1,24 @@
+var MSG = {
+  title: "Code",
+  blocks: "Blocs",
+  linkTooltip: "Sauvegarder et lier aux blocs.",
+  runTooltip: "Lancer le programme défini par les blocs dans 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/js/demos/code/msg/he.js b/js/demos/code/msg/he.js
new file mode 100644
index 0000000..dc28266
--- /dev/null
+++ b/js/demos/code/msg/he.js
@@ -0,0 +1,24 @@
+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/js/demos/code/msg/hrx.js b/js/demos/code/msg/hrx.js
new file mode 100644
index 0000000..ca0dea3
--- /dev/null
+++ b/js/demos/code/msg/hrx.js
@@ -0,0 +1,24 @@
+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/js/demos/code/msg/hu.js b/js/demos/code/msg/hu.js
new file mode 100644
index 0000000..eee1868
--- /dev/null
+++ b/js/demos/code/msg/hu.js
@@ -0,0 +1,24 @@
+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/js/demos/code/msg/ia.js b/js/demos/code/msg/ia.js
new file mode 100644
index 0000000..5938458
--- /dev/null
+++ b/js/demos/code/msg/ia.js
@@ -0,0 +1,24 @@
+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/js/demos/code/msg/is.js b/js/demos/code/msg/is.js
new file mode 100644
index 0000000..fa5c40d
--- /dev/null
+++ b/js/demos/code/msg/is.js
@@ -0,0 +1,24 @@
+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/js/demos/code/msg/it.js b/js/demos/code/msg/it.js
new file mode 100644
index 0000000..cd69b66
--- /dev/null
+++ b/js/demos/code/msg/it.js
@@ -0,0 +1,24 @@
+var MSG = {
+  title: "Codice",
+  blocks: "Blocchi",
+  linkTooltip: "Salva e collega ai blocchi.",
+  runTooltip: "Esegui il programma definito dai blocchi nell'area di lavoro.",
+  badCode: "Errore programma:\n%1",
+  timeout: "È stato superato il numero massimo consentito di interazioni eseguite.",
+  trashTooltip: "Elimina tutti i blocchi.",
+  catLogic: "Logica",
+  catLoops: "Cicli",
+  catMath: "Matematica",
+  catText: "Testo",
+  catLists: "Elenchi",
+  catColour: "Colore",
+  catVariables: "Variabili",
+  catFunctions: "Funzioni",
+  listVariable: "elenco",
+  textVariable: "testo",
+  httpRequestError: "La richiesta non è stata soddisfatta.",
+  linkAlert: "Condividi i tuoi blocchi con questo collegamento:\n\n%1",
+  hashError: "Mi spiace, '%1' non corrisponde ad alcun programma salvato.",
+  xmlError: "Non è stato possibile caricare il documento.  Forse è stato creato con una versione diversa di Blockly?",
+  badXml: "Errore durante l'analisi XML:\n%1\n\nSeleziona 'OK' per abbandonare le modifiche o 'Annulla' per continuare a modificare l'XML."
+};
diff --git a/js/demos/code/msg/ja.js b/js/demos/code/msg/ja.js
new file mode 100644
index 0000000..6d50419
--- /dev/null
+++ b/js/demos/code/msg/ja.js
@@ -0,0 +1,24 @@
+var MSG = {
+  title: "コード",
+  blocks: "ブロック",
+  linkTooltip: "ブロックの状態を保存してリンクを取得します。",
+  runTooltip: "ブロックで作成したプログラムを実行します。",
+  badCode: "プログラムのエラー:\n%1",
+  timeout: "命令の実行回数が制限値を超えました。",
+  trashTooltip: "すべてのブロックを消します。",
+  catLogic: "論理",
+  catLoops: "繰り返し",
+  catMath: "数学",
+  catText: "テキスト",
+  catLists: "リスト",
+  catColour: "色",
+  catVariables: "変数",
+  catFunctions: "関数",
+  listVariable: "リスト",
+  textVariable: "テキスト",
+  httpRequestError: "ネットワーク接続のエラーです。",
+  linkAlert: "ブロックの状態をこのリンクで共有できます:\n\n%1",
+  hashError: "すみません。「%1」という名前のプログラムは保存されていません。",
+  xmlError: "保存されたファイルを読み込めませんでした。別のバージョンのブロックリーで作成された可能性があります。",
+  badXml: "XML のエラーです:\n%1\n\nXML の変更をやめるには「OK」、編集を続けるには「キャンセル」を選んでください。"
+};
diff --git a/js/demos/code/msg/kab.js b/js/demos/code/msg/kab.js
new file mode 100644
index 0000000..648ff7f
--- /dev/null
+++ b/js/demos/code/msg/kab.js
@@ -0,0 +1,24 @@
+var MSG = {
+  title: "Tangalt",
+  blocks: "Iḥedran",
+  linkTooltip: "Sekles sakin cudd ar iḥedran.",
+  runTooltip: "Senker ahil i d-sbadun iḥedran di tallunt n umahil.",
+  badCode: "Tuccḍa deg ahil :\n%1",
+  timeout: "Amḍan afellay n wallusen n uselkem iɛeddan.",
+  trashTooltip: "Ḍeggeṛ akk iḥedran.",
+  catLogic: "Tameẓla",
+  catLoops: "Tineddicin",
+  catMath: "Tusnakt",
+  catText: "Aḍris",
+  catLists: "Tibdarin",
+  catColour: "Ini",
+  catVariables: "Imuttiyen",
+  catFunctions: "Tiwiriwin",
+  listVariable: "tabdart",
+  textVariable: "aḍris",
+  httpRequestError: "yella ugur deg usuter.",
+  linkAlert: "Bḍu iḥedran-ik s useqdec n useɣwen-agi:\n\n%1",
+  hashError: "Suref-aɣ, '%1' ur imenṭaḍ ulad d yiwen n wahil yettwaskelsen.",
+  xmlError: "Ur izmir ara ad d-isali afaylu  n usekles. Ahatyettwarna s lqem-nniḍen n Blockly?",
+  badXml: "Tuccḍa di tesleḍt n XML :\n%1\n\nFren 'IH' akken ad tzgleḍ asnifel-ik 'Sefsex' akken ad tkemmleḍ asnifel n XML."
+};
diff --git a/js/demos/code/msg/ko.js b/js/demos/code/msg/ko.js
new file mode 100644
index 0000000..990cb6f
--- /dev/null
+++ b/js/demos/code/msg/ko.js
@@ -0,0 +1,24 @@
+var MSG = {
+  title: "코드",
+  blocks: "블록",
+  linkTooltip: "블록을 저장하고 링크를 가져옵니다.",
+  runTooltip: "작업 공간에서 블록으로 정의된 프로그램을 실행합니다.",
+  badCode: "프로그램 오류:\n%1",
+  timeout: "최대 실행 반복을 초과했습니다.",
+  trashTooltip: "모든 블록을 버립니다.",
+  catLogic: "논리",
+  catLoops: "반복",
+  catMath: "수학",
+  catText: "텍스트",
+  catLists: "목록",
+  catColour: "색",
+  catVariables: "변수",
+  catFunctions: "기능",
+  listVariable: "목록",
+  textVariable: "텍스트",
+  httpRequestError: "요청에 문제가 있습니다.",
+  linkAlert: "다음 링크로 블록을 공유하세요:\n\n%1",
+  hashError: "죄송하지만 '%1'은 어떤 저장된 프로그램으로 일치하지 않습니다.",
+  xmlError: "저장된 파일을 불러올 수 없습니다. 혹시 블록리의 다른 버전으로 만들었습니까?",
+  badXml: "XML 구문 분석 오류:\n%1\n\n바뀜을 포기하려면 '확인'을 선택하고 XML을 더 편집하려면 '취소'를 선택하세요."
+};
diff --git a/js/demos/code/msg/mk.js b/js/demos/code/msg/mk.js
new file mode 100644
index 0000000..cc344a6
--- /dev/null
+++ b/js/demos/code/msg/mk.js
@@ -0,0 +1,24 @@
+var MSG = {
+  title: "Код",
+  blocks: "Блокчиња",
+  linkTooltip: "Зачувај и стави врска до блокчињата.",
+  runTooltip: "Пушти го програмот определен од блокчињата во работниот простор.",
+  badCode: "Грешка во програмот:\n%1",
+  timeout: "Го надминавте допуштениот број на повторувања во извршувањето.",
+  trashTooltip: "Отстрани ги сите блокчиња.",
+  catLogic: "Логика",
+  catLoops: "Јамки",
+  catMath: "Математика",
+  catText: "Текст",
+  catLists: "Списоци",
+  catColour: "Боја",
+  catVariables: "Променливи",
+  catFunctions: "Функции",
+  listVariable: "список",
+  textVariable: "текст",
+  httpRequestError: "Се појави проблем во барањето.",
+  linkAlert: "Споделете ги вашите блокчиња со оваа врска:\n\n%1",
+  hashError: "„%1“ не одговара на ниеден зачуван програм.",
+  xmlError: "Не можев да ја вчитам зачуваната податотека. Да не сте ја создале со друга верзија на Blockly?",
+  badXml: "Грешка при расчленувањето на XML:\n%1\n\nСтиснете на „ОК“ за да ги напуштите промените или на „Откажи“ ако сакате уште да ја уредувате XML-податотеката."
+};
diff --git a/js/demos/code/msg/ms.js b/js/demos/code/msg/ms.js
new file mode 100644
index 0000000..87ee8de
--- /dev/null
+++ b/js/demos/code/msg/ms.js
@@ -0,0 +1,24 @@
+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 aturcara:\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 menghuraikan XML:\n%1\n\nPilih 'OK' untuk melucutkan suntingan anda atau 'Batal' untuk bersambung menyunting XML-nya."
+};
diff --git a/js/demos/code/msg/nb.js b/js/demos/code/msg/nb.js
new file mode 100644
index 0000000..60ac039
--- /dev/null
+++ b/js/demos/code/msg/nb.js
@@ -0,0 +1,24 @@
+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/js/demos/code/msg/nl.js b/js/demos/code/msg/nl.js
new file mode 100644
index 0000000..339a5e8
--- /dev/null
+++ b/js/demos/code/msg/nl.js
@@ -0,0 +1,24 @@
+var MSG = {
+  title: "Code",
+  blocks: "Blokken",
+  linkTooltip: "Opslaan en koppelen naar blokken.",
+  runTooltip: "Voer het programma uit dat met de blokken in de werkruimte is gemaakt.",
+  badCode: "Programmafout:\n%1",
+  timeout: "Het maximale aantal iteraties is overschreden.",
+  trashTooltip: "Alle blokken verwijderen",
+  catLogic: "Logica",
+  catLoops: "Lussen",
+  catMath: "Formules",
+  catText: "Tekst",
+  catLists: "Lijsten",
+  catColour: "Kleur",
+  catVariables: "Variabelen",
+  catFunctions: "Functies",
+  listVariable: "lijst",
+  textVariable: "tekst",
+  httpRequestError: "Er is een probleem opgetreden tijdens het verwerken van het verzoek.",
+  linkAlert: "Deel uw blokken via deze koppeling:\n\n%1",
+  hashError: "\"%1\" komt helaas niet overeen met een opgeslagen bestand.",
+  xmlError: "Uw opgeslagen bestand kan niet geladen worden. Is het misschien gemaakt met een andere versie van Blockly?",
+  badXml: "Fout tijdens het verwerken van de XML:\n%1\n\nSelecteer \"OK\" om uw wijzigingen te negeren of \"Annuleren\" om de XML verder te bewerken."
+};
diff --git a/js/demos/code/msg/oc.js b/js/demos/code/msg/oc.js
new file mode 100644
index 0000000..c184ac8
--- /dev/null
+++ b/js/demos/code/msg/oc.js
@@ -0,0 +1,24 @@
+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/js/demos/code/msg/pl.js b/js/demos/code/msg/pl.js
new file mode 100644
index 0000000..83bb05d
--- /dev/null
+++ b/js/demos/code/msg/pl.js
@@ -0,0 +1,24 @@
+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/js/demos/code/msg/pms.js b/js/demos/code/msg/pms.js
new file mode 100644
index 0000000..a7704f7
--- /dev/null
+++ b/js/demos/code/msg/pms.js
@@ -0,0 +1,24 @@
+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/js/demos/code/msg/pt-br.js b/js/demos/code/msg/pt-br.js
new file mode 100644
index 0000000..9b18d63
--- /dev/null
+++ b/js/demos/code/msg/pt-br.js
@@ -0,0 +1,24 @@
+var MSG = {
+  title: "Código",
+  blocks: "Blocos",
+  linkTooltip: "Salvar e ligar aos blocos.",
+  runTooltip: "Execute o programa definido pelos blocos na área de trabalho.",
+  badCode: "Erro no programa:\n%1",
+  timeout: "Máximo de iterações de execução excedido.",
+  trashTooltip: "Descartar todos os blocos.",
+  catLogic: "Lógica",
+  catLoops: "Laços",
+  catMath: "Matemática",
+  catText: "Texto",
+  catLists: "Listas",
+  catColour: "Cor",
+  catVariables: "Variáveis",
+  catFunctions: "Funções",
+  listVariable: "lista",
+  textVariable: "texto",
+  httpRequestError: "Houve um problema com a requisição.",
+  linkAlert: "Compartilhe seus blocos com este link:\n\n%1",
+  hashError: "Desculpe, '%1' não corresponde a um programa salvo.",
+  xmlError: "Não foi possível carregar seu arquivo salvo. Talvez ele tenha sido criado com uma versão diferente do Blockly?",
+  badXml: "Erro de análise XML:\n%1\n\nSelecione 'OK' para abandonar suas mudanças ou 'Cancelar' para editar o XML."
+};
diff --git a/js/demos/code/msg/ro.js b/js/demos/code/msg/ro.js
new file mode 100644
index 0000000..cd3de11
--- /dev/null
+++ b/js/demos/code/msg/ro.js
@@ -0,0 +1,24 @@
+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/js/demos/code/msg/ru.js b/js/demos/code/msg/ru.js
new file mode 100644
index 0000000..389e905
--- /dev/null
+++ b/js/demos/code/msg/ru.js
@@ -0,0 +1,24 @@
+var MSG = {
+  title: "Код",
+  blocks: "Блоки",
+  linkTooltip: "Сохранить и показать ссылку на блоки.",
+  runTooltip: "Запустить программу, заданную блоками в рабочей области.",
+  badCode: "Ошибка программы:\n%1",
+  timeout: "Превышено максимальное количество итераций.",
+  trashTooltip: "Удалить все блоки.",
+  catLogic: "Логические",
+  catLoops: "Циклы",
+  catMath: "Математика",
+  catText: "Текст",
+  catLists: "Списки",
+  catColour: "Цвет",
+  catVariables: "Переменные",
+  catFunctions: "Функции",
+  listVariable: "список",
+  textVariable: "текст",
+  httpRequestError: "Произошла проблема при запросе.",
+  linkAlert: "Поделитесь своими блоками по этой ссылке:\n\n%1",
+  hashError: "К сожалению, «%1» не соответствует ни одному сохраненному файлу Блокли.",
+  xmlError: "Не удалось загрузить ваш сохраненный файл.  Возможно, он был создан в другой версии Блокли?",
+  badXml: "Ошибка синтаксического анализа XML:\n%1\n\nВыберите 'ОК', чтобы отказаться от изменений или 'Cancel' для дальнейшего редактирования XML."
+};
diff --git a/js/demos/code/msg/sc.js b/js/demos/code/msg/sc.js
new file mode 100644
index 0000000..82f94d6
--- /dev/null
+++ b/js/demos/code/msg/sc.js
@@ -0,0 +1,24 @@
+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/js/demos/code/msg/sk.js b/js/demos/code/msg/sk.js
new file mode 100644
index 0000000..3917df2
--- /dev/null
+++ b/js/demos/code/msg/sk.js
@@ -0,0 +1,24 @@
+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/js/demos/code/msg/sr.js b/js/demos/code/msg/sr.js
new file mode 100644
index 0000000..f9a026c
--- /dev/null
+++ b/js/demos/code/msg/sr.js
@@ -0,0 +1,24 @@
+var MSG = {
+  title: "Кôд",
+  blocks: "Блокови",
+  linkTooltip: "Сачувајте и повежите са блоковима.",
+  runTooltip: "Покрените програм заснован на блоковима у радном простору.",
+  badCode: "Грешка у програму:\n%1",
+  timeout: "Достигнут је максималан број понављања у извршавању.",
+  trashTooltip: "Одбаците све блокове.",
+  catLogic: "Логика",
+  catLoops: "Петље",
+  catMath: "Математика",
+  catText: "Текст",
+  catLists: "Спискови",
+  catColour: "Боја",
+  catVariables: "Променљиве",
+  catFunctions: "Процедуре",
+  listVariable: "списак",
+  textVariable: "текст",
+  httpRequestError: "Дошло је до проблема у захтеву.",
+  linkAlert: "Делите своје блокове овом везом:\n\n%1",
+  hashError: "„%1“ не одговара ниједном сачуваном програму.",
+  xmlError: "Не могу да учитам сачувану датотеку. Можда је направљена другом верзијом Blockly-ја.",
+  badXml: "Грешка при рашчлањивању XML-а:\n%1\n\nПритисните „У реду“ да напустите измене или „Откажи“ да наставите са уређивањем XML датотеке."
+};
diff --git a/js/demos/code/msg/sv.js b/js/demos/code/msg/sv.js
new file mode 100644
index 0000000..4134a4c
--- /dev/null
+++ b/js/demos/code/msg/sv.js
@@ -0,0 +1,24 @@
+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/js/demos/code/msg/ta.js b/js/demos/code/msg/ta.js
new file mode 100644
index 0000000..ff472e2
--- /dev/null
+++ b/js/demos/code/msg/ta.js
@@ -0,0 +1,24 @@
+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/js/demos/code/msg/th.js b/js/demos/code/msg/th.js
new file mode 100644
index 0000000..1ac3624
--- /dev/null
+++ b/js/demos/code/msg/th.js
@@ -0,0 +1,24 @@
+var MSG = {
+  title: "เขียนโปรแกรม",
+  blocks: "บล็อก",
+  linkTooltip: "บันทึกและสร้างลิงก์มายังบล็อกเหล่านี้",
+  runTooltip: "เรียกใช้โปรแกรมตามที่กำหนดไว้ด้วยบล็อกที่อยู่ในพื้นที่ทำงาน",
+  badCode: "โปรแกรมเกิดข้อผิดพลาด:\n%1",
+  timeout: "โปรแกรมทำงานซ้ำคำสั่งเดิมมากเกินไป",
+  trashTooltip: "ยกเลิกบล็อกทั้งหมด",
+  catLogic: "ตรรกะ",
+  catLoops: "การวนซ้ำ",
+  catMath: "คณิตศาสตร์",
+  catText: "ข้อความ",
+  catLists: "รายการ",
+  catColour: "สี",
+  catVariables: "ตัวแปร",
+  catFunctions: "ฟังก์ชัน",
+  listVariable: "รายการ",
+  textVariable: "ข้อความ",
+  httpRequestError: "มีปัญหาเกี่ยวกับการร้องขอ",
+  linkAlert: "แบ่งปันบล็อกของคุณด้วยลิงก์นี้:\n\n%1",
+  hashError: "เสียใจด้วย '%1' ไม่ตรงกับโปรแกรมใดๆ ที่เคยบันทึกเอาไว้เลย",
+  xmlError: "ไม่สามารถโหลดไฟล์ที่บันทึกไว้ของคุณได้ บางทีมันอาจจะถูกสร้างขึ้นด้วย Blockly รุ่นอื่นที่แตกต่างกัน?",
+  badXml: "เกิดข้อผิดพลาดในการแยกวิเคราะห์ XML:\n%1\n\nเลือก 'ตกลง' เพื่อละทิ้งการเปลี่ยนแปลงต่างๆ ที่ทำไว้ หรือเลือก 'ยกเลิก' เพื่อแก้ไข XML ต่อไป"
+};
diff --git a/js/demos/code/msg/tlh.js b/js/demos/code/msg/tlh.js
new file mode 100644
index 0000000..8d0c056
--- /dev/null
+++ b/js/demos/code/msg/tlh.js
@@ -0,0 +1,24 @@
+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/js/demos/code/msg/tr.js b/js/demos/code/msg/tr.js
new file mode 100644
index 0000000..1448300
--- /dev/null
+++ b/js/demos/code/msg/tr.js
@@ -0,0 +1,24 @@
+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/js/demos/code/msg/uk.js b/js/demos/code/msg/uk.js
new file mode 100644
index 0000000..6b34627
--- /dev/null
+++ b/js/demos/code/msg/uk.js
@@ -0,0 +1,24 @@
+var MSG = {
+  title: "Код",
+  blocks: "Блоки",
+  linkTooltip: "Зберегти і пов'язати з блоками.",
+  runTooltip: "Запустіть програму, визначену блоками у робочій області.",
+  badCode: "Помилка програми:\n%1",
+  timeout: "Максимальне виконання ітерацій перевищено.",
+  trashTooltip: "Відкинути всі блоки.",
+  catLogic: "Логіка",
+  catLoops: "Петлі",
+  catMath: "Математика",
+  catText: "Текст",
+  catLists: "Списки",
+  catColour: "Колір",
+  catVariables: "Змінні",
+  catFunctions: "Функції",
+  listVariable: "список",
+  textVariable: "текст",
+  httpRequestError: "Виникла проблема із запитом.",
+  linkAlert: "Поділитися вашим блоками через посилання:\n\n%1",
+  hashError: "На жаль, \"%1\" не відповідає жодній збереженій програмі.",
+  xmlError: "Не вдалося завантажити ваш збережений файл.  Можливо, він був створений з іншої версії Blockly?",
+  badXml: "Помилка синтаксичного аналізу XML:\n%1\n\nВиберіть \"Гаразд\", щоб відмовитися від змін або 'Скасувати' для подальшого редагування XML."
+};
diff --git a/js/demos/code/msg/vi.js b/js/demos/code/msg/vi.js
new file mode 100644
index 0000000..952d024
--- /dev/null
+++ b/js/demos/code/msg/vi.js
@@ -0,0 +1,24 @@
+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/js/demos/code/msg/zh-hans.js b/js/demos/code/msg/zh-hans.js
new file mode 100644
index 0000000..abf8a65
--- /dev/null
+++ b/js/demos/code/msg/zh-hans.js
@@ -0,0 +1,24 @@
+var MSG = {
+  title: "代码",
+  blocks: "块",
+  linkTooltip: "保存模块并生成链接。",
+  runTooltip: "于工作区中运行块所定义的程式。",
+  badCode: "程序错误:\n%1",
+  timeout: "超过最大执行行数。",
+  trashTooltip: "放弃所有块。",
+  catLogic: "逻辑",
+  catLoops: "循环",
+  catMath: "数学",
+  catText: "文本",
+  catLists: "列表",
+  catColour: "颜色",
+  catVariables: "变量",
+  catFunctions: "函数",
+  listVariable: "列表",
+  textVariable: "文本",
+  httpRequestError: "请求存在问题。",
+  linkAlert: "通过这个链接分享您的模块:\n\n%1",
+  hashError: "对不起,没有任何已保存的程序对应'%1' 。",
+  xmlError: "无法载入您保存的文件。您是否使用其他版本的Blockly创建该文件的?",
+  badXml: "XML解析错误:\n%1\n\n选择“确定”以取消您对XML的修改,或选择“取消”以继续编辑XML。"
+};
diff --git a/js/demos/code/msg/zh-hant.js b/js/demos/code/msg/zh-hant.js
new file mode 100644
index 0000000..48a8b52
--- /dev/null
+++ b/js/demos/code/msg/zh-hant.js
@@ -0,0 +1,24 @@
+var MSG = {
+  title: "程式碼",
+  blocks: "積木",
+  linkTooltip: "儲存積木組並提供連結。",
+  runTooltip: "於工作區中執行積木組所定義的程式。",
+  badCode: "程式錯誤:\n%1",
+  timeout: "超過最大執行數。",
+  trashTooltip: "捨棄所有積木。",
+  catLogic: "邏輯",
+  catLoops: "迴圈",
+  catMath: "數學式",
+  catText: "文字",
+  catLists: "列表",
+  catColour: "顏色",
+  catVariables: "變量",
+  catFunctions: "流程",
+  listVariable: "列表",
+  textVariable: "文字",
+  httpRequestError: "命令出現錯誤。",
+  linkAlert: "透過此連結分享您的積木組:\n\n%1",
+  hashError: "對不起,「%1」並未對應任何已保存的程式。",
+  xmlError: "未能載入您保存的檔案。或許它是由其他版本的Blockly創建?",
+  badXml: "解析 XML 時出現錯誤:\n%1\n\n選擇'確定'以放棄您的更改,或選擇'取消'以進一步編輯 XML。"
+};
diff --git a/js/demos/code/style.css b/js/demos/code/style.css
new file mode 100644
index 0000000..c24df88
--- /dev/null
+++ b/js/demos/code/style.css
@@ -0,0 +1,176 @@
+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;
+}
+#tab_code {
+  display: none;
+}
+
+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-left: 15px;
+  margin-right: 15px;
+  margin-top: 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;
+}
+
+@media (max-width: 710px) {
+  .tab_collapse {
+    display: none;
+  }
+  #tab_code {
+    display: table-cell;
+  }
+}
diff --git a/js/demos/codelab/README.md b/js/demos/codelab/README.md
new file mode 100644
index 0000000..2a5e913
--- /dev/null
+++ b/js/demos/codelab/README.md
@@ -0,0 +1,16 @@
+# Blockly for the Web codelab
+
+Code for the [Blockly for the Web codelab](https://developers.google.com/TODO).
+
+In this codelab, you'll learn how to use Blockly JavaScript library
+to add a block code editor to a web application.
+
+## What you'll learn
+
+* How to add Blockly to a sample web app.
+* How to set up a Blockly workspace.
+* How to create a new block in Blockly.
+* How to generate and run JavaScript code from blocks.
+
+Example code for each step of the codelab is available from
+the [completed](completed/) directory.
diff --git a/js/demos/codelab/app-complete/index.html b/js/demos/codelab/app-complete/index.html
new file mode 100644
index 0000000..d5780e1
--- /dev/null
+++ b/js/demos/codelab/app-complete/index.html
@@ -0,0 +1,73 @@
+
+
+
+  
+  
+  
+
+  Blockly for the Web Codelab
+
+  
+  
+
+
+
+  
+

Music Maker

+

Music Maker Configuration

+
+ +
+ + + +

Tap any button to edit its code.
When complete, press Done.

+ +
+
+
1
+
2
+
3
+
+
+
4
+
5
+
6
+
+
+
7
+
8
+
9
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + diff --git a/js/demos/codelab/app-complete/scripts/main.js b/js/demos/codelab/app-complete/scripts/main.js new file mode 100644 index 0000000..795dd1a --- /dev/null +++ b/js/demos/codelab/app-complete/scripts/main.js @@ -0,0 +1,88 @@ +/** + * @license + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + (function() { + + let currentButton; + + function handlePlay(event) { + loadWorkspace(event.target); + Blockly.JavaScript.addReservedWords('code'); + var code = Blockly.JavaScript.workspaceToCode(Blockly.getMainWorkspace()); + code += 'MusicMaker.play();'; + // Eval can be dangerous. For more controlled execution, check + // https://github.com/NeilFraser/JS-Interpreter. + try { + eval(code); + } catch (error) { + console.log(error); + } + } + + function loadWorkspace(button) { + let workspace = Blockly.getMainWorkspace(); + workspace.clear(); + if (button.blocklyXml) { + Blockly.Xml.domToWorkspace(button.blocklyXml, workspace); + } + } + + function save(button) { + let xml = Blockly.Xml.workspaceToDom(Blockly.getMainWorkspace()); + button.blocklyXml = xml; + } + + function handleSave() { + document.body.setAttribute('mode', 'edit'); + save(currentButton); + } + + function enableEditMode() { + document.body.setAttribute('mode', 'edit'); + document.querySelectorAll('.button').forEach(btn => { + btn.removeEventListener('click', handlePlay); + btn.addEventListener('click', enableBlocklyMode); + }); + } + + function enableMakerMode() { + document.body.setAttribute('mode', 'maker'); + document.querySelectorAll('.button').forEach(btn => { + btn.addEventListener('click', handlePlay); + btn.removeEventListener('click', enableBlocklyMode); + }); + } + + function enableBlocklyMode(e) { + document.body.setAttribute('mode', 'blockly'); + currentButton = e.target; + loadWorkspace(currentButton); + } + + document.querySelector('#edit').addEventListener('click', enableEditMode); + document.querySelector('#done').addEventListener('click', enableMakerMode); + document.querySelector('#save').addEventListener('click', handleSave); + + enableMakerMode(); + + Blockly.inject('blockly-div', { + media: '../../../media/', + toolbox: document.getElementById('toolbox'), + toolboxPosition: 'end', + horizontalLayout: true, + scrollbars: false + }); +})(); diff --git a/js/demos/codelab/app-complete/scripts/music_maker.js b/js/demos/codelab/app-complete/scripts/music_maker.js new file mode 100644 index 0000000..e3d4eff --- /dev/null +++ b/js/demos/codelab/app-complete/scripts/music_maker.js @@ -0,0 +1,33 @@ +/** + * @license + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const MusicMaker = { + queue_: [], + player_: new Audio(), + queueSound: function(soundUrl) { + this.queue_.push(soundUrl); + }, + play: function() { + let next = this.queue_.shift(); + if (next) { + this.player_.src = next; + this.player_.play(); + } + }, +}; + +MusicMaker.player_.addEventListener( + 'ended', MusicMaker.play.bind(MusicMaker)); diff --git a/js/demos/codelab/app-complete/scripts/sound_blocks.js b/js/demos/codelab/app-complete/scripts/sound_blocks.js new file mode 100644 index 0000000..5546226 --- /dev/null +++ b/js/demos/codelab/app-complete/scripts/sound_blocks.js @@ -0,0 +1,50 @@ +/** + * @license + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +Blockly.defineBlocksWithJsonArray([ + // Block for colour picker. + { + "type": "play_sound", + "message0": "Play %1", + "args0": [ + { + "type": "field_dropdown", + "name": "VALUE", + "options": [ + ["C4", "sounds/c4.m4a"], + ["D4", "sounds/d4.m4a"], + ["E4", "sounds/e4.m4a"], + ["F4", "sounds/f4.m4a"], + ["G4", "sounds/g4.m4a"], + ["A5", "sounds/a5.m4a"], + ["B5", "sounds/b5.m4a"], + ["C5", "sounds/c5.m4a"] + ] + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": 355, + "tooltip": "", + "helpUrl": "" + } +]); + +Blockly.JavaScript['play_sound'] = function(block) { + var value = '\'' + block.getFieldValue('VALUE') + '\''; + return 'MusicMaker.queueSound(' + value + ');\n'; +}; diff --git a/js/demos/codelab/app-complete/sounds/c4.m4a b/js/demos/codelab/app-complete/sounds/c4.m4a new file mode 100644 index 0000000..33941cf Binary files /dev/null and b/js/demos/codelab/app-complete/sounds/c4.m4a differ diff --git a/js/demos/codelab/app-complete/sounds/c5.m4a b/js/demos/codelab/app-complete/sounds/c5.m4a new file mode 100644 index 0000000..49721cd Binary files /dev/null and b/js/demos/codelab/app-complete/sounds/c5.m4a differ diff --git a/js/demos/codelab/app-complete/sounds/d4.m4a b/js/demos/codelab/app-complete/sounds/d4.m4a new file mode 100644 index 0000000..51bcad6 Binary files /dev/null and b/js/demos/codelab/app-complete/sounds/d4.m4a differ diff --git a/js/demos/codelab/app-complete/sounds/e4.m4a b/js/demos/codelab/app-complete/sounds/e4.m4a new file mode 100644 index 0000000..d910052 Binary files /dev/null and b/js/demos/codelab/app-complete/sounds/e4.m4a differ diff --git a/js/demos/codelab/app-complete/sounds/f4.m4a b/js/demos/codelab/app-complete/sounds/f4.m4a new file mode 100644 index 0000000..c80a0bf Binary files /dev/null and b/js/demos/codelab/app-complete/sounds/f4.m4a differ diff --git a/js/demos/codelab/app-complete/sounds/g4.m4a b/js/demos/codelab/app-complete/sounds/g4.m4a new file mode 100644 index 0000000..45ea448 Binary files /dev/null and b/js/demos/codelab/app-complete/sounds/g4.m4a differ diff --git a/js/demos/codelab/app-complete/styles/index.css b/js/demos/codelab/app-complete/styles/index.css new file mode 100644 index 0000000..0ef8f3b --- /dev/null +++ b/js/demos/codelab/app-complete/styles/index.css @@ -0,0 +1,75 @@ +main { + width: 400px; + position: relative; + margin: 0 auto; + overflow:hidden; + height: 600px; +} + +header { + background-color: green; + width: 100%; +} + +h1 { + width: 400px; + position: relative; + margin: 0 auto; + color: #fff; + font-size: 1.8em; + line-height: 2.4em; +} + +.mode-edit, +.mode-maker, +.mode-blockly { + display: none; +} + +[mode="maker"] .mode-maker, +[mode="edit"] .mode-edit, +[mode="blockly"] .mode-blockly { + display: block; +} + +.blockly-editor { + position: absolute; + top: 64px; + left: -400px; + transition: left .4s; + height: 460px; + width: 400px; + background-color: #eee; +} + +[mode="blockly"] .blockly-editor { + left: 0; +} + +.maker { + display: flex; + flex-flow: column; + justify-content: space-between; + height: 460px; + width: 400px; +} + +.maker > div { + display: flex; + justify-content: space-between; +} + +.button { + width: 120px; + height: 140px; + color: #fff; + font-size: 3em; + text-align: center; + vertical-align: middle; + line-height: 140px; +} + +.mdl-button { + margin: 1em 0; + float: right; +} diff --git a/js/demos/codelab/app/index.html b/js/demos/codelab/app/index.html new file mode 100644 index 0000000..31eeff7 --- /dev/null +++ b/js/demos/codelab/app/index.html @@ -0,0 +1,53 @@ + + + + + + + + Blockly for the Web Codelab + + + + + + +
+

Music Maker

+

Music Maker Configuration

+
+ +
+ + + +

Tap any button to edit its code.
When complete, press Done.

+ +
+
+
1
+
2
+
3
+
+
+
4
+
5
+
6
+
+
+
7
+
8
+
9
+
+
+ +
+
+
+
+ + + + + + diff --git a/js/demos/codelab/app/scripts/main.js b/js/demos/codelab/app/scripts/main.js new file mode 100644 index 0000000..21b8848 --- /dev/null +++ b/js/demos/codelab/app/scripts/main.js @@ -0,0 +1,61 @@ +/** + * @license + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + (function() { + + let currentButton; + + function handlePlay(event) { + // Add code for playing sound. + } + + function save(button) { + // Add code for saving the behavior of a button. + } + + function handleSave() { + document.body.setAttribute('mode', 'edit'); + save(currentButton); + } + + function enableEditMode() { + document.body.setAttribute('mode', 'edit'); + document.querySelectorAll('.button').forEach(btn => { + btn.removeEventListener('click', handlePlay); + btn.addEventListener('click', enableBlocklyMode); + }); + } + + function enableMakerMode() { + document.body.setAttribute('mode', 'maker'); + document.querySelectorAll('.button').forEach(btn => { + btn.addEventListener('click', handlePlay); + btn.removeEventListener('click', enableBlocklyMode); + }); + } + + function enableBlocklyMode(e) { + document.body.setAttribute('mode', 'blockly'); + currentButton = e.target; + } + + document.querySelector('#edit').addEventListener('click', enableEditMode); + document.querySelector('#done').addEventListener('click', enableMakerMode); + document.querySelector('#save').addEventListener('click', handleSave); + + enableMakerMode(); + +})(); diff --git a/js/demos/codelab/app/scripts/music_maker.js b/js/demos/codelab/app/scripts/music_maker.js new file mode 100644 index 0000000..e3d4eff --- /dev/null +++ b/js/demos/codelab/app/scripts/music_maker.js @@ -0,0 +1,33 @@ +/** + * @license + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const MusicMaker = { + queue_: [], + player_: new Audio(), + queueSound: function(soundUrl) { + this.queue_.push(soundUrl); + }, + play: function() { + let next = this.queue_.shift(); + if (next) { + this.player_.src = next; + this.player_.play(); + } + }, +}; + +MusicMaker.player_.addEventListener( + 'ended', MusicMaker.play.bind(MusicMaker)); diff --git a/js/demos/codelab/app/sounds/c4.m4a b/js/demos/codelab/app/sounds/c4.m4a new file mode 100644 index 0000000..33941cf Binary files /dev/null and b/js/demos/codelab/app/sounds/c4.m4a differ diff --git a/js/demos/codelab/app/sounds/c5.m4a b/js/demos/codelab/app/sounds/c5.m4a new file mode 100644 index 0000000..49721cd Binary files /dev/null and b/js/demos/codelab/app/sounds/c5.m4a differ diff --git a/js/demos/codelab/app/sounds/d4.m4a b/js/demos/codelab/app/sounds/d4.m4a new file mode 100644 index 0000000..51bcad6 Binary files /dev/null and b/js/demos/codelab/app/sounds/d4.m4a differ diff --git a/js/demos/codelab/app/sounds/e4.m4a b/js/demos/codelab/app/sounds/e4.m4a new file mode 100644 index 0000000..d910052 Binary files /dev/null and b/js/demos/codelab/app/sounds/e4.m4a differ diff --git a/js/demos/codelab/app/sounds/f4.m4a b/js/demos/codelab/app/sounds/f4.m4a new file mode 100644 index 0000000..c80a0bf Binary files /dev/null and b/js/demos/codelab/app/sounds/f4.m4a differ diff --git a/js/demos/codelab/app/sounds/g4.m4a b/js/demos/codelab/app/sounds/g4.m4a new file mode 100644 index 0000000..45ea448 Binary files /dev/null and b/js/demos/codelab/app/sounds/g4.m4a differ diff --git a/js/demos/codelab/app/styles/index.css b/js/demos/codelab/app/styles/index.css new file mode 100644 index 0000000..0ef8f3b --- /dev/null +++ b/js/demos/codelab/app/styles/index.css @@ -0,0 +1,75 @@ +main { + width: 400px; + position: relative; + margin: 0 auto; + overflow:hidden; + height: 600px; +} + +header { + background-color: green; + width: 100%; +} + +h1 { + width: 400px; + position: relative; + margin: 0 auto; + color: #fff; + font-size: 1.8em; + line-height: 2.4em; +} + +.mode-edit, +.mode-maker, +.mode-blockly { + display: none; +} + +[mode="maker"] .mode-maker, +[mode="edit"] .mode-edit, +[mode="blockly"] .mode-blockly { + display: block; +} + +.blockly-editor { + position: absolute; + top: 64px; + left: -400px; + transition: left .4s; + height: 460px; + width: 400px; + background-color: #eee; +} + +[mode="blockly"] .blockly-editor { + left: 0; +} + +.maker { + display: flex; + flex-flow: column; + justify-content: space-between; + height: 460px; + width: 400px; +} + +.maker > div { + display: flex; + justify-content: space-between; +} + +.button { + width: 120px; + height: 140px; + color: #fff; + font-size: 3em; + text-align: center; + vertical-align: middle; + line-height: 140px; +} + +.mdl-button { + margin: 1em 0; + float: right; +} diff --git a/js/demos/custom-dialogs/custom-dialog.js b/js/demos/custom-dialogs/custom-dialog.js new file mode 100644 index 0000000..99c66be --- /dev/null +++ b/js/demos/custom-dialogs/custom-dialog.js @@ -0,0 +1,172 @@ +/** + * @license + * Copyright 2016 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * An example implementation of how one might replace Blockly's browser + * dialogs. This is just an example, and applications are not encouraged to use + * it verbatim. + * + * @namespace + */ +CustomDialog = {}; + +/** Override Blockly.alert() with custom implementation. */ +Blockly.alert = function(message, callback) { + console.log('Alert: ' + message); + CustomDialog.show('Alert', message, { + onCancel: callback + }); +}; + +/** Override Blockly.confirm() with custom implementation. */ +Blockly.confirm = function(message, callback) { + console.log('Confirm: ' + message); + CustomDialog.show('Confirm', message, { + showOkay: true, + onOkay: function() { + callback(true); + }, + showCancel: true, + onCancel: function() { + callback(false); + } + }); +}; + +/** Override Blockly.prompt() with custom implementation. */ +Blockly.prompt = function(message, defaultValue, callback) { + console.log('Prompt: ' + message); + CustomDialog.show('Prompt', message, { + showInput: true, + showOkay: true, + onOkay: function() { + callback(CustomDialog.inputField.value); + }, + showCancel: true, + onCancel: function() { + callback(null); + } + }); + CustomDialog.inputField.value = defaultValue; +}; + +/** Hides any currently visible dialog. */ +CustomDialog.hide = function() { + if (CustomDialog.backdropDiv_) { + CustomDialog.backdropDiv_.style.display = 'none'; + CustomDialog.dialogDiv_.style.display = 'none'; + } +}; + +/** + * Shows the dialog. + * Allowed options: + * - showOkay: Whether to show the OK button. + * - showCancel: Whether to show the Cancel button. + * - showInput: Whether to show the text input field. + * - onOkay: Callback to handle the okay button. + * - onCancel: Callback to handle the cancel button and backdrop clicks. + */ +CustomDialog.show = function(title, message, options) { + var backdropDiv = CustomDialog.backdropDiv_; + var dialogDiv = CustomDialog.dialogDiv_; + if (!dialogDiv) { + // Generate HTML + backdropDiv = document.createElement('div'); + backdropDiv.id = 'customDialogBackdrop'; + backdropDiv.style.cssText = + 'position: absolute;' + + 'top: 0; left: 0; right: 0; bottom: 0;' + + 'background-color: rgba(0, 0, 0, .7);' + + 'z-index: 100;'; + document.body.appendChild(backdropDiv); + + dialogDiv = document.createElement('div'); + dialogDiv.id = 'customDialog'; + dialogDiv.style.cssText = + 'background-color: #fff;' + + 'width: 400px;' + + 'margin: 20px auto 0;' + + 'padding: 10px;'; + backdropDiv.appendChild(dialogDiv); + + dialogDiv.onclick = function(event) { + event.stopPropagation(); + }; + + CustomDialog.backdropDiv_ = backdropDiv; + CustomDialog.dialogDiv_ = dialogDiv; + } + backdropDiv.style.display = 'block'; + dialogDiv.style.display = 'block'; + + dialogDiv.innerHTML = + '
' + + '

' + + (options.showInput ? '
' : '') + + '
' + + (options.showCancel ? '': '') + + (options.showOkay ? '': '') + + '
'; + dialogDiv.getElementsByClassName('customDialogTitle')[0] + .appendChild(document.createTextNode(title)); + dialogDiv.getElementsByClassName('customDialogMessage')[0] + .appendChild(document.createTextNode(message)); + + var onOkay = function(event) { + CustomDialog.hide(); + options.onOkay && options.onOkay(); + event && event.stopPropagation(); + }; + var onCancel = function(event) { + CustomDialog.hide(); + options.onCancel && options.onCancel(); + event && event.stopPropagation(); + }; + + var dialogInput = document.getElementById('customDialogInput'); + CustomDialog.inputField = dialogInput; + if (dialogInput) { + dialogInput.focus(); + + dialogInput.onkeyup = function(event) { + if (event.keyCode == 13) { + // Process as OK when user hits enter. + onOkay(); + return false; + } else if (event.keyCode == 27) { + // Process as cancel when user hits esc. + onCancel(); + return false; + } + }; + } else { + var okay = document.getElementById('customDialogOkay'); + okay && okay.focus(); + } + + if (options.showOkay) { + document.getElementById('customDialogOkay') + .addEventListener('click', onOkay); + } + if (options.showCancel) { + document.getElementById('customDialogCancel') + .addEventListener('click', onCancel); + } + + backdropDiv.onclick = onCancel; +}; diff --git a/js/demos/custom-dialogs/icon.png b/js/demos/custom-dialogs/icon.png new file mode 100644 index 0000000..ba49746 Binary files /dev/null and b/js/demos/custom-dialogs/icon.png differ diff --git a/js/demos/custom-dialogs/index.html b/js/demos/custom-dialogs/index.html new file mode 100644 index 0000000..9c17180 --- /dev/null +++ b/js/demos/custom-dialogs/index.html @@ -0,0 +1,62 @@ + + + + + Blockly Demo: Custom Dialog + + + + + + +

Blockly > + Demos > Custom Dialog

+ +

This is a simple demo of replacing modal browser dialogs with HTML. + To see how it works, see the source code in + custom-dialog.js +

+ +

Try creating new variables, creating variables with names already in + use, or deleting multiple blocks on the workspace. +

+ +
+ + + + + + + + diff --git a/js/demos/custom-fields/icon.png b/js/demos/custom-fields/icon.png new file mode 100644 index 0000000..e69de29 diff --git a/js/demos/custom-fields/index.html b/js/demos/custom-fields/index.html new file mode 100644 index 0000000..9e681a8 --- /dev/null +++ b/js/demos/custom-fields/index.html @@ -0,0 +1,54 @@ + + + + + Blockly Demo: Custom Fields + + + +

Blockly > + Demos > Custom Fields

+ +

These demos are intended for developers who want creating custom block fields.

+ + + + + + + + + + + +
+ + + + + +
+ + + + + +
+ + diff --git a/js/demos/custom-fields/pitch/blocks.js b/js/demos/custom-fields/pitch/blocks.js new file mode 100644 index 0000000..3e02ac8 --- /dev/null +++ b/js/demos/custom-fields/pitch/blocks.js @@ -0,0 +1,30 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Pitch field demo blocks. + * @author samelh@gmail.com (Sam El-Husseini) + */ + +Blockly.Blocks['test_pitch_field'] = { + init: function() { + this.appendDummyInput() + .appendField('pitch') + .appendField(new CustomFields.FieldPitch('7'), 'PITCH'); + this.setStyle('loop_blocks'); + } +}; diff --git a/js/demos/custom-fields/pitch/field_pitch.js b/js/demos/custom-fields/pitch/field_pitch.js new file mode 100644 index 0000000..cf3b9fd --- /dev/null +++ b/js/demos/custom-fields/pitch/field_pitch.js @@ -0,0 +1,250 @@ +/** + * @license + * Copyright 2016 Google LLC + * https://github.com/google/blockly-games + * + * 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 Music pitch input field. Borrowed from Blockly Games. + * @author fraser@google.com (Neil Fraser) + * @author samelh@google.com (Sam El-Husseini) + */ +'use strict'; + +goog.provide('CustomFields.FieldPitch'); + +goog.require('Blockly.FieldTextInput'); +goog.require('Blockly.utils.math'); +goog.require('Blockly.utils.object'); + +var CustomFields = CustomFields || {}; + +/** + * Class for an editable pitch field. + * @param {string} text The initial content of the field. + * @extends {Blockly.FieldTextInput} + * @constructor + */ +CustomFields.FieldPitch = function(text) { + CustomFields.FieldPitch.superClass_.constructor.call(this, text); + + /** + * Click event data. + * @type {?Blockly.EventData} + * @private + */ + this.clickWrapper_ = null; + + /** + * Move event data. + * @type {?Blockly.EventData} + * @private + */ + this.moveWrapper_ = null; +}; +Blockly.utils.object.inherits(CustomFields.FieldPitch, Blockly.FieldTextInput); + +/** + * Construct a FieldPitch from a JSON arg object. + * @param {!Object} options A JSON object with options (pitch). + * @return {!CustomFields.FieldPitch} The new field instance. + * @package + * @nocollapse + */ +CustomFields.FieldPitch.fromJson = function(options) { + return new CustomFields.FieldPitch(options['pitch']); +}; + +/** + * All notes available for the picker. + */ +CustomFields.FieldPitch.NOTES = 'C3 D3 E3 F3 G3 A3 B3 C4 D4 E4 F4 G4 A4'.split(/ /); + +/** + * Show the inline free-text editor on top of the text and the note picker. + * @private + */ +CustomFields.FieldPitch.prototype.showEditor_ = function() { + CustomFields.FieldPitch.superClass_.showEditor_.call(this); + + var div = Blockly.WidgetDiv.DIV; + if (!div.firstChild) { + // Mobile interface uses Blockly.prompt. + return; + } + // Build the DOM. + var editor = this.dropdownCreate_(); + Blockly.DropDownDiv.getContentDiv().appendChild(editor); + + Blockly.DropDownDiv.setColour(this.sourceBlock_.style.colourPrimary, + this.sourceBlock_.style.colourTertiary); + + Blockly.DropDownDiv.showPositionedByField( + this, this.dropdownDispose_.bind(this)); + + // The note picker is different from other fields in that it updates on + // mousemove even if it's not in the middle of a drag. In future we may + // change this behaviour. For now, using bindEvent_ instead of + // bindEventWithChecks_ allows it to work without a mousedown/touchstart. + this.clickWrapper_ = + Blockly.bindEvent_(this.imageElement_, 'click', this, + this.hide_); + this.moveWrapper_ = + Blockly.bindEvent_(this.imageElement_, 'mousemove', this, + this.onMouseMove); + + this.updateGraph_(); +}; + +/** + * Create the pitch editor. + * @return {!Element} The newly created pitch picker. + * @private + */ +CustomFields.FieldPitch.prototype.dropdownCreate_ = function() { + this.imageElement_ = document.createElement('div'); + this.imageElement_.id = 'notePicker'; + + return this.imageElement_; +}; + +/** + * Dispose of events belonging to the pitch editor. + * @private + */ +CustomFields.FieldPitch.prototype.dropdownDispose_ = function() { + if (this.clickWrapper_) { + Blockly.unbindEvent_(this.clickWrapper_); + this.clickWrapper_ = null; + } + if (this.moveWrapper_) { + Blockly.unbindEvent_(this.moveWrapper_); + this.moveWrapper_ = null; + } + this.imageElement_ = null; +}; + +/** + * Hide the editor. + * @private + */ +CustomFields.FieldPitch.prototype.hide_ = function() { + Blockly.WidgetDiv.hide(); + Blockly.DropDownDiv.hideWithoutAnimation(); +}; + +/** + * Set the note to match the mouse's position. + * @param {!Event} e Mouse move event. + */ +CustomFields.FieldPitch.prototype.onMouseMove = function(e) { + var bBox = this.imageElement_.getBoundingClientRect(); + var dy = e.clientY - bBox.top; + var note = Blockly.utils.math.clamp(Math.round(13.5 - dy / 7.5), 0, 12); + this.imageElement_.style.backgroundPosition = (-note * 37) + 'px 0'; + this.setEditorValue_(note); +}; + +/** + * Convert the machine-readable value (0-12) to human-readable text (C3-A4). + * @param {number|string} value The provided value. + * @return {string|undefined} The respective note, or undefined if invalid. + */ +CustomFields.FieldPitch.prototype.valueToNote = function(value) { + return CustomFields.FieldPitch.NOTES[Number(value)]; +}; + +/** + * Convert the human-readable text (C3-A4) to machine-readable value (0-12). + * @param {string} text The provided note. + * @return {number|undefined} The respective value, or undefined if invalid. + */ +CustomFields.FieldPitch.prototype.noteToValue = function(text) { + var normalizedText = text.trim().toUpperCase(); + var i = CustomFields.FieldPitch.NOTES.indexOf(normalizedText); + return i > -1 ? i : undefined; +}; + +/** + * Get the text to be displayed on the field node. + * @return {?string} The HTML value if we're editing, otherwise null. Null means + * the super class will handle it, likely a string cast of value. + * @protected + */ +CustomFields.FieldPitch.prototype.getText_ = function() { + if (this.isBeingEdited_) { + return CustomFields.FieldPitch.superClass_.getText_.call(this); + } + return this.valueToNote(this.getValue()) || null; +}; + +/** + * Transform the provided value into a text to show in the HTML input. + * @param {*} value The value stored in this field. + * @return {string} The text to show on the HTML input. + */ +CustomFields.FieldPitch.prototype.getEditorText_ = function(value) { + return this.valueToNote(value); +}; + +/** + * Transform the text received from the HTML input (note) into a value + * to store in this field. + * @param {string} text Text received from the HTML input. + * @return {*} The value to store. + */ +CustomFields.FieldPitch.prototype.getValueFromEditorText_ = function(text) { + return this.noteToValue(text); +}; + +/** + * Updates the graph when the field rerenders. + * @private + * @override + */ +CustomFields.FieldPitch.prototype.render_ = function() { + CustomFields.FieldPitch.superClass_.render_.call(this); + this.updateGraph_(); +}; + +/** + * Redraw the note picker with the current note. + * @private + */ +CustomFields.FieldPitch.prototype.updateGraph_ = function() { + if (!this.imageElement_) { + return; + } + var i = this.getValue(); + this.imageElement_.style.backgroundPosition = (-i * 37) + 'px 0'; +}; + +/** + * Ensure that only a valid value may be entered. + * @param {*} opt_newValue The input value. + * @return {*} A valid value, or null if invalid. + */ +CustomFields.FieldPitch.prototype.doClassValidation_ = function(opt_newValue) { + if (opt_newValue === null || opt_newValue === undefined) { + return null; + } + var note = this.valueToNote(opt_newValue); + if (note) { + return opt_newValue; + } + return null; +}; + +Blockly.fieldRegistry.register('field_pitch', CustomFields.FieldPitch); diff --git a/js/demos/custom-fields/pitch/index.html b/js/demos/custom-fields/pitch/index.html new file mode 100644 index 0000000..642482c --- /dev/null +++ b/js/demos/custom-fields/pitch/index.html @@ -0,0 +1,120 @@ + + + + + Blockly Demo: Custom Pitch Field + + + + + + + + +

+ Blockly > + Demos > + Custom Fields > Pitch Field

+ + +

This is a demo of creating custom block fields. In this case the field + is used to select a note pitch. +

+ +

All of the custom field implementation is in + demos/custom-fields/pitch/field_pitch.js, including comments on each required + function. +

+ +

+ + +

+ + + + + + +
+ + +
+
+ + + + + + diff --git a/js/demos/custom-fields/pitch/media/notes.png b/js/demos/custom-fields/pitch/media/notes.png new file mode 100644 index 0000000..b9a57b5 Binary files /dev/null and b/js/demos/custom-fields/pitch/media/notes.png differ diff --git a/js/demos/custom-fields/pitch/pitch.css b/js/demos/custom-fields/pitch/pitch.css new file mode 100644 index 0000000..586c6cd --- /dev/null +++ b/js/demos/custom-fields/pitch/pitch.css @@ -0,0 +1,24 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#notePicker { + background-image: url(media/notes.png); + border: 1px solid #ccc; + height: 109px; + width: 46px; +} \ No newline at end of file diff --git a/js/demos/custom-fields/turtle/blocks.js b/js/demos/custom-fields/turtle/blocks.js new file mode 100644 index 0000000..ef8b245 --- /dev/null +++ b/js/demos/custom-fields/turtle/blocks.js @@ -0,0 +1,103 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Turtle field demo blocks.. + * @author bekawestberg@gmail.com (Beka Westberg) + */ + +Blockly.Blocks['turtle_basic'] = { + init: function() { + this.appendDummyInput() + .appendField('simple turtle'); + this.appendDummyInput() + .setAlign(Blockly.ALIGN_CENTRE) + .appendField(new CustomFields.FieldTurtle(), 'TURTLE'); + this.setStyle('loop_blocks'); + this.setCommentText('Demonstrates a turtle field with no validator.'); + } +}; + +Blockly.Blocks['turtle_nullifier'] = { + init: function() { + this.appendDummyInput() + .appendField('no trademarks'); + this.appendDummyInput() + .setAlign(Blockly.ALIGN_CENTRE) + .appendField(new CustomFields.FieldTurtle(null, null, null, this.validate) + , 'TURTLE'); + this.setStyle('loop_blocks'); + this.setCommentText('Validates combinations of names and hats to null' + + ' (invalid) if they could be considered infringe-y. This turns the' + + ' turtle field red. Infringe-y combinations are: (Leonardo, Mask),' + + ' (Yertle, Crown), and (Franklin, Propeller).'); + }, + + validate: function(newValue) { + this.cachedValidatedValue_ = { + turtleName: newValue.turtleName, + pattern: newValue.pattern, + hat: newValue.hat, + }; + if ((newValue.turtleName == 'Leonardo' && newValue.hat == 'Mask') || + (newValue.turtleName == 'Yertle' && newValue.hat == 'Crown') || + (newValue.turtleName == 'Franklin') && newValue.hat == 'Propeller') { + + var currentValue = this.getValue(); + if (newValue.turtleName != currentValue.turtleName) { + // Turtle name changed. + this.cachedValidatedValue_.turtleName = null; + } else { + // Hat must have changed. + this.cachedValidatedValue_.hat = null; + } + + return null; + } + return newValue; + } +}; + +Blockly.Blocks['turtle_changer'] = { + init: function() { + this.appendDummyInput() + .setAlign(Blockly.ALIGN_CENTRE) + .appendField('force hats'); + this.appendDummyInput() + .appendField(new CustomFields.FieldTurtle( + 'Dots', 'Crown', 'Yertle', this.validate), 'TURTLE'); + this.setStyle('loop_blocks'); + this.setCommentText('Validates the input so that certain names always' + + ' have specific hats. The name-hat combinations are: (Leonardo, Mask),' + + ' (Yertle, Crown), (Franklin, Propeller).'); + }, + + validate: function(newValue) { + switch(newValue.turtleName) { + case 'Leonardo': + newValue.hat = 'Mask'; + break; + case 'Yertle': + newValue.hat = 'Crown'; + break; + case 'Franklin': + newValue.hat = 'Propeller'; + break; + } + return newValue; + } +}; diff --git a/js/demos/custom-fields/turtle/field_turtle.js b/js/demos/custom-fields/turtle/field_turtle.js new file mode 100644 index 0000000..9a787e4 --- /dev/null +++ b/js/demos/custom-fields/turtle/field_turtle.js @@ -0,0 +1,753 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview A field used to customize a turtle. + * @author bekawestberg@gmail.com (Beka Westberg) + */ +'use strict'; + +// You must provide the constructor for your custom field. +goog.provide('CustomFields.FieldTurtle'); + +// You must require the abstract field class to inherit from. +goog.require('Blockly.Field'); +goog.require('Blockly.fieldRegistry'); +goog.require('Blockly.utils'); +goog.require('Blockly.utils.dom'); +goog.require('Blockly.utils.object'); +goog.require('Blockly.utils.Size'); + +var CustomFields = CustomFields || {}; + +// Generally field's values should be optional, and have logical defaults. +// If this is not possible (for example image fields can't have logical +// defaults) the field should throw a clear error when a value is not provided. +// Editable fields also generally accept validators, so we will accept a +// validator. +CustomFields.FieldTurtle = function( + opt_pattern, opt_hat, opt_turtleName, opt_validator) { + + // The turtle field contains an object as its value, so we need to compile + // the parameters into an object. + var value = {}; + value.pattern = opt_pattern || CustomFields.FieldTurtle.PATTERNS[0]; + value.hat = opt_hat || CustomFields.FieldTurtle.HATS[0]; + value.turtleName = opt_turtleName || CustomFields.FieldTurtle.NAMES[0]; + + // A field constructor should always call its parent constructor, because + // that helps keep the code organized and DRY. + CustomFields.FieldTurtle.superClass_.constructor.call( + this, value, opt_validator); + + /** + * The size of the area rendered by the field. + * @type {Blockly.utils.Size} + * @protected + * @override + */ + this.size_ = new Blockly.utils.Size(0, 0); +}; +Blockly.utils.object.inherits(CustomFields.FieldTurtle, Blockly.Field); + +// This allows the field to be constructed using a JSON block definition. +CustomFields.FieldTurtle.fromJson = function(options) { + // In this case we simply pass the JSON options along to the constructor, + // but you can also use this to get message references, and other such things. + return new CustomFields.FieldTurtle( + options['pattern'], + options['hat'], + options['turtleName']); +}; + +// Since this field is editable we must also define serializable as true +// (for backwards compatibility reasons serializable is false by default). +CustomFields.FieldTurtle.prototype.SERIALIZABLE = true; + +// The cursor property defines what the mouse will look like when the user +// hovers over the field. By default the cursor will be whatever +// .blocklyDraggable's cursor is defined as (vis. grab). Most fields define +// this property as 'default'. +CustomFields.FieldTurtle.prototype.CURSOR = 'pointer'; + +// How far to move the text to keep it to the right of the turtle. +// May change if the turtle gets fancy enough. +CustomFields.FieldTurtle.prototype.TEXT_OFFSET_X = 80; + +// These are the different options for our turtle. Being declared this way +// means they are static, and not translatable. If you want to do something +// similar, but make it translatable you should set up your options like a +// dropdown field, with language-neutral keys and human-readable values. +CustomFields.FieldTurtle.PATTERNS = + ['Dots', 'Stripes', 'Hexagons']; +CustomFields.FieldTurtle.HATS = + ['Stovepipe', 'Crown', 'Propeller', 'Mask', 'Fedora']; +CustomFields.FieldTurtle.NAMES = + ['Yertle', 'Franklin', 'Crush', 'Leonardo', 'Bowser', 'Squirtle', 'Oogway']; + +// Used to keep track of our editor event listeners, so they can be +// properly disposed of when the field closes. You can keep track of your +// listeners however you want, just be sure to dispose of them! +CustomFields.FieldTurtle.prototype.editorListeners_ = []; + +// Used to create the DOM of our field. +CustomFields.FieldTurtle.prototype.initView = function() { + // Because we want to have both a borderRect_ (background) and a + // textElement_ (text) we can call the super-function. If we only wanted + // one or the other, we could call their individual createX functions. + CustomFields.FieldTurtle.superClass_.initView.call(this); + + // Note that the field group is created by the abstract field's init_ + // function. This means that *all elements* should be children of the + // fieldGroup_. + this.createView_(); +}; + +// Updates how the field looks depending on if it is editable or not. +CustomFields.FieldTurtle.prototype.updateEditable = function() { + if (!this.fieldGroup_) { + // Not initialized yet. + return; + } + // The default functionality just makes it so the borderRect_ does not + // highlight when hovered. + Blockly.FieldColour.superClass_.updateEditable.call(this); + // Things like this are best applied to the clickTarget_. By default the + // click target is the same as getSvgRoot, which by default is the + // fieldGroup_. + var group = this.getClickTarget_(); + if (!this.isCurrentlyEditable()) { + group.style.cursor = 'not-allowed'; + } else { + group.style.cursor = this.CURSOR; + } +}; + +// Gets the text to display when the block is collapsed +CustomFields.FieldTurtle.prototype.getText = function() { + var text = this.value_.turtleName + ' wearing a ' + this.value_.hat; + if (this.value_.hat == 'Stovepipe' || this.value_.hat == 'Propeller') { + text += ' hat'; + } + return text; +}; + +// Makes sure new field values (given to setValue) are valid, meaning +// something this field can legally "hold". Class validators can either change +// the input value, or return null if the input value is invalid. Called by +// the setValue() function. +CustomFields.FieldTurtle.prototype.doClassValidation_ = function(newValue) { + // Undefined signals that we want the value to remain unchanged. This is a + // special feature of turtle fields, but could be useful for other + // multi-part fields. + if (newValue.pattern == undefined) { + newValue.pattern = this.displayValue_ && this.displayValue_.pattern; + // We only want to allow patterns that are part of our pattern list. + // Anything else is invalid, so we return null. + } else if (CustomFields.FieldTurtle.PATTERNS.indexOf(newValue.pattern) == -1) { + newValue.pattern = null; + } + + if (newValue.hat == undefined) { + newValue.hat = this.displayValue_ && this.displayValue_.hat; + } else if (CustomFields.FieldTurtle.HATS.indexOf(newValue.hat) == -1) { + newValue.hat = null; + } + + if (newValue.turtleName == undefined) { + newValue.turtleName = this.displayValue_ && this.displayValue_.turtleName; + } else if (CustomFields.FieldTurtle.NAMES.indexOf(newValue.turtleName) == -1) { + newValue.turtleName = null; + } + + // This is a strategy for dealing with defaults on multi-part values. + // The class validator sets individual properties of the object to null + // to indicate that they are invalid, and then caches that object to the + // cachedValidatedValue_ property. This way the field can, for + // example, properly handle an invalid pattern, combined with a valid hat. + // This can also be done with local validators. + this.cachedValidatedValue_ = newValue; + + // Always be sure to return! + if (!newValue.pattern || !newValue.hat || !newValue.turtleName) { + return null; + } + return newValue; +}; + +// Saves the new field value. Called by the setValue function. +CustomFields.FieldTurtle.prototype.doValueUpdate_ = function(newValue) { + // The default function sets this field's this.value_ property to the + // newValue, and its this.isDirty_ property to true. The isDirty_ property + // tells the setValue function whether the field needs to be re-rendered. + CustomFields.FieldTurtle.superClass_.doValueUpdate_.call(this, newValue); + this.displayValue_ = newValue; + // Since this field has custom UI for invalid values, we also want to make + // sure it knows it is now valid. + this.isValueInvalid_ = false; +}; + +// Notifies that the field that the new value was invalid. Called by +// setValue function. Can either be triggered by the class validator, or the +// local validator. +CustomFields.FieldTurtle.prototype.doValueInvalid_ = function(invalidValue) { + // By default this function is no-op, meaning if the new value is invalid + // the field simply won't be updated. This field has custom UI for invalid + // values, so we override this function. + + // We want the value to be displayed like normal. + // But we want to flag it as invalid, so the render_ function knows to + // make the borderRect_ red. + this.displayValue_ = invalidValue; + this.isDirty_ = true; + this.isValueInvalid_ = true; +}; + +// Updates the field's on-block display based on the current display value. +CustomFields.FieldTurtle.prototype.render_ = function() { + var value = this.displayValue_; + + // Always do editor updates inside render. This makes sure the editor + // always displays the correct value, even if a validator changes it. + if (this.editor_) { + this.renderEditor_(); + } + + this.stovepipe_.style.display = 'none'; + this.crown_.style.display = 'none'; + this.mask_.style.display = 'none'; + this.propeller_.style.display = 'none'; + this.fedora_.style.display = 'none'; + switch(value.hat) { + case 'Stovepipe': + this.stovepipe_.style.display = ''; + this.turtleGroup_.setAttribute('transform', 'translate(0,12)'); + this.textElement_.setAttribute( + 'transform', 'translate(' + this.TEXT_OFFSET_X + ',20)'); + break; + case 'Crown': + this.crown_.style.display = ''; + this.turtleGroup_.setAttribute('transform', 'translate(0,9)'); + this.textElement_.setAttribute( + 'transform', 'translate(' + this.TEXT_OFFSET_X + ',16)'); + break; + case 'Mask': + this.mask_.style.display = ''; + this.turtleGroup_.setAttribute('transform', 'translate(0,1.2)'); + this.textElement_.setAttribute('transform', + 'translate(' + this.TEXT_OFFSET_X + ',4)'); + break; + case 'Propeller': + this.propeller_.style.display = ''; + this.turtleGroup_.setAttribute('transform', 'translate(0,6)'); + this.textElement_.setAttribute('transform', + 'translate(' + this.TEXT_OFFSET_X + ',12)'); + break; + case 'Fedora': + this.fedora_.style.display = ''; + this.turtleGroup_.setAttribute('transform', 'translate(0,6)'); + this.textElement_.setAttribute('transform', + 'translate(' + this.TEXT_OFFSET_X + ',12)'); + break; + } + + switch(value.pattern) { + case 'Dots': + this.shellPattern_.setAttribute('fill', 'url(#polkadots)'); + break; + case 'Stripes': + this.shellPattern_.setAttribute('fill', 'url(#stripes)'); + break; + case 'Hexagons': + this.shellPattern_.setAttribute('fill', 'url(#hexagons)'); + break; + } + + // Always modify the textContent_ rather than the textElement_. This + // allows fields to append DOM to the textElement (e.g. the angle field). + this.textContent_.nodeValue = value.turtleName; + + if (this.isValueInvalid_) { + this.borderRect_.style.fill = '#f99'; + this.borderRect_.style.fillOpacity = 1; + } else { + this.borderRect_.style.fill = '#fff'; + this.borderRect_.style.fillOpacity = 0.6; + } + + this.updateSize_(); +}; + +CustomFields.FieldTurtle.prototype.renderEditor_ = function() { + var value = this.displayValue_; + + // .textElement is a property assigned to the element. + // It allows the text to be edited without destroying the warning icon. + this.editor_.patternText.textElement.nodeValue = value.pattern; + this.editor_.hatText.textElement.nodeValue = value.hat; + this.editor_.turtleNameText.textElement.nodeValue = value.turtleName; + + this.editor_.patternText.warningIcon.style.display = + this.cachedValidatedValue_.pattern ? 'none' : ''; + this.editor_.hatText.warningIcon.style.display = + this.cachedValidatedValue_.hat ? 'none' : ''; + this.editor_.turtleNameText.warningIcon.style.display = + this.cachedValidatedValue_.turtleName ? 'none' : ''; +}; + +// Used to update the size of the field. This function's logic could be simply +// included inside render_ (it is not called anywhere else), but it is +// usually separated to keep code more organized. +CustomFields.FieldTurtle.prototype.updateSize_ = function() { + var bbox = this.movableGroup_.getBBox(); + var width = bbox.width; + var height = bbox.height; + if (this.borderRect_) { + width += this.constants_.FIELD_BORDER_RECT_X_PADDING * 2; + height += this.constants_.FIELD_BORDER_RECT_X_PADDING * 2; + this.borderRect_.setAttribute('width', width); + this.borderRect_.setAttribute('height', height); + } + // Note how both the width and the height can be dynamic. + this.size_.width = width; + this.size_.height = height; +}; + +// Called when the field is clicked. It is usually used to show an editor, +// but it can also be used for other things e.g. the checkbox field uses +// this function to check/uncheck itself. +CustomFields.FieldTurtle.prototype.showEditor_ = function() { + this.editor_ = this.dropdownCreate_(); + this.renderEditor_(); + Blockly.DropDownDiv.getContentDiv().appendChild(this.editor_); + + // These allow us to have the editor match the block's colour. + var fillColour = this.sourceBlock_.getColour(); + Blockly.DropDownDiv.setColour(fillColour, + this.sourceBlock_.style.colourTertiary); + + // Always pass the dropdown div a dispose function so that you can clean + // up event listeners when the editor closes. + Blockly.DropDownDiv.showPositionedByField( + this, this.dropdownDispose_.bind(this)); +}; + +// Creates the UI of the editor, and adds event listeners to it. +CustomFields.FieldTurtle.prototype.dropdownCreate_ = function() { + var createRow = function(table) { + var row = table.appendChild(document.createElement('tr')); + row.className = 'row'; + return row; + }; + var createLeftArrow = function(row) { + var cell = document.createElement('div'); + cell.className = 'arrow'; + var leftArrow = document.createElement('button'); + leftArrow.setAttribute('type', 'button'); + leftArrow.textContent = '<'; + cell.appendChild(leftArrow); + row.appendChild(cell); + return cell; + }; + var createTextNode = function(row, text) { + var cell = document.createElement('div'); + cell.className = 'text'; + var text = document.createTextNode(text); + cell.appendChild(text); + cell.textElement = text; + var warning = document.createElement('img'); + warning.setAttribute('src', 'media/warning.svg'); + warning.setAttribute('height', '16px'); + warning.setAttribute('width', '16px'); + warning.style.marginLeft = '4px'; + cell.appendChild(warning); + cell.warningIcon = warning; + row.appendChild(cell); + return cell; + }; + var createRightArrow = function(row) { + var cell = document.createElement('div'); + cell.className = 'arrow'; + var rightArrow = document.createElement('button'); + rightArrow.setAttribute('type', 'button'); + rightArrow.textContent = '>'; + cell.appendChild(rightArrow); + row.appendChild(cell); + return cell; + }; + var createArrowListener = function(variable, array, direction) { + return function() { + var currentIndex = array.indexOf(this.displayValue_[variable]); + currentIndex += direction; + if (currentIndex <= -1) { + currentIndex = array.length - 1; + } else if (currentIndex >= array.length) { + currentIndex = 0; + } + var value = {}; + value[variable] = array[currentIndex]; + this.setValue(value); + }; + }; + + var widget = document.createElement('div'); + widget.className = 'customFieldsTurtleWidget blocklyNonSelectable'; + + var table = document.createElement('div'); + table.className = 'table'; + widget.appendChild(table); + + var row = createRow(table); + var leftArrow = createLeftArrow(row); + widget.patternText = createTextNode(row, this.displayValue_.pattern); + var rightArrow = createRightArrow(row); + this.editorListeners_.push(Blockly.bindEvent_(leftArrow, 'mouseup', this, + createArrowListener('pattern', CustomFields.FieldTurtle.PATTERNS, -1))); + this.editorListeners_.push(Blockly.bindEvent_(rightArrow, 'mouseup', this, + createArrowListener('pattern', CustomFields.FieldTurtle.PATTERNS, 1))); + + row = createRow(table); + leftArrow = createLeftArrow(row); + widget.hatText = createTextNode(row, this.displayValue_.hat); + rightArrow = createRightArrow(row); + this.editorListeners_.push(Blockly.bindEvent_(leftArrow, 'mouseup', this, + createArrowListener('hat', CustomFields.FieldTurtle.HATS, -1))); + this.editorListeners_.push(Blockly.bindEvent_(rightArrow, 'mouseup', this, + createArrowListener('hat', CustomFields.FieldTurtle.HATS, 1))); + + row = createRow(table); + leftArrow = createLeftArrow(row); + widget.turtleNameText = createTextNode(row, this.displayValue_.turtleName); + rightArrow = createRightArrow(row); + this.editorListeners_.push(Blockly.bindEvent_(leftArrow, 'mouseup', this, + createArrowListener('turtleName', CustomFields.FieldTurtle.NAMES, -1))); + this.editorListeners_.push(Blockly.bindEvent_(rightArrow, 'mouseup', this, + createArrowListener('turtleName', CustomFields.FieldTurtle.NAMES, 1))); + + var randomizeButton = document.createElement('button'); + randomizeButton.className = 'randomize'; + randomizeButton.setAttribute('type', 'button'); + randomizeButton.textContent = 'randomize turtle'; + this.editorListeners_.push(Blockly.bindEvent_(randomizeButton, 'mouseup', this, + function() { + var value = {}; + value.pattern = CustomFields.FieldTurtle.PATTERNS[ + Math.floor(Math.random() * CustomFields.FieldTurtle.PATTERNS.length)]; + + value.hat = CustomFields.FieldTurtle.HATS[ + Math.floor(Math.random() * CustomFields.FieldTurtle.HATS.length)]; + + value.turtleName = CustomFields.FieldTurtle.NAMES[ + Math.floor(Math.random() * CustomFields.FieldTurtle.NAMES.length)]; + + this.setValue(value); + })); + widget.appendChild(randomizeButton); + + return widget; +}; + +// Cleans up any event listeners that were attached to the now hidden editor. +CustomFields.FieldTurtle.prototype.dropdownDispose_ = function() { + for (var i = this.editorListeners_.length, listener; + listener = this.editorListeners_[i]; i--) { + Blockly.unbindEvent_(listener); + this.editorListeners_.pop(); + } +}; + +// Updates the field's colour based on the colour of the block. Called by +// block.applyColour. +CustomFields.FieldTurtle.prototype.applyColour = function() { + if (!this.sourceBlock_) { + return; + } + // The getColourX functions are the best way to access the colours of a block. + var isShadow = this.sourceBlock_.isShadow(); + var fillColour = isShadow ? + this.sourceBlock_.getColourShadow() : this.sourceBlock_.getColour(); + // This is technically a package function, meaning it could change. + var borderColour = isShadow ? fillColour : + this.sourceBlock_.style.colourTertiary; + + if (this.turtleGroup_) { + var child = this.turtleGroup_.firstChild; + while(child) { + // If it is a text node, continue. + if (child.nodeType == 3) { + child = child.nextSibling; + continue; + } + // Or if it is a non-turtle node, continue. + var className = child.getAttribute('class'); + if (!className || className.indexOf('turtleBody') == -1) { + child = child.nextSibling; + continue; + } + + child.style.fill = fillColour; + child.style.stroke = borderColour; + child = child.nextSibling; + } + } +}; + +// Saves the field's value to an XML node. Allows for custom serialization. +CustomFields.FieldTurtle.prototype.toXml = function(fieldElement) { + // The default implementation of this function creates a node that looks + // like this: (where value is returned by getValue()) + // value + // But this doesn't work for our field because it stores an /object/. + + fieldElement.setAttribute('pattern', this.value_.pattern); + fieldElement.setAttribute('hat', this.value_.hat); + // The textContent usually contains whatever is closest to the field's + // 'value'. The textContent doesn't need to contain anything, but saving + // something to it does aid in readability. + fieldElement.textContent = this.value_.turtleName; + + // Always return the element! + return fieldElement; +}; + +// Sets the field's value based on an XML node. Allows for custom +// de-serialization. +CustomFields.FieldTurtle.prototype.fromXml = function(fieldElement) { + // Because we had to do custom serialization for this field, we also need + // to do custom de-serialization. + + var value = {}; + value.pattern = fieldElement.getAttribute('pattern'); + value.hat = fieldElement.getAttribute('hat'); + value.turtleName = fieldElement.textContent; + // The end goal is to call this.setValue() + this.setValue(value); +}; + +// Blockly needs to know the JSON name of this field. Usually this is +// registered at the bottom of the field class. +Blockly.fieldRegistry.register('field_turtle', CustomFields.FieldTurtle); + +// Called by initView to create all of the SVGs. This is just used to keep +// the code more organized. +CustomFields.FieldTurtle.prototype.createView_ = function() { + this.movableGroup_ = Blockly.utils.dom.createSvgElement('g', + { + 'transform': 'translate(0,5)' + }, this.fieldGroup_); + var scaleGroup = Blockly.utils.dom.createSvgElement('g', + { + 'transform': 'scale(1.5)' + }, this.movableGroup_); + this.turtleGroup_ = Blockly.utils.dom.createSvgElement('g', + { + // Makes the smaller turtle graphic align with the hats. + 'class': 'turtleBody' + }, scaleGroup); + var tail = Blockly.utils.dom.createSvgElement('path', + { + 'class': 'turtleBody', + 'd': 'M7,27.5H0.188c3.959-2,6.547-2.708,8.776-5.237', + 'transform': 'translate(0.312 -12.994)' + }, this.turtleGroup_); + var legLeft = Blockly.utils.dom.createSvgElement('rect', + { + 'class': 'turtleBody', + 'x': 8.812, + 'y': 12.506, + 'width': 4, + 'height': 10 + }, this.turtleGroup_); + var legRight = Blockly.utils.dom.createSvgElement('rect', + { + 'class': 'turtleBody', + 'x': 28.812, + 'y': 12.506, + 'width': 4, + 'height': 10 + }, this.turtleGroup_); + var head = Blockly.utils.dom.createSvgElement('path', + { + 'class': 'turtleBody', + 'd': 'M47.991,17.884c0,1.92-2.144,3.477-4.788,3.477a6.262,6.262,0,0,1-2.212-.392c-0.2-.077-1.995,2.343-4.866,3.112a17.019,17.019,0,0,1-6.01.588c-4.413-.053-2.5-3.412-2.745-3.819-0.147-.242,2.232.144,6.126-0.376a7.392,7.392,0,0,0,4.919-2.588c0-1.92,2.144-3.477,4.788-3.477S47.991,15.964,47.991,17.884Z', + 'transform': 'translate(0.312 -12.994)' + }, this.turtleGroup_); + var smile = Blockly.utils.dom.createSvgElement('path', + { + 'class': 'turtleBody', + 'd': 'M42.223,18.668a3.614,3.614,0,0,0,2.728,2.38', + 'transform': 'translate(0.312 -12.994)' + }, this.turtleGroup_); + var sclera = Blockly.utils.dom.createSvgElement('ellipse', + { + 'cx': 43.435, + 'cy': 2.61, + 'rx': 2.247, + 'ry': 2.61, + 'fill': '#fff' + }, this.turtleGroup_); + var pupil = Blockly.utils.dom.createSvgElement('ellipse', + { + 'cx': 44.166, + 'cy': 3.403, + 'rx': 1.318, + 'ry': 1.62 + }, this.turtleGroup_); + var shell = Blockly.utils.dom.createSvgElement('path', + { + 'class': 'turtleBody', + 'd': 'M33.4,27.5H7.193c0-6,5.866-13.021,13.1-13.021S33.4,21.5,33.4,27.5Z', + 'transform': 'translate(0.312 -12.994)' + }, this.turtleGroup_); + this.shellPattern_ = Blockly.utils.dom.createSvgElement('path', + { + 'd': 'M33.4,27.5H7.193c0-6,5.866-13.021,13.1-13.021S33.4,21.5,33.4,27.5Z', + 'transform': 'translate(0.312 -12.994)' + }, this.turtleGroup_); + + this.stovepipe_ = Blockly.utils.dom.createSvgElement('image', + { + 'width': '50', + 'height': '18' + }, scaleGroup); + this.stovepipe_.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', + 'media/stovepipe.svg'); + this.crown_ = Blockly.utils.dom.createSvgElement('image', + { + 'width': '50', + 'height': '15' + }, scaleGroup); + this.crown_.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', + 'media/crown.svg'); + this.mask_ = Blockly.utils.dom.createSvgElement('image', + { + 'width': '50', + 'height': '14' + }, scaleGroup); + this.mask_.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', + 'media/mask.svg'); + this.propeller_ = Blockly.utils.dom.createSvgElement('image', + { + 'width': '50', + 'height': '11' + }, scaleGroup); + this.propeller_.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', + 'media/propeller.svg'); + this.fedora_ = Blockly.utils.dom.createSvgElement('image', + { + 'width': '50', + 'height': '12' + }, scaleGroup); + this.fedora_.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', + 'media/fedora.svg'); + + // Even if we're not going to display it right away, we want to create all + // of our DOM elements inside this function. + this.crown_.style.display = 'none'; + this.mask_.style.display = 'none'; + this.propeller_.style.display = 'none'; + this.fedora_.style.display = 'none'; + + this.movableGroup_.appendChild(this.textElement_); + this.textElement_.setAttribute( + 'transform', 'translate(' + this.TEXT_OFFSET_X + ',20)'); + + this.defs_ = Blockly.utils.dom.createSvgElement('defs', {}, this.fieldGroup_); + this.polkadotPattern_ = Blockly.utils.dom.createSvgElement('pattern', + { + 'id': 'polkadots', + 'patternUnits': 'userSpaceOnUse', + 'width': 10, + 'height': 10 + }, this.defs_); + this.polkadotGroup_ = Blockly.utils.dom.createSvgElement( + 'g', {}, this.polkadotPattern_); + Blockly.utils.dom.createSvgElement('circle', + { + 'cx': 2.5, + 'cy': 2.5, + 'r': 2.5, + 'fill': '#000', + 'fill-opacity': .3 + }, this.polkadotGroup_); + Blockly.utils.dom.createSvgElement('circle', + { + 'cx': 7.5, + 'cy': 7.5, + 'r': 2.5, + 'fill': '#000', + 'fill-opacity': .3 + }, this.polkadotGroup_); + + this.hexagonPattern_ = Blockly.utils.dom.createSvgElement('pattern', + { + 'id': 'hexagons', + 'patternUnits': 'userSpaceOnUse', + 'width': 10, + 'height': 8.68, + 'patternTransform': 'translate(2) rotate(45)' + }, this.defs_); + Blockly.utils.dom.createSvgElement('polygon', + { + 'id': 'hex', + 'points': '4.96,4.4 7.46,5.84 7.46,8.74 4.96,10.18 2.46,8.74 2.46,5.84', + 'stroke': '#000', + 'stroke-opacity': .3, + 'fill-opacity': 0 + }, this.hexagonPattern_); + var use = Blockly.utils.dom.createSvgElement('use', + { + 'x': 5, + }, this.hexagonPattern_); + use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', '#hex'); + use = Blockly.utils.dom.createSvgElement('use', + { + 'x': -5, + }, this.hexagonPattern_); + use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', '#hex'); + use = Blockly.utils.dom.createSvgElement('use', + { + 'x': 2.5, + 'y': -4.34 + }, this.hexagonPattern_); + use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', '#hex'); + use = Blockly.utils.dom.createSvgElement('use', + { + 'x': -2.5, + 'y': -4.34 + }, this.hexagonPattern_); + use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', '#hex'); + + this.stripesPattern_ = Blockly.utils.dom.createSvgElement('pattern', + { + 'id': 'stripes', + 'patternUnits': 'userSpaceOnUse', + 'width': 5, + 'height': 10, + 'patternTransform': 'rotate(45)' + }, this.defs_); + Blockly.utils.dom.createSvgElement('line', + { + 'x1': 0, + 'y1': 0, + 'x2': 0, + 'y2': 10, + 'stroke-width': 4, + 'stroke': '#000', + 'stroke-opacity': .3 + }, this.stripesPattern_); +}; diff --git a/js/demos/custom-fields/turtle/icon.png b/js/demos/custom-fields/turtle/icon.png new file mode 100644 index 0000000..3a7314a Binary files /dev/null and b/js/demos/custom-fields/turtle/icon.png differ diff --git a/js/demos/custom-fields/turtle/index.html b/js/demos/custom-fields/turtle/index.html new file mode 100644 index 0000000..9bc4dfe --- /dev/null +++ b/js/demos/custom-fields/turtle/index.html @@ -0,0 +1,175 @@ + + + + + Blockly Demo: Custom Turtle Field + + + + + + + + +

+ Blockly > + Demos > + Custom Fields > Turtle Field

+ + +

This is a demo of creating custom block fields. In this case the field + is used to define a turtle. +

+ +

All of the custom field implementation is in + demos/custom-fields/turtle/field_turtle.js, including comments on each required + function. +

+ +

Click on the blocks' comment icons to learn what they are demonstrating. + Use the buttons below to see how the fields react to changes. +

+ +

+ + + + + +

+ +

+ + +

+ + + + + + +
+ + +
+
+ + + + + + diff --git a/js/demos/custom-fields/turtle/media/crown.svg b/js/demos/custom-fields/turtle/media/crown.svg new file mode 100644 index 0000000..3eebccb --- /dev/null +++ b/js/demos/custom-fields/turtle/media/crown.svg @@ -0,0 +1 @@ +crown \ No newline at end of file diff --git a/js/demos/custom-fields/turtle/media/fedora.svg b/js/demos/custom-fields/turtle/media/fedora.svg new file mode 100644 index 0000000..4a35449 --- /dev/null +++ b/js/demos/custom-fields/turtle/media/fedora.svg @@ -0,0 +1 @@ +fedora \ No newline at end of file diff --git a/js/demos/custom-fields/turtle/media/mask.svg b/js/demos/custom-fields/turtle/media/mask.svg new file mode 100644 index 0000000..eb4fded --- /dev/null +++ b/js/demos/custom-fields/turtle/media/mask.svg @@ -0,0 +1 @@ +mask \ No newline at end of file diff --git a/js/demos/custom-fields/turtle/media/propeller.svg b/js/demos/custom-fields/turtle/media/propeller.svg new file mode 100644 index 0000000..bf0a433 --- /dev/null +++ b/js/demos/custom-fields/turtle/media/propeller.svg @@ -0,0 +1 @@ +propeller \ No newline at end of file diff --git a/js/demos/custom-fields/turtle/media/stovepipe.svg b/js/demos/custom-fields/turtle/media/stovepipe.svg new file mode 100644 index 0000000..6971ff7 --- /dev/null +++ b/js/demos/custom-fields/turtle/media/stovepipe.svg @@ -0,0 +1 @@ +stovepipe \ No newline at end of file diff --git a/js/demos/custom-fields/turtle/media/warning.svg b/js/demos/custom-fields/turtle/media/warning.svg new file mode 100644 index 0000000..11136c1 --- /dev/null +++ b/js/demos/custom-fields/turtle/media/warning.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/js/demos/custom-fields/turtle/turtle.css b/js/demos/custom-fields/turtle/turtle.css new file mode 100644 index 0000000..99ab0d4 --- /dev/null +++ b/js/demos/custom-fields/turtle/turtle.css @@ -0,0 +1,59 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +.customFieldsTurtleWidget { + width: 150px; +} + +.customFieldsTurtleWidget button { + border-radius: 4px; + border: none; + background-color: #fff; + opacity: .6; + color: #000; +} + +.customFieldsTurtleWidget .table { + width: 100%; +} + +.customFieldsTurtleWidget .row { + width: 100%; + display: flex; +} + +.customFieldsTurtleWidget .arrow { + text-align: center; + padding: 0; + flex-grow: 0; +} + +.customFieldsTurtleWidget .text { + height: 20px; + color: #fff; + flex-grow: 1; + text-align: center; +} + +.customFieldsTurtleWidget .randomize { + width: 100%; +} + +.blocklySvg .blocklyNonEditableText text, +.blocklySvg .blocklyEditableText text { + fill: #000; +} diff --git a/js/demos/fixed/icon.png b/js/demos/fixed/icon.png new file mode 100644 index 0000000..0a80ef9 Binary files /dev/null and b/js/demos/fixed/icon.png differ diff --git a/js/demos/fixed/index.html b/js/demos/fixed/index.html new file mode 100644 index 0000000..85d6346 --- /dev/null +++ b/js/demos/fixed/index.html @@ -0,0 +1,49 @@ + + + + + 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/js/demos/generator/icon.png b/js/demos/generator/icon.png new file mode 100644 index 0000000..c1a84f0 Binary files /dev/null and b/js/demos/generator/icon.png differ diff --git a/js/demos/generator/index.html b/js/demos/generator/index.html new file mode 100644 index 0000000..6f87443 --- /dev/null +++ b/js/demos/generator/index.html @@ -0,0 +1,148 @@ + + + + + Blockly Demo: Generating JavaScript + + + + + + + +

Blockly > + Demos > Generating JavaScript

+ +

This is a simple demo of generating code from blocks and running + the code in a sandboxed JavaScript interpreter.

+ +

→ More info on Code Generators and Running JavaScript.

+ +

+ + +

+ +
+ + + + + + + + + diff --git a/js/demos/graph/icon.png b/js/demos/graph/icon.png new file mode 100644 index 0000000..7828463 Binary files /dev/null and b/js/demos/graph/icon.png differ diff --git a/js/demos/graph/index.html b/js/demos/graph/index.html new file mode 100644 index 0000000..2e68c84 --- /dev/null +++ b/js/demos/graph/index.html @@ -0,0 +1,364 @@ + + + + + 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/js/demos/headless/icon.png b/js/demos/headless/icon.png new file mode 100644 index 0000000..f431dc4 Binary files /dev/null and b/js/demos/headless/icon.png differ diff --git a/js/demos/headless/index.html b/js/demos/headless/index.html new file mode 100644 index 0000000..174537c --- /dev/null +++ b/js/demos/headless/index.html @@ -0,0 +1,120 @@ + + + + + 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/js/demos/index.html b/js/demos/index.html new file mode 100644 index 0000000..1b22326 --- /dev/null +++ b/js/demos/index.html @@ -0,0 +1,248 @@ + + + + + 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.
+
+ + + + +
JS Interpreter
+ + +
+ + + + + +
Instant updates when blocks are changed.
+
+ + + + + +
See what Blockly looks like in right-to-left mode (for Arabic and Hebrew).
+
+ + + + + +
Override Blockly browser dialogs with custom implementations.
+
+ + + + + +
Implement a custom field.
+
+ + + + + +
Save and load blocks with App Engine.
+
+ + + + + +
Two Blockly instances connected as master-slave.
+
+ + + + + +
Version of Blockly accessible to screen readers.
+
+ + + + + +
Using Closure Templates to support 35 languages.
+
+ + + + + +
Export a Blockly program into JavaScript, Python, PHP, Lua, Dart, or XML.
+
+ + + + + +
Build custom blocks and setup a toolbox using Blockly.
+
+ + + + + +
Demos keyboard navigation.
+
+ + diff --git a/js/demos/interpreter/acorn_interpreter.js b/js/demos/interpreter/acorn_interpreter.js new file mode 100644 index 0000000..249bc6c --- /dev/null +++ b/js/demos/interpreter/acorn_interpreter.js @@ -0,0 +1,141 @@ +// Acorn: Copyright 2012 Marijn Haverbeke, MIT License +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 d=new SyntaxError(b);d.pos=a;d.loc=c;d.raisedAt=f;throw d;}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)++f;else if(47===a)if(a=k.charCodeAt(f+1),42===a){var a=n.onComment&&n.locations&&new e,b=f,d=k.indexOf("*/",f+=2);-1===d&&c(f-2,"Unterminated comment"); +f=d+2;if(n.locations){Y.lastIndex=b;for(var g=void 0;(g=Y.exec(k))&&g.index=a?a=P(!0):(++f,a=g(xa)),a;case 40:return++f,g(I);case 41:return++f,g(E);case 59:return++f,g(J);case 44:return++f,g(L);case 91:return++f,g(ja); +case 93:return++f,g(ka);case 123:return++f,g(Z);case 125:return++f,g(T);case 58:return++f,g(aa);case 63:return++f,g(ya);case 48:if(a=k.charCodeAt(f+1),120===a||88===a)return f+=2,a=B(16),null==a&&c(x+2,"Expected hexadecimal number"),la(k.charCodeAt(f))&&c(f,"Identifier directly after number"),a=g(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:{f++;for(var b="";;){f>=S&&c(x,"Unterminated string constant");var d=k.charCodeAt(f);if(d===a){++f; +a=g(da,b);break a}if(92===d){var d=k.charCodeAt(++f),e=/^[0-7]+/.exec(k.slice(f,f+3));for(e&&(e=e[0]);e&&255=S)return g(pa);var b=k.charCodeAt(f);if(la(b)||92===b)return Ya();a=m(b);if(!1===a){b=String.fromCharCode(b);if("\\"===b||Za.test(b))return Ya();c(f,"Unexpected character '"+b+"'")}return a}function t(a,b){var c=k.slice(f,f+b);f+=b;g(a,c)}function K(){for(var a,b,d=f;;){f>=S&&c(d, +"Unterminated regular expression");var e=k.charAt(f);na.test(e)&&c(d,"Unterminated regular expression");if(a)a=!1;else{if("["===e)b=!0;else if("]"===e&&b)b=!1;else if("/"===e&&!b)break;a="\\"===e}++f}a=k.slice(d,f);++f;(b=$a())&&!/^[gmsiy]*$/.test(b)&&c(d,"Invalid regexp flag");return g(Ba,new RegExp(a,b))}function B(a,b){for(var c=f,d=0,e=0,g=null==b?Infinity:b;e=h?h-48:Infinity;if(h>=a)break;++f;d=d*a+h}return f===c||null!=b&& +f-c!==b?null:d}function P(a){var b=f,d=!1,e=48===k.charCodeAt(f);a||null!==B(10)||c(b,"Invalid number");46===k.charCodeAt(f)&&(++f,B(10),d=!0);a=k.charCodeAt(f);if(69===a||101===a)a=k.charCodeAt(++f),43!==a&&45!==a||++f,null===B(10)&&c(b,"Invalid number"),d=!0;la(k.charCodeAt(f))&&c(f,"Identifier directly after number");a=k.slice(b,f);var h;d?h=parseFloat(a):e&&1!==a.length?/[89]/.test(a)||C?c(b,"Invalid number"):h=parseInt(a,8):h=parseInt(a,10);return g(ba,h)}function ma(a){a=B(16,a);null===a&&c(x, +"Bad character escape sequence");return a}function $a(){ca=!1;for(var a,b=!0,d=f;;){var e=k.charCodeAt(f);if(ab(e))ca&&(a+=k.charAt(f)),++f;else if(92===e){ca||(a=k.slice(d,f));ca=!0;117!=k.charCodeAt(++f)&&c(f,"Expecting Unicode escape sequence \\uXXXX");++f;var e=ma(4),g=String.fromCharCode(e);g||c(f-1,"Invalid Unicode escape");(b?la(e):ab(e))||c(f-4,"Invalid Unicode escape");a+=g}else break;b=!1}return ca?a:k.slice(d,f)}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(x,"The keyword '"+a+"' is reserved"));return g(b,a)}function r(){Da=x;M=X;Ea=ia;z()}function Fa(a){C=a;f=M;if(n.locations)for(;fb){var e=Q(a);e.left=a;e.operator=H;a=p;r();e.right=Ra(Sa(),d,c);d=q(e,a===Va||a===Wa?"LogicalExpression":"BinaryExpression");return Ra(d,b,c)}return a}function Sa(){if(p.prefix){var a=y(),b=p.isUpdate;a.operator=H;R=a.prefix=!0;r();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=H,a.prefix=!1,a.argument=b,ra(b),r(),b=q(a,"UpdateExpression");return b}function ha(a,b){if(u(xa)){var c=Q(a);c.object=a;c.property=O(!0);c.computed=!1;return ha(q(c,"MemberExpression"),b)}return u(ja)?(c=Q(a),c.object=a,c.property=A(),c.computed=!0,v(ka),ha(q(c,"MemberExpression"), +b)):!b&&u(I)?(c=Q(a),c.callee=a,c.arguments=Ta(E,!1),ha(q(c,"CallExpression"),b)):a}function ua(){switch(p){case ub:var a=y();r();return q(a,"ThisExpression");case V:return O();case ba:case da:case Ba:return a=y(),a.value=H,a.raw=k.slice(x,X),r(),q(a,"Literal");case vb:case wb:case xb:return a=y(),a.value=p.atomValue,a.raw=p.keyword,r(),q(a,"Literal");case I:var a=oa,b=x;r();var d=A();d.start=b;d.end=X;n.locations&&(d.loc.start=a,d.loc.end=ia);n.ranges&&(d.range=[b,X]);v(E);return d;case ja:return a= +y(),r(),a.elements=Ta(ka,!0,!0),q(a,"ArrayExpression");case Z:a=y();b=!0;d=!1;a.properties=[];for(r();!u(T);){if(b)b=!1;else if(v(L),n.allowTrailingCommas&&u(T))break;var e={key:p===ba||p===da?ua():O(!0)},g=!1,h;u(aa)?(e.value=A(!0),h=e.kind="init"):5<=n.ecmaVersion&&"Identifier"===e.key.type&&("get"===e.key.name||"set"===e.key.name)?(g=d=!0,h=e.kind=e.key.name,e.key=p===ba||p===da?ua():O(!0),p!==I&&N(),e.value=Na(y(),!1)):N();if("Identifier"===e.key.type&&(C||d))for(var f=0;fd?a.id:a.params[d],(bb(e.name)||sa(e.name))&&c(e.start,"Defining '"+e.name+"' in strict mode"),0<=d)for(var g=0;ga?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={})); +// JS-Interpreter: Copyright 2013 Google LLC, Apache 2.0 +function u(a,b){"string"===typeof a&&(a=acorn.parse(a,ha));this.ha=a;this.ib=b;this.ya=!1;this.V=[];this.Da=0;this.nb=Object.create(null);var c=/^step([A-Z]\w*)$/,d,e;for(e in this)"function"===typeof this[e]&&(d=e.match(c))&&(this.nb[d[1]]=this[e].bind(this));this.global=ia(this,this.ha,null);this.ha=acorn.parse(this.V.join("\n"),ha);this.V=void 0;ra(this,this.ha,void 0,void 0);c=new y(this.ha,this.global);c.done=!1;this.j=[c];this.lb();this.value=void 0;this.ha=a;c=new y(this.ha,this.global);c.done= +!1;this.j.length=0;this.j[0]=c;this.Ra=c.node.constructor;this.stateStack=this.j} +var ha={Ca:5},sa={configurable:!0,enumerable:!0,writable:!1},A={configurable:!0,enumerable:!1,writable:!0},E={configurable:!0,enumerable:!1,writable:!1},za={configurable:!1,enumerable:!0,writable:!0},Aa={STEP_ERROR:!0},Ba={SCOPE_REFERENCE:!0},Ha={VALUE_IN_DESCRIPTOR:!0},Ia={REGEXP_TIMEOUT:!0},Ja=[],Ka=null,La=["onmessage = function(e) {","var result;","var data = e.data;","switch (data[0]) {","case 'split':","result = data[1].split(data[2], data[3]);","break;","case 'match':","result = data[1].match(data[2]);", +"break;","case 'search':","result = data[1].search(data[2]);","break;","case 'replace':","result = data[1].replace(data[2], data[3]);","break;","case 'exec':","var regexp = data[1];","regexp.lastIndex = data[2];","result = [regexp.exec(data[3]), data[1].lastIndex];","break;","default:","throw 'Unknown RegExp operation: ' + data[0];","}","postMessage(result);","};"];u.prototype.REGEXP_MODE=2;u.prototype.REGEXP_THREAD_TIMEOUT=1E3; +u.prototype.sb=function(a){var b=this.j[0];if(!b||"Program"!==b.node.type)throw Error("Expecting original AST to start with a Program node.");"string"===typeof a&&(a=acorn.parse(a,ha));if(!a||"Program"!==a.type)throw Error("Expecting new AST to start with a Program node.");Ma(this,a,b.scope);for(var c=0,d;d=a.body[c];c++)b.node.body.push(d);b.done=!1}; +u.prototype.step=function(){var a=this.j,b=a[a.length-1];if(!b)return!1;var c=b.node,d=c.type;if("Program"===d&&b.done)return!1;if(this.ya)return!0;try{var e=this.nb[d](a,b,c)}catch(g){if(g!==Aa)throw g;}e&&a.push(e);return c.end?!0:this.step()};u.prototype.lb=function(){for(;!this.ya&&this.step(););return this.ya}; +function Na(a,b){a.setProperty(b,"NaN",NaN,sa);a.setProperty(b,"Infinity",Infinity,sa);a.setProperty(b,"undefined",void 0,sa);a.setProperty(b,"window",b,sa);a.setProperty(b,"this",b,sa);a.setProperty(b,"self",b);a.G=new Oa(null);a.I=new Oa(a.G);Pa(a,b);cb(a,b);b.oa=a.G;a.setProperty(b,"constructor",a.m,A);db(a,b);Eb(a,b);Fb(a,b);Gb(a,b);Hb(a,b);Ib(a,b);Jb(a,b);Kb(a,b);Lb(a,b);var c=a.b(function(){throw EvalError("Can't happen");},!1);c.eval=!0;a.setProperty(b,"eval",c);a.setProperty(b,"parseInt", +a.b(parseInt,!1));a.setProperty(b,"parseFloat",a.b(parseFloat,!1));a.setProperty(b,"isNaN",a.b(isNaN,!1));a.setProperty(b,"isFinite",a.b(isFinite,!1));c=[[escape,"escape"],[unescape,"unescape"],[decodeURI,"decodeURI"],[decodeURIComponent,"decodeURIComponent"],[encodeURI,"encodeURI"],[encodeURIComponent,"encodeURIComponent"]];for(var d=0;d>> 0;","if (arguments.length > 1) T = thisArg;","k = 0;","while (k < len) {","if (k in O && !callbackfn.call(T, O[k], k, O)) return false;","k++;","}","return true;", +"}","});","Object.defineProperty(Array.prototype, 'filter',","{configurable: true, writable: true, value:","function(fun/*, thisArg*/) {","if (this === void 0 || this === null || typeof fun !== 'function') throw TypeError();","var t = Object(this);","var len = t.length >>> 0;","var res = [];","var thisArg = arguments.length >= 2 ? arguments[1] : void 0;","for (var i = 0; i < len; i++) {","if (i in t) {","var val = t[i];","if (fun.call(thisArg, val, i, t)) res.push(val);","}","}","return res;","}", +"});","Object.defineProperty(Array.prototype, 'forEach',","{configurable: true, writable: true, value:","function(callback, thisArg) {","if (!this || typeof callback !== 'function') throw TypeError();","var T, k;","var O = Object(this);","var len = O.length >>> 0;","if (arguments.length > 1) T = thisArg;","k = 0;","while (k < len) {","if (k in O) callback.call(T, O[k], k, O);","k++;","}","}","});","Object.defineProperty(Array.prototype, 'map',","{configurable: true, writable: true, value:","function(callback, thisArg) {", +"if (!this || typeof callback !== 'function') new TypeError;","var T, A, k;","var O = Object(this);","var len = O.length >>> 0;","if (arguments.length > 1) T = thisArg;","A = new Array(len);","k = 0;","while (k < len) {","if (k in O) A[k] = callback.call(T, O[k], k, O);","k++;","}","return A;","}","});","Object.defineProperty(Array.prototype, 'reduce',","{configurable: true, writable: true, value:","function(callback /*, initialValue*/) {","if (!this || typeof callback !== 'function') throw TypeError();", +"var t = Object(this), len = t.length >>> 0, k = 0, value;","if (arguments.length === 2) {","value = arguments[1];","} else {","while (k < len && !(k in t)) k++;","if (k >= len) {","throw TypeError('Reduce of empty array with no initial value');","}","value = t[k++];","}","for (; k < len; k++) {","if (k in t) value = callback(value, t[k], k, t);","}","return value;","}","});","Object.defineProperty(Array.prototype, 'reduceRight',","{configurable: true, writable: true, value:","function(callback /*, initialValue*/) {", +"if (null === this || 'undefined' === typeof this || 'function' !== typeof callback) throw TypeError();","var t = Object(this), len = t.length >>> 0, k = len - 1, value;","if (arguments.length >= 2) {","value = arguments[1];","} else {","while (k >= 0 && !(k in t)) k--;","if (k < 0) {","throw TypeError('Reduce of empty array with no initial value');","}","value = t[k--];","}","for (; k >= 0; k--) {","if (k in t) value = callback(value, t[k], k, t);","}","return value;","}","});","Object.defineProperty(Array.prototype, 'some',", +"{configurable: true, writable: true, value:","function(fun/*, thisArg*/) {","if (!this || typeof fun !== 'function') throw TypeError();","var t = Object(this);","var len = t.length >>> 0;","var thisArg = arguments.length >= 2 ? arguments[1] : void 0;","for (var i = 0; i < len; i++) {","if (i in t && fun.call(thisArg, t[i], i, t)) {","return true;","}","}","return false;","}","});","(function() {","var sort_ = Array.prototype.sort;","Array.prototype.sort = function(opt_comp) {","if (typeof opt_comp !== 'function') {", +"return sort_.call(this);","}","for (var i = 0; i < this.length; i++) {","var changes = 0;","for (var j = 0; j < this.length - i - 1; j++) {","if (opt_comp(this[j], this[j + 1]) > 0) {","var swap = this[j];","this[j] = this[j + 1];","this[j + 1] = swap;","changes++;","}","}","if (!changes) break;","}","return this;","};","})();","Object.defineProperty(Array.prototype, 'toLocaleString',","{configurable: true, writable: true, value:","function() {","var out = [];","for (var i = 0; i < this.length; i++) {", +"out[i] = (this[i] === null || this[i] === undefined) ? '' : this[i].toLocaleString();","}","return out.join(',');","}","});","")} +function Eb(a,b){var c=function(e){e=String(e);return vc(a)?(this.data=e,this):e};a.A=a.b(c,!0);a.setProperty(b,"String",a.A);a.setProperty(a.A,"fromCharCode",a.b(String.fromCharCode,!1),A);c="charAt charCodeAt concat indexOf lastIndexOf slice substr substring toLocaleLowerCase toLocaleUpperCase toLowerCase toUpperCase trim".split(" ");for(var d=0;d= 0; i--) {","str = str.substring(0, subs[i][0]) + subs[i][2] + str.substring(subs[i][0] + subs[i][1]);", +"}","} else {","var i = str.indexOf(substr);","if (i !== -1) {","var inject = newSubstr(str.substr(i, substr.length), i, str);","str = str.substring(0, i) + inject + str.substring(i + substr.length);","}","}","return str;","};","})();","")}function Fb(a,b){a.Wa=a.b(function(c){c=!!c;return vc(a)?(this.data=c,this):c},!0);a.setProperty(b,"Boolean",a.Wa)} +function Gb(a,b){var c=function(e){e=Number(e);return vc(a)?(this.data=e,this):e};a.T=a.b(c,!0);a.setProperty(b,"Number",a.T);c=["MAX_VALUE","MIN_VALUE","NaN","NEGATIVE_INFINITY","POSITIVE_INFINITY"];for(var d=0;d>>0;return b===Number(a)?b:NaN}function Tc(a){var b=a>>>0;return String(b)===String(a)&&4294967295!==b?b:NaN}function Oa(a){this.O=Object.create(null);this.R=Object.create(null);this.a=Object.create(null);this.oa=a}p=Oa.prototype;p.oa=null;p.o=!0;p.K="Object";p.data=null; +p.toString=function(){if("Array"===this.K){var a=Ja;a.push(this);try{for(var b=[],c=0;cb.charCodeAt(0)&&T(this,a,this.A)){var c=Tc(b);if(!isNaN(c)&&c>=":d>>=e;break;case ">>>=":d>>>=e;break;case "&=":d&=e;break;case "^=":d^=e;break;case "|=":d|=e;break;default:throw SyntaxError("Unknown assignment expression: "+c.operator);}if(c=Zc(this,b.ua,d))return b.ka=!0,b.Ua=d,bd(this,c,b.ua,d);a.pop();a[a.length-1].value=d}}; +u.prototype.stepBinaryExpression=function(a,b,c){if(!b.Y)return b.Y=!0,new y(c.left,b.scope);if(!b.sa)return b.sa=!0,b.$=b.value,new y(c.right,b.scope);a.pop();var d=b.$;b=b.value;switch(c.operator){case "==":c=d==b;break;case "!=":c=d!=b;break;case "===":c=d===b;break;case "!==":c=d!==b;break;case ">":c=d>b;break;case ">=":c=d>=b;break;case "<":c=d>":c=d>>b;break;case ">>>":c=d>>>b;break;case "in":b&&b.o||J(this,this.h,"'in' expects an object, not '"+b+"'");c=xc(this,b,d);break;case "instanceof":T(this,b,this.C)||J(this,this.h,"Right-hand side of instanceof is not an object");c=d.o?T(this,d,b):!1;break;default:throw SyntaxError("Unknown binary operator: "+c.operator);}a[a.length-1].value=c}; +u.prototype.stepBlockStatement=function(a,b,c){var d=b.s||0;if(c=c.body[d])return b.s=d+1,new y(c,b.scope);a.pop()};u.prototype.stepBreakStatement=function(a,b,c){$c(this,1,void 0,c.label&&c.label.name)}; +u.prototype.stepCallExpression=function(a,b,c){if(!b.ja){b.ja=1;var d=new y(c.callee,b.scope);d.ia=!0;return d}if(1===b.ja){b.ja=2;d=b.value;if(Array.isArray(d)){if(b.Z=Yc(this,d),d[0]===Ba?b.wb="eval"===d[1]:b.J=d[0],(d=b.Z)&&"object"===typeof d&&d.L)return d.L=!1,b.ja=1,ad(this,d,b.value)}else b.Z=d;b.B=[];b.s=0}d=b.Z;if(!b.Oa){0!==b.s&&b.B.push(b.value);if(c.arguments[b.s])return new y(c.arguments[b.s++],b.scope);if("NewExpression"===c.type){d.Fb&&J(this,this.h,d+" is not a constructor");var e= +d.a.prototype;if("object"!==typeof e||null===e)e=this.G;b.J=this.g(e);b.isConstructor=!0}else void 0===b.J&&(b.J=b.scope.H?void 0:this.global);b.Oa=!0}if(b.Pa)a.pop(),a[a.length-1].value=b.isConstructor&&"object"!==typeof b.value?b.J:b.value;else{b.Pa=!0;d&&d.o||J(this,this.h,d+" is not a function");if(a=d.node){c=ia(this,a.body,d.ca);for(var g=0;gg?b.B[g]:void 0);e=this.g(this.ea);for(g=0;g + + + + Blockly Demo: Asynchronous Execution with JS Interpreter + + + + + + + + + +

Blockly > + Demos > Asynchronous Execution with JS Interpreter

+ +

This is a demo of executing code asychronously (e.g., waiting for delays or user input) using the JavaScript interpreter.

+ +

More info on running code with JS Interpreter

+ +

+ +

+ +
+
+ +
+ + + + + + + + diff --git a/js/demos/interpreter/icon.png b/js/demos/interpreter/icon.png new file mode 100644 index 0000000..b70d1b0 Binary files /dev/null and b/js/demos/interpreter/icon.png differ diff --git a/js/demos/interpreter/index.html b/js/demos/interpreter/index.html new file mode 100644 index 0000000..2245057 --- /dev/null +++ b/js/demos/interpreter/index.html @@ -0,0 +1,11 @@ + + + + + Redirecting... + + + +Redirecting to step execution jsinterpreter demo. + + diff --git a/js/demos/interpreter/step-execution.html b/js/demos/interpreter/step-execution.html new file mode 100644 index 0000000..f3f4119 --- /dev/null +++ b/js/demos/interpreter/step-execution.html @@ -0,0 +1,254 @@ + + + + + Blockly Demo: Step Execution with JS Interpreter + + + + + + + + +

Blockly > + Demos > Step Execution with JS Interpreter

+ +

This is a demo of executing code step-by-step with a sandboxed JavaScript interpreter.

+ +

The generator's Blockly.JavaScript.STATEMENT_PREFIX is assigned 'highlightBlock(%1);\n', + where %1 is the block id. The call to highlightBlock() will highlight the identified block + and set the variable highlightPause to true.

+ +

"Parse JavaScript" will generate the code and load it into the interpreter. Then, each press of the + "Step JavaScript" button will run the interpreter one step until the highlightPause is true. + That is, until highlightBlock() has highlighted the block that will be executed on the next step.

+ +

More info on running code with JS Interpreter

+ +

+ +

+ +
+
+ +
+ + + + + + + + diff --git a/js/demos/interpreter/wait_block.js b/js/demos/interpreter/wait_block.js new file mode 100644 index 0000000..4f49d8a --- /dev/null +++ b/js/demos/interpreter/wait_block.js @@ -0,0 +1,64 @@ +/** + * @license + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Example "wait" block that will pause the interpreter for a + * number of seconds. Because wait is a blocking behavior, such blocks will + * only work in interpreted environments. + * + * See https://neil.fraser.name/software/JS-Interpreter/docs.html + */ +Blockly.defineBlocksWithJsonArray([{ + "type": "wait_seconds", + "message0": " wait %1 seconds", + "args0": [{ + "type": "field_number", + "name": "SECONDS", + "min": 0, + "max": 600, + "value": 1 + }], + "previousStatement": null, + "nextStatement": null, + "colour": "%{BKY_LOOPS_HUE}" +}]); + +/** + * Generator for wait block creates call to new method + * waitForSeconds(). + */ +Blockly.JavaScript['wait_seconds'] = function(block) { + var seconds = Number(block.getFieldValue('SECONDS')); + var code = 'waitForSeconds(' + seconds + ');\n'; + return code; +}; + +/** + * Register the interpreter asynchronous function + * waitForSeconds(). + */ +function initInterpreterWaitForSeconds(interpreter, scope) { + // Ensure function name does not conflict with variable names. + Blockly.JavaScript.addReservedWords('waitForSeconds'); + + var wrapper = interpreter.createAsyncFunction( + function(timeInSeconds, callback) { + // Delay the call to the callback. + setTimeout(callback, timeInSeconds * 1000); + }); + interpreter.setProperty(scope, 'waitForSeconds', wrapper); +} \ No newline at end of file diff --git a/js/demos/keyboard_nav/icon.png b/js/demos/keyboard_nav/icon.png new file mode 100644 index 0000000..ff96ab5 Binary files /dev/null and b/js/demos/keyboard_nav/icon.png differ diff --git a/js/demos/keyboard_nav/index.html b/js/demos/keyboard_nav/index.html new file mode 100644 index 0000000..b131bbe --- /dev/null +++ b/js/demos/keyboard_nav/index.html @@ -0,0 +1,577 @@ + + + + + Blockly Demo: Keyboard Navigation + + + + + + + + +

Blockly > + Demos > Keyboard Navigation

+ +

Keyboard Navigation is our first step towards an accessible Blockly.
+ You can enter accessibility mode by shift clicking anywhere on the + workspace or on a block.
Some basic commands for moving around are below. + More complete documentation is still in progress.

+ Workspace Navigation
+ W: Previous block/field/input at the same level
+ A: Up one level (Field (or input) -> Block -> Input (or field) -> Block -> + Stack -> Workspace)
+ S: Next block/field/input at the same level
+ D: Down one level (Workspace -> Stack -> Block -> Input (or field) -> Block + -> Field (or input))
+ T: Will open the toolbox. Once in there you can moving around using the WASD keys. And insert a block by hitting Enter
+ X: While on a connection hit X to disconnect the block after the cursor

+ + Pre Order Traversal
+ Feel free to just play around in accessibility mode or hit the button below to see the demo. + The demo uses preorder tree traversal + as an alternative way to navigate the blocks, + connections, and fields on the workspace.

+ + + + + Cursor
+ The cursor controls how the user navigates the blocks, inputs, fields and connections on a workspace. + This demo shows two different cursors:
+ Default Cursor: Allow the user to go to the previous, next, in or out location.
+ Basic Cursor: Using the pre order traversal allows the user to go to the next and previous location. +

+ +

+ + + + + + + + +

+ +
+
+ +
+ + + + + + + + + diff --git a/js/demos/keyboard_nav/line_cursor.js b/js/demos/keyboard_nav/line_cursor.js new file mode 100644 index 0000000..d197e8a --- /dev/null +++ b/js/demos/keyboard_nav/line_cursor.js @@ -0,0 +1,180 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview The class representing a line cursor. + * A line cursor traverses the blocks as if they were + * lines of code in a text editor. + * Previous and next go up and down lines. In and out go + * through the elements in a line. + * @author aschmiedt@google.com (Abby Schmiedt) + */ +'use strict'; + + +/** + * Class for a line cursor. + * This will allow the user to get to all nodes in the AST by hitting next or + * previous. + * @constructor + * @extends {Blockly.BasicCursor} + */ +Blockly.LineCursor = function() { + Blockly.LineCursor.superClass_.constructor.call(this); +}; +Blockly.utils.object.inherits(Blockly.LineCursor, Blockly.BasicCursor); + + +/** + * Find the next node in the pre order traversal. + * @return {Blockly.ASTNode} The next node, or null if the current node is + * not set or there is no next value. + * @override + */ +Blockly.LineCursor.prototype.next = function() { + var curNode = this.getCurNode(); + if (!curNode) { + return null; + } + var newNode = this.getNextNode_(curNode, this.validLineNode_); + + // Skip the input or next value if there is a connected block. + if (newNode && (newNode.getType() == Blockly.ASTNode.types.INPUT || + newNode.getType() == Blockly.ASTNode.types.NEXT) && + newNode.getLocation().targetBlock()) { + newNode = this.getNextNode_(newNode, this.validLineNode_); + } + if (newNode) { + this.setCurNode(newNode); + } + return newNode; +}; + +/** + * For a basic cursor we only have the ability to go next and previous, so + * in will also allow the user to get to the next node in the pre order traversal. + * @return {Blockly.ASTNode} The next node, or null if the current node is + * not set or there is no next value. + * @override + */ +Blockly.LineCursor.prototype.in = function() { + var curNode = this.getCurNode(); + if (!curNode) { + return null; + } + var newNode = this.getNextNode_(curNode, this.validInLineNode_); + + if (newNode) { + this.setCurNode(newNode); + } + return newNode; +}; + +/** + * Find the previous node in the pre order traversal. + * @return {Blockly.ASTNode} The previous node, or null if the current node + * is not set or there is no previous value. + * @override + */ +Blockly.LineCursor.prototype.prev = function() { + var curNode = this.getCurNode(); + if (!curNode) { + return null; + } + var newNode = this.getPreviousNode_(curNode, this.validLineNode_); + + if (newNode && (newNode.getType() == Blockly.ASTNode.types.INPUT || + newNode.getType() == Blockly.ASTNode.types.NEXT) && + newNode.getLocation().targetBlock()) { + newNode = this.getPreviousNode_(newNode, this.validLineNode_); + } + + if (newNode) { + this.setCurNode(newNode); + } + return newNode; +}; + +/** + * For a basic cursor we only have the ability to go next and previou, so + * out will allow the user to get to the previous node in the pre order traversal. + * @return {Blockly.ASTNode} The previous node, or null if the current node is + * not set or there is no previous value. + * @override + */ +Blockly.LineCursor.prototype.out = function() { + var curNode = this.getCurNode(); + if (!curNode) { + return null; + } + var newNode = this.getPreviousNode_(curNode, this.validInLineNode_); + + if (newNode) { + this.setCurNode(newNode); + } + return newNode; + +}; + +/** + * Meant to traverse by lines of code. This is blocks, statement inputs and + * next connections. + * @param {Blockly.ASTNode} node The AST node to check whether it is valid. + * @return {boolean} True if the node should be visited, false otherwise. + * @private + */ +Blockly.LineCursor.prototype.validLineNode_ = function(node) { + if (!node) { + return false; + } + var isValid = false; + var location = node.getLocation(); + var type = node && node.getType(); + if (type == Blockly.ASTNode.types.BLOCK) { + if (location.outputConnection === null) { + isValid = true; + } + } else if (type == Blockly.ASTNode.types.INPUT && + location.type == Blockly.NEXT_STATEMENT) { + isValid = true; + } else if (type == Blockly.ASTNode.types.NEXT) { + isValid = true; + } + return isValid; +}; + +/** + * Meant to traverse within a block. These are fields and input values. + * @param {Blockly.ASTNode} node The AST node to check whether it is valid. + * @return {boolean} True if the node should be visited, false otherwise. + * @private + */ +Blockly.LineCursor.prototype.validInLineNode_ = function(node) { + if (!node) { + return false; + } + var isValid = false; + var location = node.getLocation(); + var type = node && node.getType(); + if (type == Blockly.ASTNode.types.FIELD) { + isValid = true; + } else if (type == Blockly.ASTNode.types.INPUT && + location.type == Blockly.INPUT_VALUE) { + isValid = true; + } + return isValid; +}; diff --git a/js/demos/maxBlocks/icon.png b/js/demos/maxBlocks/icon.png new file mode 100644 index 0000000..b90c796 Binary files /dev/null and b/js/demos/maxBlocks/icon.png differ diff --git a/js/demos/maxBlocks/index.html b/js/demos/maxBlocks/index.html new file mode 100644 index 0000000..dc94f2f --- /dev/null +++ b/js/demos/maxBlocks/index.html @@ -0,0 +1,100 @@ + + + + + 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/js/demos/minimap/icon.png b/js/demos/minimap/icon.png new file mode 100644 index 0000000..870caa0 Binary files /dev/null and b/js/demos/minimap/icon.png differ diff --git a/js/demos/minimap/index.html b/js/demos/minimap/index.html new file mode 100644 index 0000000..2f4e163 --- /dev/null +++ b/js/demos/minimap/index.html @@ -0,0 +1,91 @@ + + + + + Blockly Demo: Minimap + + + + + + + +

Blockly > + Demos > Minimap

+ +

This is a simple demo showing how a minimap can be implemented.

+ + + + + + +
+
+
+
+
+ + + + + + + + diff --git a/js/demos/minimap/minimap.js b/js/demos/minimap/minimap.js new file mode 100644 index 0000000..05e00bb --- /dev/null +++ b/js/demos/minimap/minimap.js @@ -0,0 +1,312 @@ +/** + + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview JavaScript for Blockly's Minimap demo. + * @author karnpurohit@gmail.com (Karan Purohit) + */ +'use strict'; + +/** + * Creating a separate namespace for minimap. + */ +var Minimap = {}; + +/** + * Initialize the workspace and minimap. + * @param {!Workspace} workspace The main workspace of the user. + * @param {!Workspace} minimap The workspace that will be used as a minimap. + */ +Minimap.init = function(workspace, minimap) { + this.workspace = workspace; + this.minimap = minimap; + + // Adding scroll callback functionality to vScroll and hScroll just for this demo. + // IMPORTANT: This should be changed when there is proper UI event handling + // API available and should be handled by workspace's event listeners. + this.workspace.scrollbar.vScroll.setHandlePosition = function(newPosition) { + this.handlePosition_ = newPosition; + this.svgHandle_.setAttribute(this.positionAttribute_, this.handlePosition_); + + // Code above is same as the original setHandlePosition function in core/scrollbar.js. + // New code starts from here. + + // Get the absolutePosition. + var absolutePosition = (this.handlePosition_ / this.ratio_); + + // Firing the scroll change listener. + Minimap.onScrollChange(absolutePosition, this.horizontal_); + }; + + // Adding call back for horizontal scroll. + this.workspace.scrollbar.hScroll.setHandlePosition = function(newPosition) { + this.handlePosition_ = newPosition; + this.svgHandle_.setAttribute(this.positionAttribute_, this.handlePosition_); + + // Code above is same as the original setHandlePosition function in core/scrollbar.js. + // New code starts from here. + + // Get the absolutePosition. + var absolutePosition = (this.handlePosition_ / this.ratio_); + + // Firing the scroll change listener. + Minimap.onScrollChange(absolutePosition, this.horizontal_); + }; + + + // Required to stop a positive feedback loop when user clicks minimap + // and the scroll changes, which in turn may change minimap. + this.disableScrollChange = false; + + // Listen to events on the main workspace. + this.workspace.addChangeListener(Minimap.mirrorEvent); + + //Get rectangle bounding the minimap div. + this.rect = document.getElementById('mapDiv').getBoundingClientRect(); + + // Create a svg overlay on the top of mapDiv for the minimap. + this.svg = Blockly.utils.dom.createSvgElement('svg', { + 'xmlns': Blockly.utils.dom.SVG_NS, + 'xmlns:html': Blockly.utils.dom.HTML_NS, + 'xmlns:xlink': Blockly.utils.dom.XLINK_NS, + 'version': '1.1', + 'height': this.rect.bottom-this.rect.top, + 'width': this.rect.right-this.rect.left, + 'class': 'minimap', + }, document.getElementById('mapDiv')); + this.svg.style.top = this.rect.top + 'px'; + this.svg.style.left = this.rect.left + 'px'; + + // Creating a rectangle in the minimap that represents current view. + Blockly.utils.dom.createSvgElement('rect', { + 'width': 100, + 'height': 100, + 'class': 'mapDragger' + }, this.svg); + + // Rectangle in the minimap that represents current view. + this.mapDragger = this.svg.childNodes[0]; + + // Adding mouse events to the rectangle, to make it Draggable. + // Using Blockly.bindEvent_ to attach mouse/touch listeners. + Blockly.bindEvent_(this.mapDragger, 'mousedown', null, Minimap.mousedown); + + //When the window change, we need to resize the minimap window. + window.addEventListener('resize', Minimap.repositionMinimap); + + // Mouse up event for the minimap. + this.svg.addEventListener('mouseup', Minimap.updateMapDragger); + + //Boolean to check whether I am dragging the surface or not. + this.isDragging = false; +}; + +Minimap.mousedown = function(e) { + // Using Blockly.bindEvent_ to attach mouse/touch listeners. + Minimap.mouseMoveBindData = + Blockly.bindEvent_(document, 'mousemove', null, Minimap.mousemove); + Minimap.mouseUpBindData = + Blockly.bindEvent_(document, 'mouseup', null, Minimap.mouseup); + + Minimap.isDragging = true; + e.stopPropagation(); +}; + +Minimap.mouseup = function(e) { + Minimap.isDragging = false; + // Removing listeners. + Blockly.unbindEvent_(Minimap.mouseUpBindData); + Blockly.unbindEvent_(Minimap.mouseMoveBindData); + Minimap.updateMapDragger(e); + e.stopPropagation(); +}; + +Minimap.mousemove = function(e) { + if (Minimap.isDragging) { + Minimap.updateMapDragger(e); + e.stopPropagation(); + } +}; + +/** + * Run non-UI events from the main workspace on the minimap. + * @param {!Event} event Event that triggered in the main workspace. + */ +Minimap.mirrorEvent = function(event) { + if (event.type == Blockly.Events.UI) { + return; // Don't mirror UI events. + } + // Convert event to JSON. This could then be transmitted across the net. + var json = event.toJson(); + // Convert JSON back into an event, then execute it. + var minimapEvent = Blockly.Events.fromJson(json, Minimap.minimap); + minimapEvent.run(true); + Minimap.scaleMinimap(); + Minimap.setDraggerHeight(); + Minimap.setDraggerWidth(); +}; + +/** + * Called when window is resized. Repositions the minimap overlay. + */ +Minimap.repositionMinimap = function() { + Minimap.rect = document.getElementById('mapDiv').getBoundingClientRect(); + Minimap.svg.style.top = Minimap.rect.top + 'px'; + Minimap.svg.style.left = Minimap.rect.left + 'px'; +}; + +/** + * Updates the rectangle's height. + */ +Minimap.setDraggerHeight = function() { + var workspaceMetrics = Minimap.workspace.getMetrics(); + var draggerHeight = (workspaceMetrics.viewHeight / Minimap.workspace.scale) * + Minimap.minimap.scale; + // It's zero when first block is placed. + if (draggerHeight == 0) { + return; + } + Minimap.mapDragger.setAttribute('height', draggerHeight); +}; + +/** + * Updates the rectangle's width. + */ +Minimap.setDraggerWidth = function() { + var workspaceMetrics = Minimap.workspace.getMetrics(); + var draggerWidth = (workspaceMetrics.viewWidth / Minimap.workspace.scale) * + Minimap.minimap.scale; + // It's zero when first block is placed. + if (draggerWidth == 0) { + return; + } + Minimap.mapDragger.setAttribute('width', draggerWidth); +}; + + +/** + * Updates the overall position of the viewport of the minimap by appropriately + * using translate functions. + */ +Minimap.scaleMinimap = function() { + var minimapBoundingBox = Minimap.minimap.getBlocksBoundingBox(); + var workspaceBoundingBox = Minimap.workspace.getBlocksBoundingBox(); + var workspaceMetrics = Minimap.workspace.getMetrics(); + var minimapMetrics = Minimap.minimap.getMetrics(); + + // Scaling the mimimap such that all the blocks can be seen in the viewport. + // This padding is default because this is how to scrollbar(in main workspace) + // is implemented. + var topPadding = (workspaceMetrics.viewHeight) * Minimap.minimap.scale / + (2 * Minimap.workspace.scale); + var sidePadding = (workspaceMetrics.viewWidth) * Minimap.minimap.scale / + (2 * Minimap.workspace.scale); + + // If actual padding is more than half view ports height, + // change it to actual padding. + if ((workspaceBoundingBox.y * Minimap.workspace.scale - + workspaceMetrics.contentTop) * + Minimap.minimap.scale / Minimap.workspace.scale > topPadding) { + topPadding = (workspaceBoundingBox.y * Minimap.workspace.scale - + workspaceMetrics.contentTop) * + Minimap.minimap.scale / Minimap.workspace.scale; + } + + // If actual padding is more than half view ports height, + // change it to actual padding. + if ((workspaceBoundingBox.x * Minimap.workspace.scale - + workspaceMetrics.contentLeft) * + Minimap.minimap.scale / Minimap.workspace.scale > sidePadding) { + sidePadding = (workspaceBoundingBox.x * Minimap.workspace.scale - + workspaceMetrics.contentLeft) * + Minimap.minimap.scale / Minimap.workspace.scale; + } + + var scalex = (minimapMetrics.viewWidth - 2 * sidePadding) / + minimapBoundingBox.width; + var scaley = (minimapMetrics.viewHeight - 2 * topPadding) / + minimapBoundingBox.height; + Minimap.minimap.setScale(Math.min(scalex, scaley)); + + // Translating the minimap. + Minimap.minimap.translate( + -minimapMetrics.contentLeft * Minimap.minimap.scale + sidePadding, + -minimapMetrics.contentTop * Minimap.minimap.scale + topPadding); +}; + +/** + * Handles the onclick event on the minimapBoundingBox. + * Changes mapDraggers position. + * @param {!Event} e Event from the mouse click. + */ +Minimap.updateMapDragger = function(e) { + var y = e.clientY; + var x = e.clientX; + var draggerHeight = Minimap.mapDragger.getAttribute('height'); + var draggerWidth = Minimap.mapDragger.getAttribute('width'); + + var finalY = y - Minimap.rect.top - draggerHeight / 2; + var finalX = x - Minimap.rect.left - draggerWidth / 2; + + var maxValidY = (Minimap.workspace.getMetrics().contentHeight - + Minimap.workspace.getMetrics().viewHeight) * Minimap.minimap.scale; + var maxValidX = (Minimap.workspace.getMetrics().contentWidth - + Minimap.workspace.getMetrics().viewWidth) * Minimap.minimap.scale; + + if (y + draggerHeight / 2 > Minimap.rect.bottom) { + finalY = Minimap.rect.bottom - Minimap.rect.top - draggerHeight; + } else if (y < Minimap.rect.top + draggerHeight / 2) { + finalY = 0; + } + + if (x + draggerWidth / 2 > Minimap.rect.right) { + finalX = Minimap.rect.right - Minimap.rect.left - draggerWidth; + } else if (x < Minimap.rect.left + draggerWidth / 2) { + finalX = 0; + } + + // Do not go below lower bound of scrollbar. + if (finalY > maxValidY) { + finalY = maxValidY; + } + if (finalX > maxValidX) { + finalX = maxValidX; + } + Minimap.mapDragger.setAttribute('y', finalY); + Minimap.mapDragger.setAttribute('x', finalX); + // Required, otherwise creates a feedback loop. + Minimap.disableScrollChange = true; + Minimap.workspace.scrollbar.vScroll.set((finalY * Minimap.workspace.scale) / + Minimap.minimap.scale); + Minimap.workspace.scrollbar.hScroll.set((finalX * Minimap.workspace.scale) / + Minimap.minimap.scale); + Minimap.disableScrollChange = false; +}; + +/** + * Handles the onclick event on the minimapBoundingBox, parameters are passed by + * the event handler. + * @param {number} position This is the absolute position of the scrollbar. + * @param {boolean} horizontal Informs if the change event if for + * horizontal (true) or vertical (false) scrollbar. + */ +Minimap.onScrollChange = function(position, horizontal) { + if (!Minimap.disableScrollChange) { + Minimap.mapDragger.setAttribute(horizontal ? 'x' : 'y', + position * Minimap.minimap.scale / Minimap.workspace.scale); + } +}; diff --git a/js/demos/mirror/icon.png b/js/demos/mirror/icon.png new file mode 100644 index 0000000..45e2a9a Binary files /dev/null and b/js/demos/mirror/icon.png differ diff --git a/js/demos/mirror/index.html b/js/demos/mirror/index.html new file mode 100644 index 0000000..84762f3 --- /dev/null +++ b/js/demos/mirror/index.html @@ -0,0 +1,81 @@ + + + + + Blockly Demo: Mirrored Blockly + + + + + + +

Blockly > + Demos > Mirrored Blockly

+ +

This is a simple demo of a primary Blockly instance that controls a secondary Blockly instance with events. + Open the JavaScript console to see the event passing.

+ +

→ More info on events

+ + + + + + +
+
+
+
+
+ + + + + + + diff --git a/js/demos/mobile/README.md b/js/demos/mobile/README.md new file mode 100644 index 0000000..bab0960 --- /dev/null +++ b/js/demos/mobile/README.md @@ -0,0 +1,53 @@ +# Blockly on Mobile Devices + +This directory contains three examples of running the Blockly library on mobile +devices. The `html/` directory is a example of configuring a webpage for touch +devices, with a Blockly workspace that fills the screen. + +The `mobile/html/` is also the basis for the Android and iOS demos. Each native +app copies this demo into the app's local resources, and required Blockly +library files, and hosts them in an embedded WebView. + +Thus, developers can quickly iterate within the `mobile/html/` directory, and +see changes in both the Android and iOS native apps. + +## Running the Mobile HTML Demo + +Before running the mobile HTML demo, you need to create some symbolic links +in your local file system. Run the `mobile/html/ln_resources.sh` file from +the `mobile/html/` directory. This mimicks the relative locations of the +Blockly files seen when loading the page in a native app's embedded WebView. + +After doing this, opening `mobile/html/index.html` should open normally, +filling the page with one large Blockly workspace. + +## The Android App + +### Build and Run + +Open the `demos/mobile/android/` directory in Android Studio. The project +files in the directory should be ready to build and run the demo in an emulator +or connected device. + +### Android Copy Tasks + +If you edit the `mobile/html/` demo to include new files, you will need to +update the native app project files to also copy those files. + +In the Android project, two Gradle tasks are responsible for the copies. +In `mobile/android/app/build.gradle`, the tasks `copyBlocklyHtmlFile` and +`copyBlocklyMoreFiles` configure the copy actions. + +## The iOS App + +### Build and Run + +Open the `demos/mobile/iOS/` directory in XCode. The project files in the +directory should be ready to build and run the demo in a simulator or connected +device. + +### iOS Copy Script + +The XCode project call out to `mobile/ios/cp_resources.sh` to copy the required +HTML and related files. If you've edited the `mobile/html/` demo to require new +files, update this script to copy these files, too. diff --git a/js/demos/mobile/android/.gitignore b/js/demos/mobile/android/.gitignore new file mode 100644 index 0000000..3ba2b2b --- /dev/null +++ b/js/demos/mobile/android/.gitignore @@ -0,0 +1,27 @@ +/build +/captures +/app/src/main/assets/blockly +.settings +.project + +# Local Settings +local.properties + +# Project files +*.komodoproject +.gradle +*.iml +.idea + +# Build files +*.pyc +*.apk +*.ap_ +*.class +*.dex + +# OSX Files +.DS_Store + +# Windows Files +Thumb.db diff --git a/js/demos/mobile/android/README.md b/js/demos/mobile/android/README.md new file mode 100644 index 0000000..31f968f --- /dev/null +++ b/js/demos/mobile/android/README.md @@ -0,0 +1,45 @@ +# Blockly in an Android WebView + +This code demonstrates how to get Blockly running in an Android app by +embedding it in a WebView. + +### BlocklyWebViewFragment + +Most of the work is done within the fragment class `BlocklyWebViewFragment`. +This fragment instantiates the WebView, loads the HTML +(`assets/blockly/webview.html`, copied from `demos/mobile/html/index.html`), +and provides a few helper methods. + +### Copying web assets with gradle + +This android project copies the necessary files from the main Blockly +repository (i.e., parent directory). In `app/build.gradle`, note the +`copyBlocklyHtmlFile` and `copyBlocklyMoreFiles` tasks. + +In your own project, the HTML and related files can be placed directly in the +`assets/blockly` directory without the copy step. However, using the copy tasks +simplifies the synchronization with an iOS app using the same files. + +### Loading Block Definitions and Generator functions + +The `webview.html` loads the block definitions and generator functions directly +into the page, without support or coordination with the Android classes. This +assumes the app will always utilize the same blocks. This does not mean all +blocks are visible to the user all the time; that is controlled by the toolbox +and workspace files. This should accommodate almost all applications. + +This does mean loading your own block definitions and generators will involve +editing the HTML, adding you own ` + + + + + + +
+ + + \ No newline at end of file diff --git a/js/demos/mobile/html/ln_resources.sh b/js/demos/mobile/html/ln_resources.sh new file mode 100644 index 0000000..c4c3b60 --- /dev/null +++ b/js/demos/mobile/html/ln_resources.sh @@ -0,0 +1,22 @@ +#!/bin/bash -e +# +# Create symbolic links in this directory for the +# Blockly library files used by this demo's index.html. + +if [[ ! -e ../../../blockly_compressed.js ]]; then + echo "ERROR: Could not locate blockly_compressed.js. Run from demos/mobile/html/" 1>&2 + exit 1 # terminate and indicate error +fi + +if [ ! -L blockly_compressed.js ]; then + ln -s ../../../blockly_compressed.js blockly_compressed.js +fi +if [ ! -L blocks_compressed.js ]; then + ln -s ../../../blocks_compressed.js blocks_compressed.js +fi +if [ ! -L media ]; then + ln -s ../../../media media +fi +if [ ! -L msg ]; then + ln -s ../../../msg msg +fi diff --git a/js/demos/mobile/html/toolbox_standard.js b/js/demos/mobile/html/toolbox_standard.js new file mode 100644 index 0000000..2032688 --- /dev/null +++ b/js/demos/mobile/html/toolbox_standard.js @@ -0,0 +1,333 @@ + +var BLOCKLY_TOOLBOX_XML = BLOCKLY_TOOLBOX_XML || Object.create(null); + +/* BEGINNING BLOCKLY_TOOLBOX_XML ASSIGNMENT. DO NOT EDIT. USE BLOCKLY DEVTOOLS. */ +BLOCKLY_TOOLBOX_XML['standard'] = +// From XML string/file, replace ^\s?(\s*)?(<.*>)$ with \+$1'$2' +// Tweak first and last line. +'' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '10' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '1' ++ '' ++ '' ++ '' ++ '' ++ '10' ++ '' ++ '' ++ '' ++ '' ++ '1' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '123' ++ '' ++ '' ++ '' ++ '' ++ '1' ++ '' ++ '' ++ '' ++ '' ++ '1' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '9' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '45' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '0' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '3.1' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '64' ++ '' ++ '' ++ '' ++ '' ++ '10' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '50' ++ '' ++ '' ++ '' ++ '' ++ '1' ++ '' ++ '' ++ '' ++ '' ++ '100' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '1' ++ '' ++ '' ++ '' ++ '' ++ '100' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ 'abc' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ 'text' ++ '' ++ '' ++ '' ++ '' ++ 'abc' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ 'text' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ 'text' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ 'abc' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ 'abc' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ 'abc' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ 'abc' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '5' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ 'list' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ 'list' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ 'list' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ 'list' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ ',' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '100' ++ '' ++ '' ++ '' ++ '' ++ '50' ++ '' ++ '' ++ '' ++ '' ++ '0' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '#ff0000' ++ '' ++ '' ++ '' ++ '' ++ '#3333ff' ++ '' ++ '' ++ '' ++ '' ++ '0.5' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ ''; +/* END BLOCKLY_TOOLBOX_XML ASSIGNMENT. DO NOT EDIT. */ diff --git a/js/demos/mobile/ios/.gitignore b/js/demos/mobile/ios/.gitignore new file mode 100644 index 0000000..6c1f837 --- /dev/null +++ b/js/demos/mobile/ios/.gitignore @@ -0,0 +1,25 @@ +# Files copied by cp_resources.sh +/Resources/Non-Localized/Blockly + + +# Xcode.gitignore + +## User settings +xcuserdata/ + +## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) +*.xcscmblueprint +*.xccheckout + +## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) +build/ +DerivedData/ +*.moved-aside +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 diff --git a/js/demos/mobile/ios/Blockly WebView.xcodeproj/project.pbxproj b/js/demos/mobile/ios/Blockly WebView.xcodeproj/project.pbxproj new file mode 100644 index 0000000..a3f72fc --- /dev/null +++ b/js/demos/mobile/ios/Blockly WebView.xcodeproj/project.pbxproj @@ -0,0 +1,390 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + AB036C55211B89D600CCC9D8 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB036C54211B89D600CCC9D8 /* WebKit.framework */; }; + AB980111211A37B50025AFF2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB980110211A37B50025AFF2 /* AppDelegate.swift */; }; + AB980113211A37B50025AFF2 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB980112211A37B50025AFF2 /* ViewController.swift */; }; + AB980116211A37B50025AFF2 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AB980114211A37B50025AFF2 /* Main.storyboard */; }; + AB980118211A37B70025AFF2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AB980117211A37B70025AFF2 /* Assets.xcassets */; }; + AB98011B211A37B70025AFF2 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AB980119211A37B70025AFF2 /* LaunchScreen.storyboard */; }; + ABA1B7FC212214E7000D3CC5 /* Blockly in Resources */ = {isa = PBXBuildFile; fileRef = ABA1B7FB212214E7000D3CC5 /* Blockly */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + AB036C54211B89D600CCC9D8 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; + AB98010D211A37B50025AFF2 /* Blockly WebView.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Blockly WebView.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + AB980110211A37B50025AFF2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + AB980112211A37B50025AFF2 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + AB980115211A37B50025AFF2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + AB980117211A37B70025AFF2 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + AB98011A211A37B70025AFF2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + AB98011C211A37B70025AFF2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + ABA1B7FB212214E7000D3CC5 /* Blockly */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Blockly; path = "Resources/Non-Localized/Blockly"; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + AB98010A211A37B50025AFF2 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + AB036C55211B89D600CCC9D8 /* WebKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + AB036C53211B89D500CCC9D8 /* Frameworks */ = { + isa = PBXGroup; + children = ( + AB036C54211B89D600CCC9D8 /* WebKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + AB980104211A37B50025AFF2 = { + isa = PBXGroup; + children = ( + AB98010F211A37B50025AFF2 /* Blockly WebView */, + AB98010E211A37B50025AFF2 /* Products */, + AB036C53211B89D500CCC9D8 /* Frameworks */, + ); + sourceTree = ""; + }; + AB98010E211A37B50025AFF2 /* Products */ = { + isa = PBXGroup; + children = ( + AB98010D211A37B50025AFF2 /* Blockly WebView.app */, + ); + name = Products; + sourceTree = ""; + }; + AB98010F211A37B50025AFF2 /* Blockly WebView */ = { + isa = PBXGroup; + children = ( + ABA1B7F9212214B9000D3CC5 /* Resources */, + AB980110211A37B50025AFF2 /* AppDelegate.swift */, + AB980112211A37B50025AFF2 /* ViewController.swift */, + AB980114211A37B50025AFF2 /* Main.storyboard */, + AB980117211A37B70025AFF2 /* Assets.xcassets */, + AB980119211A37B70025AFF2 /* LaunchScreen.storyboard */, + AB98011C211A37B70025AFF2 /* Info.plist */, + ); + path = "Blockly WebView"; + sourceTree = ""; + }; + ABA1B7F9212214B9000D3CC5 /* Resources */ = { + isa = PBXGroup; + children = ( + ABA1B7FA212214C6000D3CC5 /* Non-Localized */, + ); + path = Resources; + sourceTree = ""; + }; + ABA1B7FA212214C6000D3CC5 /* Non-Localized */ = { + isa = PBXGroup; + children = ( + ABA1B7FB212214E7000D3CC5 /* Blockly */, + ); + path = "Non-Localized"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + AB98010C211A37B50025AFF2 /* Blockly WebView */ = { + isa = PBXNativeTarget; + buildConfigurationList = AB98011F211A37B70025AFF2 /* Build configuration list for PBXNativeTarget "Blockly WebView" */; + buildPhases = ( + AB980109211A37B50025AFF2 /* Sources */, + AB98010A211A37B50025AFF2 /* Frameworks */, + ABEDABD1212372E700A66667 /* ShellScript */, + AB98010B211A37B50025AFF2 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Blockly WebView"; + productName = "Blockly WebView"; + productReference = AB98010D211A37B50025AFF2 /* Blockly WebView.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + AB980105211A37B50025AFF2 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0940; + LastUpgradeCheck = 0940; + ORGANIZATIONNAME = Google; + TargetAttributes = { + AB98010C211A37B50025AFF2 = { + CreatedOnToolsVersion = 9.4.1; + }; + }; + }; + buildConfigurationList = AB980108211A37B50025AFF2 /* Build configuration list for PBXProject "Blockly WebView" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = AB980104211A37B50025AFF2; + productRefGroup = AB98010E211A37B50025AFF2 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + AB98010C211A37B50025AFF2 /* Blockly WebView */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + AB98010B211A37B50025AFF2 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AB98011B211A37B70025AFF2 /* LaunchScreen.storyboard in Resources */, + AB980118211A37B70025AFF2 /* Assets.xcassets in Resources */, + AB980116211A37B50025AFF2 /* Main.storyboard in Resources */, + ABA1B7FC212214E7000D3CC5 /* Blockly in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + ABEDABD1212372E700A66667 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = ./cp_resources.sh; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + AB980109211A37B50025AFF2 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AB980113211A37B50025AFF2 /* ViewController.swift in Sources */, + AB980111211A37B50025AFF2 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + AB980114211A37B50025AFF2 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + AB980115211A37B50025AFF2 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + AB980119211A37B70025AFF2 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + AB98011A211A37B70025AFF2 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + AB98011D211A37B70025AFF2 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.4; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + AB98011E211A37B70025AFF2 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.4; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + AB980120211A37B70025AFF2 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 3KZF7Q7Q49; + INFOPLIST_FILE = "Blockly WebView/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.google.kidscoding.Blockly-WebView"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + AB980121211A37B70025AFF2 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 3KZF7Q7Q49; + INFOPLIST_FILE = "Blockly WebView/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.google.kidscoding.Blockly-WebView"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + AB980108211A37B50025AFF2 /* Build configuration list for PBXProject "Blockly WebView" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AB98011D211A37B70025AFF2 /* Debug */, + AB98011E211A37B70025AFF2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + AB98011F211A37B70025AFF2 /* Build configuration list for PBXNativeTarget "Blockly WebView" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AB980120211A37B70025AFF2 /* Debug */, + AB980121211A37B70025AFF2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = AB980105211A37B50025AFF2 /* Project object */; +} diff --git a/js/demos/mobile/ios/Blockly WebView.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/js/demos/mobile/ios/Blockly WebView.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..2a4f4ae --- /dev/null +++ b/js/demos/mobile/ios/Blockly WebView.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/js/demos/mobile/ios/Blockly WebView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/js/demos/mobile/ios/Blockly WebView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/js/demos/mobile/ios/Blockly WebView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/js/demos/mobile/ios/Blockly WebView/AppDelegate.swift b/js/demos/mobile/ios/Blockly WebView/AppDelegate.swift new file mode 100644 index 0000000..1f2bf6e --- /dev/null +++ b/js/demos/mobile/ios/Blockly WebView/AppDelegate.swift @@ -0,0 +1,46 @@ +// +// AppDelegate.swift +// Blockly WebView +// +// Created by Andrew Marshall on 8/7/18. +// Copyright © 2018 Google. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/js/demos/mobile/ios/Blockly WebView/Assets.xcassets/AppIcon.appiconset/Contents.json b/js/demos/mobile/ios/Blockly WebView/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d8db8d6 --- /dev/null +++ b/js/demos/mobile/ios/Blockly WebView/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/js/demos/mobile/ios/Blockly WebView/Assets.xcassets/Contents.json b/js/demos/mobile/ios/Blockly WebView/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/js/demos/mobile/ios/Blockly WebView/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/js/demos/mobile/ios/Blockly WebView/Base.lproj/LaunchScreen.storyboard b/js/demos/mobile/ios/Blockly WebView/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f83f6fd --- /dev/null +++ b/js/demos/mobile/ios/Blockly WebView/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/js/demos/mobile/ios/Blockly WebView/Base.lproj/Main.storyboard b/js/demos/mobile/ios/Blockly WebView/Base.lproj/Main.storyboard new file mode 100644 index 0000000..35c8fdd --- /dev/null +++ b/js/demos/mobile/ios/Blockly WebView/Base.lproj/Main.storyboard @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/js/demos/mobile/ios/Blockly WebView/Info.plist b/js/demos/mobile/ios/Blockly WebView/Info.plist new file mode 100644 index 0000000..16be3b6 --- /dev/null +++ b/js/demos/mobile/ios/Blockly WebView/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/js/demos/mobile/ios/Blockly WebView/ViewController.swift b/js/demos/mobile/ios/Blockly WebView/ViewController.swift new file mode 100644 index 0000000..f8ad801 --- /dev/null +++ b/js/demos/mobile/ios/Blockly WebView/ViewController.swift @@ -0,0 +1,111 @@ +// ViewController.swift +// Blockly WebView UI controller. +// +// Created by Andrew Marshall on 8/7/18. +// Copyright © 2018 Google. All rights reserved. +// + +import UIKit +import WebKit + + +/// A basic ViewController for a WebView. +/// It handles the initial page load, and functions like window.prompt(). +class ViewController: UIViewController, WKUIDelegate { + /// The name used to reference this iOS object when executing callbacks from the JS code. + /// If this value is changed, it should also be changed in the `CODE_GENERATOR_BRIDGE_JS` file. + fileprivate static let HOST_HTML = "Blockly/webview.html" + + @IBOutlet weak var webView: WKWebView! + + /// Additional setup after loading the UI NIB. + override func viewDidLoad() { + super.viewDidLoad() + webView.uiDelegate = self + // Do any additional setup after loading the view, typically from a nib. + loadWebContent() + } + + /// Load the root HTML page into the webview. + func loadWebContent() { + if let htmlUrl = Bundle.main.url(forResource: "webview", withExtension: "html", + subdirectory: "Blockly") { + webView.load(URLRequest.init(url: htmlUrl)) + } else { + NSLog("Failed to load HTML. Could not find resource.") + } + } + + /// Handle window.alert() with a native dialog. + func webView(_ webView: WKWebView, + runJavaScriptAlertPanelWithMessage message: String, + initiatedByFrame frame: WKFrameInfo, + completionHandler: @escaping () -> Void) { + + let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert) + let title = NSLocalizedString("OK", comment: "OK Button") + let ok = UIAlertAction(title: title, style: .default) { (action: UIAlertAction) -> Void in + alert.dismiss(animated: true, completion: nil) + } + alert.addAction(ok) + present(alert, animated: true) + completionHandler() + } + + /// Handle window.confirm() with a native dialog. + func webView(_ webView: WKWebView, + runJavaScriptConfirmPanelWithMessage message: String, + initiatedByFrame frame: WKFrameInfo, + completionHandler: @escaping (Bool) -> Void) { + + let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert) + let closeAndHandle = { (okayed: Bool) in + alert.dismiss(animated: true, completion: nil) + completionHandler(okayed) + } + + let okTitle = NSLocalizedString("OK", comment: "OK button title") + let ok = UIAlertAction(title: okTitle, style: .default) { (action: UIAlertAction) -> Void in + closeAndHandle(true) + } + alert.addAction(ok) + + let cancelTitle = NSLocalizedString("Cancel", comment: "Cancel button title") + let cancel = UIAlertAction(title: cancelTitle, style: .default) { + (action: UIAlertAction) -> Void in + closeAndHandle(false) + } + alert.addAction(cancel) + present(alert, animated: true) + } + + /// Handle window.prompt() with a native dialog. + func webView(_ webView: WKWebView, + runJavaScriptTextInputPanelWithPrompt prompt: String, + defaultText: String?, + initiatedByFrame frame: WKFrameInfo, + completionHandler: @escaping (String?) -> Void) { + + let alert = UIAlertController(title: prompt, message: nil, preferredStyle: .alert) + + alert.addTextField { (textField) in + textField.text = defaultText + } + + let okTitle = NSLocalizedString("OK", comment: "OK button title") + let okAction = UIAlertAction(title: okTitle, style: .default) { (_) in + let textInput = alert.textFields![0] as UITextField + completionHandler(textInput.text) + } + alert.addAction(okAction) + + let cancelTitle = NSLocalizedString("Cancel", comment: "Cancel button title") + let cancelAction = UIAlertAction(title: cancelTitle, style: .cancel) { (_) in + completionHandler(nil) + } + alert.addAction(cancelAction) + + present(alert, animated: true) + } +} + diff --git a/js/demos/mobile/ios/cp_resources.sh b/js/demos/mobile/ios/cp_resources.sh new file mode 100644 index 0000000..050ee90 --- /dev/null +++ b/js/demos/mobile/ios/cp_resources.sh @@ -0,0 +1,21 @@ +#!/bin/bash +set -eux + +BLOCKLY_ROOT=../../.. +IOS_RESOURCES=Resources/Non-Localized/Blockly + +MORE_FILES_TO_COPY=( + "blockly_compressed.js" + "blocks_compressed.js" + "media" + "msg/js" + ) + +mkdir -p $IOS_RESOURCES/media +mkdir -p $IOS_RESOURCES/msg/js +rsync -rp ../html/index.html $IOS_RESOURCES/webview.html +rsync -rp ../html/toolbox_standard.js $IOS_RESOURCES/toolbox_standard.js +for i in "${MORE_FILES_TO_COPY[@]}"; do # The quotes are necessary here + TARGET_DIR=$(dirname $IOS_RESOURCES/$i) + rsync -rp $BLOCKLY_ROOT/$i $TARGET_DIR +done diff --git a/js/demos/plane/README.txt b/js/demos/plane/README.txt new file mode 100644 index 0000000..944448f --- /dev/null +++ b/js/demos/plane/README.txt @@ -0,0 +1,26 @@ +This Blockly demo uses Closure Templates to create a multilingual application. +Any changes to the template.soy file require a recompile. Here is the command +to generate a quick English version for debugging: + +java -jar soy/SoyToJsSrcCompiler.jar --outputPathFormat generated/en.js --srcs template.soy + +To generate a full set of language translations, first extract all the strings +from template.soy using this command: + +java -jar soy/SoyMsgExtractor.jar --outputFile xlf/extracted_msgs.xlf template.soy + +This generates xlf/extracted_msgs.xlf, which may then be used by any +XLIFF-compatible translation console to generate a set of files with the +translated strings. These should be placed in the xlf directory. + +Finally, generate all the language versions with this command: + +java -jar soy/SoyToJsSrcCompiler.jar --locales ar,be-tarask,br,ca,da,de,el,en,es,fa,fr,he,hrx,hu,ia,is,it,ja,ko,ms,nb,nl,pl,pms,pt-br,ro,ru,sc,sv,th,tr,uk,vi,zh-hans,zh-hant --messageFilePathFormat xlf/translated_msgs_{LOCALE}.xlf --outputPathFormat "generated/{LOCALE}.js" template.soy + +This is the process that Google uses for maintaining Blockly Games in 50+ +languages. The XLIFF format is simple enough that it is trivial to write a +Python script to reformat it into some other format (such as JSON) for +compatibility with other translation consoles. + +For more information, see message translation for Closure Templates: +https://developers.google.com/closure/templates/docs/translation diff --git a/js/demos/plane/blocks.js b/js/demos/plane/blocks.js new file mode 100644 index 0000000..33c66c7 --- /dev/null +++ b/js/demos/plane/blocks.js @@ -0,0 +1,101 @@ +/** + * @license + * Copyright 2013 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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/js/demos/plane/generated/ar.js b/js/demos/plane/generated/ar.js new file mode 100644 index 0000000..ac760fb --- /dev/null +++ b/js/demos/plane/generated/ar.js @@ -0,0 +1,50 @@ +// This file was automatically generated from template.soy. +// Please don't edit this file by hand. + +/** + * @fileoverview Templates in namespace planepage. + */ + +if (typeof planepage == 'undefined') { var planepage = {}; } + + +planepage.messages = function(opt_data, opt_ignored, opt_ijData) { + return '
\u0627\u0644\u0635\u0641\u0648\u0641: %1\u0627\u0644\u0635\u0641\u0648\u0641 (%1)\u0635\u0641\u0648\u0641 \u0627\u0644\u0637\u0628\u0642\u0629 \u0627\u0644\u0623\u0648\u0644\u0649: %1\u0635\u0641\u0648\u0641 \u0627\u0644\u0637\u0628\u0642\u0629 \u0627\u0644\u0623\u0648\u0644\u0649 (%1)\u0635\u0641\u0648\u0641 \u0627\u0644\u0641\u0626\u0629 \u0627\u0644\u062B\u0627\u0646\u064A\u0629: %1\u0635\u0641\u0648\u0641 \u0627\u0644\u0641\u0626\u0629 \u0627\u0644\u062B\u0627\u0646\u064A\u0629: (%1)\u0627\u0644\u0645\u0642\u0627\u0639\u062F: %1\u061F\u0627\u0644\u0645\u0642\u0627\u0639\u062F =
'; +}; +if (goog.DEBUG) { + planepage.messages.soyTemplateName = 'planepage.messages'; +} + + +planepage.start = function(opt_data, opt_ignored, opt_ijData) { + var output = planepage.messages(null, null, opt_ijData) + '

Blockly‏ > Demos‏ > \u0622\u0644\u0629 \u062D\u0627\u0633\u0628\u0629 \u0644\u0645\u0642\u0639\u062F \u0627\u0644\u0637\u0627\u0626\u0631\u0629   '; + var iLimit47 = opt_ijData.maxLevel + 1; + for (var i47 = 1; i47 < iLimit47; i47++) { + output += ' ' + ((i47 == opt_ijData.level) ? '' + soy.$$escapeHtml(i47) + '' : (i47 < opt_ijData.level) ? '' : '' + soy.$$escapeHtml(i47) + ''); + } + output += '

+ + + + + + diff --git a/js/demos/plane/plane.js b/js/demos/plane/plane.js new file mode 100644 index 0000000..182de9e --- /dev/null +++ b/js/demos/plane/plane.js @@ -0,0 +1,442 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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(xml, Plane.workspace); + } else if (defaultXml) { + // Load the editor with default starting blocks. + var xml = Blockly.Xml.textToDom(defaultXml); + Blockly.Xml.domToWorkspace(xml, Plane.workspace); + } + Plane.workspace.clearUndo(); +}; + +/** + * 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); + Plane.workspace.addChangeListener(Blockly.Events.disableOrphans); + + // 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(false)); + updateBlocks(Plane.workspace.flyout_.workspace_.getAllBlocks(false)); +}; + +/** + * 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.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.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/js/demos/plane/slider.js b/js/demos/plane/slider.js new file mode 100644 index 0000000..a219653 --- /dev/null +++ b/js/demos/plane/slider.js @@ -0,0 +1,285 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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/js/demos/plane/soy/COPYING b/js/demos/plane/soy/COPYING new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/js/demos/plane/soy/COPYING @@ -0,0 +1,202 @@ + + 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/js/demos/plane/soy/README b/js/demos/plane/soy/README new file mode 100644 index 0000000..51aa75c --- /dev/null +++ b/js/demos/plane/soy/README @@ -0,0 +1,45 @@ +// Copyright 2009 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +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/js/demos/plane/soy/SoyMsgExtractor.jar b/js/demos/plane/soy/SoyMsgExtractor.jar new file mode 100644 index 0000000..d5c112f Binary files /dev/null and b/js/demos/plane/soy/SoyMsgExtractor.jar differ diff --git a/js/demos/plane/soy/SoyToJsSrcCompiler.jar b/js/demos/plane/soy/SoyToJsSrcCompiler.jar new file mode 100644 index 0000000..bb3b7a9 Binary files /dev/null and b/js/demos/plane/soy/SoyToJsSrcCompiler.jar differ diff --git a/js/demos/plane/soy/soyutils.js b/js/demos/plane/soy/soyutils.js new file mode 100644 index 0000000..861c81f --- /dev/null +++ b/js/demos/plane/soy/soyutils.js @@ -0,0 +1,3299 @@ +/** + * @license + * Copyright 2008 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview + * 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; + + /** + * Calls superclass constructor/method. + * @param {!Object} me Should always be "this". + * @param {string} methodName + * @param {...*} var_args + * @return {?} The return value of the superclass method/constructor. + */ + childCtor.base = function(me, methodName, var_args) { + var args = Array.prototype.slice.call(arguments, 2); + return parentCtor.prototype[methodName].apply(me, args); + }; +}; + + +// 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 ­ entity, though this will give a + * visible hyphen at breaks. IE8+ use a zero width space. Other browsers + * just use . + * @type {string} + * @private + */ + WORD_BREAK: + goog.userAgent.WEBKIT ? '' : + goog.userAgent.OPERA ? '­' : + goog.userAgent.IE ? '​' : + '' + }; +} + + +if (!goog.i18n) { + goog.i18n = { + bidi: {} + }; +} + + +/** + * Constant that defines whether or not the current locale is an RTL locale. + * + * @type {boolean} + */ +goog.i18n.bidi.IS_RTL = false; + + +/** + * Directionality enum. + * @enum {number} + */ +goog.i18n.bidi.Dir = { + /** + * Left-to-right. + */ + LTR: 1, + + /** + * Right-to-left. + */ + RTL: -1, + + /** + * Neither left-to-right nor right-to-left. + */ + NEUTRAL: 0, + + /** + * A historical misnomer for NEUTRAL. + * @deprecated For "neutral", use NEUTRAL; for "unknown", use null. + */ + UNKNOWN: 0 +}; + + +/** + * 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|null} givenDir Directionality given + * in one of the following formats: + * 1. A goog.i18n.bidi.Dir constant. + * 2. A number (positive = LTR, negative = RTL, 0 = neutral). + * 3. A boolean (true = RTL, false = LTR). + * 4. A null for unknown directionality. + * @param {boolean=} opt_noNeutral Whether a givenDir of zero or + * goog.i18n.bidi.Dir.NEUTRAL should be treated as null, i.e. unknown, in + * order to preserve legacy behavior. + * @return {?goog.i18n.bidi.Dir} A goog.i18n.bidi.Dir constant matching the + * given directionality. If given null, returns null (i.e. unknown). + */ +goog.i18n.bidi.toDir = function(givenDir, opt_noNeutral) { + if (typeof givenDir == 'number') { + // This includes the non-null goog.i18n.bidi.Dir case. + return givenDir > 0 ? goog.i18n.bidi.Dir.LTR : + givenDir < 0 ? goog.i18n.bidi.Dir.RTL : + opt_noNeutral ? null : goog.i18n.bidi.Dir.NEUTRAL; + } else if (givenDir == null) { + return null; + } else { + // Must be typeof givenDir == 'boolean'. + return givenDir ? goog.i18n.bidi.Dir.RTL : goog.i18n.bidi.Dir.LTR; + } +}; + + +/** + * Estimates the directionality of a string based on relative word counts. + * If the number of RTL words is above a certain percentage of the total number + * of strongly directional words, returns RTL. + * Otherwise, if any words are strongly or weakly LTR, returns LTR. + * Otherwise, returns NEUTRAL. + * Numbers are counted as weakly LTR. + * @param {string} str The string to be checked. + * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped. + * Default: false. + * @return {goog.i18n.bidi.Dir} Estimated overall directionality of {@code str}. + */ +goog.i18n.bidi.estimateDirection = function(str, opt_isHtml) { + var rtlCount = 0; + var totalCount = 0; + var hasWeaklyLtr = false; + var tokens = soyshim.$$bidiStripHtmlIfNecessary_(str, opt_isHtml). + split(soyshim.$$bidiWordSeparatorRe_); + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + if (soyshim.$$bidiRtlDirCheckRe_.test(token)) { + rtlCount++; + totalCount++; + } else if (soyshim.$$bidiIsRequiredLtrRe_.test(token)) { + hasWeaklyLtr = true; + } else if (soyshim.$$bidiLtrCharRe_.test(token)) { + totalCount++; + } else if (soyshim.$$bidiHasNumeralsRe_.test(token)) { + hasWeaklyLtr = true; + } + } + + return totalCount == 0 ? + (hasWeaklyLtr ? goog.i18n.bidi.Dir.LTR : goog.i18n.bidi.Dir.NEUTRAL) : + (rtlCount / totalCount > soyshim.$$bidiRtlDetectionThreshold_ ? + 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|null} dir The context + * directionality, in one of the following formats: + * 1. A goog.i18n.bidi.Dir constant. NEUTRAL is treated the same as null, + * i.e. unknown, for backward compatibility with legacy calls. + * 2. A number (positive = LTR, negative = RTL, 0 = unknown). + * 3. A boolean (true = RTL, false = LTR). + * 4. A null for unknown directionality. + * @constructor + */ +goog.i18n.BidiFormatter = function(dir) { + /** + * The overall directionality of the context in which the formatter is being + * used. + * @type {?goog.i18n.bidi.Dir} + * @private + */ + this.dir_ = goog.i18n.bidi.toDir(dir, true /* opt_noNeutral */); +}; + +/** + * @return {?goog.i18n.bidi.Dir} The context directionality. + */ +goog.i18n.BidiFormatter.prototype.getContextDir = function() { + return this.dir_; +}; + +/** + * Returns 'dir="ltr"' or 'dir="rtl"', depending on the given directionality, if + * it is not the same as the context directionality. Otherwise, returns the + * empty string. + * + * @param {goog.i18n.bidi.Dir} dir A directionality. + * @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.knownDirAttr = function(dir) { + 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 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. + * 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 {?goog.i18n.bidi.Dir} textDir {@code text}'s overall directionality, + * or null if unknown and needs to be estimated. + * @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 the context directionality, or + * the empty string when either the context directionality is unknown or + * neither the text's overall nor its exit directionality is opposite to it. + */ +goog.i18n.BidiFormatter.prototype.markAfterKnownDir = function ( + textDir, text, opt_isHtml) { + if (textDir == null) { + textDir = goog.i18n.bidi.estimateDirection(text, opt_isHtml); + } + return ( + this.dir_ > 0 && (textDir < 0 || + soyshim.$$bidiIsRtlExitText_(text, opt_isHtml)) ? '\u200E' : // LRM + this.dir_ < 0 && (textDir > 0 || + soyshim.$$bidiIsLtrExitText_(text, opt_isHtml)) ? '\u200F' : // RLM + ''); +}; + +/** + * Formats an HTML string for use in HTML output of the context directionality, + * so an opposite-directionality string is neither garbled nor garbles what + * follows it. + * + * @param {?goog.i18n.bidi.Dir} textDir {@code str}'s overall directionality, or + * null if unknown and needs to be estimated. + * @param {string} str The input text (HTML or HTML-escaped). + * @param {boolean=} placeholder This argument exists for consistency with the + * Closure Library. Specifying it has no effect. + * @return {string} The input text after applying the above processing. + */ +goog.i18n.BidiFormatter.prototype.spanWrapWithKnownDir = function( + textDir, str, placeholder) { + if (textDir == null) { + textDir = goog.i18n.bidi.estimateDirection(str, true); + } + var reset = this.markAfterKnownDir(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 an HTML-escaped string for use in HTML output of the context + * directionality, so an opposite-directionality string is neither garbled nor + * garbles what follows it. + * As opposed to {@link #spanWrapWithKnownDir}, this makes use of unicode bidi + * formatting characters. In HTML, it should only be used inside attribute + * values and elements that do not allow markup, e.g. an 'option' tag. + * + * @param {?goog.i18n.bidi.Dir} textDir {@code str}'s overall directionality, or + * null if unknown and needs to be estimated. + * @param {string} str The input text (HTML-escaped). + * @param {boolean=} opt_isHtml Whether {@code str} is HTML / HTML-escaped. + * Default: false. + * @return {string} The input text after applying the above processing. + */ +goog.i18n.BidiFormatter.prototype.unicodeWrapWithKnownDir = function( + textDir, str, opt_isHtml) { + if (textDir == null) { + textDir = goog.i18n.bidi.estimateDirection(str, opt_isHtml); + } + var reset = this.markAfterKnownDir(textDir, str, opt_isHtml); + 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: goog.DEBUG ? {sanitizedContentKindHtml: true} : {}, + + /** + * 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's entirely under Google's + * control. + */ + JS: goog.DEBUG ? {sanitizedContentJsChars: 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: goog.DEBUG ? {sanitizedContentJsStrChars: true} : {}, + + /** A properly encoded portion of a URI. */ + URI: goog.DEBUG ? {sanitizedContentUri: true} : {}, + + /** + * 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: goog.DEBUG ? {sanitizedContentCss: true} : {}, + + /** + * 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: goog.DEBUG ? {sanitizedContentKindText: true} : {} +}; + + + +/** + * A string-like object that carries a content-type and a content direction. + * + * 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 content's direction; null if unknown and thus to be estimated when + * necessary. + * @type {?goog.i18n.bidi.Dir} + */ +goog.soy.data.SanitizedContent.prototype.contentDir = null; + + +/** + * 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; +}; + + +/** + * 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. + * Based on goog.i18n.bidi.stripHtmlIfNeeded_(). + * @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. + * Copied from goog.i18n.bidi.htmlSkipReg_. + * @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. + * Copied from goog.i18n.bidi.ltrChars_. + * @type {string} + * @private + */ +soyshim.$$bidiLtrChars_ = + 'A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02B8\u0300-\u0590\u0800-\u1FFF' + + '\u200E\u2C00-\uFB1C\uFE00-\uFE6F\uFEFD-\uFFFF'; + + +/** + * 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. + * Copied from goog.i18n.bidi.rtlChars_. + * @type {string} + * @private + */ +soyshim.$$bidiRtlChars_ = '\u0591-\u07FF\u200F\uFB1D-\uFDFF\uFE70-\uFEFC'; + + +/** + * Regular expressions to check if a piece of text is of RTL directionality + * on first character with strong directionality. + * Based on goog.i18n.bidi.rtlDirCheckRe_. + * @type {RegExp} + * @private + */ +soyshim.$$bidiRtlDirCheckRe_ = new RegExp( + '^[^' + soyshim.$$bidiLtrChars_ + ']*[' + soyshim.$$bidiRtlChars_ + ']'); + + +/** + * Regular expression to check for LTR characters. + * Based on goog.i18n.bidi.ltrCharReg_. + * @type {RegExp} + * @private + */ +soyshim.$$bidiLtrCharRe_ = new RegExp('[' + soyshim.$$bidiLtrChars_ + ']'); + + +/** + * Regular expression to check if a string looks like something that must + * always be LTR even in RTL text, e.g. a URL. When estimating the + * directionality of text containing these, we treat these as weakly LTR, + * like numbers. + * Copied from goog.i18n.bidi.isRequiredLtrRe_. + * @type {RegExp} + * @private + */ +soyshim.$$bidiIsRequiredLtrRe_ = /^http:\/\/.*/; + + +/** + * Regular expression to check if a string contains any numerals. Used to + * differentiate between completely neutral strings and those containing + * numbers, which are weakly LTR. + * Copied from goog.i18n.bidi.hasNumeralsRe_. + * @type {RegExp} + * @private + */ +soyshim.$$bidiHasNumeralsRe_ = /\d/; + + +/** + * Regular expression to split a string into "words" for directionality + * estimation based on relative word counts. + * Copied from goog.i18n.bidi.wordSeparatorRe_. + * @type {RegExp} + * @private + */ +soyshim.$$bidiWordSeparatorRe_ = /\s+/; + + +/** + * This constant controls threshold of rtl directionality. + * Copied from goog.i18n.bidi.rtlDetectionThreshold_. + * @type {number} + * @private + */ +soyshim.$$bidiRtlDetectionThreshold_ = 0.40; + +/** + * Regular expressions to check if the last strongly-directional character in a + * piece of text is LTR. + * Based on goog.i18n.bidi.ltrExitDirCheckRe_. + * @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. + * Based on goog.i18n.bidi.rtlExitDirCheckRe_. + * @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. + * Based on goog.i18n.bidi.endsWithLtr(). + * @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. + * Based on goog.i18n.bidi.endsWithRtl(). + * @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; + + +/** + * Checks whether a given value is of a given content kind. + * + * @param {*} value The value to be examined. + * @param {soydata.SanitizedContentKind} contentKind The desired content + * kind. + * @return {boolean} Whether the given value is of the given kind. + * @private + */ +soydata.isContentKind = function(value, contentKind) { + // TODO(user): This function should really include the assert on + // value.constructor that is currently sprinkled at most of the call sites. + // Unfortunately, that would require a (debug-mode-only) switch statement. + // TODO(user): Perhaps we should get rid of the contentKind property + // altogether and only at the constructor. + return value != null && value.contentKind === contentKind; +}; + + +/** + * Returns a given value's contentDir property, constrained to a + * goog.i18n.bidi.Dir value or null. Returns null if the value is null, + * undefined, a primitive or does not have a contentDir property, or the + * property's value is not 1 (for LTR), -1 (for RTL), or 0 (for neutral). + * + * @param {*} value The value whose contentDir property, if any, is to + * be returned. + * @return {?goog.i18n.bidi.Dir} The contentDir property. + */ +soydata.getContentDir = function(value) { + if (value != null) { + switch (value.contentDir) { + case goog.i18n.bidi.Dir.LTR: + return goog.i18n.bidi.Dir.LTR; + case goog.i18n.bidi.Dir.RTL: + return goog.i18n.bidi.Dir.RTL; + case goog.i18n.bidi.Dir.NEUTRAL: + return goog.i18n.bidi.Dir.NEUTRAL; + } + } + return null; +}; + + +/** + * 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. The default content direction is + * unknown, i.e. to be estimated when necessary. + * + * @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; + +/** + * Returns a SanitizedHtml object for a particular value. The content direction + * is preserved. + * + * This HTML-escapes the value unless it is already SanitizedHtml. + * + * @param {*} value The value to convert. If it is already a SanitizedHtml + * object, it is left alone. + * @return {!soydata.SanitizedHtml} A SanitizedHtml object derived from the + * stringified value. It is escaped unless the input is SanitizedHtml. + */ +soydata.SanitizedHtml.from = function(value) { + // The check is soydata.isContentKind() inlined for performance. + if (value != null && + value.contentKind === soydata.SanitizedContentKind.HTML) { + goog.asserts.assert(value.constructor === soydata.SanitizedHtml); + return /** @type {!soydata.SanitizedHtml} */ (value); + } + return soydata.VERY_UNSAFE.ordainSanitizedHtml( + soy.esc.$$escapeHtmlHelper(String(value)), soydata.getContentDir(value)); +}; + + +/** + * Content of type {@link soydata.SanitizedContentKind.JS}. + * + * The content is Javascript source that when evaluated does not execute any + * attacker-controlled scripts. The content direction is LTR. + * + * @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; + +/** @override */ +soydata.SanitizedJs.prototype.contentDir = goog.i18n.bidi.Dir.LTR; + + +/** + * 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. The default content direction is + * unknown, i.e. to be estimated when necessary. + * + * @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. The content direction is LTR. + * + * @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; + +/** @override */ +soydata.SanitizedUri.prototype.contentDir = goog.i18n.bidi.Dir.LTR; + + +/** + * Content of type {@link soydata.SanitizedContentKind.ATTRIBUTES}. + * + * The content should be safely embeddable within an open tag, such as a + * key="value" pair. The content direction is LTR. + * + * @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; + +/** @override */ +soydata.SanitizedHtmlAttribute.prototype.contentDir = goog.i18n.bidi.Dir.LTR; + + +/** + * Content of type {@link soydata.SanitizedContentKind.CSS}. + * + * The content is non-attacker-exploitable CSS, such as {@code color:#c3d9ff}. + * The content direction is LTR. + * + * @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; + +/** @override */ +soydata.SanitizedCss.prototype.contentDir = goog.i18n.bidi.Dir.LTR; + + +/** + * 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. + * @param {?goog.i18n.bidi.Dir=} opt_contentDir The content direction; null if + * unknown and thus to be estimated when necessary. Default: null. + * @constructor + * @extends {goog.soy.data.SanitizedContent} + */ +soydata.UnsanitizedText = function(content, opt_contentDir) { + /** @override */ + this.content = String(content); + this.contentDir = opt_contentDir != null ? opt_contentDir : null; +}; +goog.inherits(soydata.UnsanitizedText, goog.soy.data.SanitizedContent); + +/** @override */ +soydata.UnsanitizedText.prototype.contentKind = + soydata.SanitizedContentKind.TEXT; + + +/** + * Empty string, used as a type in Soy templates. + * @enum {string} + * @private + */ +soydata.$$EMPTY_STRING_ = { + VALUE: '' +}; + + +/** + * 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)} ctor A constructor. + * @return {!function(*, ?goog.i18n.bidi.Dir=): T} A factory that takes + * content and an optional content direction and returns a new instance. If + * the content direction is undefined, ctor.prototype.contentDir is used. + * @template T + * @private + */ +soydata.$$makeSanitizedContentFactory_ = function(ctor) { + /** @type {function(new: goog.soy.data.SanitizedContent)} */ + function InstantiableCtor() {} + InstantiableCtor.prototype = ctor.prototype; + /** + * Creates a ctor-type SanitizedContent instance. + * + * @param {*} content The content to put in the instance. + * @param {?goog.i18n.bidi.Dir=} opt_contentDir The content direction. If + * undefined, ctor.prototype.contentDir is used. + * @return {goog.soy.data.SanitizedContent} The new instance. It is actually + * of type T above (ctor's type, a descendant of SanitizedContent), but + * there is no way to express that here. + */ + function sanitizedContentFactory(content, opt_contentDir) { + var result = new InstantiableCtor(); + result.content = String(content); + if (opt_contentDir !== undefined) { + result.contentDir = opt_contentDir; + } + return result; + } + return sanitizedContentFactory; +}; + + +/** + * Creates a factory for SanitizedContent types that should always have their + * default directionality. + * + * 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 (with default directionality, i.e. ctor.prototype.contentDir). + * @template T + * @private + */ +soydata.$$makeSanitizedContentFactoryWithDefaultDirOnly_ = function(ctor) { + /** @type {function(new: goog.soy.data.SanitizedContent)} */ + function InstantiableCtor() {} + InstantiableCtor.prototype = ctor.prototype; + /** + * Creates a ctor-type SanitizedContent instance. + * + * @param {*} content The content to put in the instance. + * @return {goog.soy.data.SanitizedContent} The new instance. It is actually + * of type T above (ctor's type, a descendant of SanitizedContent), but + * there is no way to express that here. + */ + function sanitizedContentFactory(content) { + var result = new InstantiableCtor(); + result.content = String(content); + return result; + } + return sanitizedContentFactory; +}; + + +// ----------------------------------------------------------------------------- +// 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. + * @param {?goog.i18n.bidi.Dir=} opt_contentDir The content direction; null if + * unknown and thus to be estimated when necessary. Default: null. + * @return {!soydata.UnsanitizedText} A wrapper that is rejected by the + * Soy noAutoescape print directive. + */ +soydata.markUnsanitizedText = function(content, opt_contentDir) { + return new soydata.UnsanitizedText(content, opt_contentDir); +}; + + +/** + * 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. + * @param {?goog.i18n.bidi.Dir=} opt_contentDir The content direction; null if + * unknown and thus to be estimated when necessary. Default: null. + * @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.$$makeSanitizedContentFactoryWithDefaultDirOnly_( + 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. + * @param {?goog.i18n.bidi.Dir=} opt_contentDir The content direction; null if + * unknown and thus to be estimated when necessary. Default: null. + * @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.$$makeSanitizedContentFactoryWithDefaultDirOnly_( + 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.$$makeSanitizedContentFactoryWithDefaultDirOnly_( + 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.$$makeSanitizedContentFactoryWithDefaultDirOnly_( + 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. + + +/** + * Whether the locale is right-to-left. + * + * @type {boolean} + */ +soy.$$IS_LOCALE_RTL = goog.i18n.bidi.IS_RTL; + + +/** + * 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) { + // TODO: Support map literal with nonstring 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|number} delTemplateVariant The delegate template variant (can + * be an empty string, or a number when a global is used). + * @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 ''; +}; + + +// ----------------------------------------------------------------------------- +// Internal sanitized content wrappers. + + +/** + * Creates a SanitizedContent factory for SanitizedContent types for internal + * Soy let and param blocks. + * + * This is a hack within Soy so that SanitizedContent objects created via let + * and param blocks will truth-test as false if they are empty string. + * Tricking the Javascript runtime to treat empty SanitizedContent as falsey is + * not possible, and changing the Soy compiler to wrap every boolean statement + * for just this purpose is impractical. Instead, we just avoid wrapping empty + * string as SanitizedContent, since it's a no-op for empty strings anyways. + * + * @param {function(new: T)} ctor A constructor. + * @return {!function(*, ?goog.i18n.bidi.Dir=): (T|soydata.$$EMPTY_STRING_)} + * A factory that takes content and an optional content direction and + * returns a new instance, or an empty string. If the content direction is + * undefined, ctor.prototype.contentDir is used. + * @template T + * @private + */ +soydata.$$makeSanitizedContentFactoryForInternalBlocks_ = function(ctor) { + /** @type {function(new: goog.soy.data.SanitizedContent)} */ + function InstantiableCtor() {} + InstantiableCtor.prototype = ctor.prototype; + /** + * Creates a ctor-type SanitizedContent instance. + * + * @param {*} content The content to put in the instance. + * @param {?goog.i18n.bidi.Dir=} opt_contentDir The content direction. If + * undefined, ctor.prototype.contentDir is used. + * @return {goog.soy.data.SanitizedContent|soydata.$$EMPTY_STRING_} The new + * instance, or an empty string. A new instance is actually of type T + * above (ctor's type, a descendant of SanitizedContent), but there's no + * way to express that here. + */ + function sanitizedContentFactory(content, opt_contentDir) { + var contentString = String(content); + if (!contentString) { + return soydata.$$EMPTY_STRING_.VALUE; + } + var result = new InstantiableCtor(); + result.content = String(content); + if (opt_contentDir !== undefined) { + result.contentDir = opt_contentDir; + } + return result; + } + return sanitizedContentFactory; +}; + + +/** + * Creates a SanitizedContent factory for SanitizedContent types that should + * always have their default directionality for internal Soy let and param + * blocks. + * + * This is a hack within Soy so that SanitizedContent objects created via let + * and param blocks will truth-test as false if they are empty string. + * Tricking the Javascript runtime to treat empty SanitizedContent as falsey is + * not possible, and changing the Soy compiler to wrap every boolean statement + * for just this purpose is impractical. Instead, we just avoid wrapping empty + * string as SanitizedContent, since it's a no-op for empty strings anyways. + * + * @param {function(new: T)} ctor A constructor. + * @return {!function(*): (T|soydata.$$EMPTY_STRING_)} A + * factory that takes content and returns a + * new instance (with default directionality, i.e. + * ctor.prototype.contentDir), or an empty string. + * @template T + * @private + */ +soydata.$$makeSanitizedContentFactoryWithDefaultDirOnlyForInternalBlocks_ = + function(ctor) { + /** @type {function(new: goog.soy.data.SanitizedContent)} */ + function InstantiableCtor() {} + InstantiableCtor.prototype = ctor.prototype; + /** + * Creates a ctor-type SanitizedContent instance. + * + * @param {*} content The content to put in the instance. + * @return {goog.soy.data.SanitizedContent|soydata.$$EMPTY_STRING_} The new + * instance, or an empty string. A new instance is actually of type T + * above (ctor's type, a descendant of SanitizedContent), but there's no + * way to express that here. + */ + function sanitizedContentFactory(content) { + var contentString = String(content); + if (!contentString) { + return soydata.$$EMPTY_STRING_.VALUE; + } + var result = new InstantiableCtor(); + result.content = String(content); + return result; + } + return sanitizedContentFactory; +}; + + +/** + * Creates kind="text" block contents (internal use only). + * + * @param {*} content Text. + * @param {?goog.i18n.bidi.Dir=} opt_contentDir The content direction; null if + * unknown and thus to be estimated when necessary. Default: null. + * @return {!soydata.UnsanitizedText|soydata.$$EMPTY_STRING_} Wrapped result. + */ +soydata.$$markUnsanitizedTextForInternalBlocks = function( + content, opt_contentDir) { + var contentString = String(content); + if (!contentString) { + return soydata.$$EMPTY_STRING_.VALUE; + } + return new soydata.UnsanitizedText(contentString, opt_contentDir); +}; + + +/** + * Creates kind="html" block contents (internal use only). + * + * @param {*} content Text. + * @param {?goog.i18n.bidi.Dir=} opt_contentDir The content direction; null if + * unknown and thus to be estimated when necessary. Default: null. + * @return {soydata.SanitizedHtml|soydata.$$EMPTY_STRING_} Wrapped result. + */ +soydata.VERY_UNSAFE.$$ordainSanitizedHtmlForInternalBlocks = + soydata.$$makeSanitizedContentFactoryForInternalBlocks_( + soydata.SanitizedHtml); + + +/** + * Creates kind="js" block contents (internal use only). + * + * @param {*} content Text. + * @return {soydata.SanitizedJs|soydata.$$EMPTY_STRING_} Wrapped result. + */ +soydata.VERY_UNSAFE.$$ordainSanitizedJsForInternalBlocks = + soydata.$$makeSanitizedContentFactoryWithDefaultDirOnlyForInternalBlocks_( + soydata.SanitizedJs); + + +/** + * Creates kind="uri" block contents (internal use only). + * + * @param {*} content Text. + * @return {soydata.SanitizedUri|soydata.$$EMPTY_STRING_} Wrapped result. + */ +soydata.VERY_UNSAFE.$$ordainSanitizedUriForInternalBlocks = + soydata.$$makeSanitizedContentFactoryWithDefaultDirOnlyForInternalBlocks_( + soydata.SanitizedUri); + + +/** + * Creates kind="attributes" block contents (internal use only). + * + * @param {*} content Text. + * @return {soydata.SanitizedHtmlAttribute|soydata.$$EMPTY_STRING_} Wrapped + * result. + */ +soydata.VERY_UNSAFE.$$ordainSanitizedAttributesForInternalBlocks = + soydata.$$makeSanitizedContentFactoryWithDefaultDirOnlyForInternalBlocks_( + soydata.SanitizedHtmlAttribute); + + +/** + * Creates kind="css" block contents (internal use only). + * + * @param {*} content Text. + * @return {soydata.SanitizedCss|soydata.$$EMPTY_STRING_} Wrapped result. + */ +soydata.VERY_UNSAFE.$$ordainSanitizedCssForInternalBlocks = + soydata.$$makeSanitizedContentFactoryWithDefaultDirOnlyForInternalBlocks_( + soydata.SanitizedCss); + + +// ----------------------------------------------------------------------------- +// Escape/filter/normalize. + + +/** + * Returns a SanitizedHtml object for a particular value. The content direction + * is preserved. + * + * This HTML-escapes the value unless it is already SanitizedHtml. Escapes + * double quote '"' in addition to '&', '<', and '>' so that a string can be + * included in an HTML tag attribute value within double quotes. + * + * @param {*} value The value to convert. If it is already a SanitizedHtml + * object, it is left alone. + * @return {!soydata.SanitizedHtml} An escaped version of value. + */ +soy.$$escapeHtml = function(value) { + return soydata.SanitizedHtml.from(value); +}; + + +/** + * Strips unsafe tags to convert a string of untrusted HTML into HTML that + * is safe to embed. The content direction is preserved. + * + * @param {*} value The string-like value to be escaped. May not be a string, + * but the value will be coerced to a string. + * @return {!soydata.SanitizedHtml} A sanitized and normalized version of value. + */ +soy.$$cleanHtml = function(value) { + if (soydata.isContentKind(value, soydata.SanitizedContentKind.HTML)) { + goog.asserts.assert(value.constructor === soydata.SanitizedHtml); + return /** @type {!soydata.SanitizedHtml} */ (value); + } + return soydata.VERY_UNSAFE.ordainSanitizedHtml( + soy.$$stripHtmlTags(value, soy.esc.$$SAFE_TAG_WHITELIST_), + soydata.getContentDir(value)); +}; + + +/** + * 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 (soydata.isContentKind(value, soydata.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 (soydata.isContentKind(value, soydata.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 (soydata.isContentKind(value, soydata.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 (soydata.isContentKind(value, soydata.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 (soydata.isContentKind(value, soydata.SanitizedContentKind.URI)) { + goog.asserts.assert(value.constructor === soydata.SanitizedUri); + return soy.$$normalizeUri(value); + } + return soy.esc.$$filterNormalizeUriHelper(value); +}; + + +/** + * Allows only data-protocol image URI's. + * + * @param {*} value The value to process. May not be a string, but the value + * will be coerced to a string. + * @return {!soydata.SanitizedUri} An escaped version of value. + */ +soy.$$filterImageDataUri = function(value) { + // NOTE: Even if it's a SanitizedUri, we will still filter it. + return soydata.VERY_UNSAFE.ordainSanitizedUri( + soy.esc.$$filterImageDataUriHelper(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 (soydata.isContentKind(value, soydata.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 {*} The value, that we dearly hope will not cause an attack. + */ +soy.$$filterNoAutoescape = function(value) { + if (soydata.isContentKind(value, soydata.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 value; +}; + + +// ----------------------------------------------------------------------------- +// Basic directives/functions. + + +/** + * Converts \r\n, \r, and \n to
    s + * @param {*} value The string in which to convert newlines. + * @return {string|!soydata.SanitizedHtml} A copy of {@code value} with + * converted newlines. If {@code value} is SanitizedHtml, the return value + * is also SanitizedHtml, of the same known directionality. + */ +soy.$$changeNewlineToBr = function(value) { + var result = goog.string.newLineToBr(String(value), false); + if (soydata.isContentKind(value, soydata.SanitizedContentKind.HTML)) { + return soydata.VERY_UNSAFE.ordainSanitizedHtml( + result, soydata.getContentDir(value)); + } + return result; +}; + + +/** + * 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 {*} value 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|!soydata.SanitizedHtml} The string including word + * breaks. If {@code value} is SanitizedHtml, the return value + * is also SanitizedHtml, of the same known directionality. + */ +soy.$$insertWordBreaks = function(value, maxCharsBetweenWordBreaks) { + var result = goog.format.insertWordBreaks( + String(value), maxCharsBetweenWordBreaks); + if (soydata.isContentKind(value, soydata.SanitizedContentKind.HTML)) { + return soydata.VERY_UNSAFE.ordainSanitizedHtml( + result, soydata.getContentDir(value)); + } + return result; +}; + + +/** + * 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. + * If text has a goog.i18n.bidi.Dir-valued contentDir, this is used instead of + * estimating the directionality. + * + * @param {*} text The content 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) { + var contentDir = soydata.getContentDir(text); + if (contentDir != null) { + return contentDir; + } + var isHtml = opt_isHtml || + soydata.isContentKind(text, soydata.SanitizedContentKind.HTML); + return goog.i18n.bidi.estimateDirection(text + '', isHtml); +}; + + +/** + * 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. + * If text has a goog.i18n.bidi.Dir-valued contentDir, this is used instead of + * estimating the directionality. + * + * @param {number} bidiGlobalDir The global directionality context: 1 if ltr, -1 + * if rtl, 0 if unknown. + * @param {*} text The content 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) { + var formatter = soy.$$getBidiFormatterInstance_(bidiGlobalDir); + var contentDir = soydata.getContentDir(text); + if (contentDir == null) { + var isHtml = opt_isHtml || + soydata.isContentKind(text, soydata.SanitizedContentKind.HTML); + contentDir = goog.i18n.bidi.estimateDirection(text + '', isHtml); + } + return soydata.VERY_UNSAFE.ordainSanitizedHtmlAttribute( + formatter.knownDirAttr(contentDir)); +}; + + +/** + * 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. + * If text has a goog.i18n.bidi.Dir-valued contentDir, this is used instead of + * estimating the directionality. + * + * @param {number} bidiGlobalDir The global directionality context: 1 if ltr, -1 + * if rtl, 0 if unknown. + * @param {*} text The content 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); + var isHtml = opt_isHtml || + soydata.isContentKind(text, soydata.SanitizedContentKind.HTML); + return formatter.markAfterKnownDir(soydata.getContentDir(text), text + '', + isHtml); +}; + + +/** + * Returns text wrapped in a according to its + * directionality - but only if that is neither neutral nor the same as the + * global context. Otherwise, returns text unchanged. + * Always treats text as HTML/HTML-escaped, i.e. ignores mark-up and escapes + * when estimating text's directionality. + * If text has a goog.i18n.bidi.Dir-valued contentDir, this is used instead of + * estimating the directionality. + * + * @param {number} bidiGlobalDir The global directionality context: 1 if ltr, -1 + * if rtl, 0 if unknown. + * @param {*} text The string to be wrapped. Can be other types, but the value + * will be coerced to a string. + * @return {!goog.soy.data.SanitizedContent|string} The wrapped text. + */ +soy.$$bidiSpanWrap = function(bidiGlobalDir, text) { + var formatter = soy.$$getBidiFormatterInstance_(bidiGlobalDir); + + // We always treat the value as HTML, because span-wrapping is only useful + // when its output will be treated as HTML (without escaping), and because + // |bidiSpanWrap is not itself specified to do HTML escaping in Soy. (Both + // explicit and automatic HTML escaping, if any, is done before calling + // |bidiSpanWrap because the BidiSpanWrapDirective Java class implements + // SanitizedContentOperator, but this does not mean that the input has to be + // HTML SanitizedContent. In legacy usage, a string that is not + // SanitizedContent is often printed in an autoescape="false" template or by + // a print with a |noAutoescape, in which case our input is just SoyData.) If + // the output will be treated as HTML, the input had better be safe + // HTML/HTML-escaped (even if it isn't HTML SanitizedData), or we have an XSS + // opportunity and a much bigger problem than bidi garbling. + var wrappedText = formatter.spanWrapWithKnownDir( + soydata.getContentDir(text), text + '', true /* opt_isHtml */); + + // Like other directives whose Java class implements SanitizedContentOperator, + // |bidiSpanWrap is called after the escaping (if any) has already been done, + // and thus there is no need for it to produce actual SanitizedContent. + return wrappedText; +}; + + +/** + * Returns text 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 text's directionality is neither neutral nor the same as the + * global context. Otherwise, returns text unchanged. + * Only treats soydata.SanitizedHtml as HTML/HTML-escaped, i.e. ignores mark-up + * and escapes when estimating text's directionality. + * If text has a goog.i18n.bidi.Dir-valued contentDir, this is used instead of + * estimating the directionality. + * + * @param {number} bidiGlobalDir The global directionality context: 1 if ltr, -1 + * if rtl, 0 if unknown. + * @param {*} text The string to be wrapped. Can be other types, but the value + * will be coerced to a string. + * @return {!goog.soy.data.SanitizedContent|string} The wrapped string. + */ +soy.$$bidiUnicodeWrap = function(bidiGlobalDir, text) { + var formatter = soy.$$getBidiFormatterInstance_(bidiGlobalDir); + + // We treat the value as HTML if and only if it says it's HTML, even though in + // legacy usage, we sometimes have an HTML string (not SanitizedContent) that + // is passed to an autoescape="false" template or a {print $foo|noAutoescape}, + // with the output going into an HTML context without escaping. We simply have + // no way of knowing if this is what is happening when we get + // non-SanitizedContent input, and most of the time it isn't. + var isHtml = soydata.isContentKind(text, soydata.SanitizedContentKind.HTML); + var wrappedText = formatter.unicodeWrapWithKnownDir( + soydata.getContentDir(text), text + '', isHtml); + + // Bidi-wrapping a value converts it to the context directionality. Since it + // does not cost us anything, we will indicate this known direction in the + // output SanitizedContent, even though the intended consumer of that + // information - a bidi wrapping directive - has already been run. + var wrappedTextDir = formatter.getContextDir(); + + // Unicode-wrapping UnsanitizedText gives UnsanitizedText. + // Unicode-wrapping safe HTML or JS string data gives valid, safe HTML or JS + // string data. + // ATTENTION: Do these need to be ...ForInternalBlocks()? + if (soydata.isContentKind(text, soydata.SanitizedContentKind.TEXT)) { + return new soydata.UnsanitizedText(wrappedText, wrappedTextDir); + } + if (isHtml) { + return soydata.VERY_UNSAFE.ordainSanitizedHtml(wrappedText, wrappedTextDir); + } + if (soydata.isContentKind(text, soydata.SanitizedContentKind.JS_STR_CHARS)) { + return soydata.VERY_UNSAFE.ordainSanitizedJsStrChars( + wrappedText, wrappedTextDir); + } + + // Unicode-wrapping does not conform to the syntax of the other types of + // content. For lack of anything better to do, we we do not declare a content + // kind at all by falling through to the non-SanitizedContent case below. + // TODO(user): Consider throwing a runtime error on receipt of + // SanitizedContent other than TEXT, HTML, or JS_STR_CHARS. + + // The input was not SanitizedContent, so our output isn't SanitizedContent + // either. + return wrappedText; +}; + + +// ----------------------------------------------------------------------------- +// Generated code. + + + + + + + + +// START GENERATED CODE FOR ESCAPERS. + +/** + * @type {function (*) : string} + */ +soy.esc.$$escapeUriHelper = function(v) { + return encodeURIComponent(String(v)); +}; + +/** + * Maps characters 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 characters 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 characters 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 characters 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_IMAGE_DATA_URI_ = /^data:image\/(?:bmp|gif|jpe?g|png|tiff|webp);base64,[a-z0-9+\/]+=*$/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 |filterImageDataUri + * @param {*} value Can be of any type but will be coerced to a string. + * @return {string} The escaped text. + */ +soy.esc.$$filterImageDataUriHelper = function(value) { + var str = String(value); + if (!soy.esc.$$FILTER_FOR_FILTER_IMAGE_DATA_URI_.test(str)) { + return 'data:image/gif;base64,zSoyz'; + } + return str; +}; + +/** + * 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/js/demos/plane/style.css b/js/demos/plane/style.css new file mode 100644 index 0000000..16e2c6f --- /dev/null +++ b/js/demos/plane/style.css @@ -0,0 +1,97 @@ +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; + animation-delay: 2s; +} +@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/js/demos/plane/template.soy b/js/demos/plane/template.soy new file mode 100644 index 0000000..cbccc9a --- /dev/null +++ b/js/demos/plane/template.soy @@ -0,0 +1,225 @@ +{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/js/demos/plane/xlf/extracted_msgs.xlf b/js/demos/plane/xlf/extracted_msgs.xlf new file mode 100644 index 0000000..6a4fd44 --- /dev/null +++ b/js/demos/plane/xlf/extracted_msgs.xlf @@ -0,0 +1,77 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_ar.xlf b/js/demos/plane/xlf/translated_msgs_ar.xlf new file mode 100644 index 0000000..c9b8e16 --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_ar.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_be-tarask.xlf b/js/demos/plane/xlf/translated_msgs_be-tarask.xlf new file mode 100644 index 0000000..4580b5f --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_be-tarask.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_br.xlf b/js/demos/plane/xlf/translated_msgs_br.xlf new file mode 100644 index 0000000..4a7fc0c --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_br.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_ca.xlf b/js/demos/plane/xlf/translated_msgs_ca.xlf new file mode 100644 index 0000000..17dfe65 --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_ca.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_da.xlf b/js/demos/plane/xlf/translated_msgs_da.xlf new file mode 100644 index 0000000..752fe24 --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_da.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_de.xlf b/js/demos/plane/xlf/translated_msgs_de.xlf new file mode 100644 index 0000000..f06bc77 --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_de.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_el.xlf b/js/demos/plane/xlf/translated_msgs_el.xlf new file mode 100644 index 0000000..5acb291 --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_el.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_en.xlf b/js/demos/plane/xlf/translated_msgs_en.xlf new file mode 100644 index 0000000..e471a00 --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_en.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_es.xlf b/js/demos/plane/xlf/translated_msgs_es.xlf new file mode 100644 index 0000000..e2022b5 --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_es.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_et.xlf b/js/demos/plane/xlf/translated_msgs_et.xlf new file mode 100644 index 0000000..d88be0a --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_et.xlf @@ -0,0 +1,63 @@ + + + + + + Rows: %1 + Ridu: %1 + + + seats = + istmete arv = + + + 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. + Lennuki kokpitis on kaks istet (üks kummalegi piloodile), mingi arv ridu 1. klassi reisijatele ja mingi arv ridu 2. klassi reisijatele. Igas 1. klassi reas on neli istet, igas 2. klassi reas viis istet. + + + ? + ? + + + Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). + Ehita plokkidest valem, mis arvutab istmete arvu lennukis õigesti sõltumata ridade arvust (seda saad muuta lennuki juures oleva liuguriga). + + + 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. + Lennuki kokpitis on kaks istet (üks kummalegi piloodile) ja mingi arv istemridu reisijatele. Igas reas on neli istet. + + + 1st class rows (%1) + 1. klassi ridu (%1) + + + 2nd class rows: %1 + 2. klassi ridu: %1 + + + Seats: %1 + Istmeid: %1 + + + Plane Seat Calculator + Lennukiistmete kalkulaator + + + rows (%1) + rows (%1) + + + 1st class rows: %1 + 1. klassi ridu: %1 + + + An airplane has a number of rows of passenger seats. Each row contains four seats. + Lennukis on reisijate istmed mitmes reas. Igas reas on neli istet. + + + 2nd class rows (%1) + 2. klassi ridu (%1) + + + + diff --git a/js/demos/plane/xlf/translated_msgs_fa.xlf b/js/demos/plane/xlf/translated_msgs_fa.xlf new file mode 100644 index 0000000..264ec31 --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_fa.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_fr.xlf b/js/demos/plane/xlf/translated_msgs_fr.xlf new file mode 100644 index 0000000..9485da2 --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_fr.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_he.xlf b/js/demos/plane/xlf/translated_msgs_he.xlf new file mode 100644 index 0000000..55ac148 --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_he.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_hrx.xlf b/js/demos/plane/xlf/translated_msgs_hrx.xlf new file mode 100644 index 0000000..263d305 --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_hrx.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_hu.xlf b/js/demos/plane/xlf/translated_msgs_hu.xlf new file mode 100644 index 0000000..c44d1aa --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_hu.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_ia.xlf b/js/demos/plane/xlf/translated_msgs_ia.xlf new file mode 100644 index 0000000..83ae2c6 --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_ia.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_is.xlf b/js/demos/plane/xlf/translated_msgs_is.xlf new file mode 100644 index 0000000..3810f4b --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_is.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_it.xlf b/js/demos/plane/xlf/translated_msgs_it.xlf new file mode 100644 index 0000000..27bad0d --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_it.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_ja.xlf b/js/demos/plane/xlf/translated_msgs_ja.xlf new file mode 100644 index 0000000..b04624a --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_ja.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_ko.xlf b/js/demos/plane/xlf/translated_msgs_ko.xlf new file mode 100644 index 0000000..07e2328 --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_ko.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_ms.xlf b/js/demos/plane/xlf/translated_msgs_ms.xlf new file mode 100644 index 0000000..c34f084 --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_ms.xlf @@ -0,0 +1,63 @@ + + + + + + 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 terbang 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 terbang 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 kedua: %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 kedua (%1) + + + + diff --git a/js/demos/plane/xlf/translated_msgs_nb.xlf b/js/demos/plane/xlf/translated_msgs_nb.xlf new file mode 100644 index 0000000..99c9c6a --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_nb.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_nl.xlf b/js/demos/plane/xlf/translated_msgs_nl.xlf new file mode 100644 index 0000000..6f36fa0 --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_nl.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_pl.xlf b/js/demos/plane/xlf/translated_msgs_pl.xlf new file mode 100644 index 0000000..4c8b044 --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_pl.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_pms.xlf b/js/demos/plane/xlf/translated_msgs_pms.xlf new file mode 100644 index 0000000..0fef912 --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_pms.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_pt-br.xlf b/js/demos/plane/xlf/translated_msgs_pt-br.xlf new file mode 100644 index 0000000..7bdd9cc --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_pt-br.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_ro.xlf b/js/demos/plane/xlf/translated_msgs_ro.xlf new file mode 100644 index 0000000..614a3bd --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_ro.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_ru.xlf b/js/demos/plane/xlf/translated_msgs_ru.xlf new file mode 100644 index 0000000..d25b254 --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_ru.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_sc.xlf b/js/demos/plane/xlf/translated_msgs_sc.xlf new file mode 100644 index 0000000..6328123 --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_sc.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_sv.xlf b/js/demos/plane/xlf/translated_msgs_sv.xlf new file mode 100644 index 0000000..f3d836f --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_sv.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_th.xlf b/js/demos/plane/xlf/translated_msgs_th.xlf new file mode 100644 index 0000000..0967d4d --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_th.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_tr.xlf b/js/demos/plane/xlf/translated_msgs_tr.xlf new file mode 100644 index 0000000..678541a --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_tr.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_uk.xlf b/js/demos/plane/xlf/translated_msgs_uk.xlf new file mode 100644 index 0000000..d5e7682 --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_uk.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_vi.xlf b/js/demos/plane/xlf/translated_msgs_vi.xlf new file mode 100644 index 0000000..1f4ef6f --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_vi.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_zh-hans.xlf b/js/demos/plane/xlf/translated_msgs_zh-hans.xlf new file mode 100644 index 0000000..2cbb7e8 --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_zh-hans.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/plane/xlf/translated_msgs_zh-hant.xlf b/js/demos/plane/xlf/translated_msgs_zh-hant.xlf new file mode 100644 index 0000000..2dadf6d --- /dev/null +++ b/js/demos/plane/xlf/translated_msgs_zh-hant.xlf @@ -0,0 +1,63 @@ + + + + + + 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/js/demos/resizable/icon.png b/js/demos/resizable/icon.png new file mode 100644 index 0000000..c4eaf81 Binary files /dev/null and b/js/demos/resizable/icon.png differ diff --git a/js/demos/resizable/index.html b/js/demos/resizable/index.html new file mode 100644 index 0000000..e2ee1e0 --- /dev/null +++ b/js/demos/resizable/index.html @@ -0,0 +1,52 @@ + + + + + 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/js/demos/resizable/overlay.html b/js/demos/resizable/overlay.html new file mode 100644 index 0000000..826a667 --- /dev/null +++ b/js/demos/resizable/overlay.html @@ -0,0 +1,96 @@ + + + + + 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/js/demos/rtl/icon.png b/js/demos/rtl/icon.png new file mode 100644 index 0000000..284c1ef Binary files /dev/null and b/js/demos/rtl/icon.png differ diff --git a/js/demos/rtl/index.html b/js/demos/rtl/index.html new file mode 100644 index 0000000..ff2b630 --- /dev/null +++ b/js/demos/rtl/index.html @@ -0,0 +1,210 @@ + + + + + + Blockly Demo: RTL + + + + + + + +

    Blockly > + Demos > Right-to-Left

    + +
    + + + + + + diff --git a/js/demos/storage/icon.png b/js/demos/storage/icon.png new file mode 100644 index 0000000..a766b5d Binary files /dev/null and b/js/demos/storage/icon.png differ diff --git a/js/demos/storage/index.html b/js/demos/storage/index.html new file mode 100644 index 0000000..759dc2b --- /dev/null +++ b/js/demos/storage/index.html @@ -0,0 +1,96 @@ + + + + + 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/js/demos/toolbox/icon.png b/js/demos/toolbox/icon.png new file mode 100644 index 0000000..fe54fe4 Binary files /dev/null and b/js/demos/toolbox/icon.png differ diff --git a/js/demos/toolbox/index.html b/js/demos/toolbox/index.html new file mode 100644 index 0000000..007b8ee --- /dev/null +++ b/js/demos/toolbox/index.html @@ -0,0 +1,349 @@ + + + + + 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/js/externs/goog-externs.js b/js/externs/goog-externs.js new file mode 100644 index 0000000..496805d --- /dev/null +++ b/js/externs/goog-externs.js @@ -0,0 +1,26 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Externs for goog. + * @externs + */ + +/** + * @type {!Object} + */ +var goog = {}; diff --git a/js/externs/svg-externs.js b/js/externs/svg-externs.js new file mode 100644 index 0000000..5fca4dc --- /dev/null +++ b/js/externs/svg-externs.js @@ -0,0 +1,10243 @@ +/** + * Copyright 2017 The Closure Compiler Authors + * + * 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 Generated by closureidl 0.2dev closureidl-parser-webkit 0.2dev dart-idl 7592. + * Parser: type=webkit dir=${WEBKIT}/Source/WebCore/_/_.idl dir=${WEBKIT}/Source/WebCore/_/_/_.idl dir=${WEBKIT}/Source/WebCore/Modules/_/_.idl + * Context0: id=webkit + * Filter0: annotate-platform platform=webkit + * Filter1: merge-supplemental + * Filter2: fix-nulls + * Filter3: fix-constructors + * Filter4: rename-interfaces + * Filter5: check-consistency + * Context1: id=closure + * Filter0: import context=webkit + * Filter1: closure:merge-overloaded-methods + * Filter2: closure:fix-callbacks remove=false + * Filter3: closure:fix-arrays remove=simple + * Filter4: closure:fix-optionals + * Filter5: closure:rename-reserved-params + * Filter6: closure:guess-interfaces + * Filter7: closure:expand-interfaces + * Output: format=js + * + * @externs + */ + + + +/** + * @constructor + */ +function SVGAnimatedNumberList(){} + + +/** + * @type {!SVGNumberList} + */ +SVGAnimatedNumberList.prototype.baseVal; + + +/** + * @type {!SVGNumberList} + */ +SVGAnimatedNumberList.prototype.animVal; + + + +/** + * @constructor + */ +function SVGLengthList(){} + + +/** + * @type {number} + */ +SVGLengthList.prototype.numberOfItems; + + +/** */ +SVGLengthList.prototype.clear = function(){}; + + +/** + * @param {!SVGLength} item + * @return {!SVGLength} + */ +SVGLengthList.prototype.initialize = function(item){}; + + +/** + * @param {number} index + * @return {!SVGLength} + */ +SVGLengthList.prototype.getItem = function(index){}; + + +/** + * @param {!SVGLength} item + * @param {number} index + * @return {!SVGLength} + */ +SVGLengthList.prototype.insertItemBefore = function(item, index){}; + + +/** + * @param {!SVGLength} item + * @param {number} index + * @return {!SVGLength} + */ +SVGLengthList.prototype.replaceItem = function(item, index){}; + + +/** + * @param {number} index + * @return {!SVGLength} + */ +SVGLengthList.prototype.removeItem = function(index){}; + + +/** + * @param {!SVGLength} item + * @return {!SVGLength} + */ +SVGLengthList.prototype.appendItem = function(item){}; + + + +/** + * @constructor + * @implements {EventTarget} + */ +function SVGElementInstance(){} + + +/** + * @type {!SVGElement} + */ +SVGElementInstance.prototype.correspondingElement; + + +/** + * @type {!SVGUseElement} + */ +SVGElementInstance.prototype.correspondingUseElement; + + +/** + * @type {!SVGElementInstance} + */ +SVGElementInstance.prototype.parentNode; + + +/** + * @type {!Array|!SVGElementInstanceList} + */ +SVGElementInstance.prototype.childNodes; + + +/** + * @type {!SVGElementInstance} + */ +SVGElementInstance.prototype.firstChild; + + +/** + * @type {!SVGElementInstance} + */ +SVGElementInstance.prototype.lastChild; + + +/** + * @type {!SVGElementInstance} + */ +SVGElementInstance.prototype.previousSibling; + + +/** + * @type {!SVGElementInstance} + */ +SVGElementInstance.prototype.nextSibling; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onabort; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onblur; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onchange; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onclick; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.oncontextmenu; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.ondblclick; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onerror; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onfocus; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.oninput; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onkeydown; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onkeypress; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onkeyup; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onload; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onmousedown; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onmousemove; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onmouseout; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onmouseover; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onmouseup; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onmousewheel; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onbeforecut; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.oncut; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onbeforecopy; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.oncopy; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onbeforepaste; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onpaste; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.ondragenter; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.ondragover; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.ondragleave; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.ondrop; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.ondragstart; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.ondrag; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.ondragend; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onreset; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onresize; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onscroll; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onsearch; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onselect; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onselectstart; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onsubmit; + + +/** + * @type {!EventListener|function(!Event)} + */ +SVGElementInstance.prototype.onunload; + + +/** + * @override + */ +SVGElementInstance.prototype.addEventListener = function(type, listener, opt_useCapture){}; + + +/** + * @override + */ +SVGElementInstance.prototype.removeEventListener = function(type, listener, opt_useCapture){}; + + +/** + * @param {!Event} event + * @return {boolean} + * @override + */ +SVGElementInstance.prototype.dispatchEvent = function(event){}; + + + +/** + * @constructor + */ +function SVGAnimatedRect(){} + + +/** + * @type {!SVGRect} + */ +SVGAnimatedRect.prototype.baseVal; + + +/** + * @type {!SVGRect} + */ +SVGAnimatedRect.prototype.animVal; + + + +/** + * @constructor + */ +function SVGAnimatedString(){} + + +/** + * @type {string} + */ +SVGAnimatedString.prototype.baseVal; + + +/** + * @type {string} + */ +SVGAnimatedString.prototype.animVal; + + + +/** + * @interface + */ +function SVGStylable(){} + + +/** + * @type {!SVGAnimatedString} + */ +SVGStylable.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + */ +SVGStylable.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @interface + */ +function SVGExternalResourcesRequired(){} + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGExternalResourcesRequired.prototype.externalResourcesRequired; + + + +/** + * @constructor + */ +function SVGPoint(){} + + +/** + * @type {number} + */ +SVGPoint.prototype.x; + + +/** + * @type {number} + */ +SVGPoint.prototype.y; + + +/** + * @param {!SVGMatrix} matrix + * @return {!SVGPoint} + */ +SVGPoint.prototype.matrixTransform = function(matrix){}; + + + +/** + * @constructor + */ +function SVGMatrix(){} + + +/** + * @type {number} + */ +SVGMatrix.prototype.a; + + +/** + * @type {number} + */ +SVGMatrix.prototype.b; + + +/** + * @type {number} + */ +SVGMatrix.prototype.c; + + +/** + * @type {number} + */ +SVGMatrix.prototype.d; + + +/** + * @type {number} + */ +SVGMatrix.prototype.e; + + +/** + * @type {number} + */ +SVGMatrix.prototype.f; + + +/** + * @param {!SVGMatrix} secondMatrix + * @return {!SVGMatrix} + */ +SVGMatrix.prototype.multiply = function(secondMatrix){}; + + +/** + * @return {!SVGMatrix} + */ +SVGMatrix.prototype.inverse = function(){}; + + +/** + * @param {number} x + * @param {number} y + * @return {!SVGMatrix} + */ +SVGMatrix.prototype.translate = function(x, y){}; + + +/** + * @param {number} scaleFactor + * @return {!SVGMatrix} + */ +SVGMatrix.prototype.scale = function(scaleFactor){}; + + +/** + * @param {number} scaleFactorX + * @param {number} scaleFactorY + * @return {!SVGMatrix} + */ +SVGMatrix.prototype.scaleNonUniform = function(scaleFactorX, scaleFactorY){}; + + +/** + * @param {number} angle + * @return {!SVGMatrix} + */ +SVGMatrix.prototype.rotate = function(angle){}; + + +/** + * @param {number} x + * @param {number} y + * @return {!SVGMatrix} + */ +SVGMatrix.prototype.rotateFromVector = function(x, y){}; + + +/** + * @return {!SVGMatrix} + */ +SVGMatrix.prototype.flipX = function(){}; + + +/** + * @return {!SVGMatrix} + */ +SVGMatrix.prototype.flipY = function(){}; + + +/** + * @param {number} angle + * @return {!SVGMatrix} + */ +SVGMatrix.prototype.skewX = function(angle){}; + + +/** + * @param {number} angle + * @return {!SVGMatrix} + */ +SVGMatrix.prototype.skewY = function(angle){}; + + + +/** + * @constructor + */ +function SVGNumberList(){} + + +/** + * @type {number} + */ +SVGNumberList.prototype.numberOfItems; + + +/** */ +SVGNumberList.prototype.clear = function(){}; + + +/** + * @param {!SVGNumber} item + * @return {!SVGNumber} + */ +SVGNumberList.prototype.initialize = function(item){}; + + +/** + * @param {number} index + * @return {!SVGNumber} + */ +SVGNumberList.prototype.getItem = function(index){}; + + +/** + * @param {!SVGNumber} item + * @param {number} index + * @return {!SVGNumber} + */ +SVGNumberList.prototype.insertItemBefore = function(item, index){}; + + +/** + * @param {!SVGNumber} item + * @param {number} index + * @return {!SVGNumber} + */ +SVGNumberList.prototype.replaceItem = function(item, index){}; + + +/** + * @param {number} index + * @return {!SVGNumber} + */ +SVGNumberList.prototype.removeItem = function(index){}; + + +/** + * @param {!SVGNumber} item + * @return {!SVGNumber} + */ +SVGNumberList.prototype.appendItem = function(item){}; + + + +/** + * @interface + */ +function SVGLangSpace(){} + + +/** + * @type {string} + */ +SVGLangSpace.prototype.xmllang; + + +/** + * @type {string} + */ +SVGLangSpace.prototype.xmlspace; + + + +/** + * @constructor + */ +function SVGAnimatedLengthList(){} + + +/** + * @type {!SVGLengthList} + */ +SVGAnimatedLengthList.prototype.baseVal; + + +/** + * @type {!SVGLengthList} + */ +SVGAnimatedLengthList.prototype.animVal; + + + +/** + * @constructor + */ +function SVGAnimatedTransformList(){} + + +/** + * @type {!SVGTransformList} + */ +SVGAnimatedTransformList.prototype.baseVal; + + +/** + * @type {!SVGTransformList} + */ +SVGAnimatedTransformList.prototype.animVal; + + + +/** + * @constructor + */ +function SVGUnitTypes(){} + + +/** + * @const + * @type {number} + */ +SVGUnitTypes.SVG_UNIT_TYPE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGUnitTypes.prototype.SVG_UNIT_TYPE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE; + + +/** + * @const + * @type {number} + */ +SVGUnitTypes.prototype.SVG_UNIT_TYPE_USERSPACEONUSE; + + +/** + * @const + * @type {number} + */ +SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX; + + +/** + * @const + * @type {number} + */ +SVGUnitTypes.prototype.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX; + + + +/** + * @constructor + */ +function SVGLength(){} + + +/** + * @const + * @type {number} + */ +SVGLength.SVG_LENGTHTYPE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGLength.prototype.SVG_LENGTHTYPE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGLength.SVG_LENGTHTYPE_NUMBER; + + +/** + * @const + * @type {number} + */ +SVGLength.prototype.SVG_LENGTHTYPE_NUMBER; + + +/** + * @const + * @type {number} + */ +SVGLength.SVG_LENGTHTYPE_PERCENTAGE; + + +/** + * @const + * @type {number} + */ +SVGLength.prototype.SVG_LENGTHTYPE_PERCENTAGE; + + +/** + * @const + * @type {number} + */ +SVGLength.SVG_LENGTHTYPE_EMS; + + +/** + * @const + * @type {number} + */ +SVGLength.prototype.SVG_LENGTHTYPE_EMS; + + +/** + * @const + * @type {number} + */ +SVGLength.SVG_LENGTHTYPE_EXS; + + +/** + * @const + * @type {number} + */ +SVGLength.prototype.SVG_LENGTHTYPE_EXS; + + +/** + * @const + * @type {number} + */ +SVGLength.SVG_LENGTHTYPE_PX; + + +/** + * @const + * @type {number} + */ +SVGLength.prototype.SVG_LENGTHTYPE_PX; + + +/** + * @const + * @type {number} + */ +SVGLength.SVG_LENGTHTYPE_CM; + + +/** + * @const + * @type {number} + */ +SVGLength.prototype.SVG_LENGTHTYPE_CM; + + +/** + * @const + * @type {number} + */ +SVGLength.SVG_LENGTHTYPE_MM; + + +/** + * @const + * @type {number} + */ +SVGLength.prototype.SVG_LENGTHTYPE_MM; + + +/** + * @const + * @type {number} + */ +SVGLength.SVG_LENGTHTYPE_IN; + + +/** + * @const + * @type {number} + */ +SVGLength.prototype.SVG_LENGTHTYPE_IN; + + +/** + * @const + * @type {number} + */ +SVGLength.SVG_LENGTHTYPE_PT; + + +/** + * @const + * @type {number} + */ +SVGLength.prototype.SVG_LENGTHTYPE_PT; + + +/** + * @const + * @type {number} + */ +SVGLength.SVG_LENGTHTYPE_PC; + + +/** + * @const + * @type {number} + */ +SVGLength.prototype.SVG_LENGTHTYPE_PC; + + +/** + * @type {number} + */ +SVGLength.prototype.unitType; + + +/** + * @type {number} + */ +SVGLength.prototype.value; + + +/** + * @type {number} + */ +SVGLength.prototype.valueInSpecifiedUnits; + + +/** + * @type {string} + */ +SVGLength.prototype.valueAsString; + + +/** + * @param {number} unitType + * @param {number} valueInSpecifiedUnits + * @return {undefined} + */ +SVGLength.prototype.newValueSpecifiedUnits = function(unitType, valueInSpecifiedUnits){}; + + +/** + * @param {number} unitType + * @return {undefined} + */ +SVGLength.prototype.convertToSpecifiedUnits = function(unitType){}; + + + +/** + * @constructor + */ +function SVGAnimatedNumber(){} + + +/** + * @type {number} + */ +SVGAnimatedNumber.prototype.baseVal; + + +/** + * @type {number} + */ +SVGAnimatedNumber.prototype.animVal; + + + +/** + * @constructor + */ +function SVGAnimatedAngle(){} + + +/** + * @type {!SVGAngle} + */ +SVGAnimatedAngle.prototype.baseVal; + + +/** + * @type {!SVGAngle} + */ +SVGAnimatedAngle.prototype.animVal; + + + +/** + * @interface + * @extends {SVGStylable} + */ +function SVGFilterPrimitiveStandardAttributes(){} + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFilterPrimitiveStandardAttributes.prototype.x; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFilterPrimitiveStandardAttributes.prototype.y; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFilterPrimitiveStandardAttributes.prototype.width; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFilterPrimitiveStandardAttributes.prototype.height; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFilterPrimitiveStandardAttributes.prototype.result; + + + +/** + * @constructor + * @extends {SVGGradientElement} + */ +function SVGLinearGradientElement(){} + + +/** + * @type {!SVGAnimatedLength} + */ +SVGLinearGradientElement.prototype.x1; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGLinearGradientElement.prototype.y1; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGLinearGradientElement.prototype.x2; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGLinearGradientElement.prototype.y2; + + + +/** + * @constructor + * @extends {SVGGradientElement} + */ +function SVGRadialGradientElement(){} + + +/** + * @type {!SVGAnimatedLength} + */ +SVGRadialGradientElement.prototype.cx; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGRadialGradientElement.prototype.cy; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGRadialGradientElement.prototype.r; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGRadialGradientElement.prototype.fx; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGRadialGradientElement.prototype.fy; + + + +/** + * @constructor + */ +function SVGTransform(){} + + +/** + * @const + * @type {number} + */ +SVGTransform.SVG_TRANSFORM_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGTransform.prototype.SVG_TRANSFORM_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGTransform.SVG_TRANSFORM_MATRIX; + + +/** + * @const + * @type {number} + */ +SVGTransform.prototype.SVG_TRANSFORM_MATRIX; + + +/** + * @const + * @type {number} + */ +SVGTransform.SVG_TRANSFORM_TRANSLATE; + + +/** + * @const + * @type {number} + */ +SVGTransform.prototype.SVG_TRANSFORM_TRANSLATE; + + +/** + * @const + * @type {number} + */ +SVGTransform.SVG_TRANSFORM_SCALE; + + +/** + * @const + * @type {number} + */ +SVGTransform.prototype.SVG_TRANSFORM_SCALE; + + +/** + * @const + * @type {number} + */ +SVGTransform.SVG_TRANSFORM_ROTATE; + + +/** + * @const + * @type {number} + */ +SVGTransform.prototype.SVG_TRANSFORM_ROTATE; + + +/** + * @const + * @type {number} + */ +SVGTransform.SVG_TRANSFORM_SKEWX; + + +/** + * @const + * @type {number} + */ +SVGTransform.prototype.SVG_TRANSFORM_SKEWX; + + +/** + * @const + * @type {number} + */ +SVGTransform.SVG_TRANSFORM_SKEWY; + + +/** + * @const + * @type {number} + */ +SVGTransform.prototype.SVG_TRANSFORM_SKEWY; + + +/** + * @type {number} + */ +SVGTransform.prototype.type; + + +/** + * @type {!SVGMatrix} + */ +SVGTransform.prototype.matrix; + + +/** + * @type {number} + */ +SVGTransform.prototype.angle; + + +/** + * @param {!SVGMatrix} matrix + * @return {undefined} + */ +SVGTransform.prototype.setMatrix = function(matrix){}; + + +/** + * @param {number} tx + * @param {number} ty + * @return {undefined} + */ +SVGTransform.prototype.setTranslate = function(tx, ty){}; + + +/** + * @param {number} sx + * @param {number} sy + * @return {undefined} + */ +SVGTransform.prototype.setScale = function(sx, sy){}; + + +/** + * @param {number} angle + * @param {number} cx + * @param {number} cy + * @return {undefined} + */ +SVGTransform.prototype.setRotate = function(angle, cx, cy){}; + + +/** + * @param {number} angle + * @return {undefined} + */ +SVGTransform.prototype.setSkewX = function(angle){}; + + +/** + * @param {number} angle + * @return {undefined} + */ +SVGTransform.prototype.setSkewY = function(angle){}; + + + +/** + * @interface + */ +function SVGZoomAndPan(){} + +/** + * @type {number} + */ +SVGZoomAndPan.prototype.zoomAndPan; + + + +/** + * @constructor + */ +function SVGPreserveAspectRatio(){} + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.prototype.SVG_PRESERVEASPECTRATIO_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_NONE; + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.prototype.SVG_PRESERVEASPECTRATIO_NONE; + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMIN; + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.prototype.SVG_PRESERVEASPECTRATIO_XMINYMIN; + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMIN; + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.prototype.SVG_PRESERVEASPECTRATIO_XMIDYMIN; + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMIN; + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.prototype.SVG_PRESERVEASPECTRATIO_XMAXYMIN; + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMID; + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.prototype.SVG_PRESERVEASPECTRATIO_XMINYMID; + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMID; + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.prototype.SVG_PRESERVEASPECTRATIO_XMIDYMID; + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMID; + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.prototype.SVG_PRESERVEASPECTRATIO_XMAXYMID; + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMAX; + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.prototype.SVG_PRESERVEASPECTRATIO_XMINYMAX; + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMAX; + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.prototype.SVG_PRESERVEASPECTRATIO_XMIDYMAX; + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMAX; + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.prototype.SVG_PRESERVEASPECTRATIO_XMAXYMAX; + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.SVG_MEETORSLICE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.prototype.SVG_MEETORSLICE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.SVG_MEETORSLICE_MEET; + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.prototype.SVG_MEETORSLICE_MEET; + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.SVG_MEETORSLICE_SLICE; + + +/** + * @const + * @type {number} + */ +SVGPreserveAspectRatio.prototype.SVG_MEETORSLICE_SLICE; + + +/** + * @type {number} + */ +SVGPreserveAspectRatio.prototype.align; + + +/** + * @type {number} + */ +SVGPreserveAspectRatio.prototype.meetOrSlice; + + + +/** + * @constructor + */ +function SVGRect(){} + + +/** + * @type {number} + */ +SVGRect.prototype.x; + + +/** + * @type {number} + */ +SVGRect.prototype.y; + + +/** + * @type {number} + */ +SVGRect.prototype.width; + + +/** + * @type {number} + */ +SVGRect.prototype.height; + + + +/** + * @constructor + */ +function SVGException(){} + + +/** + * @const + * @type {number} + */ +SVGException.SVG_WRONG_TYPE_ERR; + + +/** + * @const + * @type {number} + */ +SVGException.prototype.SVG_WRONG_TYPE_ERR; + + +/** + * @const + * @type {number} + */ +SVGException.SVG_INVALID_VALUE_ERR; + + +/** + * @const + * @type {number} + */ +SVGException.prototype.SVG_INVALID_VALUE_ERR; + + +/** + * @const + * @type {number} + */ +SVGException.SVG_MATRIX_NOT_INVERTABLE; + + +/** + * @const + * @type {number} + */ +SVGException.prototype.SVG_MATRIX_NOT_INVERTABLE; + + +/** + * @type {number} + */ +SVGException.prototype.code; + + +/** + * @type {string} + */ +SVGException.prototype.name; + + +/** + * @type {string} + */ +SVGException.prototype.message; + + +/** + * @return {string} + * @override + */ +SVGException.prototype.toString = function(){}; + + + +/** + * @constructor + * @extends {CSSValue} + */ +function SVGColor(){} + + +/** + * @const + * @type {number} + */ +SVGColor.SVG_COLORTYPE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGColor.prototype.SVG_COLORTYPE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGColor.SVG_COLORTYPE_RGBCOLOR; + + +/** + * @const + * @type {number} + */ +SVGColor.prototype.SVG_COLORTYPE_RGBCOLOR; + + +/** + * @const + * @type {number} + */ +SVGColor.SVG_COLORTYPE_RGBCOLOR_ICCCOLOR; + + +/** + * @const + * @type {number} + */ +SVGColor.prototype.SVG_COLORTYPE_RGBCOLOR_ICCCOLOR; + + +/** + * @const + * @type {number} + */ +SVGColor.SVG_COLORTYPE_CURRENTCOLOR; + + +/** + * @const + * @type {number} + */ +SVGColor.prototype.SVG_COLORTYPE_CURRENTCOLOR; + + +/** + * @type {number} + */ +SVGColor.prototype.colorType; + + +/** + * @type {!RGBColor} + */ +SVGColor.prototype.rgbColor; + + +/** + * @param {string} rgbColor + * @return {undefined} + */ +SVGColor.prototype.setRGBColor = function(rgbColor){}; + + +/** + * @param {string} rgbColor + * @param {string} iccColor + * @return {undefined} + */ +SVGColor.prototype.setRGBColorICCColor = function(rgbColor, iccColor){}; + + +/** + * @param {number} colorType + * @param {string} rgbColor + * @param {string} iccColor + * @return {undefined} + */ +SVGColor.prototype.setColor = function(colorType, rgbColor, iccColor){}; + + + +/** + * @constructor + * @extends {SVGColor} + */ +function SVGPaint(){} + + +/** + * @const + * @type {number} + */ +SVGPaint.SVG_PAINTTYPE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGPaint.prototype.SVG_PAINTTYPE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGPaint.SVG_PAINTTYPE_RGBCOLOR; + + +/** + * @const + * @type {number} + */ +SVGPaint.prototype.SVG_PAINTTYPE_RGBCOLOR; + + +/** + * @const + * @type {number} + */ +SVGPaint.SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR; + + +/** + * @const + * @type {number} + */ +SVGPaint.prototype.SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR; + + +/** + * @const + * @type {number} + */ +SVGPaint.SVG_PAINTTYPE_NONE; + + +/** + * @const + * @type {number} + */ +SVGPaint.prototype.SVG_PAINTTYPE_NONE; + + +/** + * @const + * @type {number} + */ +SVGPaint.SVG_PAINTTYPE_CURRENTCOLOR; + + +/** + * @const + * @type {number} + */ +SVGPaint.prototype.SVG_PAINTTYPE_CURRENTCOLOR; + + +/** + * @const + * @type {number} + */ +SVGPaint.SVG_PAINTTYPE_URI_NONE; + + +/** + * @const + * @type {number} + */ +SVGPaint.prototype.SVG_PAINTTYPE_URI_NONE; + + +/** + * @const + * @type {number} + */ +SVGPaint.SVG_PAINTTYPE_URI_CURRENTCOLOR; + + +/** + * @const + * @type {number} + */ +SVGPaint.prototype.SVG_PAINTTYPE_URI_CURRENTCOLOR; + + +/** + * @const + * @type {number} + */ +SVGPaint.SVG_PAINTTYPE_URI_RGBCOLOR; + + +/** + * @const + * @type {number} + */ +SVGPaint.prototype.SVG_PAINTTYPE_URI_RGBCOLOR; + + +/** + * @const + * @type {number} + */ +SVGPaint.SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR; + + +/** + * @const + * @type {number} + */ +SVGPaint.prototype.SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR; + + +/** + * @const + * @type {number} + */ +SVGPaint.SVG_PAINTTYPE_URI; + + +/** + * @const + * @type {number} + */ +SVGPaint.prototype.SVG_PAINTTYPE_URI; + + +/** + * @type {number} + */ +SVGPaint.prototype.paintType; + + +/** + * @type {string} + */ +SVGPaint.prototype.uri; + + +/** + * @param {string} uri + * @return {undefined} + */ +SVGPaint.prototype.setUri = function(uri){}; + + +/** + * @param {number} paintType + * @param {string} uri + * @param {string} rgbColor + * @param {string} iccColor + * @return {undefined} + */ +SVGPaint.prototype.setPaint = function(paintType, uri, rgbColor, iccColor){}; + + + +/** + * @constructor + */ +function SVGPointList(){} + + +/** + * @type {number} + */ +SVGPointList.prototype.numberOfItems; + + +/** */ +SVGPointList.prototype.clear = function(){}; + + +/** + * @param {!SVGPoint} item + * @return {!SVGPoint} + */ +SVGPointList.prototype.initialize = function(item){}; + + +/** + * @param {number} index + * @return {!SVGPoint} + */ +SVGPointList.prototype.getItem = function(index){}; + + +/** + * @param {!SVGPoint} item + * @param {number} index + * @return {!SVGPoint} + */ +SVGPointList.prototype.insertItemBefore = function(item, index){}; + + +/** + * @param {!SVGPoint} item + * @param {number} index + * @return {!SVGPoint} + */ +SVGPointList.prototype.replaceItem = function(item, index){}; + + +/** + * @param {number} index + * @return {!SVGPoint} + */ +SVGPointList.prototype.removeItem = function(index){}; + + +/** + * @param {!SVGPoint} item + * @return {!SVGPoint} + */ +SVGPointList.prototype.appendItem = function(item){}; + + + +/** + * @constructor + */ +function SVGTransformList(){} + + +/** + * @type {number} + */ +SVGTransformList.prototype.numberOfItems; + + +/** */ +SVGTransformList.prototype.clear = function(){}; + + +/** + * @param {!SVGTransform} item + * @return {!SVGTransform} + */ +SVGTransformList.prototype.initialize = function(item){}; + + +/** + * @param {number} index + * @return {!SVGTransform} + */ +SVGTransformList.prototype.getItem = function(index){}; + + +/** + * @param {!SVGTransform} item + * @param {number} index + * @return {!SVGTransform} + */ +SVGTransformList.prototype.insertItemBefore = function(item, index){}; + + +/** + * @param {!SVGTransform} item + * @param {number} index + * @return {!SVGTransform} + */ +SVGTransformList.prototype.replaceItem = function(item, index){}; + + +/** + * @param {number} index + * @return {!SVGTransform} + */ +SVGTransformList.prototype.removeItem = function(index){}; + + +/** + * @param {!SVGTransform} item + * @return {!SVGTransform} + */ +SVGTransformList.prototype.appendItem = function(item){}; + + +/** + * @param {!SVGMatrix} matrix + * @return {!SVGTransform} + */ +SVGTransformList.prototype.createSVGTransformFromMatrix = function(matrix){}; + + +/** + * @return {!SVGTransform} + */ +SVGTransformList.prototype.consolidate = function(){}; + + + +/** + * @constructor + * @extends {UIEvent} + */ +function SVGZoomEvent(){} + + +/** + * @type {!SVGRect} + */ +SVGZoomEvent.prototype.zoomRectScreen; + + +/** + * @type {number} + */ +SVGZoomEvent.prototype.previousScale; + + +/** + * @type {!SVGPoint} + */ +SVGZoomEvent.prototype.previousTranslate; + + +/** + * @type {number} + */ +SVGZoomEvent.prototype.newScale; + + +/** + * @type {!SVGPoint} + */ +SVGZoomEvent.prototype.newTranslate; + + + +/** + * @constructor + * @extends {SVGTextContentElement} + */ +function SVGTextPositioningElement(){} + + +/** + * @type {!SVGAnimatedLengthList} + */ +SVGTextPositioningElement.prototype.x; + + +/** + * @type {!SVGAnimatedLengthList} + */ +SVGTextPositioningElement.prototype.y; + + +/** + * @type {!SVGAnimatedLengthList} + */ +SVGTextPositioningElement.prototype.dx; + + +/** + * @type {!SVGAnimatedLengthList} + */ +SVGTextPositioningElement.prototype.dy; + + +/** + * @type {!SVGAnimatedNumberList} + */ +SVGTextPositioningElement.prototype.rotate; + + + +/** + * @constructor + * @extends {SVGTextPositioningElement} + */ +function SVGTSpanElement(){} + + + +/** + * @constructor + */ +function SVGStringList(){} + + +/** + * @type {number} + */ +SVGStringList.prototype.numberOfItems; + + +/** */ +SVGStringList.prototype.clear = function(){}; + + +/** + * @param {string} item + * @return {string} + */ +SVGStringList.prototype.initialize = function(item){}; + + +/** + * @param {number} index + * @return {string} + */ +SVGStringList.prototype.getItem = function(index){}; + + +/** + * @param {string} item + * @param {number} index + * @return {string} + */ +SVGStringList.prototype.insertItemBefore = function(item, index){}; + + +/** + * @param {string} item + * @param {number} index + * @return {string} + */ +SVGStringList.prototype.replaceItem = function(item, index){}; + + +/** + * @param {number} index + * @return {string} + */ +SVGStringList.prototype.removeItem = function(index){}; + + +/** + * @param {string} item + * @return {string} + */ +SVGStringList.prototype.appendItem = function(item){}; + + + +/** + * @interface + */ +function SVGURIReference(){} + + +/** + * @type {!SVGAnimatedString} + */ +SVGURIReference.prototype.href; + + + +/** + * @constructor + * @extends {SVGTextPositioningElement} + * @implements {SVGURIReference} + */ +function SVGTRefElement(){} + + +/** + * @type {!SVGAnimatedString} + */ +SVGTRefElement.prototype.href; + + + +/** + * @constructor + * @extends {SVGTextContentElement} + * @implements {SVGURIReference} + */ +function SVGTextPathElement(){} + + +/** + * @const + * @type {number} + */ +SVGTextPathElement.TEXTPATH_METHODTYPE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGTextPathElement.prototype.TEXTPATH_METHODTYPE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGTextPathElement.TEXTPATH_METHODTYPE_ALIGN; + + +/** + * @const + * @type {number} + */ +SVGTextPathElement.prototype.TEXTPATH_METHODTYPE_ALIGN; + + +/** + * @const + * @type {number} + */ +SVGTextPathElement.TEXTPATH_METHODTYPE_STRETCH; + + +/** + * @const + * @type {number} + */ +SVGTextPathElement.prototype.TEXTPATH_METHODTYPE_STRETCH; + + +/** + * @const + * @type {number} + */ +SVGTextPathElement.TEXTPATH_SPACINGTYPE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGTextPathElement.prototype.TEXTPATH_SPACINGTYPE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGTextPathElement.TEXTPATH_SPACINGTYPE_AUTO; + + +/** + * @const + * @type {number} + */ +SVGTextPathElement.prototype.TEXTPATH_SPACINGTYPE_AUTO; + + +/** + * @const + * @type {number} + */ +SVGTextPathElement.TEXTPATH_SPACINGTYPE_EXACT; + + +/** + * @const + * @type {number} + */ +SVGTextPathElement.prototype.TEXTPATH_SPACINGTYPE_EXACT; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGTextPathElement.prototype.startOffset; + + +/** + * @type {!SVGAnimatedEnumeration} + */ +SVGTextPathElement.prototype.method; + + +/** + * @type {!SVGAnimatedEnumeration} + */ +SVGTextPathElement.prototype.spacing; + + +/** + * @type {!SVGAnimatedString} + */ +SVGTextPathElement.prototype.href; + + + +/** + * @constructor + * @extends {SVGTextPositioningElement} + * @implements {SVGURIReference} + */ +function SVGAltGlyphElement(){} + + +/** + * @type {string} + */ +SVGAltGlyphElement.prototype.glyphRef; + + +/** + * @type {string} + */ +SVGAltGlyphElement.prototype.format; + + +/** + * @type {!SVGAnimatedString} + */ +SVGAltGlyphElement.prototype.href; + + + +/** + * @constructor + * @extends {SVGComponentTransferFunctionElement} + */ +function SVGFEFuncGElement(){} + + + +/** + * @constructor + * @extends {SVGComponentTransferFunctionElement} + */ +function SVGFEFuncAElement(){} + + + +/** + * @constructor + * @extends {SVGComponentTransferFunctionElement} + */ +function SVGFEFuncRElement(){} + + + +/** + * @constructor + */ +function SVGNumber(){} + + +/** + * @type {number} + */ +SVGNumber.prototype.value; + + + +/** + * @interface + */ +function SVGTests(){} + + +/** + * @type {!SVGStringList} + */ +SVGTests.prototype.requiredFeatures; + + +/** + * @type {!SVGStringList} + */ +SVGTests.prototype.requiredExtensions; + + +/** + * @type {!SVGStringList} + */ +SVGTests.prototype.systemLanguage; + + +/** + * @param {string=} opt_extension + * @return {boolean} + */ +SVGTests.prototype.hasExtension = function(opt_extension){}; + + + +/** + * @constructor + */ +function SVGPathSeg(){} + + +/** + * @const + * @type {number} + */ +SVGPathSeg.PATHSEG_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.prototype.PATHSEG_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.PATHSEG_CLOSEPATH; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.prototype.PATHSEG_CLOSEPATH; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.PATHSEG_MOVETO_ABS; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.prototype.PATHSEG_MOVETO_ABS; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.PATHSEG_MOVETO_REL; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.prototype.PATHSEG_MOVETO_REL; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.PATHSEG_LINETO_ABS; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.prototype.PATHSEG_LINETO_ABS; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.PATHSEG_LINETO_REL; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.prototype.PATHSEG_LINETO_REL; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.prototype.PATHSEG_CURVETO_CUBIC_ABS; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.prototype.PATHSEG_CURVETO_CUBIC_REL; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.prototype.PATHSEG_CURVETO_QUADRATIC_ABS; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.prototype.PATHSEG_CURVETO_QUADRATIC_REL; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.PATHSEG_ARC_ABS; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.prototype.PATHSEG_ARC_ABS; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.PATHSEG_ARC_REL; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.prototype.PATHSEG_ARC_REL; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.prototype.PATHSEG_LINETO_HORIZONTAL_ABS; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.prototype.PATHSEG_LINETO_HORIZONTAL_REL; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.prototype.PATHSEG_LINETO_VERTICAL_ABS; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.prototype.PATHSEG_LINETO_VERTICAL_REL; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.prototype.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.prototype.PATHSEG_CURVETO_CUBIC_SMOOTH_REL; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.prototype.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL; + + +/** + * @const + * @type {number} + */ +SVGPathSeg.prototype.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL; + + +/** + * @type {number} + */ +SVGPathSeg.prototype.pathSegType; + + +/** + * @type {string} + */ +SVGPathSeg.prototype.pathSegTypeAsLetter; + + + +/** + * @constructor + * @extends {SVGPathSeg} + */ +function SVGPathSegCurvetoQuadraticSmoothAbs(){} + + +/** + * @type {number} + */ +SVGPathSegCurvetoQuadraticSmoothAbs.prototype.x; + + +/** + * @type {number} + */ +SVGPathSegCurvetoQuadraticSmoothAbs.prototype.y; + + + +/** + * @constructor + * @extends {SVGPathSeg} + */ +function SVGPathSegArcRel(){} + + +/** + * @type {number} + */ +SVGPathSegArcRel.prototype.x; + + +/** + * @type {number} + */ +SVGPathSegArcRel.prototype.y; + + +/** + * @type {number} + */ +SVGPathSegArcRel.prototype.r1; + + +/** + * @type {number} + */ +SVGPathSegArcRel.prototype.r2; + + +/** + * @type {number} + */ +SVGPathSegArcRel.prototype.angle; + + +/** + * @type {boolean} + */ +SVGPathSegArcRel.prototype.largeArcFlag; + + +/** + * @type {boolean} + */ +SVGPathSegArcRel.prototype.sweepFlag; + + + +/** + * @constructor + * @extends {SVGPathSeg} + */ +function SVGPathSegCurvetoQuadraticAbs(){} + + +/** + * @type {number} + */ +SVGPathSegCurvetoQuadraticAbs.prototype.x; + + +/** + * @type {number} + */ +SVGPathSegCurvetoQuadraticAbs.prototype.y; + + +/** + * @type {number} + */ +SVGPathSegCurvetoQuadraticAbs.prototype.x1; + + +/** + * @type {number} + */ +SVGPathSegCurvetoQuadraticAbs.prototype.y1; + + + +/** + * @constructor + * @extends {SVGPathSeg} + */ +function SVGPathSegLinetoHorizontalRel(){} + + +/** + * @type {number} + */ +SVGPathSegLinetoHorizontalRel.prototype.x; + + + +/** + * @constructor + * @extends {SVGPathSeg} + */ +function SVGPathSegLinetoRel(){} + + +/** + * @type {number} + */ +SVGPathSegLinetoRel.prototype.x; + + +/** + * @type {number} + */ +SVGPathSegLinetoRel.prototype.y; + + + +/** + * @constructor + * @extends {SVGPathSeg} + */ +function SVGPathSegCurvetoCubicRel(){} + + +/** + * @type {number} + */ +SVGPathSegCurvetoCubicRel.prototype.x; + + +/** + * @type {number} + */ +SVGPathSegCurvetoCubicRel.prototype.y; + + +/** + * @type {number} + */ +SVGPathSegCurvetoCubicRel.prototype.x1; + + +/** + * @type {number} + */ +SVGPathSegCurvetoCubicRel.prototype.y1; + + +/** + * @type {number} + */ +SVGPathSegCurvetoCubicRel.prototype.x2; + + +/** + * @type {number} + */ +SVGPathSegCurvetoCubicRel.prototype.y2; + + + +/** + * @constructor + * @extends {SVGPathSeg} + */ +function SVGPathSegMovetoAbs(){} + + +/** + * @type {number} + */ +SVGPathSegMovetoAbs.prototype.x; + + +/** + * @type {number} + */ +SVGPathSegMovetoAbs.prototype.y; + + + +/** + * @constructor + * @extends {SVGPathSeg} + */ +function SVGPathSegCurvetoQuadraticSmoothRel(){} + + +/** + * @type {number} + */ +SVGPathSegCurvetoQuadraticSmoothRel.prototype.x; + + +/** + * @type {number} + */ +SVGPathSegCurvetoQuadraticSmoothRel.prototype.y; + + + +/** + * @constructor + * @extends {SVGPathSeg} + */ +function SVGPathSegLinetoVerticalRel(){} + + +/** + * @type {number} + */ +SVGPathSegLinetoVerticalRel.prototype.y; + + + +/** + * @constructor + * @extends {SVGPathSeg} + */ +function SVGPathSegLinetoAbs(){} + + +/** + * @type {number} + */ +SVGPathSegLinetoAbs.prototype.x; + + +/** + * @type {number} + */ +SVGPathSegLinetoAbs.prototype.y; + + + +/** + * @constructor + * @extends {SVGPathSeg} + */ +function SVGPathSegCurvetoCubicSmoothRel(){} + + +/** + * @type {number} + */ +SVGPathSegCurvetoCubicSmoothRel.prototype.x; + + +/** + * @type {number} + */ +SVGPathSegCurvetoCubicSmoothRel.prototype.y; + + +/** + * @type {number} + */ +SVGPathSegCurvetoCubicSmoothRel.prototype.x2; + + +/** + * @type {number} + */ +SVGPathSegCurvetoCubicSmoothRel.prototype.y2; + + + +/** + * @constructor + * @extends {SVGPathSeg} + */ +function SVGPathSegLinetoHorizontalAbs(){} + + +/** + * @type {number} + */ +SVGPathSegLinetoHorizontalAbs.prototype.x; + + + +/** + * @constructor + * @extends {SVGPathSeg} + */ +function SVGPathSegCurvetoQuadraticRel(){} + + +/** + * @type {number} + */ +SVGPathSegCurvetoQuadraticRel.prototype.x; + + +/** + * @type {number} + */ +SVGPathSegCurvetoQuadraticRel.prototype.y; + + +/** + * @type {number} + */ +SVGPathSegCurvetoQuadraticRel.prototype.x1; + + +/** + * @type {number} + */ +SVGPathSegCurvetoQuadraticRel.prototype.y1; + + + +/** + * @constructor + * @extends {SVGPathSeg} + */ +function SVGPathSegCurvetoCubicSmoothAbs(){} + + +/** + * @type {number} + */ +SVGPathSegCurvetoCubicSmoothAbs.prototype.x; + + +/** + * @type {number} + */ +SVGPathSegCurvetoCubicSmoothAbs.prototype.y; + + +/** + * @type {number} + */ +SVGPathSegCurvetoCubicSmoothAbs.prototype.x2; + + +/** + * @type {number} + */ +SVGPathSegCurvetoCubicSmoothAbs.prototype.y2; + + + +/** + * @constructor + * @extends {SVGPathSeg} + */ +function SVGPathSegCurvetoCubicAbs(){} + + +/** + * @type {number} + */ +SVGPathSegCurvetoCubicAbs.prototype.x; + + +/** + * @type {number} + */ +SVGPathSegCurvetoCubicAbs.prototype.y; + + +/** + * @type {number} + */ +SVGPathSegCurvetoCubicAbs.prototype.x1; + + +/** + * @type {number} + */ +SVGPathSegCurvetoCubicAbs.prototype.y1; + + +/** + * @type {number} + */ +SVGPathSegCurvetoCubicAbs.prototype.x2; + + +/** + * @type {number} + */ +SVGPathSegCurvetoCubicAbs.prototype.y2; + + + +/** + * @constructor + * @extends {SVGPathSeg} + */ +function SVGPathSegClosePath(){} + + + +/** + * @interface + */ +function SVGFitToViewBox(){} + + +/** + * @type {!SVGAnimatedRect} + */ +SVGFitToViewBox.prototype.viewBox; + + +/** + * @type {!SVGAnimatedPreserveAspectRatio} + */ +SVGFitToViewBox.prototype.preserveAspectRatio; + + + +/** + * @constructor + * @implements {SVGZoomAndPan} + * @implements {SVGFitToViewBox} + */ +function SVGViewSpec(){} + + +/** + * @type {!SVGTransformList} + */ +SVGViewSpec.prototype.transform; + + +/** + * @type {!SVGElement} + */ +SVGViewSpec.prototype.viewTarget; + + +/** + * @type {string} + */ +SVGViewSpec.prototype.viewBoxString; + + +/** + * @type {string} + */ +SVGViewSpec.prototype.preserveAspectRatioString; + + +/** + * @type {string} + */ +SVGViewSpec.prototype.transformString; + + +/** + * @type {string} + */ +SVGViewSpec.prototype.viewTargetString; + + +/** + * @const + * @type {number} + */ +SVGViewSpec.SVG_ZOOMANDPAN_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGViewSpec.prototype.SVG_ZOOMANDPAN_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGViewSpec.SVG_ZOOMANDPAN_DISABLE; + + +/** + * @const + * @type {number} + */ +SVGViewSpec.prototype.SVG_ZOOMANDPAN_DISABLE; + + +/** + * @const + * @type {number} + */ +SVGViewSpec.SVG_ZOOMANDPAN_MAGNIFY; + + +/** + * @const + * @type {number} + */ +SVGViewSpec.prototype.SVG_ZOOMANDPAN_MAGNIFY; + + +/** + * @type {number} + */ +SVGViewSpec.prototype.zoomAndPan; + + +/** + * @type {!SVGAnimatedRect} + */ +SVGViewSpec.prototype.viewBox; + + +/** + * @type {!SVGAnimatedPreserveAspectRatio} + */ +SVGViewSpec.prototype.preserveAspectRatio; + + + +/** + * @constructor + */ +function SVGRenderingIntent(){} + + +/** + * @const + * @type {number} + */ +SVGRenderingIntent.RENDERING_INTENT_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGRenderingIntent.prototype.RENDERING_INTENT_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGRenderingIntent.RENDERING_INTENT_AUTO; + + +/** + * @const + * @type {number} + */ +SVGRenderingIntent.prototype.RENDERING_INTENT_AUTO; + + +/** + * @const + * @type {number} + */ +SVGRenderingIntent.RENDERING_INTENT_PERCEPTUAL; + + +/** + * @const + * @type {number} + */ +SVGRenderingIntent.prototype.RENDERING_INTENT_PERCEPTUAL; + + +/** + * @const + * @type {number} + */ +SVGRenderingIntent.RENDERING_INTENT_RELATIVE_COLORIMETRIC; + + +/** + * @const + * @type {number} + */ +SVGRenderingIntent.prototype.RENDERING_INTENT_RELATIVE_COLORIMETRIC; + + +/** + * @const + * @type {number} + */ +SVGRenderingIntent.RENDERING_INTENT_SATURATION; + + +/** + * @const + * @type {number} + */ +SVGRenderingIntent.prototype.RENDERING_INTENT_SATURATION; + + +/** + * @const + * @type {number} + */ +SVGRenderingIntent.RENDERING_INTENT_ABSOLUTE_COLORIMETRIC; + + +/** + * @const + * @type {number} + */ +SVGRenderingIntent.prototype.RENDERING_INTENT_ABSOLUTE_COLORIMETRIC; + + + +/** + * @constructor + * @extends {SVGPathSeg} + */ +function SVGPathSegLinetoVerticalAbs(){} + + +/** + * @type {number} + */ +SVGPathSegLinetoVerticalAbs.prototype.y; + + + +/** + * @constructor + */ +function SVGPathSegList(){} + + +/** + * @type {number} + */ +SVGPathSegList.prototype.numberOfItems; + + +/** */ +SVGPathSegList.prototype.clear = function(){}; + + +/** + * @param {!SVGPathSeg} newItem + * @return {!SVGPathSeg} + */ +SVGPathSegList.prototype.initialize = function(newItem){}; + + +/** + * @param {number} index + * @return {!SVGPathSeg} + */ +SVGPathSegList.prototype.getItem = function(index){}; + + +/** + * @param {!SVGPathSeg} newItem + * @param {number} index + * @return {!SVGPathSeg} + */ +SVGPathSegList.prototype.insertItemBefore = function(newItem, index){}; + + +/** + * @param {!SVGPathSeg} newItem + * @param {number} index + * @return {!SVGPathSeg} + */ +SVGPathSegList.prototype.replaceItem = function(newItem, index){}; + + +/** + * @param {number} index + * @return {!SVGPathSeg} + */ +SVGPathSegList.prototype.removeItem = function(index){}; + + +/** + * @param {!SVGPathSeg} newItem + * @return {!SVGPathSeg} + */ +SVGPathSegList.prototype.appendItem = function(newItem){}; + + + +/** + * @constructor + * @extends {Document} + */ +function SVGDocument(){} + + +/** + * @type {!SVGSVGElement} + */ +SVGDocument.prototype.rootElement; + + +/** + * @param {string=} opt_eventType + * @return {!Event} + * @override + */ +SVGDocument.prototype.createEvent = function(opt_eventType){}; + + + +/** + * @constructor + * @extends {SVGElement} + */ +function SVGAltGlyphItemElement(){} + + + +/** + * @constructor + * @extends {SVGElement} + */ +function SVGFontFaceFormatElement(){} + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGFilterPrimitiveStandardAttributes} + */ +function SVGFECompositeElement(){} + + +/** + * @const + * @type {number} + */ +SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGFECompositeElement.prototype.SVG_FECOMPOSITE_OPERATOR_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_OVER; + + +/** + * @const + * @type {number} + */ +SVGFECompositeElement.prototype.SVG_FECOMPOSITE_OPERATOR_OVER; + + +/** + * @const + * @type {number} + */ +SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_IN; + + +/** + * @const + * @type {number} + */ +SVGFECompositeElement.prototype.SVG_FECOMPOSITE_OPERATOR_IN; + + +/** + * @const + * @type {number} + */ +SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_OUT; + + +/** + * @const + * @type {number} + */ +SVGFECompositeElement.prototype.SVG_FECOMPOSITE_OPERATOR_OUT; + + +/** + * @const + * @type {number} + */ +SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_ATOP; + + +/** + * @const + * @type {number} + */ +SVGFECompositeElement.prototype.SVG_FECOMPOSITE_OPERATOR_ATOP; + + +/** + * @const + * @type {number} + */ +SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_XOR; + + +/** + * @const + * @type {number} + */ +SVGFECompositeElement.prototype.SVG_FECOMPOSITE_OPERATOR_XOR; + + +/** + * @const + * @type {number} + */ +SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_ARITHMETIC; + + +/** + * @const + * @type {number} + */ +SVGFECompositeElement.prototype.SVG_FECOMPOSITE_OPERATOR_ARITHMETIC; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFECompositeElement.prototype.in1; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFECompositeElement.prototype.in2; + + +/** + * @type {!SVGAnimatedEnumeration} + */ +SVGFECompositeElement.prototype.operator; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFECompositeElement.prototype.k1; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFECompositeElement.prototype.k2; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFECompositeElement.prototype.k3; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFECompositeElement.prototype.k4; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFECompositeElement.prototype.x; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFECompositeElement.prototype.y; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFECompositeElement.prototype.width; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFECompositeElement.prototype.height; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFECompositeElement.prototype.result; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFECompositeElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGFECompositeElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGLangSpace} + * @implements {SVGStylable} + */ +function SVGDescElement(){} + + +/** + * @type {string} + */ +SVGDescElement.prototype.xmllang; + + +/** + * @type {string} + */ +SVGDescElement.prototype.xmlspace; + + +/** + * @type {!SVGAnimatedString} + */ +SVGDescElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGDescElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGTests} + * @implements {SVGLangSpace} + * @implements {SVGExternalResourcesRequired} + * @implements {SVGStylable} + * @implements {SVGTransformable} + */ +function SVGEllipseElement(){} + + +/** + * @type {!SVGAnimatedLength} + */ +SVGEllipseElement.prototype.cx; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGEllipseElement.prototype.cy; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGEllipseElement.prototype.rx; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGEllipseElement.prototype.ry; + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGEllipseElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGAnimatedTransformList} + */ +SVGEllipseElement.prototype.transform; + + +/** + * @type {string} + */ +SVGEllipseElement.prototype.xmllang; + + +/** + * @type {string} + */ +SVGEllipseElement.prototype.xmlspace; + + +/** + * @type {!SVGElement} + */ +SVGEllipseElement.prototype.nearestViewportElement; + + +/** + * @type {!SVGElement} + * @override + */ +SVGEllipseElement.prototype.farthestViewportElement; + + +/** + * @return {!SVGRect} + * @override + */ +SVGEllipseElement.prototype.getBBox = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGEllipseElement.prototype.getCTM = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGEllipseElement.prototype.getScreenCTM = function(){}; + + +/** + * @param {!SVGElement=} opt_element + * @return {!SVGMatrix} + * @override + */ +SVGEllipseElement.prototype.getTransformToElement = function(opt_element){}; + + +/** + * @type {!SVGStringList} + */ +SVGEllipseElement.prototype.requiredFeatures; + + +/** + * @type {!SVGStringList} + */ +SVGEllipseElement.prototype.requiredExtensions; + + +/** + * @type {!SVGStringList} + */ +SVGEllipseElement.prototype.systemLanguage; + + +/** + * @param {string=} opt_extension + * @return {boolean} + * @override + */ +SVGEllipseElement.prototype.hasExtension = function(opt_extension){}; + + +/** + * @type {!SVGAnimatedString} + */ +SVGEllipseElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGEllipseElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGFilterPrimitiveStandardAttributes} + */ +function SVGFESpecularLightingElement(){} + + +/** + * @type {!SVGAnimatedString} + */ +SVGFESpecularLightingElement.prototype.in1; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFESpecularLightingElement.prototype.surfaceScale; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFESpecularLightingElement.prototype.specularConstant; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFESpecularLightingElement.prototype.specularExponent; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFESpecularLightingElement.prototype.x; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFESpecularLightingElement.prototype.y; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFESpecularLightingElement.prototype.width; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFESpecularLightingElement.prototype.height; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFESpecularLightingElement.prototype.result; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFESpecularLightingElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGFESpecularLightingElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGFilterPrimitiveStandardAttributes} + */ +function SVGFEColorMatrixElement(){} + + +/** + * @const + * @type {number} + */ +SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGFEColorMatrixElement.prototype.SVG_FECOLORMATRIX_TYPE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_MATRIX; + + +/** + * @const + * @type {number} + */ +SVGFEColorMatrixElement.prototype.SVG_FECOLORMATRIX_TYPE_MATRIX; + + +/** + * @const + * @type {number} + */ +SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_SATURATE; + + +/** + * @const + * @type {number} + */ +SVGFEColorMatrixElement.prototype.SVG_FECOLORMATRIX_TYPE_SATURATE; + + +/** + * @const + * @type {number} + */ +SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_HUEROTATE; + + +/** + * @const + * @type {number} + */ +SVGFEColorMatrixElement.prototype.SVG_FECOLORMATRIX_TYPE_HUEROTATE; + + +/** + * @const + * @type {number} + */ +SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA; + + +/** + * @const + * @type {number} + */ +SVGFEColorMatrixElement.prototype.SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEColorMatrixElement.prototype.in1; + + +/** + * @type {!SVGAnimatedEnumeration} + */ +SVGFEColorMatrixElement.prototype.type; + + +/** + * @type {!SVGAnimatedNumberList} + */ +SVGFEColorMatrixElement.prototype.values; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEColorMatrixElement.prototype.x; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEColorMatrixElement.prototype.y; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEColorMatrixElement.prototype.width; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEColorMatrixElement.prototype.height; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEColorMatrixElement.prototype.result; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEColorMatrixElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGFEColorMatrixElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGLangSpace} + * @implements {SVGExternalResourcesRequired} + * @implements {SVGStylable} + * @implements {SVGFitToViewBox} + */ +function SVGSymbolElement(){} + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGSymbolElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGAnimatedRect} + */ +SVGSymbolElement.prototype.viewBox; + + +/** + * @type {!SVGAnimatedPreserveAspectRatio} + */ +SVGSymbolElement.prototype.preserveAspectRatio; + + +/** + * @type {string} + */ +SVGSymbolElement.prototype.xmllang; + + +/** + * @type {string} + */ +SVGSymbolElement.prototype.xmlspace; + + +/** + * @type {!SVGAnimatedString} + */ +SVGSymbolElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGSymbolElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGFilterPrimitiveStandardAttributes} + */ +function SVGFEConvolveMatrixElement(){} + + +/** + * @const + * @type {number} + */ +SVGFEConvolveMatrixElement.SVG_EDGEMODE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGFEConvolveMatrixElement.prototype.SVG_EDGEMODE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGFEConvolveMatrixElement.SVG_EDGEMODE_DUPLICATE; + + +/** + * @const + * @type {number} + */ +SVGFEConvolveMatrixElement.prototype.SVG_EDGEMODE_DUPLICATE; + + +/** + * @const + * @type {number} + */ +SVGFEConvolveMatrixElement.SVG_EDGEMODE_WRAP; + + +/** + * @const + * @type {number} + */ +SVGFEConvolveMatrixElement.prototype.SVG_EDGEMODE_WRAP; + + +/** + * @const + * @type {number} + */ +SVGFEConvolveMatrixElement.SVG_EDGEMODE_NONE; + + +/** + * @const + * @type {number} + */ +SVGFEConvolveMatrixElement.prototype.SVG_EDGEMODE_NONE; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEConvolveMatrixElement.prototype.in1; + + +/** + * @type {!SVGAnimatedInteger} + */ +SVGFEConvolveMatrixElement.prototype.orderX; + + +/** + * @type {!SVGAnimatedInteger} + */ +SVGFEConvolveMatrixElement.prototype.orderY; + + +/** + * @type {!SVGAnimatedNumberList} + */ +SVGFEConvolveMatrixElement.prototype.kernelMatrix; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFEConvolveMatrixElement.prototype.divisor; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFEConvolveMatrixElement.prototype.bias; + + +/** + * @type {!SVGAnimatedInteger} + */ +SVGFEConvolveMatrixElement.prototype.targetX; + + +/** + * @type {!SVGAnimatedInteger} + */ +SVGFEConvolveMatrixElement.prototype.targetY; + + +/** + * @type {!SVGAnimatedEnumeration} + */ +SVGFEConvolveMatrixElement.prototype.edgeMode; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFEConvolveMatrixElement.prototype.kernelUnitLengthX; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFEConvolveMatrixElement.prototype.kernelUnitLengthY; + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGFEConvolveMatrixElement.prototype.preserveAlpha; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEConvolveMatrixElement.prototype.x; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEConvolveMatrixElement.prototype.y; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEConvolveMatrixElement.prototype.width; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEConvolveMatrixElement.prototype.height; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEConvolveMatrixElement.prototype.result; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEConvolveMatrixElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGFEConvolveMatrixElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGFilterPrimitiveStandardAttributes} + */ +function SVGFEFloodElement(){} + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEFloodElement.prototype.x; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEFloodElement.prototype.y; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEFloodElement.prototype.width; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEFloodElement.prototype.height; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEFloodElement.prototype.result; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEFloodElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGFEFloodElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGStylable} + */ +function SVGStopElement(){} + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGStopElement.prototype.offset; + + +/** + * @type {!SVGAnimatedString} + */ +SVGStopElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGStopElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + */ +function SVGGlyphElement(){} + + + +/** + * @constructor + * @extends {SVGElement} + */ +function SVGHKernElement(){} + + + +/** + * @constructor + * @extends {SVGElement} + */ +function SVGVKernElement(){} + + + +/** + * @constructor + * @extends {SVGElement} + */ +function SVGFontElement(){} + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGFilterPrimitiveStandardAttributes} + */ +function SVGFEOffsetElement(){} + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEOffsetElement.prototype.in1; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFEOffsetElement.prototype.dx; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFEOffsetElement.prototype.dy; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEOffsetElement.prototype.x; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEOffsetElement.prototype.y; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEOffsetElement.prototype.width; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEOffsetElement.prototype.height; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEOffsetElement.prototype.result; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEOffsetElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGFEOffsetElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGURIReference} + * @implements {SVGLangSpace} + * @implements {SVGExternalResourcesRequired} + * @implements {SVGStylable} + */ +function SVGFilterElement(){} + + +/** + * @type {!SVGAnimatedEnumeration} + */ +SVGFilterElement.prototype.filterUnits; + + +/** + * @type {!SVGAnimatedEnumeration} + */ +SVGFilterElement.prototype.primitiveUnits; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFilterElement.prototype.x; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFilterElement.prototype.y; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFilterElement.prototype.width; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFilterElement.prototype.height; + + +/** + * @type {!SVGAnimatedInteger} + */ +SVGFilterElement.prototype.filterResX; + + +/** + * @type {!SVGAnimatedInteger} + */ +SVGFilterElement.prototype.filterResY; + + +/** + * @param {number=} opt_filterResX + * @param {number=} opt_filterResY + * @return {undefined} + */ +SVGFilterElement.prototype.setFilterRes = function(opt_filterResX, opt_filterResY){}; + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGFilterElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFilterElement.prototype.href; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFilterElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGFilterElement.prototype.getPresentationAttribute = function(opt_name){}; + + +/** + * @type {string} + */ +SVGFilterElement.prototype.xmllang; + + +/** + * @type {string} + */ +SVGFilterElement.prototype.xmlspace; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGFilterPrimitiveStandardAttributes} + */ +function SVGFEGaussianBlurElement(){} + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEGaussianBlurElement.prototype.in1; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFEGaussianBlurElement.prototype.stdDeviationX; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFEGaussianBlurElement.prototype.stdDeviationY; + + +/** + * @param {number=} opt_stdDeviationX + * @param {number=} opt_stdDeviationY + * @return {undefined} + */ +SVGFEGaussianBlurElement.prototype.setStdDeviation = function(opt_stdDeviationX, opt_stdDeviationY){}; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEGaussianBlurElement.prototype.x; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEGaussianBlurElement.prototype.y; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEGaussianBlurElement.prototype.width; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEGaussianBlurElement.prototype.height; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEGaussianBlurElement.prototype.result; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEGaussianBlurElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGFEGaussianBlurElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + */ +function SVGAltGlyphDefElement(){} + + + +/** + * @constructor + * @extends {SVGElement} + */ +function SVGComponentTransferFunctionElement(){} + + +/** + * @const + * @type {number} + */ +SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGComponentTransferFunctionElement.prototype.SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY; + + +/** + * @const + * @type {number} + */ +SVGComponentTransferFunctionElement.prototype.SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY; + + +/** + * @const + * @type {number} + */ +SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_TABLE; + + +/** + * @const + * @type {number} + */ +SVGComponentTransferFunctionElement.prototype.SVG_FECOMPONENTTRANSFER_TYPE_TABLE; + + +/** + * @const + * @type {number} + */ +SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE; + + +/** + * @const + * @type {number} + */ +SVGComponentTransferFunctionElement.prototype.SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE; + + +/** + * @const + * @type {number} + */ +SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_LINEAR; + + +/** + * @const + * @type {number} + */ +SVGComponentTransferFunctionElement.prototype.SVG_FECOMPONENTTRANSFER_TYPE_LINEAR; + + +/** + * @const + * @type {number} + */ +SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_GAMMA; + + +/** + * @const + * @type {number} + */ +SVGComponentTransferFunctionElement.prototype.SVG_FECOMPONENTTRANSFER_TYPE_GAMMA; + + +/** + * @type {!SVGAnimatedEnumeration} + */ +SVGComponentTransferFunctionElement.prototype.type; + + +/** + * @type {!SVGAnimatedNumberList} + */ +SVGComponentTransferFunctionElement.prototype.tableValues; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGComponentTransferFunctionElement.prototype.slope; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGComponentTransferFunctionElement.prototype.intercept; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGComponentTransferFunctionElement.prototype.amplitude; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGComponentTransferFunctionElement.prototype.exponent; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGComponentTransferFunctionElement.prototype.offset; + + + +/** + * @constructor + * @extends {SVGElement} + */ +function SVGMetadataElement(){} + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGLangSpace} + * @implements {SVGStylable} + */ +function SVGTitleElement(){} + + +/** + * @type {string} + */ +SVGTitleElement.prototype.xmllang; + + +/** + * @type {string} + */ +SVGTitleElement.prototype.xmlspace; + + +/** + * @type {!SVGAnimatedString} + */ +SVGTitleElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGTitleElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGURIReference} + * @implements {SVGTests} + * @implements {SVGExternalResourcesRequired} + */ +function SVGCursorElement(){} + + +/** + * @type {!SVGAnimatedLength} + */ +SVGCursorElement.prototype.x; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGCursorElement.prototype.y; + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGCursorElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGAnimatedString} + */ +SVGCursorElement.prototype.href; + + +/** + * @type {!SVGStringList} + */ +SVGCursorElement.prototype.requiredFeatures; + + +/** + * @type {!SVGStringList} + */ +SVGCursorElement.prototype.requiredExtensions; + + +/** + * @type {!SVGStringList} + */ +SVGCursorElement.prototype.systemLanguage; + + +/** + * @param {string=} opt_extension + * @return {boolean} + * @override + */ +SVGCursorElement.prototype.hasExtension = function(opt_extension){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGURIReference} + * @implements {SVGExternalResourcesRequired} + * @implements {SVGStylable} + */ +function SVGGradientElement(){} + + +/** + * @const + * @type {number} + */ +SVGGradientElement.SVG_SPREADMETHOD_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGGradientElement.prototype.SVG_SPREADMETHOD_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGGradientElement.SVG_SPREADMETHOD_PAD; + + +/** + * @const + * @type {number} + */ +SVGGradientElement.prototype.SVG_SPREADMETHOD_PAD; + + +/** + * @const + * @type {number} + */ +SVGGradientElement.SVG_SPREADMETHOD_REFLECT; + + +/** + * @const + * @type {number} + */ +SVGGradientElement.prototype.SVG_SPREADMETHOD_REFLECT; + + +/** + * @const + * @type {number} + */ +SVGGradientElement.SVG_SPREADMETHOD_REPEAT; + + +/** + * @const + * @type {number} + */ +SVGGradientElement.prototype.SVG_SPREADMETHOD_REPEAT; + + +/** + * @type {!SVGAnimatedEnumeration} + */ +SVGGradientElement.prototype.gradientUnits; + + +/** + * @type {!SVGAnimatedTransformList} + */ +SVGGradientElement.prototype.gradientTransform; + + +/** + * @type {!SVGAnimatedEnumeration} + */ +SVGGradientElement.prototype.spreadMethod; + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGGradientElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGAnimatedString} + */ +SVGGradientElement.prototype.href; + + +/** + * @type {!SVGAnimatedString} + */ +SVGGradientElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGGradientElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGLangSpace} + * @implements {SVGExternalResourcesRequired} + * @implements {SVGStylable} + * @implements {SVGFitToViewBox} + */ +function SVGMarkerElement(){} + + +/** + * @const + * @type {number} + */ +SVGMarkerElement.SVG_MARKERUNITS_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGMarkerElement.prototype.SVG_MARKERUNITS_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGMarkerElement.SVG_MARKERUNITS_USERSPACEONUSE; + + +/** + * @const + * @type {number} + */ +SVGMarkerElement.prototype.SVG_MARKERUNITS_USERSPACEONUSE; + + +/** + * @const + * @type {number} + */ +SVGMarkerElement.SVG_MARKERUNITS_STROKEWIDTH; + + +/** + * @const + * @type {number} + */ +SVGMarkerElement.prototype.SVG_MARKERUNITS_STROKEWIDTH; + + +/** + * @const + * @type {number} + */ +SVGMarkerElement.SVG_MARKER_ORIENT_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGMarkerElement.prototype.SVG_MARKER_ORIENT_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGMarkerElement.SVG_MARKER_ORIENT_AUTO; + + +/** + * @const + * @type {number} + */ +SVGMarkerElement.prototype.SVG_MARKER_ORIENT_AUTO; + + +/** + * @const + * @type {number} + */ +SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE; + + +/** + * @const + * @type {number} + */ +SVGMarkerElement.prototype.SVG_MARKER_ORIENT_ANGLE; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGMarkerElement.prototype.refX; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGMarkerElement.prototype.refY; + + +/** + * @type {!SVGAnimatedEnumeration} + */ +SVGMarkerElement.prototype.markerUnits; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGMarkerElement.prototype.markerWidth; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGMarkerElement.prototype.markerHeight; + + +/** + * @type {!SVGAnimatedEnumeration} + */ +SVGMarkerElement.prototype.orientType; + + +/** + * @type {!SVGAnimatedAngle} + */ +SVGMarkerElement.prototype.orientAngle; + + +/** */ +SVGMarkerElement.prototype.setOrientToAuto = function(){}; + + +/** + * @param {!SVGAngle=} opt_angle + * @return {undefined} + */ +SVGMarkerElement.prototype.setOrientToAngle = function(opt_angle){}; + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGMarkerElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGAnimatedRect} + */ +SVGMarkerElement.prototype.viewBox; + + +/** + * @type {!SVGAnimatedPreserveAspectRatio} + */ +SVGMarkerElement.prototype.preserveAspectRatio; + + +/** + * @type {string} + */ +SVGMarkerElement.prototype.xmllang; + + +/** + * @type {string} + */ +SVGMarkerElement.prototype.xmlspace; + + +/** + * @type {!SVGAnimatedString} + */ +SVGMarkerElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGMarkerElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGTests} + * @implements {SVGLangSpace} + * @implements {SVGExternalResourcesRequired} + * @implements {SVGStylable} + */ +function SVGMaskElement(){} + + +/** + * @type {!SVGAnimatedEnumeration} + */ +SVGMaskElement.prototype.maskUnits; + + +/** + * @type {!SVGAnimatedEnumeration} + */ +SVGMaskElement.prototype.maskContentUnits; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGMaskElement.prototype.x; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGMaskElement.prototype.y; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGMaskElement.prototype.width; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGMaskElement.prototype.height; + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGMaskElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGStringList} + */ +SVGMaskElement.prototype.requiredFeatures; + + +/** + * @type {!SVGStringList} + */ +SVGMaskElement.prototype.requiredExtensions; + + +/** + * @type {!SVGStringList} + */ +SVGMaskElement.prototype.systemLanguage; + + +/** + * @param {string=} opt_extension + * @return {boolean} + * @override + */ +SVGMaskElement.prototype.hasExtension = function(opt_extension){}; + + +/** + * @type {!SVGAnimatedString} + */ +SVGMaskElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGMaskElement.prototype.getPresentationAttribute = function(opt_name){}; + + +/** + * @type {string} + */ +SVGMaskElement.prototype.xmllang; + + +/** + * @type {string} + */ +SVGMaskElement.prototype.xmlspace; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGExternalResourcesRequired} + * @implements {SVGFitToViewBox} + * @implements {SVGZoomAndPan} + */ +function SVGViewElement(){} + + +/** + * @type {!SVGStringList} + */ +SVGViewElement.prototype.viewTarget; + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGViewElement.prototype.externalResourcesRequired; + + +/** + * @const + * @type {number} + */ +SVGViewElement.SVG_ZOOMANDPAN_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGViewElement.prototype.SVG_ZOOMANDPAN_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGViewElement.SVG_ZOOMANDPAN_DISABLE; + + +/** + * @const + * @type {number} + */ +SVGViewElement.prototype.SVG_ZOOMANDPAN_DISABLE; + + +/** + * @const + * @type {number} + */ +SVGViewElement.SVG_ZOOMANDPAN_MAGNIFY; + + +/** + * @const + * @type {number} + */ +SVGViewElement.prototype.SVG_ZOOMANDPAN_MAGNIFY; + + +/** + * @type {number} + */ +SVGViewElement.prototype.zoomAndPan; + + +/** + * @type {!SVGAnimatedRect} + */ +SVGViewElement.prototype.viewBox; + + +/** + * @type {!SVGAnimatedPreserveAspectRatio} + */ +SVGViewElement.prototype.preserveAspectRatio; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGURIReference} + * @implements {SVGExternalResourcesRequired} + */ +function SVGMPathElement(){} + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGMPathElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGAnimatedString} + */ +SVGMPathElement.prototype.href; + + + +/** + * @constructor + * @extends {SVGElement} + */ +function SVGFontFaceSrcElement(){} + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGURIReference} + * @implements {SVGLangSpace} + * @implements {SVGExternalResourcesRequired} + * @implements {SVGFilterPrimitiveStandardAttributes} + */ +function SVGFEImageElement(){} + + +/** + * @type {!SVGAnimatedPreserveAspectRatio} + */ +SVGFEImageElement.prototype.preserveAspectRatio; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEImageElement.prototype.x; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEImageElement.prototype.y; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEImageElement.prototype.width; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEImageElement.prototype.height; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEImageElement.prototype.result; + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGFEImageElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEImageElement.prototype.href; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEImageElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGFEImageElement.prototype.getPresentationAttribute = function(opt_name){}; + + +/** + * @type {string} + */ +SVGFEImageElement.prototype.xmllang; + + +/** + * @type {string} + */ +SVGFEImageElement.prototype.xmlspace; + + + +/** + * @constructor + * @extends {SVGElement} + */ +function SVGFEDistantLightElement(){} + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFEDistantLightElement.prototype.azimuth; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFEDistantLightElement.prototype.elevation; + + + +/** + * @constructor + * @extends {SVGElement} + */ +function SVGFontFaceUriElement(){} + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGFilterPrimitiveStandardAttributes} + */ +function SVGFEDiffuseLightingElement(){} + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEDiffuseLightingElement.prototype.in1; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFEDiffuseLightingElement.prototype.surfaceScale; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFEDiffuseLightingElement.prototype.diffuseConstant; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFEDiffuseLightingElement.prototype.kernelUnitLengthX; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFEDiffuseLightingElement.prototype.kernelUnitLengthY; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEDiffuseLightingElement.prototype.x; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEDiffuseLightingElement.prototype.y; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEDiffuseLightingElement.prototype.width; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEDiffuseLightingElement.prototype.height; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEDiffuseLightingElement.prototype.result; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEDiffuseLightingElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGFEDiffuseLightingElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGFilterPrimitiveStandardAttributes} + */ +function SVGFEMorphologyElement(){} + + +/** + * @const + * @type {number} + */ +SVGFEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGFEMorphologyElement.prototype.SVG_MORPHOLOGY_OPERATOR_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGFEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_ERODE; + + +/** + * @const + * @type {number} + */ +SVGFEMorphologyElement.prototype.SVG_MORPHOLOGY_OPERATOR_ERODE; + + +/** + * @const + * @type {number} + */ +SVGFEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_DILATE; + + +/** + * @const + * @type {number} + */ +SVGFEMorphologyElement.prototype.SVG_MORPHOLOGY_OPERATOR_DILATE; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEMorphologyElement.prototype.in1; + + +/** + * @type {!SVGAnimatedEnumeration} + */ +SVGFEMorphologyElement.prototype.operator; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFEMorphologyElement.prototype.radiusX; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFEMorphologyElement.prototype.radiusY; + + +/** + * @param {number=} opt_radiusX + * @param {number=} opt_radiusY + * @return {undefined} + */ +SVGFEMorphologyElement.prototype.setRadius = function(opt_radiusX, opt_radiusY){}; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEMorphologyElement.prototype.x; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEMorphologyElement.prototype.y; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEMorphologyElement.prototype.width; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEMorphologyElement.prototype.height; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEMorphologyElement.prototype.result; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEMorphologyElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGFEMorphologyElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGURIReference} + * @implements {SVGStylable} + */ +function SVGGlyphRefElement(){} + + +/** + * @type {string} + */ +SVGGlyphRefElement.prototype.glyphRef; + + +/** + * @type {string} + */ +SVGGlyphRefElement.prototype.format; + + +/** + * @type {number} + */ +SVGGlyphRefElement.prototype.x; + + +/** + * @type {number} + */ +SVGGlyphRefElement.prototype.y; + + +/** + * @type {number} + */ +SVGGlyphRefElement.prototype.dx; + + +/** + * @type {number} + */ +SVGGlyphRefElement.prototype.dy; + + +/** + * @type {!SVGAnimatedString} + */ +SVGGlyphRefElement.prototype.href; + + +/** + * @type {!SVGAnimatedString} + */ +SVGGlyphRefElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGGlyphRefElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGTests} + * @implements {SVGLangSpace} + * @implements {SVGExternalResourcesRequired} + * @implements {SVGStylable} + */ +function SVGTextContentElement(){} + + +/** + * @const + * @type {number} + */ +SVGTextContentElement.LENGTHADJUST_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGTextContentElement.prototype.LENGTHADJUST_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGTextContentElement.LENGTHADJUST_SPACING; + + +/** + * @const + * @type {number} + */ +SVGTextContentElement.prototype.LENGTHADJUST_SPACING; + + +/** + * @const + * @type {number} + */ +SVGTextContentElement.LENGTHADJUST_SPACINGANDGLYPHS; + + +/** + * @const + * @type {number} + */ +SVGTextContentElement.prototype.LENGTHADJUST_SPACINGANDGLYPHS; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGTextContentElement.prototype.textLength; + + +/** + * @type {!SVGAnimatedEnumeration} + */ +SVGTextContentElement.prototype.lengthAdjust; + + +/** + * @return {number} + */ +SVGTextContentElement.prototype.getNumberOfChars = function(){}; + + +/** + * @return {number} + */ +SVGTextContentElement.prototype.getComputedTextLength = function(){}; + + +/** + * @param {number=} opt_offset + * @param {number=} opt_length + * @return {number} + */ +SVGTextContentElement.prototype.getSubStringLength = function(opt_offset, opt_length){}; + + +/** + * @param {number=} opt_offset + * @return {!SVGPoint} + */ +SVGTextContentElement.prototype.getStartPositionOfChar = function(opt_offset){}; + + +/** + * @param {number=} opt_offset + * @return {!SVGPoint} + */ +SVGTextContentElement.prototype.getEndPositionOfChar = function(opt_offset){}; + + +/** + * @param {number=} opt_offset + * @return {!SVGRect} + */ +SVGTextContentElement.prototype.getExtentOfChar = function(opt_offset){}; + + +/** + * @param {number=} opt_offset + * @return {number} + */ +SVGTextContentElement.prototype.getRotationOfChar = function(opt_offset){}; + + +/** + * @param {!SVGPoint=} opt_point + * @return {number} + */ +SVGTextContentElement.prototype.getCharNumAtPosition = function(opt_point){}; + + +/** + * @param {number=} opt_offset + * @param {number=} opt_length + * @return {undefined} + */ +SVGTextContentElement.prototype.selectSubString = function(opt_offset, opt_length){}; + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGTextContentElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGStringList} + */ +SVGTextContentElement.prototype.requiredFeatures; + + +/** + * @type {!SVGStringList} + */ +SVGTextContentElement.prototype.requiredExtensions; + + +/** + * @type {!SVGStringList} + */ +SVGTextContentElement.prototype.systemLanguage; + + +/** + * @param {string=} opt_extension + * @return {boolean} + * @override + */ +SVGTextContentElement.prototype.hasExtension = function(opt_extension){}; + + +/** + * @type {!SVGAnimatedString} + */ +SVGTextContentElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGTextContentElement.prototype.getPresentationAttribute = function(opt_name){}; + + +/** + * @type {string} + */ +SVGTextContentElement.prototype.xmllang; + + +/** + * @type {string} + */ +SVGTextContentElement.prototype.xmlspace; + + + +/** + * @constructor + * @extends {SVGElement} + */ +function SVGFESpotLightElement(){} + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFESpotLightElement.prototype.x; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFESpotLightElement.prototype.y; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFESpotLightElement.prototype.z; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFESpotLightElement.prototype.pointsAtX; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFESpotLightElement.prototype.pointsAtY; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFESpotLightElement.prototype.pointsAtZ; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFESpotLightElement.prototype.specularExponent; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFESpotLightElement.prototype.limitingConeAngle; + + + +/** + * @constructor + * @extends {SVGElement} + */ +function SVGFontFaceNameElement(){} + + + +/** + * @constructor + * @extends {SVGElement} + */ +function SVGFEPointLightElement(){} + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFEPointLightElement.prototype.x; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFEPointLightElement.prototype.y; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFEPointLightElement.prototype.z; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGFilterPrimitiveStandardAttributes} + */ +function SVGFEDropShadowElement(){} + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEDropShadowElement.prototype.in1; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFEDropShadowElement.prototype.dx; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFEDropShadowElement.prototype.dy; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFEDropShadowElement.prototype.stdDeviationX; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFEDropShadowElement.prototype.stdDeviationY; + + +/** + * @param {number=} opt_stdDeviationX + * @param {number=} opt_stdDeviationY + * @return {undefined} + */ +SVGFEDropShadowElement.prototype.setStdDeviation = function(opt_stdDeviationX, opt_stdDeviationY){}; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEDropShadowElement.prototype.x; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEDropShadowElement.prototype.y; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEDropShadowElement.prototype.width; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEDropShadowElement.prototype.height; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEDropShadowElement.prototype.result; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEDropShadowElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGFEDropShadowElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGFilterPrimitiveStandardAttributes} + */ +function SVGFETileElement(){} + + +/** + * @type {!SVGAnimatedString} + */ +SVGFETileElement.prototype.in1; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFETileElement.prototype.x; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFETileElement.prototype.y; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFETileElement.prototype.width; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFETileElement.prototype.height; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFETileElement.prototype.result; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFETileElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGFETileElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + */ +function SVGMissingGlyphElement(){} + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGFilterPrimitiveStandardAttributes} + */ +function SVGFEBlendElement(){} + + +/** + * @const + * @type {number} + */ +SVGFEBlendElement.SVG_FEBLEND_MODE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGFEBlendElement.prototype.SVG_FEBLEND_MODE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGFEBlendElement.SVG_FEBLEND_MODE_NORMAL; + + +/** + * @const + * @type {number} + */ +SVGFEBlendElement.prototype.SVG_FEBLEND_MODE_NORMAL; + + +/** + * @const + * @type {number} + */ +SVGFEBlendElement.SVG_FEBLEND_MODE_MULTIPLY; + + +/** + * @const + * @type {number} + */ +SVGFEBlendElement.prototype.SVG_FEBLEND_MODE_MULTIPLY; + + +/** + * @const + * @type {number} + */ +SVGFEBlendElement.SVG_FEBLEND_MODE_SCREEN; + + +/** + * @const + * @type {number} + */ +SVGFEBlendElement.prototype.SVG_FEBLEND_MODE_SCREEN; + + +/** + * @const + * @type {number} + */ +SVGFEBlendElement.SVG_FEBLEND_MODE_DARKEN; + + +/** + * @const + * @type {number} + */ +SVGFEBlendElement.prototype.SVG_FEBLEND_MODE_DARKEN; + + +/** + * @const + * @type {number} + */ +SVGFEBlendElement.SVG_FEBLEND_MODE_LIGHTEN; + + +/** + * @const + * @type {number} + */ +SVGFEBlendElement.prototype.SVG_FEBLEND_MODE_LIGHTEN; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEBlendElement.prototype.in1; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEBlendElement.prototype.in2; + + +/** + * @type {!SVGAnimatedEnumeration} + */ +SVGFEBlendElement.prototype.mode; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEBlendElement.prototype.x; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEBlendElement.prototype.y; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEBlendElement.prototype.width; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEBlendElement.prototype.height; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEBlendElement.prototype.result; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEBlendElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGFEBlendElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGURIReference} + * @implements {SVGTests} + * @implements {SVGLangSpace} + * @implements {SVGExternalResourcesRequired} + * @implements {SVGStylable} + * @implements {SVGFitToViewBox} + */ +function SVGPatternElement(){} + + +/** + * @type {!SVGAnimatedEnumeration} + */ +SVGPatternElement.prototype.patternUnits; + + +/** + * @type {!SVGAnimatedEnumeration} + */ +SVGPatternElement.prototype.patternContentUnits; + + +/** + * @type {!SVGAnimatedTransformList} + */ +SVGPatternElement.prototype.patternTransform; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGPatternElement.prototype.x; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGPatternElement.prototype.y; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGPatternElement.prototype.width; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGPatternElement.prototype.height; + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGPatternElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGAnimatedRect} + */ +SVGPatternElement.prototype.viewBox; + + +/** + * @type {!SVGAnimatedPreserveAspectRatio} + */ +SVGPatternElement.prototype.preserveAspectRatio; + + +/** + * @type {!SVGAnimatedString} + */ +SVGPatternElement.prototype.href; + + +/** + * @type {string} + */ +SVGPatternElement.prototype.xmllang; + + +/** + * @type {string} + */ +SVGPatternElement.prototype.xmlspace; + + +/** + * @type {!SVGStringList} + */ +SVGPatternElement.prototype.requiredFeatures; + + +/** + * @type {!SVGStringList} + */ +SVGPatternElement.prototype.requiredExtensions; + + +/** + * @type {!SVGStringList} + */ +SVGPatternElement.prototype.systemLanguage; + + +/** + * @param {string=} opt_extension + * @return {boolean} + * @override + */ +SVGPatternElement.prototype.hasExtension = function(opt_extension){}; + + +/** + * @type {!SVGAnimatedString} + */ +SVGPatternElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGPatternElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + */ +function SVGFEMergeNodeElement(){} + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEMergeNodeElement.prototype.in1; + + + +/** + * @constructor + * @extends {SVGComponentTransferFunctionElement} + */ +function SVGFEFuncBElement(){} + + + +/** + * @constructor + * @extends {SVGPathSeg} + */ +function SVGPathSegMovetoRel(){} + + +/** + * @type {number} + */ +SVGPathSegMovetoRel.prototype.x; + + +/** + * @type {number} + */ +SVGPathSegMovetoRel.prototype.y; + + + +/** + * @interface + */ +function SVGLocatable(){} + + +/** + * @type {!SVGElement} + */ +SVGLocatable.prototype.nearestViewportElement; + + +/** + * @type {!SVGElement} + */ +SVGLocatable.prototype.farthestViewportElement; + + +/** + * @return {!SVGRect} + */ +SVGLocatable.prototype.getBBox = function(){}; + + +/** + * @return {!SVGMatrix} + */ +SVGLocatable.prototype.getCTM = function(){}; + + +/** + * @return {!SVGMatrix} + */ +SVGLocatable.prototype.getScreenCTM = function(){}; + + +/** + * @param {!SVGElement=} opt_element + * @return {!SVGMatrix} + */ +SVGLocatable.prototype.getTransformToElement = function(opt_element){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGTests} + * @implements {SVGLangSpace} + * @implements {SVGExternalResourcesRequired} + * @implements {SVGStylable} + * @implements {SVGLocatable} + * @implements {SVGFitToViewBox} + * @implements {SVGZoomAndPan} + */ +function SVGSVGElement(){} + + +/** + * @type {!SVGAnimatedLength} + */ +SVGSVGElement.prototype.x; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGSVGElement.prototype.y; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGSVGElement.prototype.width; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGSVGElement.prototype.height; + + +/** + * @type {string} + */ +SVGSVGElement.prototype.contentScriptType; + + +/** + * @type {string} + */ +SVGSVGElement.prototype.contentStyleType; + + +/** + * @type {!SVGRect} + */ +SVGSVGElement.prototype.viewport; + + +/** + * @type {number} + */ +SVGSVGElement.prototype.pixelUnitToMillimeterX; + + +/** + * @type {number} + */ +SVGSVGElement.prototype.pixelUnitToMillimeterY; + + +/** + * @type {number} + */ +SVGSVGElement.prototype.screenPixelToMillimeterX; + + +/** + * @type {number} + */ +SVGSVGElement.prototype.screenPixelToMillimeterY; + + +/** + * @type {boolean} + */ +SVGSVGElement.prototype.useCurrentView; + + +/** + * @type {number} + */ +SVGSVGElement.prototype.currentScale; + + +/** + * @type {!SVGPoint} + */ +SVGSVGElement.prototype.currentTranslate; + + +/** + * @param {number=} opt_maxWaitMilliseconds + * @return {number} + */ +SVGSVGElement.prototype.suspendRedraw = function(opt_maxWaitMilliseconds){}; + + +/** + * @param {number=} opt_suspendHandleId + * @return {undefined} + */ +SVGSVGElement.prototype.unsuspendRedraw = function(opt_suspendHandleId){}; + + +/** */ +SVGSVGElement.prototype.unsuspendRedrawAll = function(){}; + + +/** */ +SVGSVGElement.prototype.forceRedraw = function(){}; + + +/** */ +SVGSVGElement.prototype.pauseAnimations = function(){}; + + +/** */ +SVGSVGElement.prototype.unpauseAnimations = function(){}; + + +/** + * @return {boolean} + */ +SVGSVGElement.prototype.animationsPaused = function(){}; + + +/** + * @return {number} + */ +SVGSVGElement.prototype.getCurrentTime = function(){}; + + +/** + * @param {number=} opt_seconds + * @return {undefined} + */ +SVGSVGElement.prototype.setCurrentTime = function(opt_seconds){}; + + +/** + * @param {!SVGRect=} opt_rect + * @param {!SVGElement=} opt_referenceElement + * @return {!NodeList} + */ +SVGSVGElement.prototype.getIntersectionList = function(opt_rect, opt_referenceElement){}; + + +/** + * @param {!SVGRect=} opt_rect + * @param {!SVGElement=} opt_referenceElement + * @return {!NodeList} + */ +SVGSVGElement.prototype.getEnclosureList = function(opt_rect, opt_referenceElement){}; + + +/** + * @param {!SVGElement=} opt_element + * @param {!SVGRect=} opt_rect + * @return {boolean} + */ +SVGSVGElement.prototype.checkIntersection = function(opt_element, opt_rect){}; + + +/** + * @param {!SVGElement=} opt_element + * @param {!SVGRect=} opt_rect + * @return {boolean} + */ +SVGSVGElement.prototype.checkEnclosure = function(opt_element, opt_rect){}; + + +/** */ +SVGSVGElement.prototype.deselectAll = function(){}; + + +/** + * @return {!SVGNumber} + */ +SVGSVGElement.prototype.createSVGNumber = function(){}; + + +/** + * @return {!SVGLength} + */ +SVGSVGElement.prototype.createSVGLength = function(){}; + + +/** + * @return {!SVGAngle} + */ +SVGSVGElement.prototype.createSVGAngle = function(){}; + + +/** + * @return {!SVGPoint} + */ +SVGSVGElement.prototype.createSVGPoint = function(){}; + + +/** + * @return {!SVGMatrix} + */ +SVGSVGElement.prototype.createSVGMatrix = function(){}; + + +/** + * @return {!SVGRect} + */ +SVGSVGElement.prototype.createSVGRect = function(){}; + + +/** + * @return {!SVGTransform} + */ +SVGSVGElement.prototype.createSVGTransform = function(){}; + + +/** + * @param {!SVGMatrix=} opt_matrix + * @return {!SVGTransform} + */ +SVGSVGElement.prototype.createSVGTransformFromMatrix = function(opt_matrix){}; + + +/** + * @param {string=} opt_elementId + * @return {Element} + * @see https://developer.mozilla.org/en/docs/Web/API/SVGSVGElement + */ +SVGSVGElement.prototype.getElementById = function(opt_elementId){}; + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGSVGElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGAnimatedRect} + */ +SVGSVGElement.prototype.viewBox; + + +/** + * @type {!SVGAnimatedPreserveAspectRatio} + */ +SVGSVGElement.prototype.preserveAspectRatio; + + +/** + * @type {string} + */ +SVGSVGElement.prototype.xmllang; + + +/** + * @type {string} + */ +SVGSVGElement.prototype.xmlspace; + + +/** + * @const + * @type {number} + */ +SVGSVGElement.SVG_ZOOMANDPAN_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGSVGElement.prototype.SVG_ZOOMANDPAN_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGSVGElement.SVG_ZOOMANDPAN_DISABLE; + + +/** + * @const + * @type {number} + */ +SVGSVGElement.prototype.SVG_ZOOMANDPAN_DISABLE; + + +/** + * @const + * @type {number} + */ +SVGSVGElement.SVG_ZOOMANDPAN_MAGNIFY; + + +/** + * @const + * @type {number} + */ +SVGSVGElement.prototype.SVG_ZOOMANDPAN_MAGNIFY; + + +/** + * @type {number} + */ +SVGSVGElement.prototype.zoomAndPan; + + +/** + * @type {!SVGElement} + */ +SVGSVGElement.prototype.nearestViewportElement; + + +/** + * @type {!SVGElement} + */ +SVGSVGElement.prototype.farthestViewportElement; + + +/** + * @return {!SVGRect} + * @override + */ +SVGSVGElement.prototype.getBBox = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGSVGElement.prototype.getCTM = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGSVGElement.prototype.getScreenCTM = function(){}; + + +/** + * @param {!SVGElement=} opt_element + * @return {!SVGMatrix} + * @override + */ +SVGSVGElement.prototype.getTransformToElement = function(opt_element){}; + + +/** + * @type {!SVGStringList} + */ +SVGSVGElement.prototype.requiredFeatures; + + +/** + * @type {!SVGStringList} + */ +SVGSVGElement.prototype.requiredExtensions; + + +/** + * @type {!SVGStringList} + */ +SVGSVGElement.prototype.systemLanguage; + + +/** + * @param {string=} opt_extension + * @return {boolean} + * @override + */ +SVGSVGElement.prototype.hasExtension = function(opt_extension){}; + + +/** + * @type {!SVGAnimatedString} + */ +SVGSVGElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGSVGElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @interface + * @extends {SVGLocatable} + */ +function SVGTransformable(){} + + +/** + * @type {!SVGAnimatedTransformList} + */ +SVGTransformable.prototype.transform; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGTests} + * @implements {SVGLangSpace} + * @implements {SVGExternalResourcesRequired} + * @implements {SVGStylable} + * @implements {SVGTransformable} + */ +function SVGDefsElement(){} + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGDefsElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGAnimatedTransformList} + */ +SVGDefsElement.prototype.transform; + + +/** + * @type {string} + */ +SVGDefsElement.prototype.xmllang; + + +/** + * @type {string} + */ +SVGDefsElement.prototype.xmlspace; + + +/** + * @type {!SVGElement} + */ +SVGDefsElement.prototype.nearestViewportElement; + + +/** + * @type {!SVGElement} + */ +SVGDefsElement.prototype.farthestViewportElement; + + +/** + * @return {!SVGRect} + * @override + */ +SVGDefsElement.prototype.getBBox = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGDefsElement.prototype.getCTM = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGDefsElement.prototype.getScreenCTM = function(){}; + + +/** + * @param {!SVGElement=} opt_element + * @return {!SVGMatrix} + * @override + */ +SVGDefsElement.prototype.getTransformToElement = function(opt_element){}; + + +/** + * @type {!SVGStringList} + */ +SVGDefsElement.prototype.requiredFeatures; + + +/** + * @type {!SVGStringList} + */ +SVGDefsElement.prototype.requiredExtensions; + + +/** + * @type {!SVGStringList} + */ +SVGDefsElement.prototype.systemLanguage; + + +/** + * @param {string=} opt_extension + * @return {boolean} + * @override + */ +SVGDefsElement.prototype.hasExtension = function(opt_extension){}; + + +/** + * @type {!SVGAnimatedString} + */ +SVGDefsElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGDefsElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGTests} + * @implements {SVGLangSpace} + * @implements {SVGExternalResourcesRequired} + * @implements {SVGStylable} + * @implements {SVGTransformable} + */ +function SVGPolygonElement(){} + + +/** + * @type {!SVGPointList} + */ +SVGPolygonElement.prototype.points; + + +/** + * @type {!SVGPointList} + */ +SVGPolygonElement.prototype.animatedPoints; + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGPolygonElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGAnimatedTransformList} + */ +SVGPolygonElement.prototype.transform; + + +/** + * @type {string} + */ +SVGPolygonElement.prototype.xmllang; + + +/** + * @type {string} + */ +SVGPolygonElement.prototype.xmlspace; + + +/** + * @type {!SVGElement} + */ +SVGPolygonElement.prototype.nearestViewportElement; + + +/** + * @type {!SVGElement} + */ +SVGPolygonElement.prototype.farthestViewportElement; + + +/** + * @return {!SVGRect} + * @override + */ +SVGPolygonElement.prototype.getBBox = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGPolygonElement.prototype.getCTM = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGPolygonElement.prototype.getScreenCTM = function(){}; + + +/** + * @param {!SVGElement=} opt_element + * @return {!SVGMatrix} + * @override + */ +SVGPolygonElement.prototype.getTransformToElement = function(opt_element){}; + + +/** + * @type {!SVGStringList} + */ +SVGPolygonElement.prototype.requiredFeatures; + + +/** + * @type {!SVGStringList} + */ +SVGPolygonElement.prototype.requiredExtensions; + + +/** + * @type {!SVGStringList} + */ +SVGPolygonElement.prototype.systemLanguage; + + +/** + * @param {string=} opt_extension + * @return {boolean} + * @override + */ +SVGPolygonElement.prototype.hasExtension = function(opt_extension){}; + + +/** + * @type {!SVGAnimatedString} + */ +SVGPolygonElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGPolygonElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGTests} + * @implements {SVGLangSpace} + * @implements {SVGExternalResourcesRequired} + * @implements {SVGStylable} + * @implements {SVGTransformable} + */ +function SVGPathElement(){} + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGPathElement.prototype.pathLength; + + +/** + * @type {!SVGPathSegList} + */ +SVGPathElement.prototype.pathSegList; + + +/** + * @type {!SVGPathSegList} + */ +SVGPathElement.prototype.normalizedPathSegList; + + +/** + * @type {!SVGPathSegList} + */ +SVGPathElement.prototype.animatedPathSegList; + + +/** + * @type {!SVGPathSegList} + */ +SVGPathElement.prototype.animatedNormalizedPathSegList; + + +/** + * @return {number} + */ +SVGPathElement.prototype.getTotalLength = function(){}; + + +/** + * @param {number=} opt_distance + * @return {!SVGPoint} + */ +SVGPathElement.prototype.getPointAtLength = function(opt_distance){}; + + +/** + * @param {number=} opt_distance + * @return {number} + */ +SVGPathElement.prototype.getPathSegAtLength = function(opt_distance){}; + + +/** + * @return {!SVGPathSegClosePath} + */ +SVGPathElement.prototype.createSVGPathSegClosePath = function(){}; + + +/** + * @param {number=} opt_x + * @param {number=} opt_y + * @return {!SVGPathSegMovetoAbs} + */ +SVGPathElement.prototype.createSVGPathSegMovetoAbs = function(opt_x, opt_y){}; + + +/** + * @param {number=} opt_x + * @param {number=} opt_y + * @return {!SVGPathSegMovetoRel} + */ +SVGPathElement.prototype.createSVGPathSegMovetoRel = function(opt_x, opt_y){}; + + +/** + * @param {number=} opt_x + * @param {number=} opt_y + * @return {!SVGPathSegLinetoAbs} + */ +SVGPathElement.prototype.createSVGPathSegLinetoAbs = function(opt_x, opt_y){}; + + +/** + * @param {number=} opt_x + * @param {number=} opt_y + * @return {!SVGPathSegLinetoRel} + */ +SVGPathElement.prototype.createSVGPathSegLinetoRel = function(opt_x, opt_y){}; + + +/** + * @param {number=} opt_x + * @param {number=} opt_y + * @param {number=} opt_x1 + * @param {number=} opt_y1 + * @param {number=} opt_x2 + * @param {number=} opt_y2 + * @return {!SVGPathSegCurvetoCubicAbs} + */ +SVGPathElement.prototype.createSVGPathSegCurvetoCubicAbs = function(opt_x, opt_y, opt_x1, opt_y1, opt_x2, opt_y2){}; + + +/** + * @param {number=} opt_x + * @param {number=} opt_y + * @param {number=} opt_x1 + * @param {number=} opt_y1 + * @param {number=} opt_x2 + * @param {number=} opt_y2 + * @return {!SVGPathSegCurvetoCubicRel} + */ +SVGPathElement.prototype.createSVGPathSegCurvetoCubicRel = function(opt_x, opt_y, opt_x1, opt_y1, opt_x2, opt_y2){}; + + +/** + * @param {number=} opt_x + * @param {number=} opt_y + * @param {number=} opt_x1 + * @param {number=} opt_y1 + * @return {!SVGPathSegCurvetoQuadraticAbs} + */ +SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticAbs = function(opt_x, opt_y, opt_x1, opt_y1){}; + + +/** + * @param {number=} opt_x + * @param {number=} opt_y + * @param {number=} opt_x1 + * @param {number=} opt_y1 + * @return {!SVGPathSegCurvetoQuadraticRel} + */ +SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticRel = function(opt_x, opt_y, opt_x1, opt_y1){}; + + +/** + * @param {number=} opt_x + * @param {number=} opt_y + * @param {number=} opt_r1 + * @param {number=} opt_r2 + * @param {number=} opt_angle + * @param {boolean=} opt_largeArcFlag + * @param {boolean=} opt_sweepFlag + * @return {!SVGPathSegArcAbs} + */ +SVGPathElement.prototype.createSVGPathSegArcAbs = function(opt_x, opt_y, opt_r1, opt_r2, opt_angle, opt_largeArcFlag, opt_sweepFlag){}; + + +/** + * @param {number=} opt_x + * @param {number=} opt_y + * @param {number=} opt_r1 + * @param {number=} opt_r2 + * @param {number=} opt_angle + * @param {boolean=} opt_largeArcFlag + * @param {boolean=} opt_sweepFlag + * @return {!SVGPathSegArcRel} + */ +SVGPathElement.prototype.createSVGPathSegArcRel = function(opt_x, opt_y, opt_r1, opt_r2, opt_angle, opt_largeArcFlag, opt_sweepFlag){}; + + +/** + * @param {number=} opt_x + * @return {!SVGPathSegLinetoHorizontalAbs} + */ +SVGPathElement.prototype.createSVGPathSegLinetoHorizontalAbs = function(opt_x){}; + + +/** + * @param {number=} opt_x + * @return {!SVGPathSegLinetoHorizontalRel} + */ +SVGPathElement.prototype.createSVGPathSegLinetoHorizontalRel = function(opt_x){}; + + +/** + * @param {number=} opt_y + * @return {!SVGPathSegLinetoVerticalAbs} + */ +SVGPathElement.prototype.createSVGPathSegLinetoVerticalAbs = function(opt_y){}; + + +/** + * @param {number=} opt_y + * @return {!SVGPathSegLinetoVerticalRel} + */ +SVGPathElement.prototype.createSVGPathSegLinetoVerticalRel = function(opt_y){}; + + +/** + * @param {number=} opt_x + * @param {number=} opt_y + * @param {number=} opt_x2 + * @param {number=} opt_y2 + * @return {!SVGPathSegCurvetoCubicSmoothAbs} + */ +SVGPathElement.prototype.createSVGPathSegCurvetoCubicSmoothAbs = function(opt_x, opt_y, opt_x2, opt_y2){}; + + +/** + * @param {number=} opt_x + * @param {number=} opt_y + * @param {number=} opt_x2 + * @param {number=} opt_y2 + * @return {!SVGPathSegCurvetoCubicSmoothRel} + */ +SVGPathElement.prototype.createSVGPathSegCurvetoCubicSmoothRel = function(opt_x, opt_y, opt_x2, opt_y2){}; + + +/** + * @param {number=} opt_x + * @param {number=} opt_y + * @return {!SVGPathSegCurvetoQuadraticSmoothAbs} + */ +SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticSmoothAbs = function(opt_x, opt_y){}; + + +/** + * @param {number=} opt_x + * @param {number=} opt_y + * @return {!SVGPathSegCurvetoQuadraticSmoothRel} + */ +SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticSmoothRel = function(opt_x, opt_y){}; + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGPathElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGAnimatedTransformList} + */ +SVGPathElement.prototype.transform; + + +/** + * @type {string} + */ +SVGPathElement.prototype.xmllang; + + +/** + * @type {string} + */ +SVGPathElement.prototype.xmlspace; + + +/** + * @type {!SVGElement} + */ +SVGPathElement.prototype.nearestViewportElement; + + +/** + * @type {!SVGElement} + */ +SVGPathElement.prototype.farthestViewportElement; + + +/** + * @return {!SVGRect} + * @override + */ +SVGPathElement.prototype.getBBox = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGPathElement.prototype.getCTM = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGPathElement.prototype.getScreenCTM = function(){}; + + +/** + * @param {!SVGElement=} opt_element + * @return {!SVGMatrix} + * @override + */ +SVGPathElement.prototype.getTransformToElement = function(opt_element){}; + + +/** + * @type {!SVGStringList} + */ +SVGPathElement.prototype.requiredFeatures; + + +/** + * @type {!SVGStringList} + */ +SVGPathElement.prototype.requiredExtensions; + + +/** + * @type {!SVGStringList} + */ +SVGPathElement.prototype.systemLanguage; + + +/** + * @param {string=} opt_extension + * @return {boolean} + * @override + */ +SVGPathElement.prototype.hasExtension = function(opt_extension){}; + + +/** + * @type {!SVGAnimatedString} + */ +SVGPathElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGPathElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGTests} + * @implements {SVGLangSpace} + * @implements {SVGExternalResourcesRequired} + * @implements {SVGStylable} + * @implements {SVGTransformable} + */ +function SVGCircleElement(){} + + +/** + * @type {!SVGAnimatedLength} + */ +SVGCircleElement.prototype.cx; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGCircleElement.prototype.cy; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGCircleElement.prototype.r; + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGCircleElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGAnimatedTransformList} + */ +SVGCircleElement.prototype.transform; + + +/** + * @type {string} + */ +SVGCircleElement.prototype.xmllang; + + +/** + * @type {string} + */ +SVGCircleElement.prototype.xmlspace; + + +/** + * @type {!SVGElement} + */ +SVGCircleElement.prototype.nearestViewportElement; + + +/** + * @type {!SVGElement} + */ +SVGCircleElement.prototype.farthestViewportElement; + + +/** + * @return {!SVGRect} + * @override + */ +SVGCircleElement.prototype.getBBox = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGCircleElement.prototype.getCTM = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGCircleElement.prototype.getScreenCTM = function(){}; + + +/** + * @param {!SVGElement=} opt_element + * @return {!SVGMatrix} + * @override + */ +SVGCircleElement.prototype.getTransformToElement = function(opt_element){}; + + +/** + * @type {!SVGStringList} + */ +SVGCircleElement.prototype.requiredFeatures; + + +/** + * @type {!SVGStringList} + */ +SVGCircleElement.prototype.requiredExtensions; + + +/** + * @type {!SVGStringList} + */ +SVGCircleElement.prototype.systemLanguage; + + +/** + * @param {string=} opt_extension + * @return {boolean} + * @override + */ +SVGCircleElement.prototype.hasExtension = function(opt_extension){}; + + +/** + * @type {!SVGAnimatedString} + */ +SVGCircleElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGCircleElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGURIReference} + * @implements {SVGTests} + * @implements {SVGLangSpace} + * @implements {SVGExternalResourcesRequired} + * @implements {SVGStylable} + * @implements {SVGTransformable} + */ +function SVGUseElement(){} + + +/** + * @type {!SVGAnimatedLength} + */ +SVGUseElement.prototype.x; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGUseElement.prototype.y; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGUseElement.prototype.width; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGUseElement.prototype.height; + + +/** + * @type {!SVGElementInstance} + */ +SVGUseElement.prototype.instanceRoot; + + +/** + * @type {!SVGElementInstance} + */ +SVGUseElement.prototype.animatedInstanceRoot; + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGUseElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGElement} + */ +SVGUseElement.prototype.nearestViewportElement; + + +/** + * @type {!SVGElement} + */ +SVGUseElement.prototype.farthestViewportElement; + + +/** + * @return {!SVGRect} + * @override + */ +SVGUseElement.prototype.getBBox = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGUseElement.prototype.getCTM = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGUseElement.prototype.getScreenCTM = function(){}; + + +/** + * @param {!SVGElement=} opt_element + * @return {!SVGMatrix} + * @override + */ +SVGUseElement.prototype.getTransformToElement = function(opt_element){}; + + +/** + * @type {!SVGAnimatedTransformList} + */ +SVGUseElement.prototype.transform; + + +/** + * @type {!SVGAnimatedString} + */ +SVGUseElement.prototype.href; + + +/** + * @type {string} + */ +SVGUseElement.prototype.xmllang; + + +/** + * @type {string} + */ +SVGUseElement.prototype.xmlspace; + + +/** + * @type {!SVGStringList} + */ +SVGUseElement.prototype.requiredFeatures; + + +/** + * @type {!SVGStringList} + */ +SVGUseElement.prototype.requiredExtensions; + + +/** + * @type {!SVGStringList} + */ +SVGUseElement.prototype.systemLanguage; + + +/** + * @param {string=} opt_extension + * @return {boolean} + * @override + */ +SVGUseElement.prototype.hasExtension = function(opt_extension){}; + + +/** + * @type {!SVGAnimatedString} + */ +SVGUseElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGUseElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGTests} + * @implements {SVGLangSpace} + * @implements {SVGExternalResourcesRequired} + * @implements {SVGStylable} + * @implements {SVGTransformable} + */ +function SVGPolylineElement(){} + + +/** + * @type {!SVGPointList} + */ +SVGPolylineElement.prototype.points; + + +/** + * @type {!SVGPointList} + */ +SVGPolylineElement.prototype.animatedPoints; + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGPolylineElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGAnimatedTransformList} + */ +SVGPolylineElement.prototype.transform; + + +/** + * @type {string} + */ +SVGPolylineElement.prototype.xmllang; + + +/** + * @type {string} + */ +SVGPolylineElement.prototype.xmlspace; + + +/** + * @type {!SVGElement} + */ +SVGPolylineElement.prototype.nearestViewportElement; + + +/** + * @type {!SVGElement} + */ +SVGPolylineElement.prototype.farthestViewportElement; + + +/** + * @return {!SVGRect} + * @override + */ +SVGPolylineElement.prototype.getBBox = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGPolylineElement.prototype.getCTM = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGPolylineElement.prototype.getScreenCTM = function(){}; + + +/** + * @param {!SVGElement=} opt_element + * @return {!SVGMatrix} + * @override + */ +SVGPolylineElement.prototype.getTransformToElement = function(opt_element){}; + + +/** + * @type {!SVGStringList} + */ +SVGPolylineElement.prototype.requiredFeatures; + + +/** + * @type {!SVGStringList} + */ +SVGPolylineElement.prototype.requiredExtensions; + + +/** + * @type {!SVGStringList} + */ +SVGPolylineElement.prototype.systemLanguage; + + +/** + * @param {string=} opt_extension + * @return {boolean} + * @override + */ +SVGPolylineElement.prototype.hasExtension = function(opt_extension){}; + + +/** + * @type {!SVGAnimatedString} + */ +SVGPolylineElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGPolylineElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGTests} + * @implements {SVGLangSpace} + * @implements {SVGExternalResourcesRequired} + * @implements {SVGStylable} + * @implements {SVGTransformable} + */ +function SVGGElement(){} + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGGElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGAnimatedTransformList} + */ +SVGGElement.prototype.transform; + + +/** + * @type {string} + */ +SVGGElement.prototype.xmllang; + + +/** + * @type {string} + */ +SVGGElement.prototype.xmlspace; + + +/** + * @type {!SVGElement} + */ +SVGGElement.prototype.nearestViewportElement; + + +/** + * @type {!SVGElement} + */ +SVGGElement.prototype.farthestViewportElement; + + +/** + * @return {!SVGRect} + * @override + */ +SVGGElement.prototype.getBBox = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGGElement.prototype.getCTM = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGGElement.prototype.getScreenCTM = function(){}; + + +/** + * @param {!SVGElement=} opt_element + * @return {!SVGMatrix} + * @override + */ +SVGGElement.prototype.getTransformToElement = function(opt_element){}; + + +/** + * @type {!SVGStringList} + */ +SVGGElement.prototype.requiredFeatures; + + +/** + * @type {!SVGStringList} + */ +SVGGElement.prototype.requiredExtensions; + + +/** + * @type {!SVGStringList} + */ +SVGGElement.prototype.systemLanguage; + + +/** + * @param {string=} opt_extension + * @return {boolean} + * @override + */ +SVGGElement.prototype.hasExtension = function(opt_extension){}; + + +/** + * @type {!SVGAnimatedString} + */ +SVGGElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGGElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGTests} + * @implements {SVGLangSpace} + * @implements {SVGExternalResourcesRequired} + * @implements {SVGStylable} + * @implements {SVGTransformable} + */ +function SVGSwitchElement(){} + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGSwitchElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGAnimatedTransformList} + */ +SVGSwitchElement.prototype.transform; + + +/** + * @type {string} + */ +SVGSwitchElement.prototype.xmllang; + + +/** + * @type {string} + */ +SVGSwitchElement.prototype.xmlspace; + + +/** + * @type {!SVGElement} + */ +SVGSwitchElement.prototype.nearestViewportElement; + + +/** + * @type {!SVGElement} + */ +SVGSwitchElement.prototype.farthestViewportElement; + + +/** + * @return {!SVGRect} + * @override + */ +SVGSwitchElement.prototype.getBBox = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGSwitchElement.prototype.getCTM = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGSwitchElement.prototype.getScreenCTM = function(){}; + + +/** + * @param {!SVGElement=} opt_element + * @return {!SVGMatrix} + * @override + */ +SVGSwitchElement.prototype.getTransformToElement = function(opt_element){}; + + +/** + * @type {!SVGStringList} + */ +SVGSwitchElement.prototype.requiredFeatures; + + +/** + * @type {!SVGStringList} + */ +SVGSwitchElement.prototype.requiredExtensions; + + +/** + * @type {!SVGStringList} + */ +SVGSwitchElement.prototype.systemLanguage; + + +/** + * @param {string=} opt_extension + * @return {boolean} + * @override + */ +SVGSwitchElement.prototype.hasExtension = function(opt_extension){}; + + +/** + * @type {!SVGAnimatedString} + */ +SVGSwitchElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGSwitchElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGURIReference} + * @implements {SVGTests} + * @implements {SVGLangSpace} + * @implements {SVGExternalResourcesRequired} + * @implements {SVGStylable} + * @implements {SVGTransformable} + */ +function SVGImageElement(){} + + +/** + * @type {!SVGAnimatedLength} + */ +SVGImageElement.prototype.x; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGImageElement.prototype.y; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGImageElement.prototype.width; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGImageElement.prototype.height; + + +/** + * @type {!SVGAnimatedPreserveAspectRatio} + */ +SVGImageElement.prototype.preserveAspectRatio; + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGImageElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGElement} + */ +SVGImageElement.prototype.nearestViewportElement; + + +/** + * @type {!SVGElement} + */ +SVGImageElement.prototype.farthestViewportElement; + + +/** + * @return {!SVGRect} + * @override + */ +SVGImageElement.prototype.getBBox = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGImageElement.prototype.getCTM = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGImageElement.prototype.getScreenCTM = function(){}; + + +/** + * @param {!SVGElement=} opt_element + * @return {!SVGMatrix} + * @override + */ +SVGImageElement.prototype.getTransformToElement = function(opt_element){}; + + +/** + * @type {!SVGAnimatedTransformList} + */ +SVGImageElement.prototype.transform; + + +/** + * @type {!SVGAnimatedString} + */ +SVGImageElement.prototype.href; + + +/** + * @type {string} + */ +SVGImageElement.prototype.xmllang; + + +/** + * @type {string} + */ +SVGImageElement.prototype.xmlspace; + + +/** + * @type {!SVGStringList} + */ +SVGImageElement.prototype.requiredFeatures; + + +/** + * @type {!SVGStringList} + */ +SVGImageElement.prototype.requiredExtensions; + + +/** + * @type {!SVGStringList} + */ +SVGImageElement.prototype.systemLanguage; + + +/** + * @param {string=} opt_extension + * @return {boolean} + * @override + */ +SVGImageElement.prototype.hasExtension = function(opt_extension){}; + + +/** + * @type {!SVGAnimatedString} + */ +SVGImageElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGImageElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGTests} + * @implements {SVGLangSpace} + * @implements {SVGExternalResourcesRequired} + * @implements {SVGStylable} + * @implements {SVGTransformable} + */ +function SVGRectElement(){} + + +/** + * @type {!SVGAnimatedLength} + */ +SVGRectElement.prototype.x; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGRectElement.prototype.y; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGRectElement.prototype.width; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGRectElement.prototype.height; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGRectElement.prototype.rx; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGRectElement.prototype.ry; + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGRectElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGAnimatedTransformList} + */ +SVGRectElement.prototype.transform; + + +/** + * @type {string} + */ +SVGRectElement.prototype.xmllang; + + +/** + * @type {string} + */ +SVGRectElement.prototype.xmlspace; + + +/** + * @type {!SVGElement} + */ +SVGRectElement.prototype.nearestViewportElement; + + +/** + * @type {!SVGElement} + */ +SVGRectElement.prototype.farthestViewportElement; + + +/** + * @return {!SVGRect} + * @override + */ +SVGRectElement.prototype.getBBox = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGRectElement.prototype.getCTM = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGRectElement.prototype.getScreenCTM = function(){}; + + +/** + * @param {!SVGElement=} opt_element + * @return {!SVGMatrix} + * @override + */ +SVGRectElement.prototype.getTransformToElement = function(opt_element){}; + + +/** + * @type {!SVGStringList} + */ +SVGRectElement.prototype.requiredFeatures; + + +/** + * @type {!SVGStringList} + */ +SVGRectElement.prototype.requiredExtensions; + + +/** + * @type {!SVGStringList} + */ +SVGRectElement.prototype.systemLanguage; + + +/** + * @param {string=} opt_extension + * @return {boolean} + * @override + */ +SVGRectElement.prototype.hasExtension = function(opt_extension){}; + + +/** + * @type {!SVGAnimatedString} + */ +SVGRectElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGRectElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGURIReference} + * @implements {SVGTests} + * @implements {SVGLangSpace} + * @implements {SVGExternalResourcesRequired} + * @implements {SVGStylable} + * @implements {SVGTransformable} + */ +function SVGAElement(){} + + +/** + * @type {!SVGAnimatedString} + */ +SVGAElement.prototype.target; + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGAElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGElement} + */ +SVGAElement.prototype.nearestViewportElement; + + +/** + * @type {!SVGElement} + */ +SVGAElement.prototype.farthestViewportElement; + + +/** + * @return {!SVGRect} + * @override + */ +SVGAElement.prototype.getBBox = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGAElement.prototype.getCTM = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGAElement.prototype.getScreenCTM = function(){}; + + +/** + * @param {!SVGElement=} opt_element + * @return {!SVGMatrix} + * @override + */ +SVGAElement.prototype.getTransformToElement = function(opt_element){}; + + +/** + * @type {!SVGAnimatedTransformList} + */ +SVGAElement.prototype.transform; + + +/** + * @type {!SVGAnimatedString} + */ +SVGAElement.prototype.href; + + +/** + * @type {string} + */ +SVGAElement.prototype.xmllang; + + +/** + * @type {string} + */ +SVGAElement.prototype.xmlspace; + + +/** + * @type {!SVGStringList} + */ +SVGAElement.prototype.requiredFeatures; + + +/** + * @type {!SVGStringList} + */ +SVGAElement.prototype.requiredExtensions; + + +/** + * @type {!SVGStringList} + */ +SVGAElement.prototype.systemLanguage; + + +/** + * @param {string=} opt_extension + * @return {boolean} + * @override + */ +SVGAElement.prototype.hasExtension = function(opt_extension){}; + + +/** + * @type {!SVGAnimatedString} + */ +SVGAElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGAElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + */ +function SVGAnimatedPreserveAspectRatio(){} + + +/** + * @type {!SVGPreserveAspectRatio} + */ +SVGAnimatedPreserveAspectRatio.prototype.baseVal; + + +/** + * @type {!SVGPreserveAspectRatio} + */ +SVGAnimatedPreserveAspectRatio.prototype.animVal; + + + +/** + * @constructor + */ +function SVGElementInstanceList(){} + + +/** + * @type {number} + */ +SVGElementInstanceList.prototype.length; + + +/** + * @param {number=} opt_index + * @return {!SVGElementInstance} + */ +SVGElementInstanceList.prototype.item = function(opt_index){}; + + + +/** + * @constructor + * @extends {Element} + */ +function SVGElement(){} + + +/** + * @type {string} + */ +SVGElement.prototype.id; + + +/** + * @type {string} + */ +SVGElement.prototype.xmlbase; + + +/** + * @type {!SVGSVGElement} + */ +SVGElement.prototype.ownerSVGElement; + + +/** + * @type {!SVGElement} + */ +SVGElement.prototype.viewportElement; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGFilterPrimitiveStandardAttributes} + */ +function SVGFETurbulenceElement(){} + + +/** + * @const + * @type {number} + */ +SVGFETurbulenceElement.SVG_TURBULENCE_TYPE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGFETurbulenceElement.prototype.SVG_TURBULENCE_TYPE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGFETurbulenceElement.SVG_TURBULENCE_TYPE_FRACTALNOISE; + + +/** + * @const + * @type {number} + */ +SVGFETurbulenceElement.prototype.SVG_TURBULENCE_TYPE_FRACTALNOISE; + + +/** + * @const + * @type {number} + */ +SVGFETurbulenceElement.SVG_TURBULENCE_TYPE_TURBULENCE; + + +/** + * @const + * @type {number} + */ +SVGFETurbulenceElement.prototype.SVG_TURBULENCE_TYPE_TURBULENCE; + + +/** + * @const + * @type {number} + */ +SVGFETurbulenceElement.SVG_STITCHTYPE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGFETurbulenceElement.prototype.SVG_STITCHTYPE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGFETurbulenceElement.SVG_STITCHTYPE_STITCH; + + +/** + * @const + * @type {number} + */ +SVGFETurbulenceElement.prototype.SVG_STITCHTYPE_STITCH; + + +/** + * @const + * @type {number} + */ +SVGFETurbulenceElement.SVG_STITCHTYPE_NOSTITCH; + + +/** + * @const + * @type {number} + */ +SVGFETurbulenceElement.prototype.SVG_STITCHTYPE_NOSTITCH; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFETurbulenceElement.prototype.baseFrequencyX; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFETurbulenceElement.prototype.baseFrequencyY; + + +/** + * @type {!SVGAnimatedInteger} + */ +SVGFETurbulenceElement.prototype.numOctaves; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFETurbulenceElement.prototype.seed; + + +/** + * @type {!SVGAnimatedEnumeration} + */ +SVGFETurbulenceElement.prototype.stitchTiles; + + +/** + * @type {!SVGAnimatedEnumeration} + */ +SVGFETurbulenceElement.prototype.type; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFETurbulenceElement.prototype.x; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFETurbulenceElement.prototype.y; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFETurbulenceElement.prototype.width; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFETurbulenceElement.prototype.height; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFETurbulenceElement.prototype.result; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFETurbulenceElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGFETurbulenceElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGPathSeg} + */ +function SVGPathSegArcAbs(){} + + +/** + * @type {number} + */ +SVGPathSegArcAbs.prototype.x; + + +/** + * @type {number} + */ +SVGPathSegArcAbs.prototype.y; + + +/** + * @type {number} + */ +SVGPathSegArcAbs.prototype.r1; + + +/** + * @type {number} + */ +SVGPathSegArcAbs.prototype.r2; + + +/** + * @type {number} + */ +SVGPathSegArcAbs.prototype.angle; + + +/** + * @type {boolean} + */ +SVGPathSegArcAbs.prototype.largeArcFlag; + + +/** + * @type {boolean} + */ +SVGPathSegArcAbs.prototype.sweepFlag; + + + +/** + * @constructor + */ +function SVGAnimatedBoolean(){} + + +/** + * @type {boolean} + */ +SVGAnimatedBoolean.prototype.baseVal; + + +/** + * @type {boolean} + */ +SVGAnimatedBoolean.prototype.animVal; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGLangSpace} + */ +function SVGStyleElement(){} + + +/** + * @type {boolean} + */ +SVGStyleElement.prototype.disabled; + + +/** + * @type {string} + */ +SVGStyleElement.prototype.type; + + +/** + * @type {string} + */ +SVGStyleElement.prototype.media; + + +/** + * @type {string} + */ +SVGStyleElement.prototype.title; + + +/** + * @type {string} + */ +SVGStyleElement.prototype.xmllang; + + +/** + * @type {string} + */ +SVGStyleElement.prototype.xmlspace; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGTests} + * @implements {SVGLangSpace} + * @implements {SVGExternalResourcesRequired} + * @implements {SVGStylable} + * @implements {SVGTransformable} + */ +function SVGClipPathElement(){} + + +/** + * @type {!SVGAnimatedEnumeration} + */ +SVGClipPathElement.prototype.clipPathUnits; + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGClipPathElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGAnimatedTransformList} + */ +SVGClipPathElement.prototype.transform; + + +/** + * @type {string} + */ +SVGClipPathElement.prototype.xmllang; + + +/** + * @type {string} + */ +SVGClipPathElement.prototype.xmlspace; + + +/** + * @type {!SVGElement} + */ +SVGClipPathElement.prototype.nearestViewportElement; + + +/** + * @type {!SVGElement} + */ +SVGClipPathElement.prototype.farthestViewportElement; + + +/** + * @return {!SVGRect} + * @override + */ +SVGClipPathElement.prototype.getBBox = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGClipPathElement.prototype.getCTM = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGClipPathElement.prototype.getScreenCTM = function(){}; + + +/** + * @param {!SVGElement=} opt_element + * @return {!SVGMatrix} + * @override + */ +SVGClipPathElement.prototype.getTransformToElement = function(opt_element){}; + + +/** + * @type {!SVGStringList} + */ +SVGClipPathElement.prototype.requiredFeatures; + + +/** + * @type {!SVGStringList} + */ +SVGClipPathElement.prototype.requiredExtensions; + + +/** + * @type {!SVGStringList} + */ +SVGClipPathElement.prototype.systemLanguage; + + +/** + * @param {string=} opt_extension + * @return {boolean} + * @override + */ +SVGClipPathElement.prototype.hasExtension = function(opt_extension){}; + + +/** + * @type {!SVGAnimatedString} + */ +SVGClipPathElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGClipPathElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @interface + */ +function ElementTimeControl(){} + + +/** + * @return {undefined} + */ +ElementTimeControl.prototype.beginElement = function(){}; + + +/** + * @param {number=} opt_offset + * @return {undefined} + */ +ElementTimeControl.prototype.beginElementAt = function(opt_offset){}; + + +/** + * @return {undefined} + */ +ElementTimeControl.prototype.endElement = function(){}; + + +/** + * @param {number=} opt_offset + * @return {undefined} + */ +ElementTimeControl.prototype.endElementAt = function(opt_offset){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGTests} + * @implements {SVGExternalResourcesRequired} + * @implements {ElementTimeControl} + */ +function SVGAnimationElement(){} + + +/** + * @type {!SVGElement} + */ +SVGAnimationElement.prototype.targetElement; + + +/** + * @return {number} + */ +SVGAnimationElement.prototype.getStartTime = function(){}; + + +/** + * @return {number} + */ +SVGAnimationElement.prototype.getCurrentTime = function(){}; + + +/** + * @return {number} + */ +SVGAnimationElement.prototype.getSimpleDuration = function(){}; + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGAnimationElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGStringList} + */ +SVGAnimationElement.prototype.requiredFeatures; + + +/** + * @type {!SVGStringList} + */ +SVGAnimationElement.prototype.requiredExtensions; + + +/** + * @type {!SVGStringList} + */ +SVGAnimationElement.prototype.systemLanguage; + + +/** + * @param {string=} opt_extension + * @return {boolean} + * @override + */ +SVGAnimationElement.prototype.hasExtension = function(opt_extension){}; + + +/** + * @override + * @return {undefined} + */ +SVGAnimationElement.prototype.beginElement = function(){}; + + +/** + * @param {number=} opt_offset + * @override + * @return {undefined} + */ +SVGAnimationElement.prototype.beginElementAt = function(opt_offset){}; + + +/** + * @override + * @return {undefined} + */ +SVGAnimationElement.prototype.endElement = function(){}; + + +/** + * @param {number=} opt_offset + * @override + * @return {undefined} + */ +SVGAnimationElement.prototype.endElementAt = function(opt_offset){}; + + + +/** + * @constructor + * @extends {SVGAnimationElement} + */ +function SVGAnimateMotionElement(){} + + + +/** + * @constructor + * @extends {SVGAnimationElement} + */ +function SVGAnimateElement(){} + + + +/** + * @constructor + * @extends {SVGAnimationElement} + */ +function SVGAnimateColorElement(){} + + + +/** + * @constructor + * @extends {SVGAnimationElement} + */ +function SVGAnimateTransformElement(){} + + + +/** + * @constructor + * @extends {SVGAnimationElement} + */ +function SVGSetElement(){} + + + +/** + * @constructor + */ +function SVGAngle(){} + + +/** + * @const + * @type {number} + */ +SVGAngle.SVG_ANGLETYPE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGAngle.prototype.SVG_ANGLETYPE_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGAngle.SVG_ANGLETYPE_UNSPECIFIED; + + +/** + * @const + * @type {number} + */ +SVGAngle.prototype.SVG_ANGLETYPE_UNSPECIFIED; + + +/** + * @const + * @type {number} + */ +SVGAngle.SVG_ANGLETYPE_DEG; + + +/** + * @const + * @type {number} + */ +SVGAngle.prototype.SVG_ANGLETYPE_DEG; + + +/** + * @const + * @type {number} + */ +SVGAngle.SVG_ANGLETYPE_RAD; + + +/** + * @const + * @type {number} + */ +SVGAngle.prototype.SVG_ANGLETYPE_RAD; + + +/** + * @const + * @type {number} + */ +SVGAngle.SVG_ANGLETYPE_GRAD; + + +/** + * @const + * @type {number} + */ +SVGAngle.prototype.SVG_ANGLETYPE_GRAD; + + +/** + * @type {number} + */ +SVGAngle.prototype.unitType; + + +/** + * @type {number} + */ +SVGAngle.prototype.value; + + +/** + * @type {number} + */ +SVGAngle.prototype.valueInSpecifiedUnits; + + +/** + * @type {string} + */ +SVGAngle.prototype.valueAsString; + + +/** + * @param {number} unitType + * @param {number} valueInSpecifiedUnits + * @return {undefined} + */ +SVGAngle.prototype.newValueSpecifiedUnits = function(unitType, valueInSpecifiedUnits){}; + + +/** + * @param {number} unitType + * @return {undefined} + */ +SVGAngle.prototype.convertToSpecifiedUnits = function(unitType){}; + + + +/** + * @constructor + * @extends {SVGTextPositioningElement} + * @implements {SVGTransformable} + */ +function SVGTextElement(){} + + +/** + * @type {!SVGAnimatedTransformList} + */ +SVGTextElement.prototype.transform; + + +/** + * @type {!SVGElement} + */ +SVGTextElement.prototype.nearestViewportElement; + + +/** + * @type {!SVGElement} + */ +SVGTextElement.prototype.farthestViewportElement; + + +/** + * @return {!SVGRect} + * @override + */ +SVGTextElement.prototype.getBBox = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGTextElement.prototype.getCTM = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGTextElement.prototype.getScreenCTM = function(){}; + + +/** + * @param {!SVGElement=} opt_element + * @return {!SVGMatrix} + * @override + */ +SVGTextElement.prototype.getTransformToElement = function(opt_element){}; + + + +/** + * @constructor + * @extends {SVGElement} + */ +function SVGFontFaceElement(){} + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGTests} + * @implements {SVGLangSpace} + * @implements {SVGExternalResourcesRequired} + * @implements {SVGStylable} + * @implements {SVGTransformable} + */ +function SVGLineElement(){} + + +/** + * @type {!SVGAnimatedLength} + */ +SVGLineElement.prototype.x1; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGLineElement.prototype.y1; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGLineElement.prototype.x2; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGLineElement.prototype.y2; + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGLineElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGAnimatedTransformList} + */ +SVGLineElement.prototype.transform; + + +/** + * @type {string} + */ +SVGLineElement.prototype.xmllang; + + +/** + * @type {string} + */ +SVGLineElement.prototype.xmlspace; + + +/** + * @type {!SVGElement} + */ +SVGLineElement.prototype.nearestViewportElement; + + +/** + * @type {!SVGElement} + */ +SVGLineElement.prototype.farthestViewportElement; + + +/** + * @return {!SVGRect} + * @override + */ +SVGLineElement.prototype.getBBox = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGLineElement.prototype.getCTM = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGLineElement.prototype.getScreenCTM = function(){}; + + +/** + * @param {!SVGElement=} opt_element + * @return {!SVGMatrix} + * @override + */ +SVGLineElement.prototype.getTransformToElement = function(opt_element){}; + + +/** + * @type {!SVGStringList} + */ +SVGLineElement.prototype.requiredFeatures; + + +/** + * @type {!SVGStringList} + */ +SVGLineElement.prototype.requiredExtensions; + + +/** + * @type {!SVGStringList} + */ +SVGLineElement.prototype.systemLanguage; + + +/** + * @param {string=} opt_extension + * @return {boolean} + * @override + */ +SVGLineElement.prototype.hasExtension = function(opt_extension){}; + + +/** + * @type {!SVGAnimatedString} + */ +SVGLineElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGLineElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGFilterPrimitiveStandardAttributes} + */ +function SVGFEComponentTransferElement(){} + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEComponentTransferElement.prototype.in1; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEComponentTransferElement.prototype.x; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEComponentTransferElement.prototype.y; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEComponentTransferElement.prototype.width; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEComponentTransferElement.prototype.height; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEComponentTransferElement.prototype.result; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEComponentTransferElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGFEComponentTransferElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGFilterPrimitiveStandardAttributes} + */ +function SVGFEDisplacementMapElement(){} + + +/** + * @const + * @type {number} + */ +SVGFEDisplacementMapElement.SVG_CHANNEL_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGFEDisplacementMapElement.prototype.SVG_CHANNEL_UNKNOWN; + + +/** + * @const + * @type {number} + */ +SVGFEDisplacementMapElement.SVG_CHANNEL_R; + + +/** + * @const + * @type {number} + */ +SVGFEDisplacementMapElement.prototype.SVG_CHANNEL_R; + + +/** + * @const + * @type {number} + */ +SVGFEDisplacementMapElement.SVG_CHANNEL_G; + + +/** + * @const + * @type {number} + */ +SVGFEDisplacementMapElement.prototype.SVG_CHANNEL_G; + + +/** + * @const + * @type {number} + */ +SVGFEDisplacementMapElement.SVG_CHANNEL_B; + + +/** + * @const + * @type {number} + */ +SVGFEDisplacementMapElement.prototype.SVG_CHANNEL_B; + + +/** + * @const + * @type {number} + */ +SVGFEDisplacementMapElement.SVG_CHANNEL_A; + + +/** + * @const + * @type {number} + */ +SVGFEDisplacementMapElement.prototype.SVG_CHANNEL_A; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEDisplacementMapElement.prototype.in1; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEDisplacementMapElement.prototype.in2; + + +/** + * @type {!SVGAnimatedNumber} + */ +SVGFEDisplacementMapElement.prototype.scale; + + +/** + * @type {!SVGAnimatedEnumeration} + */ +SVGFEDisplacementMapElement.prototype.xChannelSelector; + + +/** + * @type {!SVGAnimatedEnumeration} + */ +SVGFEDisplacementMapElement.prototype.yChannelSelector; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEDisplacementMapElement.prototype.x; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEDisplacementMapElement.prototype.y; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEDisplacementMapElement.prototype.width; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEDisplacementMapElement.prototype.height; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEDisplacementMapElement.prototype.result; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEDisplacementMapElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGFEDisplacementMapElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + */ +function SVGAnimatedEnumeration(){} + + +/** + * @type {number} + */ +SVGAnimatedEnumeration.prototype.baseVal; + + +/** + * @type {number} + */ +SVGAnimatedEnumeration.prototype.animVal; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGFilterPrimitiveStandardAttributes} + */ +function SVGFEMergeElement(){} + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEMergeElement.prototype.x; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEMergeElement.prototype.y; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEMergeElement.prototype.width; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGFEMergeElement.prototype.height; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEMergeElement.prototype.result; + + +/** + * @type {!SVGAnimatedString} + */ +SVGFEMergeElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGFEMergeElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGTests} + * @implements {SVGLangSpace} + * @implements {SVGExternalResourcesRequired} + * @implements {SVGStylable} + * @implements {SVGTransformable} + */ +function SVGForeignObjectElement(){} + + +/** + * @type {!SVGAnimatedLength} + */ +SVGForeignObjectElement.prototype.x; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGForeignObjectElement.prototype.y; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGForeignObjectElement.prototype.width; + + +/** + * @type {!SVGAnimatedLength} + */ +SVGForeignObjectElement.prototype.height; + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGForeignObjectElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGAnimatedTransformList} + */ +SVGForeignObjectElement.prototype.transform; + + +/** + * @type {string} + */ +SVGForeignObjectElement.prototype.xmllang; + + +/** + * @type {string} + */ +SVGForeignObjectElement.prototype.xmlspace; + + +/** + * @type {!SVGElement} + */ +SVGForeignObjectElement.prototype.nearestViewportElement; + + +/** + * @type {!SVGElement} + */ +SVGForeignObjectElement.prototype.farthestViewportElement; + + +/** + * @return {!SVGRect} + * @override + */ +SVGForeignObjectElement.prototype.getBBox = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGForeignObjectElement.prototype.getCTM = function(){}; + + +/** + * @return {!SVGMatrix} + * @override + */ +SVGForeignObjectElement.prototype.getScreenCTM = function(){}; + + +/** + * @param {!SVGElement=} opt_element + * @return {!SVGMatrix} + * @override + */ +SVGForeignObjectElement.prototype.getTransformToElement = function(opt_element){}; + + +/** + * @type {!SVGStringList} + */ +SVGForeignObjectElement.prototype.requiredFeatures; + + +/** + * @type {!SVGStringList} + */ +SVGForeignObjectElement.prototype.requiredExtensions; + + +/** + * @type {!SVGStringList} + */ +SVGForeignObjectElement.prototype.systemLanguage; + + +/** + * @param {string=} opt_extension + * @return {boolean} + * @override + */ +SVGForeignObjectElement.prototype.hasExtension = function(opt_extension){}; + + +/** + * @type {!SVGAnimatedString} + */ +SVGForeignObjectElement.prototype.className; + + +/** + * @param {string=} opt_name + * @return {!CSSValue} + * @override + */ +SVGForeignObjectElement.prototype.getPresentationAttribute = function(opt_name){}; + + + +/** + * @constructor + */ +function SVGAnimatedLength(){} + + +/** + * @type {!SVGLength} + */ +SVGAnimatedLength.prototype.baseVal; + + +/** + * @type {!SVGLength} + */ +SVGAnimatedLength.prototype.animVal; + + + +/** + * @constructor + * @extends {SVGElement} + * @implements {SVGURIReference} + * @implements {SVGExternalResourcesRequired} + */ +function SVGScriptElement(){} + + +/** + * @type {string} + */ +SVGScriptElement.prototype.type; + + +/** + * @type {!SVGAnimatedBoolean} + */ +SVGScriptElement.prototype.externalResourcesRequired; + + +/** + * @type {!SVGAnimatedString} + */ +SVGScriptElement.prototype.href; + + + +/** + * @constructor + */ +function SVGAnimatedInteger(){} + + +/** + * @type {number} + */ +SVGAnimatedInteger.prototype.baseVal; + + +/** + * @type {number} + */ +SVGAnimatedInteger.prototype.animVal; diff --git a/js/generators/dart.js b/js/generators/dart.js new file mode 100644 index 0000000..444709d --- /dev/null +++ b/js/generators/dart.js @@ -0,0 +1,300 @@ +/** + * @license + * Copyright 2014 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Helper functions for generating Dart for blocks. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Dart'); + +goog.require('Blockly.Generator'); +goog.require('Blockly.utils.string'); + + +/** + * 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_IF_NULL = 13; // ?? +Blockly.Dart.ORDER_CONDITIONAL = 14; // expr ? expr : expr +Blockly.Dart.ORDER_CASCADE = 15; // .. +Blockly.Dart.ORDER_ASSIGNMENT = 16; // = *= /= ~/= %= += -= <<= >>= &= ^= |= +Blockly.Dart.ORDER_NONE = 99; // (...) + +/** + * 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(); + } + + Blockly.Dart.variableDB_.setVariableMap(workspace.getVariableMap()); + + var defvars = []; + // Add developer variables (not created or named by the user). + var devVarList = Blockly.Variables.allDeveloperVariables(workspace); + for (var i = 0; i < devVarList.length; i++) { + defvars.push(Blockly.Dart.variableDB_.getName(devVarList[i], + Blockly.Names.DEVELOPER_VARIABLE_TYPE)); + } + + // Add user variables, but only ones that are being used. + var variables = Blockly.Variables.allUsedVarModels(workspace); + for (var i = 0; i < variables.length; i++) { + defvars.push(Blockly.Dart.variableDB_.getName(variables[i].getId(), + Blockly.VARIABLE_CATEGORY_NAME)); + } + + // Declare all of the variables. + if (defvars.length) { + Blockly.Dart.definitions_['variables'] = + 'var ' + defvars.join(', ') + ';'; + } +}; + +/** + * 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) { + // Can't use goog.string.quote since $ must also be escaped. + string = string.replace(/\\/g, '\\\\') + .replace(/\n/g, '\\\n') + .replace(/\$/g, '\\$') + .replace(/'/g, '\\\''); + return '\'' + string + '\''; +}; + +/** + * Encode a string as a properly escaped multiline Dart string, complete with + * quotes. + * @param {string} string Text to encode. + * @return {string} Dart string. + * @private + */ +Blockly.Dart.multiline_quote_ = function(string) { + // Can't use goog.string.quote since $ must also be escaped. + string = string.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. + * @param {boolean=} opt_thisOnly True to generate code for only this statement. + * @return {string} Dart code with comments and subsequent blocks added. + * @private + */ +Blockly.Dart.scrub_ = function(block, code, opt_thisOnly) { + 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) { + comment = Blockly.utils.string.wrap(comment, + Blockly.Dart.COMMENT_WRAP - 3); + if (block.getProcedureDef) { + // Use documentation comment for function comments. + commentCode += Blockly.Dart.prefixLines(comment + '\n', '/// '); + } else { + commentCode += Blockly.Dart.prefixLines(comment + '\n', '// '); + } + } + // Collect comments for all value arguments. + // Don't collect comments for nested statements. + for (var i = 0; i < block.inputList.length; i++) { + if (block.inputList[i].type == Blockly.INPUT_VALUE) { + var childBlock = block.inputList[i].connection.targetBlock(); + if (childBlock) { + comment = Blockly.Dart.allNestedComments(childBlock); + if (comment) { + commentCode += Blockly.Dart.prefixLines(comment, '// '); + } + } + } + } + } + var nextBlock = block.nextConnection && block.nextConnection.targetBlock(); + var nextCode = opt_thisOnly ? '' : Blockly.Dart.blockToCode(nextBlock); + return commentCode + code + nextCode; +}; + +/** + * Gets a property and adjusts the value while taking into account indexing. + * @param {!Blockly.Block} block The block. + * @param {string} atId The property ID of the element to get. + * @param {number=} opt_delta Value to add. + * @param {boolean=} opt_negate Whether to negate the value. + * @param {number=} opt_order The highest order acting on this value. + * @return {string|number} + */ +Blockly.Dart.getAdjusted = function(block, atId, opt_delta, opt_negate, + opt_order) { + var delta = opt_delta || 0; + var order = opt_order || Blockly.Dart.ORDER_NONE; + if (block.workspace.options.oneBasedIndex) { + delta--; + } + var defaultAtIndex = block.workspace.options.oneBasedIndex ? '1' : '0'; + if (delta) { + var at = Blockly.Dart.valueToCode(block, atId, + Blockly.Dart.ORDER_ADDITIVE) || defaultAtIndex; + } else if (opt_negate) { + var at = Blockly.Dart.valueToCode(block, atId, + Blockly.Dart.ORDER_UNARY_PREFIX) || defaultAtIndex; + } else { + var at = Blockly.Dart.valueToCode(block, atId, order) || + defaultAtIndex; + } + + if (Blockly.isNumber(at)) { + // If the index is a naked number, adjust it right now. + at = parseInt(at, 10) + delta; + if (opt_negate) { + at = -at; + } + } else { + // If the index is dynamic, adjust it in code. + if (delta > 0) { + at = at + ' + ' + delta; + var innerOrder = Blockly.Dart.ORDER_ADDITIVE; + } else if (delta < 0) { + at = at + ' - ' + -delta; + var innerOrder = Blockly.Dart.ORDER_ADDITIVE; + } + if (opt_negate) { + if (delta) { + at = '-(' + at + ')'; + } else { + at = '-' + at; + } + var innerOrder = Blockly.Dart.ORDER_UNARY_PREFIX; + } + innerOrder = Math.floor(innerOrder); + order = Math.floor(order); + if (innerOrder && order >= innerOrder) { + at = '(' + at + ')'; + } + } + return at; +}; diff --git a/js/generators/dart/colour.js b/js/generators/dart/colour.js new file mode 100644 index 0000000..8f58bd4 --- /dev/null +++ b/js/generators/dart/colour.js @@ -0,0 +1,125 @@ +/** + * @license + * Copyright 2014 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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 = Blockly.Dart.quote_(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, 100), 0) * 2.55).round();', + ' String rs = rn.toInt().toRadixString(16);', + ' rs = \'0$rs\';', + ' rs = rs.substring(rs.length - 2);', + ' num gn = (Math.max(Math.min(g, 100), 0) * 2.55).round();', + ' String gs = gn.toInt().toRadixString(16);', + ' gs = \'0$gs\';', + ' gs = gs.substring(gs.length - 2);', + ' num bn = (Math.max(Math.min(b, 100), 0) * 2.55).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/js/generators/dart/lists.js b/js/generators/dart/lists.js new file mode 100644 index 0000000..37f780d --- /dev/null +++ b/js/generators/dart/lists.js @@ -0,0 +1,458 @@ +/** + * @license + * Copyright 2014 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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 elements = new Array(block.itemCount_); + for (var i = 0; i < block.itemCount_; i++) { + elements[i] = Blockly.Dart.valueToCode(block, 'ADD' + i, + Blockly.Dart.ORDER_NONE) || 'null'; + } + var code = '[' + elements.join(', ') + ']'; + return [code, Blockly.Dart.ORDER_ATOMIC]; +}; + +Blockly.Dart['lists_repeat'] = function(block) { + // Create a list with one element repeated. + var element = Blockly.Dart.valueToCode(block, 'ITEM', + Blockly.Dart.ORDER_NONE) || 'null'; + var repeatCount = Blockly.Dart.valueToCode(block, 'NUM', + Blockly.Dart.ORDER_NONE) || '0'; + var code = 'new List.filled(' + repeatCount + ', ' + element + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['lists_length'] = function(block) { + // String or array length. + var list = Blockly.Dart.valueToCode(block, 'VALUE', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]'; + return [list + '.length', Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['lists_isEmpty'] = function(block) { + // Is the string null or array empty? + var list = Blockly.Dart.valueToCode(block, 'VALUE', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]'; + return [list + '.isEmpty', Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['lists_indexOf'] = function(block) { + // Find an item in the list. + var operator = block.getFieldValue('END') == 'FIRST' ? + 'indexOf' : 'lastIndexOf'; + var item = Blockly.Dart.valueToCode(block, 'FIND', + Blockly.Dart.ORDER_NONE) || '\'\''; + var list = Blockly.Dart.valueToCode(block, 'VALUE', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]'; + var code = list + '.' + operator + '(' + item + ')'; + if (block.workspace.options.oneBasedIndex) { + return [code + ' + 1', Blockly.Dart.ORDER_ADDITIVE]; + } + 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 listOrder = (where == 'RANDOM' || where == 'FROM_END') ? + Blockly.Dart.ORDER_NONE : Blockly.Dart.ORDER_UNARY_POSTFIX; + var list = Blockly.Dart.valueToCode(block, 'VALUE', listOrder) || '[]'; + // Cache non-trivial values to variables to prevent repeated look-ups. + // Closure, which accesses and modifies 'list'. + function cacheList() { + var listVar = Blockly.Dart.variableDB_.getDistinctName( + 'tmp_list', Blockly.VARIABLE_CATEGORY_NAME); + var code = 'List ' + listVar + ' = ' + list + ';\n'; + list = listVar; + return code; + } + // If `list` would be evaluated more than once (which is the case for + // RANDOM REMOVE and FROM_END) and is non-trivial, make sure to access it + // only once. + if (((where == 'RANDOM' && mode == 'REMOVE') || where == 'FROM_END') && + !list.match(/^\w+$/)) { + // `list` is an expression, so we may not evaluate it more than once. + if (where == 'RANDOM') { + Blockly.Dart.definitions_['import_dart_math'] = + 'import \'dart:math\' as Math;'; + // We can use multiple statements. + var code = cacheList(); + var xVar = Blockly.Dart.variableDB_.getDistinctName( + 'tmp_x', Blockly.VARIABLE_CATEGORY_NAME); + code += 'int ' + xVar + ' = new Math.Random().nextInt(' + list + + '.length);\n'; + code += list + '.removeAt(' + xVar + ');\n'; + return code; + } else { // where == 'FROM_END' + if (mode == 'REMOVE') { + // We can use multiple statements. + var at = Blockly.Dart.getAdjusted(block, 'AT', 1, false, + Blockly.Dart.ORDER_ADDITIVE); + var code = cacheList(); + code += list + '.removeAt(' + list + '.length' + ' - ' + at + ');\n'; + return code; + + } else if (mode == 'GET') { + var at = Blockly.Dart.getAdjusted(block, 'AT', 1); + // We need to create a procedure to avoid reevaluating values. + var functionName = Blockly.Dart.provideFunction_( + 'lists_get_from_end', + ['dynamic ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(List my_list, num x) {', + ' x = my_list.length - x;', + ' return my_list[x];', + '}']); + var code = functionName + '(' + list + ', ' + at + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } else if (mode == 'GET_REMOVE') { + var at = Blockly.Dart.getAdjusted(block, 'AT', 1); + // We need to create a procedure to avoid reevaluating values. + var functionName = Blockly.Dart.provideFunction_( + 'lists_remove_from_end', + ['dynamic ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(List my_list, num x) {', + ' x = my_list.length - x;', + ' return my_list.removeAt(x);', + '}']); + var code = functionName + '(' + list + ', ' + at + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } + } + } else { + // Either `list` is a simple variable, or we only need to refer to `list` + // once. + switch (where) { + case 'FIRST': + if (mode == 'GET') { + var code = list + '.first'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } else if (mode == 'GET_REMOVE') { + var code = list + '.removeAt(0)'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } else if (mode == 'REMOVE') { + return list + '.removeAt(0);\n'; + } + break; + case 'LAST': + if (mode == 'GET') { + var code = list + '.last'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } else if (mode == 'GET_REMOVE') { + var code = list + '.removeLast()'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } else if (mode == 'REMOVE') { + return list + '.removeLast();\n'; + } + break; + case 'FROM_START': + var at = Blockly.Dart.getAdjusted(block, 'AT'); + if (mode == 'GET') { + var code = list + '[' + at + ']'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } else if (mode == 'GET_REMOVE') { + var code = list + '.removeAt(' + at + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } else if (mode == 'REMOVE') { + return list + '.removeAt(' + at + ');\n'; + } + break; + case 'FROM_END': + var at = Blockly.Dart.getAdjusted(block, 'AT', 1, false, + Blockly.Dart.ORDER_ADDITIVE); + if (mode == 'GET') { + var code = list + '[' + list + '.length - ' + at + ']'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } else if (mode == 'GET_REMOVE' || mode == 'REMOVE') { + var code = list + '.removeAt(' + list + '.length - ' + at + ')'; + if (mode == 'GET_REMOVE') { + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } else if (mode == 'REMOVE') { + return code + ';\n'; + } + } + break; + case 'RANDOM': + Blockly.Dart.definitions_['import_dart_math'] = + 'import \'dart:math\' as Math;'; + if (mode == 'REMOVE') { + // We can use multiple statements. + var xVar = Blockly.Dart.variableDB_.getDistinctName( + 'tmp_x', Blockly.VARIABLE_CATEGORY_NAME); + var code = 'int ' + xVar + ' = new Math.Random().nextInt(' + list + + '.length);\n'; + code += list + '.removeAt(' + xVar + ');\n'; + return code; + } else if (mode == 'GET') { + var functionName = Blockly.Dart.provideFunction_( + 'lists_get_random_item', + ['dynamic ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(List my_list) {', + ' int x = new Math.Random().nextInt(my_list.length);', + ' return my_list[x];', + '}']); + var code = functionName + '(' + list + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } else if (mode == 'GET_REMOVE') { + var functionName = Blockly.Dart.provideFunction_( + 'lists_remove_random_item', + ['dynamic ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(List my_list) {', + ' int x = new Math.Random().nextInt(my_list.length);', + ' return my_list.removeAt(x);', + '}']); + var code = functionName + '(' + list + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } + break; + } + } + throw Error('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 mode = block.getFieldValue('MODE') || 'GET'; + var where = block.getFieldValue('WHERE') || 'FROM_START'; + var list = Blockly.Dart.valueToCode(block, 'LIST', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '[]'; + var value = Blockly.Dart.valueToCode(block, 'TO', + Blockly.Dart.ORDER_ASSIGNMENT) || 'null'; + // Cache non-trivial values to variables to prevent repeated look-ups. + // Closure, which accesses and modifies 'list'. + function cacheList() { + if (list.match(/^\w+$/)) { + return ''; + } + var listVar = Blockly.Dart.variableDB_.getDistinctName( + 'tmp_list', Blockly.VARIABLE_CATEGORY_NAME); + var code = 'List ' + listVar + ' = ' + list + ';\n'; + list = listVar; + return code; + } + switch (where) { + case 'FIRST': + if (mode == 'SET') { + return list + '[0] = ' + value + ';\n'; + } else if (mode == 'INSERT') { + return list + '.insert(0, ' + value + ');\n'; + } + break; + case 'LAST': + if (mode == 'SET') { + var code = cacheList(); + code += list + '[' + list + '.length - 1] = ' + value + ';\n'; + return code; + } else if (mode == 'INSERT') { + return list + '.add(' + value + ');\n'; + } + break; + case 'FROM_START': + var at = Blockly.Dart.getAdjusted(block, 'AT'); + if (mode == 'SET') { + return list + '[' + at + '] = ' + value + ';\n'; + } else if (mode == 'INSERT') { + return list + '.insert(' + at + ', ' + value + ');\n'; + } + break; + case 'FROM_END': + var at = Blockly.Dart.getAdjusted(block, 'AT', 1, false, + Blockly.Dart.ORDER_ADDITIVE); + var code = cacheList(); + if (mode == 'SET') { + code += list + '[' + list + '.length - ' + at + '] = ' + value + + ';\n'; + return code; + } else if (mode == 'INSERT') { + code += list + '.insert(' + list + '.length - ' + at + ', ' + + value + ');\n'; + return code; + } + break; + case 'RANDOM': + Blockly.Dart.definitions_['import_dart_math'] = + 'import \'dart:math\' as Math;'; + var code = cacheList(); + var xVar = Blockly.Dart.variableDB_.getDistinctName( + 'tmp_x', Blockly.VARIABLE_CATEGORY_NAME); + code += 'int ' + xVar + + ' = new Math.Random().nextInt(' + list + '.length);\n'; + if (mode == 'SET') { + code += list + '[' + xVar + '] = ' + value + ';\n'; + return code; + } else if (mode == 'INSERT') { + code += list + '.insert(' + xVar + ', ' + value + ');\n'; + return code; + } + break; + } + throw Error('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'); + if (list.match(/^\w+$/) || (where1 != 'FROM_END' && where2 == 'FROM_START')) { + // If the list is a is a variable or doesn't require a call for length, + // don't generate a helper function. + switch (where1) { + case 'FROM_START': + var at1 = Blockly.Dart.getAdjusted(block, 'AT1'); + break; + case 'FROM_END': + var at1 = Blockly.Dart.getAdjusted(block, 'AT1', 1, false, + Blockly.Dart.ORDER_ADDITIVE); + at1 = list + '.length - ' + at1; + break; + case 'FIRST': + var at1 = '0'; + break; + default: + throw Error('Unhandled option (lists_getSublist).'); + } + switch (where2) { + case 'FROM_START': + var at2 = Blockly.Dart.getAdjusted(block, 'AT2', 1); + break; + case 'FROM_END': + var at2 = Blockly.Dart.getAdjusted(block, 'AT2', 0, false, + Blockly.Dart.ORDER_ADDITIVE); + at2 = list + '.length - ' + at2; + break; + case 'LAST': + // There is no second index if LAST option is chosen. + break; + default: + throw Error('Unhandled option (lists_getSublist).'); + } + if (where2 == 'LAST') { + var code = list + '.sublist(' + at1 + ')'; + } else { + var code = list + '.sublist(' + at1 + ', ' + at2 + ')'; + } + } else { + var at1 = Blockly.Dart.getAdjusted(block, 'AT1'); + var at2 = Blockly.Dart.getAdjusted(block, 'AT2'); + var functionName = Blockly.Dart.provideFunction_( + 'lists_get_sublist', + ['List ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(List list, String where1, num at1, String where2, num at2) {', + ' int getAt(String where, num at) {', + ' if (where == \'FROM_END\') {', + ' at = list.length - 1 - at;', + ' } else if (where == \'FIRST\') {', + ' at = 0;', + ' } else if (where == \'LAST\') {', + ' at = list.length - 1;', + ' } else if (where != \'FROM_START\') {', + ' throw \'Unhandled option (lists_getSublist).\';', + ' }', + ' return at;', + ' }', + ' at1 = getAt(where1, at1);', + ' at2 = getAt(where2, at2) + 1;', + ' return list.sublist(at1, at2);', + '}']); + var code = functionName + '(' + list + ', \'' + + where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')'; + } + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['lists_sort'] = function(block) { + // Block for sorting a list. + var list = Blockly.Dart.valueToCode(block, 'LIST', + Blockly.Dart.ORDER_NONE) || '[]'; + var direction = block.getFieldValue('DIRECTION') === '1' ? 1 : -1; + var type = block.getFieldValue('TYPE'); + var sortFunctionName = Blockly.Dart.provideFunction_( + 'lists_sort', + ['List ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(List list, String type, int direction) {', + ' var compareFuncs = {', + ' "NUMERIC": (a, b) => (direction * a.compareTo(b)).toInt(),', + ' "TEXT": (a, b) => direction * ' + + 'a.toString().compareTo(b.toString()),', + ' "IGNORE_CASE": ', + ' (a, b) => direction * ', + ' a.toString().toLowerCase().compareTo(b.toString().toLowerCase())', + ' };', + ' list = new List.from(list);', // Clone the list. + ' var compare = compareFuncs[type];', + ' list.sort(compare);', + ' return list;', + '}']); + return [sortFunctionName + '(' + list + ', ' + + '"' + type + '", ' + direction + ')', + Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['lists_split'] = function(block) { + // Block for splitting text into a list, or joining a list into text. + var input = Blockly.Dart.valueToCode(block, 'INPUT', + Blockly.Dart.ORDER_UNARY_POSTFIX); + var delimiter = Blockly.Dart.valueToCode(block, 'DELIM', + Blockly.Dart.ORDER_NONE) || '\'\''; + var mode = block.getFieldValue('MODE'); + if (mode == 'SPLIT') { + if (!input) { + input = '\'\''; + } + var functionName = 'split'; + } else if (mode == 'JOIN') { + if (!input) { + input = '[]'; + } + var functionName = 'join'; + } else { + throw Error('Unknown mode: ' + mode); + } + var code = input + '.' + functionName + '(' + delimiter + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['lists_reverse'] = function(block) { + // Block for reversing a list. + var list = Blockly.Dart.valueToCode(block, 'LIST', + Blockly.Dart.ORDER_NONE) || '[]'; + // XXX What should the operator precedence be for a `new`? + var code = 'new List.from(' + list + '.reversed)'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; diff --git a/js/generators/dart/logic.js b/js/generators/dart/logic.js new file mode 100644 index 0000000..abfdd05 --- /dev/null +++ b/js/generators/dart/logic.js @@ -0,0 +1,138 @@ +/** + * @license + * Copyright 2014 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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 code = '', branchCode, conditionCode; + if (Blockly.Dart.STATEMENT_PREFIX) { + // Automatic prefix insertion is switched off for this block. Add manually. + code += Blockly.Dart.injectId(Blockly.Dart.STATEMENT_PREFIX, block); + } + do { + conditionCode = Blockly.Dart.valueToCode(block, 'IF' + n, + Blockly.Dart.ORDER_NONE) || 'false'; + branchCode = Blockly.Dart.statementToCode(block, 'DO' + n); + if (Blockly.Dart.STATEMENT_SUFFIX) { + branchCode = Blockly.Dart.prefixLines( + Blockly.Dart.injectId(Blockly.Dart.STATEMENT_SUFFIX, block), + Blockly.Dart.INDENT) + branchCode; + } + code += (n > 0 ? 'else ' : '') + + 'if (' + conditionCode + ') {\n' + branchCode + '}'; + ++n; + } while (block.getInput('IF' + n)); + + if (block.getInput('ELSE') || Blockly.Dart.STATEMENT_SUFFIX) { + branchCode = Blockly.Dart.statementToCode(block, 'ELSE'); + if (Blockly.Dart.STATEMENT_SUFFIX) { + branchCode = Blockly.Dart.prefixLines( + Blockly.Dart.injectId(Blockly.Dart.STATEMENT_SUFFIX, block), + Blockly.Dart.INDENT) + branchCode; + } + code += ' else {\n' + branchCode + '}'; + } + return code + '\n'; +}; + +Blockly.Dart['controls_ifelse'] = Blockly.Dart['controls_if']; + +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/js/generators/dart/loops.js b/js/generators/dart/loops.js new file mode 100644 index 0000000..9d10afd --- /dev/null +++ b/js/generators/dart/loops.js @@ -0,0 +1,180 @@ +/** + * @license + * Copyright 2014 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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); + var code = ''; + var loopVar = Blockly.Dart.variableDB_.getDistinctName( + 'count', Blockly.VARIABLE_CATEGORY_NAME); + var endVar = repeats; + if (!repeats.match(/^\w+$/) && !Blockly.isNumber(repeats)) { + endVar = Blockly.Dart.variableDB_.getDistinctName( + 'repeat_end', Blockly.VARIABLE_CATEGORY_NAME); + 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); + 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.VARIABLE_CATEGORY_NAME); + 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); + var code; + if (Blockly.isNumber(argument0) && Blockly.isNumber(argument1) && + Blockly.isNumber(increment)) { + // All arguments are simple numbers. + var up = Number(argument0) <= Number(argument1); + code = 'for (' + variable0 + ' = ' + argument0 + '; ' + + variable0 + (up ? ' <= ' : ' >= ') + argument1 + '; ' + + variable0; + var step = Math.abs(Number(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.Dart.variableDB_.getDistinctName( + variable0 + '_start', Blockly.VARIABLE_CATEGORY_NAME); + code += 'var ' + startVar + ' = ' + argument0 + ';\n'; + } + var endVar = argument1; + if (!argument1.match(/^\w+$/) && !Blockly.isNumber(argument1)) { + endVar = Blockly.Dart.variableDB_.getDistinctName( + variable0 + '_end', Blockly.VARIABLE_CATEGORY_NAME); + 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.VARIABLE_CATEGORY_NAME); + 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 + '; ' + + incVar + ' >= 0 ? ' + + variable0 + ' <= ' + endVar + ' : ' + + variable0 + ' >= ' + endVar + '; ' + + 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.VARIABLE_CATEGORY_NAME); + var argument0 = Blockly.Dart.valueToCode(block, 'LIST', + Blockly.Dart.ORDER_ASSIGNMENT) || '[]'; + var branch = Blockly.Dart.statementToCode(block, 'DO'); + branch = Blockly.Dart.addLoopTrap(branch, block); + var code = 'for (var ' + variable0 + ' in ' + argument0 + ') {\n' + + branch + '}\n'; + return code; +}; + +Blockly.Dart['controls_flow_statements'] = function(block) { + // Flow statements: continue, break. + var xfix = ''; + if (Blockly.Dart.STATEMENT_PREFIX) { + // Automatic prefix insertion is switched off for this block. Add manually. + xfix += Blockly.Dart.injectId(Blockly.Dart.STATEMENT_PREFIX, block); + } + if (Blockly.Dart.STATEMENT_SUFFIX) { + // Inject any statement suffix here since the regular one at the end + // will not get executed if the break/continue is triggered. + xfix += Blockly.Dart.injectId(Blockly.Dart.STATEMENT_SUFFIX, block); + } + if (Blockly.Dart.STATEMENT_PREFIX) { + var loop = Blockly.Constants.Loops + .CONTROL_FLOW_IN_LOOP_CHECK_MIXIN.getSurroundLoop(block); + if (loop && !loop.suppressPrefixSuffix) { + // Inject loop's statement prefix here since the regular one at the end + // of the loop will not get executed if 'continue' is triggered. + // In the case of 'break', a prefix is needed due to the loop's suffix. + xfix += Blockly.Dart.injectId(Blockly.Dart.STATEMENT_PREFIX, loop); + } + } + switch (block.getFieldValue('FLOW')) { + case 'BREAK': + return xfix + 'break;\n'; + case 'CONTINUE': + return xfix + 'continue;\n'; + } + throw Error('Unknown flow statement.'); +}; diff --git a/js/generators/dart/math.js b/js/generators/dart/math.js new file mode 100644 index 0000000..9564588 --- /dev/null +++ b/js/generators/dart/math.js @@ -0,0 +1,496 @@ +/** + * @license + * Copyright 2014 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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 = Number(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 Error('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.Dart.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.Dart.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.VARIABLE_CATEGORY_NAME); + 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_mean', + ['num ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(List myList) {', + ' // First filter list for numbers only.', + ' List localList = new List.from(myList);', + ' localList.removeWhere((a) => a is! num);', + ' if (localList.isEmpty) return null;', + ' num sumVal = 0;', + ' localList.forEach((var 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.removeWhere((a) => a is! num);', + ' if (localList.isEmpty) return null;', + ' localList.sort((a, b) => (a - b));', + ' int index = localList.length ~/ 2;', + ' if (localList.length % 2 == 1) {', + ' return localList[index];', + ' } else {', + ' return (localList[index - 1] + localList[index]) / 2;', + ' }', + '}']); + code = functionName + '(' + list + ')'; + break; + case 'MODE': + 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.removeWhere((a) => a is! num);', + ' if (numbers.isEmpty) return null;', + ' num n = numbers.length;', + ' num sum = 0;', + ' numbers.forEach((x) => sum += x);', + ' num mean = sum / n;', + ' num sumSquare = 0;', + ' numbers.forEach((x) => sumSquare += ' + + 'Math.pow(x - mean, 2));', + ' return Math.sqrt(sumSquare / n);', + '}']); + code = functionName + '(' + list + ')'; + break; + case 'RANDOM': + 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 Error('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]; +}; + +Blockly.Dart['math_atan2'] = function(block) { + // Arctangent of point (X, Y) in degrees from -180 to 180. + Blockly.Dart.definitions_['import_dart_math'] = + 'import \'dart:math\' as Math;'; + var argument0 = Blockly.Dart.valueToCode(block, 'X', + Blockly.Dart.ORDER_NONE) || '0'; + var argument1 = Blockly.Dart.valueToCode(block, 'Y', + Blockly.Dart.ORDER_NONE) || '0'; + return ['Math.atan2(' + argument1 + ', ' + argument0 + ') / Math.pi * 180', + Blockly.Dart.ORDER_MULTIPLICATIVE]; +}; diff --git a/js/generators/dart/procedures.js b/js/generators/dart/procedures.js new file mode 100644 index 0000000..d21fdfd --- /dev/null +++ b/js/generators/dart/procedures.js @@ -0,0 +1,120 @@ +/** + * @license + * Copyright 2014 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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.PROCEDURE_CATEGORY_NAME); + var xfix1 = ''; + if (Blockly.Dart.STATEMENT_PREFIX) { + xfix1 += Blockly.Dart.injectId(Blockly.Dart.STATEMENT_PREFIX, block); + } + if (Blockly.Dart.STATEMENT_SUFFIX) { + xfix1 += Blockly.Dart.injectId(Blockly.Dart.STATEMENT_SUFFIX, block); + } + if (xfix1) { + xfix1 = Blockly.Dart.prefixLines(xfix1, Blockly.Dart.INDENT); + } + var loopTrap = ''; + if (Blockly.Dart.INFINITE_LOOP_TRAP) { + loopTrap = Blockly.Dart.prefixLines( + Blockly.Dart.injectId(Blockly.Dart.INFINITE_LOOP_TRAP, block), + Blockly.Dart.INDENT); + } + var branch = Blockly.Dart.statementToCode(block, 'STACK'); + var returnValue = Blockly.Dart.valueToCode(block, 'RETURN', + Blockly.Dart.ORDER_NONE) || ''; + var xfix2 = ''; + if (branch && returnValue) { + // After executing the function body, revisit this block for the return. + xfix2 = xfix1; + } + if (returnValue) { + returnValue = Blockly.Dart.INDENT + 'return ' + returnValue + ';\n'; + } + var returnType = returnValue ? 'dynamic' : 'void'; + var args = []; + for (var i = 0; i < block.arguments_.length; i++) { + args[i] = Blockly.Dart.variableDB_.getName(block.arguments_[i], + Blockly.VARIABLE_CATEGORY_NAME); + } + var code = returnType + ' ' + funcName + '(' + args.join(', ') + ') {\n' + + xfix1 + loopTrap + branch + xfix2 + returnValue + '}'; + code = Blockly.Dart.scrub_(block, code); + // Add % so as not to collide with helper functions in definitions list. + 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.PROCEDURE_CATEGORY_NAME); + var args = []; + for (var i = 0; i < block.arguments_.length; i++) { + args[i] = Blockly.Dart.valueToCode(block, 'ARG' + i, + Blockly.Dart.ORDER_NONE) || 'null'; + } + var code = funcName + '(' + args.join(', ') + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['procedures_callnoreturn'] = function(block) { + // Call a procedure with no return value. + // Generated code is for a function call as a statement is the same as a + // function call as a value, with the addition of line ending. + var tuple = Blockly.Dart['procedures_callreturn'](block); + return tuple[0] + ';\n'; +}; + +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 (Blockly.Dart.STATEMENT_SUFFIX) { + // Inject any statement suffix here since the regular one at the end + // will not get executed if the return is triggered. + code += Blockly.Dart.prefixLines( + Blockly.Dart.injectId(Blockly.Dart.STATEMENT_SUFFIX, block), + Blockly.Dart.INDENT); + } + if (block.hasReturnValue_) { + var value = Blockly.Dart.valueToCode(block, 'VALUE', + Blockly.Dart.ORDER_NONE) || 'null'; + code += Blockly.Dart.INDENT + 'return ' + value + ';\n'; + } else { + code += Blockly.Dart.INDENT + 'return;\n'; + } + code += '}\n'; + return code; +}; diff --git a/js/generators/dart/text.js b/js/generators/dart/text.js new file mode 100644 index 0000000..b53eddf --- /dev/null +++ b/js/generators/dart/text.js @@ -0,0 +1,350 @@ +/** + * @license + * Copyright 2014 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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_multiline'] = function(block) { + // Text value. + var code = Blockly.Dart.multiline_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. + switch (block.itemCount_) { + case 0: + return ['\'\'', Blockly.Dart.ORDER_ATOMIC]; + case 1: + var element = Blockly.Dart.valueToCode(block, 'ADD0', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; + var code = element + '.toString()'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + default: + var elements = new Array(block.itemCount_); + for (var i = 0; i < block.itemCount_; i++) { + elements[i] = Blockly.Dart.valueToCode(block, 'ADD' + i, + Blockly.Dart.ORDER_NONE) || '\'\''; + } + var code = '[' + elements.join(',') + '].join()'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + } +}; + +Blockly.Dart['text_append'] = function(block) { + // Append to a variable in place. + var varName = Blockly.Dart.variableDB_.getName(block.getFieldValue('VAR'), + Blockly.VARIABLE_CATEGORY_NAME); + var value = Blockly.Dart.valueToCode(block, 'TEXT', + Blockly.Dart.ORDER_NONE) || '\'\''; + return varName + ' = [' + varName + ', ' + value + '].join();\n'; +}; + +Blockly.Dart['text_length'] = function(block) { + // String or array length. + var text = Blockly.Dart.valueToCode(block, 'VALUE', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; + return [text + '.length', Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['text_isEmpty'] = function(block) { + // Is the string null or array empty? + var text = Blockly.Dart.valueToCode(block, 'VALUE', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; + return [text + '.isEmpty', Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['text_indexOf'] = function(block) { + // Search the text for a substring. + var operator = block.getFieldValue('END') == 'FIRST' ? + 'indexOf' : 'lastIndexOf'; + var substring = Blockly.Dart.valueToCode(block, 'FIND', + Blockly.Dart.ORDER_NONE) || '\'\''; + var text = Blockly.Dart.valueToCode(block, 'VALUE', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; + var code = text + '.' + operator + '(' + substring + ')'; + if (block.workspace.options.oneBasedIndex) { + return [code + ' + 1', Blockly.Dart.ORDER_ADDITIVE]; + } + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['text_charAt'] = function(block) { + // Get letter at index. + // Note: Until January 2013 this block did not have the WHERE input. + var where = block.getFieldValue('WHERE') || 'FROM_START'; + var 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': + var at = Blockly.Dart.getAdjusted(block, 'AT'); + var code = text + '[' + at + ']'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; + case 'LAST': + at = 1; + // Fall through. + case 'FROM_END': + var at = Blockly.Dart.getAdjusted(block, 'AT', 1); + var functionName = Blockly.Dart.provideFunction_( + 'text_get_from_end', + ['String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(String 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 Error('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'); + if (where1 == 'FIRST' && where2 == 'LAST') { + var code = text; + } else if (text.match(/^'?\w+'?$/) || + (where1 != 'FROM_END' && where2 == 'FROM_START')) { + // If the text is a variable or literal or doesn't require a call for + // length, don't generate a helper function. + switch (where1) { + case 'FROM_START': + var at1 = Blockly.Dart.getAdjusted(block, 'AT1'); + break; + case 'FROM_END': + var at1 = Blockly.Dart.getAdjusted(block, 'AT1', 1, false, + Blockly.Dart.ORDER_ADDITIVE); + at1 = text + '.length - ' + at1; + break; + case 'FIRST': + var at1 = '0'; + break; + default: + throw Error('Unhandled option (text_getSubstring).'); + } + switch (where2) { + case 'FROM_START': + var at2 = Blockly.Dart.getAdjusted(block, 'AT2', 1); + break; + case 'FROM_END': + var at2 = Blockly.Dart.getAdjusted(block, 'AT2', 0, false, + Blockly.Dart.ORDER_ADDITIVE); + at2 = text + '.length - ' + at2; + break; + case 'LAST': + break; + default: + throw Error('Unhandled option (text_getSubstring).'); + } + if (where2 == 'LAST') { + var code = text + '.substring(' + at1 + ')'; + } else { + var code = text + '.substring(' + at1 + ', ' + at2 + ')'; + } + } else { + var at1 = Blockly.Dart.getAdjusted(block, 'AT1'); + var at2 = Blockly.Dart.getAdjusted(block, 'AT2'); + var functionName = Blockly.Dart.provideFunction_( + 'text_get_substring', + ['String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(String text, String where1, num at1, String where2, num at2) {', + ' int getAt(String where, num at) {', + ' if (where == \'FROM_END\') {', + ' at = text.length - 1 - at;', + ' } else if (where == \'FIRST\') {', + ' at = 0;', + ' } else if (where == \'LAST\') {', + ' at = text.length - 1;', + ' } else if (where != \'FROM_START\') {', + ' throw \'Unhandled option (text_getSubstring).\';', + ' }', + ' return at;', + ' }', + ' at1 = getAt(where1, at1);', + ' at2 = getAt(where2, at2) + 1;', + ' return text.substring(at1, at2);', + '}']); + var code = functionName + '(' + text + ', \'' + + where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')'; + } + 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 textOrder = operator ? Blockly.Dart.ORDER_UNARY_POSTFIX : + Blockly.Dart.ORDER_NONE; + var text = Blockly.Dart.valueToCode(block, 'TEXT', textOrder) || '\'\''; + if (operator) { + // Upper and lower case are functions built into Dart. + var code = text + operator; + } else { + // Title case is not a native Dart function. Define one. + var functionName = Blockly.Dart.provideFunction_( + 'text_toTitleCase', + ['String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(String 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 code = functionName + '(' + text + ')'; + } + 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 text = Blockly.Dart.valueToCode(block, 'TEXT', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; + return [text + operator, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['text_print'] = function(block) { + // Print statement. + var msg = Blockly.Dart.valueToCode(block, 'TEXT', + Blockly.Dart.ORDER_NONE) || '\'\''; + return 'print(' + msg + ');\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']; + +Blockly.Dart['text_count'] = function(block) { + var text = Blockly.Dart.valueToCode(block, 'TEXT', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; + var sub = Blockly.Dart.valueToCode(block, 'SUB', + Blockly.Dart.ORDER_NONE) || '\'\''; + // Substring count is not a native Dart function. Define one. + var functionName = Blockly.Dart.provideFunction_( + 'text_count', + ['int ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + '(String haystack, String needle) {', + ' if (needle.length == 0) {', + ' return haystack.length + 1;', + ' }', + ' int index = 0;', + ' int count = 0;', + ' while (index != -1) {', + ' index = haystack.indexOf(needle, index);', + ' if (index != -1) {', + ' count++;', + ' index += needle.length;', + ' }', + ' }', + ' return count;', + '}']); + var code = functionName + '(' + text + ', ' + sub + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['text_replace'] = function(block) { + var text = Blockly.Dart.valueToCode(block, 'TEXT', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; + var from = Blockly.Dart.valueToCode(block, 'FROM', + Blockly.Dart.ORDER_NONE) || '\'\''; + var to = Blockly.Dart.valueToCode(block, 'TO', + Blockly.Dart.ORDER_NONE) || '\'\''; + var code = text + '.replaceAll(' + from + ', ' + to + ')'; + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; + +Blockly.Dart['text_reverse'] = function(block) { + // There isn't a sensible way to do this in Dart. See: + // http://stackoverflow.com/a/21613700/3529104 + // Implementing something is possibly better than not implementing anything? + var text = Blockly.Dart.valueToCode(block, 'TEXT', + Blockly.Dart.ORDER_UNARY_POSTFIX) || '\'\''; + var code = 'new String.fromCharCodes(' + text + '.runes.toList().reversed)'; + // XXX What should the operator precedence be for a `new`? + return [code, Blockly.Dart.ORDER_UNARY_POSTFIX]; +}; diff --git a/js/generators/dart/variables.js b/js/generators/dart/variables.js new file mode 100644 index 0000000..dd4d7cf --- /dev/null +++ b/js/generators/dart/variables.js @@ -0,0 +1,43 @@ +/** + * @license + * Copyright 2014 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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.VARIABLE_CATEGORY_NAME); + 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.VARIABLE_CATEGORY_NAME); + return varName + ' = ' + argument0 + ';\n'; +}; diff --git a/js/generators/dart/variables_dynamic.js b/js/generators/dart/variables_dynamic.js new file mode 100644 index 0000000..0fad712 --- /dev/null +++ b/js/generators/dart/variables_dynamic.js @@ -0,0 +1,32 @@ +/** + * @license + * Copyright 2018 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Dart for dynamic variable blocks. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.Dart.variablesDynamic'); + +goog.require('Blockly.Dart'); +goog.require('Blockly.Dart.variables'); + + +// Dart is dynamically typed. +Blockly.Dart['variables_get_dynamic'] = Blockly.Dart['variables_get']; +Blockly.Dart['variables_set_dynamic'] = Blockly.Dart['variables_set']; diff --git a/js/generators/javascript.js b/js/generators/javascript.js new file mode 100644 index 0000000..68cdbbd --- /dev/null +++ b/js/generators/javascript.js @@ -0,0 +1,328 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Helper functions for generating JavaScript for blocks. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.JavaScript'); + +goog.require('Blockly.Generator'); +goog.require('Blockly.utils.global'); +goog.require('Blockly.utils.string'); + + +/** + * 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( + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#Keywords + 'break,case,catch,class,const,continue,debugger,default,delete,do,else,export,extends,finally,for,function,if,import,in,instanceof,new,return,super,switch,this,throw,try,typeof,var,void,while,with,yield,' + + 'enum,' + + 'implements,interface,let,package,private,protected,public,static,' + + 'await,' + + 'null,true,false,' + + // Magic variable. + 'arguments,' + + // Everything in the current environment (835 items in Chrome, 104 in Node). + Object.getOwnPropertyNames(Blockly.utils.global).join(',')); + +/** + * Order of operation ENUMs. + * https://developer.mozilla.org/en/JavaScript/Reference/Operators/Operator_Precedence + */ +Blockly.JavaScript.ORDER_ATOMIC = 0; // 0 "" ... +Blockly.JavaScript.ORDER_NEW = 1.1; // new +Blockly.JavaScript.ORDER_MEMBER = 1.2; // . [] +Blockly.JavaScript.ORDER_FUNCTION_CALL = 2; // () +Blockly.JavaScript.ORDER_INCREMENT = 3; // ++ +Blockly.JavaScript.ORDER_DECREMENT = 3; // -- +Blockly.JavaScript.ORDER_BITWISE_NOT = 4.1; // ~ +Blockly.JavaScript.ORDER_UNARY_PLUS = 4.2; // + +Blockly.JavaScript.ORDER_UNARY_NEGATION = 4.3; // - +Blockly.JavaScript.ORDER_LOGICAL_NOT = 4.4; // ! +Blockly.JavaScript.ORDER_TYPEOF = 4.5; // typeof +Blockly.JavaScript.ORDER_VOID = 4.6; // void +Blockly.JavaScript.ORDER_DELETE = 4.7; // delete +Blockly.JavaScript.ORDER_AWAIT = 4.8; // await +Blockly.JavaScript.ORDER_EXPONENTIATION = 5.0; // ** +Blockly.JavaScript.ORDER_MULTIPLICATION = 5.1; // * +Blockly.JavaScript.ORDER_DIVISION = 5.2; // / +Blockly.JavaScript.ORDER_MODULUS = 5.3; // % +Blockly.JavaScript.ORDER_SUBTRACTION = 6.1; // - +Blockly.JavaScript.ORDER_ADDITION = 6.2; // + +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_YIELD = 17; // yield +Blockly.JavaScript.ORDER_COMMA = 18; // , +Blockly.JavaScript.ORDER_NONE = 99; // (...) + +/** + * List of outer-inner pairings that do NOT require parentheses. + * @type {!Array.>} + */ +Blockly.JavaScript.ORDER_OVERRIDES = [ + // (foo()).bar -> foo().bar + // (foo())[0] -> foo()[0] + [Blockly.JavaScript.ORDER_FUNCTION_CALL, Blockly.JavaScript.ORDER_MEMBER], + // (foo())() -> foo()() + [Blockly.JavaScript.ORDER_FUNCTION_CALL, Blockly.JavaScript.ORDER_FUNCTION_CALL], + // (foo.bar).baz -> foo.bar.baz + // (foo.bar)[0] -> foo.bar[0] + // (foo[0]).bar -> foo[0].bar + // (foo[0])[1] -> foo[0][1] + [Blockly.JavaScript.ORDER_MEMBER, Blockly.JavaScript.ORDER_MEMBER], + // (foo.bar)() -> foo.bar() + // (foo[0])() -> foo[0]() + [Blockly.JavaScript.ORDER_MEMBER, Blockly.JavaScript.ORDER_FUNCTION_CALL], + + // !(!foo) -> !!foo + [Blockly.JavaScript.ORDER_LOGICAL_NOT, Blockly.JavaScript.ORDER_LOGICAL_NOT], + // a * (b * c) -> a * b * c + [Blockly.JavaScript.ORDER_MULTIPLICATION, Blockly.JavaScript.ORDER_MULTIPLICATION], + // a + (b + c) -> a + b + c + [Blockly.JavaScript.ORDER_ADDITION, Blockly.JavaScript.ORDER_ADDITION], + // a && (b && c) -> a && b && c + [Blockly.JavaScript.ORDER_LOGICAL_AND, Blockly.JavaScript.ORDER_LOGICAL_AND], + // a || (b || c) -> a || b || c + [Blockly.JavaScript.ORDER_LOGICAL_OR, Blockly.JavaScript.ORDER_LOGICAL_OR] +]; + +/** + * 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(); + } + + Blockly.JavaScript.variableDB_.setVariableMap(workspace.getVariableMap()); + + var defvars = []; + // Add developer variables (not created or named by the user). + var devVarList = Blockly.Variables.allDeveloperVariables(workspace); + for (var i = 0; i < devVarList.length; i++) { + defvars.push(Blockly.JavaScript.variableDB_.getName(devVarList[i], + Blockly.Names.DEVELOPER_VARIABLE_TYPE)); + } + + // Add user variables, but only ones that are being used. + var variables = Blockly.Variables.allUsedVarModels(workspace); + for (var i = 0; i < variables.length; i++) { + defvars.push(Blockly.JavaScript.variableDB_.getName(variables[i].getId(), + Blockly.VARIABLE_CATEGORY_NAME)); + } + + // Declare all of the variables. + if (defvars.length) { + Blockly.JavaScript.definitions_['variables'] = + 'var ' + defvars.join(', ') + ';'; + } +}; + +/** + * 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) { + // Can't use goog.string.quote since Google's style guide recommends + // JS string literals use single quotes. + string = string.replace(/\\/g, '\\\\') + .replace(/\n/g, '\\\n') + .replace(/'/g, '\\\''); + return '\'' + string + '\''; +}; + +/** + * Encode a string as a properly escaped multiline JavaScript string, complete + * with quotes. + * @param {string} string Text to encode. + * @return {string} JavaScript string. + * @private + */ +Blockly.JavaScript.multiline_quote_ = function(string) { + // Can't use goog.string.quote since Google's style guide recommends + // JS string literals use single quotes. + var lines = string.split(/\n/g).map(Blockly.JavaScript.quote_); + return lines.join(' + \'\\n\' +\n'); +}; + +/** + * 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. + * @param {boolean=} opt_thisOnly True to generate code for only this statement. + * @return {string} JavaScript code with comments and subsequent blocks added. + * @private + */ +Blockly.JavaScript.scrub_ = function(block, code, opt_thisOnly) { + 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) { + comment = Blockly.utils.string.wrap(comment, + Blockly.JavaScript.COMMENT_WRAP - 3); + commentCode += Blockly.JavaScript.prefixLines(comment + '\n', '// '); + } + // Collect comments for all value arguments. + // Don't collect comments for nested statements. + for (var i = 0; i < block.inputList.length; i++) { + if (block.inputList[i].type == Blockly.INPUT_VALUE) { + var childBlock = block.inputList[i].connection.targetBlock(); + if (childBlock) { + comment = Blockly.JavaScript.allNestedComments(childBlock); + if (comment) { + commentCode += Blockly.JavaScript.prefixLines(comment, '// '); + } + } + } + } + } + var nextBlock = block.nextConnection && block.nextConnection.targetBlock(); + var nextCode = opt_thisOnly ? '' : Blockly.JavaScript.blockToCode(nextBlock); + return commentCode + code + nextCode; +}; + +/** + * Gets a property and adjusts the value while taking into account indexing. + * @param {!Blockly.Block} block The block. + * @param {string} atId The property ID of the element to get. + * @param {number=} opt_delta Value to add. + * @param {boolean=} opt_negate Whether to negate the value. + * @param {number=} opt_order The highest order acting on this value. + * @return {string|number} + */ +Blockly.JavaScript.getAdjusted = function(block, atId, opt_delta, opt_negate, + opt_order) { + var delta = opt_delta || 0; + var order = opt_order || Blockly.JavaScript.ORDER_NONE; + if (block.workspace.options.oneBasedIndex) { + delta--; + } + var defaultAtIndex = block.workspace.options.oneBasedIndex ? '1' : '0'; + if (delta > 0) { + var at = Blockly.JavaScript.valueToCode(block, atId, + Blockly.JavaScript.ORDER_ADDITION) || defaultAtIndex; + } else if (delta < 0) { + var at = Blockly.JavaScript.valueToCode(block, atId, + Blockly.JavaScript.ORDER_SUBTRACTION) || defaultAtIndex; + } else if (opt_negate) { + var at = Blockly.JavaScript.valueToCode(block, atId, + Blockly.JavaScript.ORDER_UNARY_NEGATION) || defaultAtIndex; + } else { + var at = Blockly.JavaScript.valueToCode(block, atId, order) || + defaultAtIndex; + } + + if (Blockly.isNumber(at)) { + // If the index is a naked number, adjust it right now. + at = Number(at) + delta; + if (opt_negate) { + at = -at; + } + } else { + // If the index is dynamic, adjust it in code. + if (delta > 0) { + at = at + ' + ' + delta; + var innerOrder = Blockly.JavaScript.ORDER_ADDITION; + } else if (delta < 0) { + at = at + ' - ' + -delta; + var innerOrder = Blockly.JavaScript.ORDER_SUBTRACTION; + } + if (opt_negate) { + if (delta) { + at = '-(' + at + ')'; + } else { + at = '-' + at; + } + var innerOrder = Blockly.JavaScript.ORDER_UNARY_NEGATION; + } + innerOrder = Math.floor(innerOrder); + order = Math.floor(order); + if (innerOrder && order >= innerOrder) { + at = '(' + at + ')'; + } + } + return at; +}; diff --git a/js/generators/javascript/colour.js b/js/generators/javascript/colour.js new file mode 100644 index 0000000..55cc80c --- /dev/null +++ b/js/generators/javascript/colour.js @@ -0,0 +1,100 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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 = Blockly.JavaScript.quote_(block.getFieldValue('COLOUR')); + return [code, Blockly.JavaScript.ORDER_ATOMIC]; +}; + +Blockly.JavaScript['colour_random'] = function(block) { + // Generate a random colour. + var functionName = Blockly.JavaScript.provideFunction_( + 'colourRandom', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + '() {', + ' var num = Math.floor(Math.random() * Math.pow(2, 24));', + ' return \'#\' + (\'00000\' + num.toString(16)).substr(-6);', + '}']); + 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_( + 'colourRgb', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(r, g, b) {', + ' r = Math.max(Math.min(Number(r), 100), 0) * 2.55;', + ' g = Math.max(Math.min(Number(g), 100), 0) * 2.55;', + ' b = Math.max(Math.min(Number(b), 100), 0) * 2.55;', + ' r = (\'0\' + (Math.round(r) || 0).toString(16)).slice(-2);', + ' g = (\'0\' + (Math.round(g) || 0).toString(16)).slice(-2);', + ' b = (\'0\' + (Math.round(b) || 0).toString(16)).slice(-2);', + ' return \'#\' + r + g + b;', + '}']); + 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_( + 'colourBlend', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(c1, c2, ratio) {', + ' ratio = Math.max(Math.min(Number(ratio), 1), 0);', + ' var r1 = parseInt(c1.substring(1, 3), 16);', + ' var g1 = parseInt(c1.substring(3, 5), 16);', + ' var b1 = parseInt(c1.substring(5, 7), 16);', + ' var r2 = parseInt(c2.substring(1, 3), 16);', + ' var g2 = parseInt(c2.substring(3, 5), 16);', + ' var b2 = parseInt(c2.substring(5, 7), 16);', + ' var r = Math.round(r1 * (1 - ratio) + r2 * ratio);', + ' var g = Math.round(g1 * (1 - ratio) + g2 * ratio);', + ' var b = Math.round(b1 * (1 - ratio) + b2 * ratio);', + ' r = (\'0\' + (r || 0).toString(16)).slice(-2);', + ' g = (\'0\' + (g || 0).toString(16)).slice(-2);', + ' b = (\'0\' + (b || 0).toString(16)).slice(-2);', + ' return \'#\' + r + g + b;', + '}']); + var code = functionName + '(' + c1 + ', ' + c2 + ', ' + ratio + ')'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; diff --git a/js/generators/javascript/lists.js b/js/generators/javascript/lists.js new file mode 100644 index 0000000..d799f63 --- /dev/null +++ b/js/generators/javascript/lists.js @@ -0,0 +1,399 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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 elements = new Array(block.itemCount_); + for (var i = 0; i < block.itemCount_; i++) { + elements[i] = Blockly.JavaScript.valueToCode(block, 'ADD' + i, + Blockly.JavaScript.ORDER_COMMA) || 'null'; + } + var code = '[' + elements.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_( + 'listsRepeat', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(value, n) {', + ' var array = [];', + ' for (var i = 0; i < n; i++) {', + ' array[i] = value;', + ' }', + ' return array;', + '}']); + var element = Blockly.JavaScript.valueToCode(block, 'ITEM', + Blockly.JavaScript.ORDER_COMMA) || 'null'; + var repeatCount = Blockly.JavaScript.valueToCode(block, 'NUM', + Blockly.JavaScript.ORDER_COMMA) || '0'; + var code = functionName + '(' + element + ', ' + repeatCount + ')'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +Blockly.JavaScript['lists_length'] = function(block) { + // String or array length. + var list = Blockly.JavaScript.valueToCode(block, 'VALUE', + Blockly.JavaScript.ORDER_MEMBER) || '[]'; + return [list + '.length', Blockly.JavaScript.ORDER_MEMBER]; +}; + +Blockly.JavaScript['lists_isEmpty'] = function(block) { + // Is the string null or array empty? + var list = Blockly.JavaScript.valueToCode(block, 'VALUE', + Blockly.JavaScript.ORDER_MEMBER) || '[]'; + return ['!' + list + '.length', Blockly.JavaScript.ORDER_LOGICAL_NOT]; +}; + +Blockly.JavaScript['lists_indexOf'] = function(block) { + // Find an item in the list. + var operator = block.getFieldValue('END') == 'FIRST' ? + 'indexOf' : 'lastIndexOf'; + var item = Blockly.JavaScript.valueToCode(block, 'FIND', + Blockly.JavaScript.ORDER_NONE) || '\'\''; + var list = Blockly.JavaScript.valueToCode(block, 'VALUE', + Blockly.JavaScript.ORDER_MEMBER) || '[]'; + var code = list + '.' + operator + '(' + item + ')'; + if (block.workspace.options.oneBasedIndex) { + return [code + ' + 1', Blockly.JavaScript.ORDER_ADDITION]; + } + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +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 listOrder = (where == 'RANDOM') ? Blockly.JavaScript.ORDER_COMMA : + Blockly.JavaScript.ORDER_MEMBER; + var list = Blockly.JavaScript.valueToCode(block, 'VALUE', listOrder) || '[]'; + + switch (where) { + case ('FIRST'): + if (mode == 'GET') { + var code = list + '[0]'; + return [code, Blockly.JavaScript.ORDER_MEMBER]; + } else if (mode == 'GET_REMOVE') { + var code = list + '.shift()'; + return [code, Blockly.JavaScript.ORDER_MEMBER]; + } else if (mode == 'REMOVE') { + return list + '.shift();\n'; + } + break; + case ('LAST'): + if (mode == 'GET') { + var code = list + '.slice(-1)[0]'; + return [code, Blockly.JavaScript.ORDER_MEMBER]; + } else if (mode == 'GET_REMOVE') { + var code = list + '.pop()'; + return [code, Blockly.JavaScript.ORDER_MEMBER]; + } else if (mode == 'REMOVE') { + return list + '.pop();\n'; + } + break; + case ('FROM_START'): + var at = Blockly.JavaScript.getAdjusted(block, 'AT'); + if (mode == 'GET') { + var code = list + '[' + at + ']'; + return [code, Blockly.JavaScript.ORDER_MEMBER]; + } else if (mode == 'GET_REMOVE') { + var code = list + '.splice(' + at + ', 1)[0]'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; + } else if (mode == 'REMOVE') { + return list + '.splice(' + at + ', 1);\n'; + } + break; + case ('FROM_END'): + var at = Blockly.JavaScript.getAdjusted(block, 'AT', 1, true); + if (mode == 'GET') { + var code = list + '.slice(' + at + ')[0]'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; + } else if (mode == 'GET_REMOVE') { + var code = list + '.splice(' + at + ', 1)[0]'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; + } else if (mode == 'REMOVE') { + return list + '.splice(' + at + ', 1);'; + } + break; + case ('RANDOM'): + var functionName = Blockly.JavaScript.provideFunction_( + 'listsGetRandomItem', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(list, remove) {', + ' var x = Math.floor(Math.random() * list.length);', + ' if (remove) {', + ' return list.splice(x, 1)[0];', + ' } else {', + ' return list[x];', + ' }', + '}']); + code = functionName + '(' + list + ', ' + (mode != 'GET') + ')'; + if (mode == 'GET' || mode == 'GET_REMOVE') { + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; + } else if (mode == 'REMOVE') { + return code + ';\n'; + } + break; + } + throw Error('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 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( + 'tmpList', Blockly.VARIABLE_CATEGORY_NAME); + var code = 'var ' + listVar + ' = ' + list + ';\n'; + list = listVar; + return code; + } + switch (where) { + case ('FIRST'): + if (mode == 'SET') { + return list + '[0] = ' + value + ';\n'; + } else if (mode == 'INSERT') { + return list + '.unshift(' + value + ');\n'; + } + break; + case ('LAST'): + if (mode == 'SET') { + var code = cacheList(); + code += list + '[' + list + '.length - 1] = ' + value + ';\n'; + return code; + } else if (mode == 'INSERT') { + return list + '.push(' + value + ');\n'; + } + break; + case ('FROM_START'): + var at = Blockly.JavaScript.getAdjusted(block, 'AT'); + if (mode == 'SET') { + return list + '[' + at + '] = ' + value + ';\n'; + } else if (mode == 'INSERT') { + return list + '.splice(' + at + ', 0, ' + value + ');\n'; + } + break; + case ('FROM_END'): + var at = Blockly.JavaScript.getAdjusted(block, 'AT', 1, false, + Blockly.JavaScript.ORDER_SUBTRACTION); + var code = cacheList(); + if (mode == 'SET') { + code += list + '[' + list + '.length - ' + at + '] = ' + value + ';\n'; + return code; + } else if (mode == 'INSERT') { + code += list + '.splice(' + list + '.length - ' + at + ', 0, ' + value + + ');\n'; + return code; + } + break; + case ('RANDOM'): + var code = cacheList(); + var xVar = Blockly.JavaScript.variableDB_.getDistinctName( + 'tmpX', Blockly.VARIABLE_CATEGORY_NAME); + code += 'var ' + xVar + ' = Math.floor(Math.random() * ' + list + + '.length);\n'; + if (mode == 'SET') { + code += list + '[' + xVar + '] = ' + value + ';\n'; + return code; + } else if (mode == 'INSERT') { + code += list + '.splice(' + xVar + ', 0, ' + value + ');\n'; + return code; + } + break; + } + throw Error('Unhandled combination (lists_setIndex).'); +}; + +/** + * Returns an expression calculating the index into a list. + * @param {string} listName Name of the list, used to calculate length. + * @param {string} where The method of indexing, selected by dropdown in Blockly + * @param {string=} opt_at The optional offset when indexing from start/end. + * @return {string|undefined} Index expression. + * @private + */ +Blockly.JavaScript.lists.getIndex_ = function(listName, where, opt_at) { + if (where == 'FIRST') { + return '0'; + } else if (where == 'FROM_END') { + return listName + '.length - 1 - ' + opt_at; + } else if (where == 'LAST') { + return listName + '.length - 1'; + } else { + return opt_at; + } +}; + +Blockly.JavaScript['lists_getSublist'] = function(block) { + // Get sublist. + var list = Blockly.JavaScript.valueToCode(block, 'LIST', + Blockly.JavaScript.ORDER_MEMBER) || '[]'; + var where1 = block.getFieldValue('WHERE1'); + var where2 = block.getFieldValue('WHERE2'); + if (where1 == 'FIRST' && where2 == 'LAST') { + var code = list + '.slice(0)'; + } else if (list.match(/^\w+$/) || + (where1 != 'FROM_END' && where2 == 'FROM_START')) { + // If the list is a variable or doesn't require a call for length, don't + // generate a helper function. + switch (where1) { + case 'FROM_START': + var at1 = Blockly.JavaScript.getAdjusted(block, 'AT1'); + break; + case 'FROM_END': + var at1 = Blockly.JavaScript.getAdjusted(block, 'AT1', 1, false, + Blockly.JavaScript.ORDER_SUBTRACTION); + at1 = list + '.length - ' + at1; + break; + case 'FIRST': + var at1 = '0'; + break; + default: + throw Error('Unhandled option (lists_getSublist).'); + } + switch (where2) { + case 'FROM_START': + var at2 = Blockly.JavaScript.getAdjusted(block, 'AT2', 1); + break; + case 'FROM_END': + var at2 = Blockly.JavaScript.getAdjusted(block, 'AT2', 0, false, + Blockly.JavaScript.ORDER_SUBTRACTION); + at2 = list + '.length - ' + at2; + break; + case 'LAST': + var at2 = list + '.length'; + break; + default: + throw Error('Unhandled option (lists_getSublist).'); + } + code = list + '.slice(' + at1 + ', ' + at2 + ')'; + } else { + var at1 = Blockly.JavaScript.getAdjusted(block, 'AT1'); + var at2 = Blockly.JavaScript.getAdjusted(block, 'AT2'); + var getIndex_ = Blockly.JavaScript.lists.getIndex_; + var wherePascalCase = {'FIRST': 'First', 'LAST': 'Last', + 'FROM_START': 'FromStart', 'FROM_END': 'FromEnd'}; + var functionName = Blockly.JavaScript.provideFunction_( + 'subsequence' + wherePascalCase[where1] + wherePascalCase[where2], + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(sequence' + + // The value for 'FROM_END' and'FROM_START' depends on `at` so + // we add it as a parameter. + ((where1 == 'FROM_END' || where1 == 'FROM_START') ? ', at1' : '') + + ((where2 == 'FROM_END' || where2 == 'FROM_START') ? ', at2' : '') + + ') {', + ' var start = ' + getIndex_('sequence', where1, 'at1') + ';', + ' var end = ' + getIndex_('sequence', where2, 'at2') + ' + 1;', + ' return sequence.slice(start, end);', + '}']); + var code = functionName + '(' + list + + // The value for 'FROM_END' and 'FROM_START' depends on `at` so we + // pass it. + ((where1 == 'FROM_END' || where1 == 'FROM_START') ? ', ' + at1 : '') + + ((where2 == 'FROM_END' || where2 == 'FROM_START') ? ', ' + at2 : '') + + ')'; + } + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +Blockly.JavaScript['lists_sort'] = function(block) { + // Block for sorting a list. + var list = Blockly.JavaScript.valueToCode(block, 'LIST', + Blockly.JavaScript.ORDER_FUNCTION_CALL) || '[]'; + var direction = block.getFieldValue('DIRECTION') === '1' ? 1 : -1; + var type = block.getFieldValue('TYPE'); + var getCompareFunctionName = Blockly.JavaScript.provideFunction_( + 'listsGetSortCompare', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(type, direction) {', + ' var compareFuncs = {', + ' "NUMERIC": function(a, b) {', + ' return Number(a) - Number(b); },', + ' "TEXT": function(a, b) {', + ' return a.toString() > b.toString() ? 1 : -1; },', + ' "IGNORE_CASE": function(a, b) {', + ' return a.toString().toLowerCase() > ' + + 'b.toString().toLowerCase() ? 1 : -1; },', + ' };', + ' var compare = compareFuncs[type];', + ' return function(a, b) { return compare(a, b) * direction; }', + '}']); + return [list + '.slice().sort(' + + getCompareFunctionName + '("' + type + '", ' + direction + '))', + Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +Blockly.JavaScript['lists_split'] = function(block) { + // Block for splitting text into a list, or joining a list into text. + var input = Blockly.JavaScript.valueToCode(block, 'INPUT', + Blockly.JavaScript.ORDER_MEMBER); + var delimiter = Blockly.JavaScript.valueToCode(block, 'DELIM', + Blockly.JavaScript.ORDER_NONE) || '\'\''; + var mode = block.getFieldValue('MODE'); + if (mode == 'SPLIT') { + if (!input) { + input = '\'\''; + } + var functionName = 'split'; + } else if (mode == 'JOIN') { + if (!input) { + input = '[]'; + } + var functionName = 'join'; + } else { + throw Error('Unknown mode: ' + mode); + } + var code = input + '.' + functionName + '(' + delimiter + ')'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +Blockly.JavaScript['lists_reverse'] = function(block) { + // Block for reversing a list. + var list = Blockly.JavaScript.valueToCode(block, 'LIST', + Blockly.JavaScript.ORDER_FUNCTION_CALL) || '[]'; + var code = list + '.slice().reverse()'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; diff --git a/js/generators/javascript/logic.js b/js/generators/javascript/logic.js new file mode 100644 index 0000000..3160fa5 --- /dev/null +++ b/js/generators/javascript/logic.js @@ -0,0 +1,140 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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 code = '', branchCode, conditionCode; + if (Blockly.JavaScript.STATEMENT_PREFIX) { + // Automatic prefix insertion is switched off for this block. Add manually. + code += Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_PREFIX, + block); + } + do { + conditionCode = Blockly.JavaScript.valueToCode(block, 'IF' + n, + Blockly.JavaScript.ORDER_NONE) || 'false'; + branchCode = Blockly.JavaScript.statementToCode(block, 'DO' + n); + if (Blockly.JavaScript.STATEMENT_SUFFIX) { + branchCode = Blockly.JavaScript.prefixLines( + Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_SUFFIX, + block), Blockly.JavaScript.INDENT) + branchCode; + } + code += (n > 0 ? ' else ' : '') + + 'if (' + conditionCode + ') {\n' + branchCode + '}'; + ++n; + } while (block.getInput('IF' + n)); + + if (block.getInput('ELSE') || Blockly.JavaScript.STATEMENT_SUFFIX) { + branchCode = Blockly.JavaScript.statementToCode(block, 'ELSE'); + if (Blockly.JavaScript.STATEMENT_SUFFIX) { + branchCode = Blockly.JavaScript.prefixLines( + Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_SUFFIX, + block), Blockly.JavaScript.INDENT) + branchCode; + } + code += ' else {\n' + branchCode + '}'; + } + return code + '\n'; +}; + +Blockly.JavaScript['controls_ifelse'] = Blockly.JavaScript['controls_if']; + +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/js/generators/javascript/loops.js b/js/generators/javascript/loops.js new file mode 100644 index 0000000..9f00680 --- /dev/null +++ b/js/generators/javascript/loops.js @@ -0,0 +1,195 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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); + var code = ''; + var loopVar = Blockly.JavaScript.variableDB_.getDistinctName( + 'count', Blockly.VARIABLE_CATEGORY_NAME); + var endVar = repeats; + if (!repeats.match(/^\w+$/) && !Blockly.isNumber(repeats)) { + endVar = Blockly.JavaScript.variableDB_.getDistinctName( + 'repeat_end', Blockly.VARIABLE_CATEGORY_NAME); + 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); + 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.VARIABLE_CATEGORY_NAME); + 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); + var code; + if (Blockly.isNumber(argument0) && Blockly.isNumber(argument1) && + Blockly.isNumber(increment)) { + // All arguments are simple numbers. + var up = Number(argument0) <= Number(argument1); + code = 'for (' + variable0 + ' = ' + argument0 + '; ' + + variable0 + (up ? ' <= ' : ' >= ') + argument1 + '; ' + + variable0; + var step = Math.abs(Number(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.VARIABLE_CATEGORY_NAME); + code += 'var ' + startVar + ' = ' + argument0 + ';\n'; + } + var endVar = argument1; + if (!argument1.match(/^\w+$/) && !Blockly.isNumber(argument1)) { + endVar = Blockly.JavaScript.variableDB_.getDistinctName( + variable0 + '_end', Blockly.VARIABLE_CATEGORY_NAME); + 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.VARIABLE_CATEGORY_NAME); + 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 + '; ' + + incVar + ' >= 0 ? ' + + variable0 + ' <= ' + endVar + ' : ' + + variable0 + ' >= ' + endVar + '; ' + + 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.VARIABLE_CATEGORY_NAME); + var argument0 = Blockly.JavaScript.valueToCode(block, 'LIST', + Blockly.JavaScript.ORDER_ASSIGNMENT) || '[]'; + var branch = Blockly.JavaScript.statementToCode(block, 'DO'); + branch = Blockly.JavaScript.addLoopTrap(branch, block); + 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.VARIABLE_CATEGORY_NAME); + code += 'var ' + listVar + ' = ' + argument0 + ';\n'; + } + var indexVar = Blockly.JavaScript.variableDB_.getDistinctName( + variable0 + '_index', Blockly.VARIABLE_CATEGORY_NAME); + 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. + var xfix = ''; + if (Blockly.JavaScript.STATEMENT_PREFIX) { + // Automatic prefix insertion is switched off for this block. Add manually. + xfix += Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_PREFIX, + block); + } + if (Blockly.JavaScript.STATEMENT_SUFFIX) { + // Inject any statement suffix here since the regular one at the end + // will not get executed if the break/continue is triggered. + xfix += Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_SUFFIX, + block); + } + if (Blockly.JavaScript.STATEMENT_PREFIX) { + var loop = Blockly.Constants.Loops + .CONTROL_FLOW_IN_LOOP_CHECK_MIXIN.getSurroundLoop(block); + if (loop && !loop.suppressPrefixSuffix) { + // Inject loop's statement prefix here since the regular one at the end + // of the loop will not get executed if 'continue' is triggered. + // In the case of 'break', a prefix is needed due to the loop's suffix. + xfix += Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_PREFIX, + loop); + } + } + switch (block.getFieldValue('FLOW')) { + case 'BREAK': + return xfix + 'break;\n'; + case 'CONTINUE': + return xfix + 'continue;\n'; + } + throw Error('Unknown flow statement.'); +}; diff --git a/js/generators/javascript/math.js b/js/generators/javascript/math.js new file mode 100644 index 0000000..337a01d --- /dev/null +++ b/js/generators/javascript/math.js @@ -0,0 +1,420 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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 = Number(block.getFieldValue('NUM')); + var order = code >= 0 ? Blockly.JavaScript.ORDER_ATOMIC : + Blockly.JavaScript.ORDER_UNARY_NEGATION; + return [code, order]; +}; + +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 Error('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_( + 'mathIsPrime', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + '(n) {', + ' // https://en.wikipedia.org/wiki/Primality_test#Naive_methods', + ' if (n == 2 || n == 3) {', + ' return true;', + ' }', + ' // False if n is NaN, negative, is 1, or not whole.', + ' // And false if n is divisible by 2 or 3.', + ' if (isNaN(n) || n <= 1 || n % 1 != 0 || n % 2 == 0 ||' + + ' 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.VARIABLE_CATEGORY_NAME); + 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': + // mathMean([null,null,1,3]) == 2.0. + var functionName = Blockly.JavaScript.provideFunction_( + 'mathMean', + ['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': + // mathMedian([null,null,1,3]) == 2.0. + var functionName = Blockly.JavaScript.provideFunction_( + 'mathMedian', + ['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_( + 'mathModes', + ['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_( + 'mathStandardDeviation', + ['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_( + 'mathRandomList', + ['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 Error('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_( + 'mathRandomInt', + ['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]; +}; + +Blockly.JavaScript['math_atan2'] = function(block) { + // Arctangent of point (X, Y) in degrees from -180 to 180. + var argument0 = Blockly.JavaScript.valueToCode(block, 'X', + Blockly.JavaScript.ORDER_COMMA) || '0'; + var argument1 = Blockly.JavaScript.valueToCode(block, 'Y', + Blockly.JavaScript.ORDER_COMMA) || '0'; + return ['Math.atan2(' + argument1 + ', ' + argument0 + ') / Math.PI * 180', + Blockly.JavaScript.ORDER_DIVISION]; +}; diff --git a/js/generators/javascript/procedures.js b/js/generators/javascript/procedures.js new file mode 100644 index 0000000..8874fce --- /dev/null +++ b/js/generators/javascript/procedures.js @@ -0,0 +1,122 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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.PROCEDURE_CATEGORY_NAME); + var xfix1 = ''; + if (Blockly.JavaScript.STATEMENT_PREFIX) { + xfix1 += Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_PREFIX, + block); + } + if (Blockly.JavaScript.STATEMENT_SUFFIX) { + xfix1 += Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_SUFFIX, + block); + } + if (xfix1) { + xfix1 = Blockly.JavaScript.prefixLines(xfix1, Blockly.JavaScript.INDENT); + } + var loopTrap = ''; + if (Blockly.JavaScript.INFINITE_LOOP_TRAP) { + loopTrap = Blockly.JavaScript.prefixLines( + Blockly.JavaScript.injectId(Blockly.JavaScript.INFINITE_LOOP_TRAP, + block), Blockly.JavaScript.INDENT); + } + var branch = Blockly.JavaScript.statementToCode(block, 'STACK'); + var returnValue = Blockly.JavaScript.valueToCode(block, 'RETURN', + Blockly.JavaScript.ORDER_NONE) || ''; + var xfix2 = ''; + if (branch && returnValue) { + // After executing the function body, revisit this block for the return. + xfix2 = xfix1; + } + if (returnValue) { + returnValue = Blockly.JavaScript.INDENT + 'return ' + returnValue + ';\n'; + } + var args = []; + for (var i = 0; i < block.arguments_.length; i++) { + args[i] = Blockly.JavaScript.variableDB_.getName(block.arguments_[i], + Blockly.VARIABLE_CATEGORY_NAME); + } + var code = 'function ' + funcName + '(' + args.join(', ') + ') {\n' + + xfix1 + loopTrap + branch + xfix2 + returnValue + '}'; + code = Blockly.JavaScript.scrub_(block, code); + // Add % so as not to collide with helper functions in definitions list. + Blockly.JavaScript.definitions_['%' + funcName] = code; + return null; +}; + +// 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.PROCEDURE_CATEGORY_NAME); + var args = []; + for (var i = 0; i < block.arguments_.length; i++) { + args[i] = Blockly.JavaScript.valueToCode(block, 'ARG' + i, + 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. + // Generated code is for a function call as a statement is the same as a + // function call as a value, with the addition of line ending. + var tuple = Blockly.JavaScript['procedures_callreturn'](block); + return tuple[0] + ';\n'; +}; + +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 (Blockly.JavaScript.STATEMENT_SUFFIX) { + // Inject any statement suffix here since the regular one at the end + // will not get executed if the return is triggered. + code += Blockly.JavaScript.prefixLines( + Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_SUFFIX, block), + Blockly.JavaScript.INDENT); + } + if (block.hasReturnValue_) { + var value = Blockly.JavaScript.valueToCode(block, 'VALUE', + Blockly.JavaScript.ORDER_NONE) || 'null'; + code += Blockly.JavaScript.INDENT + 'return ' + value + ';\n'; + } else { + code += Blockly.JavaScript.INDENT + 'return;\n'; + } + code += '}\n'; + return code; +}; diff --git a/js/generators/javascript/text.js b/js/generators/javascript/text.js new file mode 100644 index 0000000..d81dd15 --- /dev/null +++ b/js/generators/javascript/text.js @@ -0,0 +1,378 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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_multiline'] = function(block) { + // Text value. + var code = Blockly.JavaScript.multiline_quote_(block.getFieldValue('TEXT')); + if (code.includes('\n')) { + code = '(' + code + ')' + } + return [code, Blockly.JavaScript.ORDER_ATOMIC]; +}; + +/** + * Enclose the provided value in 'String(...)' function. + * Leave string literals alone. + * @param {string} value Code evaluating to a value. + * @return {string} Code evaluating to a string. + * @private + */ +Blockly.JavaScript.text.forceString_ = function(value) { + if (Blockly.JavaScript.text.forceString_.strRegExp.test(value)) { + return value; + } + return 'String(' + value + ')'; +}; + +/** + * Regular expression to detect a single-quoted string literal. + */ +Blockly.JavaScript.text.forceString_.strRegExp = /^\s*'([^']|\\')*'\s*$/; + +Blockly.JavaScript['text_join'] = function(block) { + // Create a string made up of any number of elements of any type. + switch (block.itemCount_) { + case 0: + return ['\'\'', Blockly.JavaScript.ORDER_ATOMIC]; + case 1: + var element = Blockly.JavaScript.valueToCode(block, 'ADD0', + Blockly.JavaScript.ORDER_NONE) || '\'\''; + var code = Blockly.JavaScript.text.forceString_(element); + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; + case 2: + var element0 = Blockly.JavaScript.valueToCode(block, 'ADD0', + Blockly.JavaScript.ORDER_NONE) || '\'\''; + var element1 = Blockly.JavaScript.valueToCode(block, 'ADD1', + Blockly.JavaScript.ORDER_NONE) || '\'\''; + var code = Blockly.JavaScript.text.forceString_(element0) + ' + ' + + Blockly.JavaScript.text.forceString_(element1); + return [code, Blockly.JavaScript.ORDER_ADDITION]; + default: + var elements = new Array(block.itemCount_); + for (var i = 0; i < block.itemCount_; i++) { + elements[i] = Blockly.JavaScript.valueToCode(block, 'ADD' + i, + Blockly.JavaScript.ORDER_COMMA) || '\'\''; + } + var code = '[' + elements.join(',') + '].join(\'\')'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; + } +}; + +Blockly.JavaScript['text_append'] = function(block) { + // Append to a variable in place. + var varName = Blockly.JavaScript.variableDB_.getName( + block.getFieldValue('VAR'), Blockly.VARIABLE_CATEGORY_NAME); + var value = Blockly.JavaScript.valueToCode(block, 'TEXT', + Blockly.JavaScript.ORDER_NONE) || '\'\''; + return varName + ' += ' + Blockly.JavaScript.text.forceString_(value) + ';\n'; +}; + +Blockly.JavaScript['text_length'] = function(block) { + // String or array length. + var text = Blockly.JavaScript.valueToCode(block, 'VALUE', + Blockly.JavaScript.ORDER_FUNCTION_CALL) || '\'\''; + return [text + '.length', Blockly.JavaScript.ORDER_MEMBER]; +}; + +Blockly.JavaScript['text_isEmpty'] = function(block) { + // Is the string null or array empty? + var text = Blockly.JavaScript.valueToCode(block, 'VALUE', + Blockly.JavaScript.ORDER_MEMBER) || '\'\''; + return ['!' + text + '.length', Blockly.JavaScript.ORDER_LOGICAL_NOT]; +}; + +Blockly.JavaScript['text_indexOf'] = function(block) { + // Search the text for a substring. + var operator = block.getFieldValue('END') == 'FIRST' ? + 'indexOf' : 'lastIndexOf'; + var substring = Blockly.JavaScript.valueToCode(block, 'FIND', + Blockly.JavaScript.ORDER_NONE) || '\'\''; + var text = Blockly.JavaScript.valueToCode(block, 'VALUE', + Blockly.JavaScript.ORDER_MEMBER) || '\'\''; + var code = text + '.' + operator + '(' + substring + ')'; + // Adjust index if using one-based indices. + if (block.workspace.options.oneBasedIndex) { + return [code + ' + 1', Blockly.JavaScript.ORDER_ADDITION]; + } + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +Blockly.JavaScript['text_charAt'] = function(block) { + // Get letter at index. + // Note: Until January 2013 this block did not have the WHERE input. + var where = block.getFieldValue('WHERE') || 'FROM_START'; + var textOrder = (where == 'RANDOM') ? Blockly.JavaScript.ORDER_NONE : + Blockly.JavaScript.ORDER_MEMBER; + var text = Blockly.JavaScript.valueToCode(block, 'VALUE', + textOrder) || '\'\''; + 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': + var at = Blockly.JavaScript.getAdjusted(block, 'AT'); + // Adjust index if using one-based indices. + var code = text + '.charAt(' + at + ')'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; + case 'FROM_END': + var at = Blockly.JavaScript.getAdjusted(block, 'AT', 1, true); + var code = text + '.slice(' + at + ').charAt(0)'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; + case 'RANDOM': + var functionName = Blockly.JavaScript.provideFunction_( + 'textRandomLetter', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(text) {', + ' var x = Math.floor(Math.random() * text.length);', + ' return text[x];', + '}']); + var code = functionName + '(' + text + ')'; + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; + } + throw Error('Unhandled option (text_charAt).'); +}; + +/** + * Returns an expression calculating the index into a string. + * @param {string} stringName Name of the string, used to calculate length. + * @param {string} where The method of indexing, selected by dropdown in Blockly + * @param {string=} opt_at The optional offset when indexing from start/end. + * @return {string|undefined} Index expression. + * @private + */ +Blockly.JavaScript.text.getIndex_ = function(stringName, where, opt_at) { + if (where == 'FIRST') { + return '0'; + } else if (where == 'FROM_END') { + return stringName + '.length - 1 - ' + opt_at; + } else if (where == 'LAST') { + return stringName + '.length - 1'; + } else { + return opt_at; + } +}; + +Blockly.JavaScript['text_getSubstring'] = function(block) { + // Get substring. + var text = Blockly.JavaScript.valueToCode(block, 'STRING', + Blockly.JavaScript.ORDER_FUNCTION_CALL) || '\'\''; + var where1 = block.getFieldValue('WHERE1'); + var where2 = block.getFieldValue('WHERE2'); + if (where1 == 'FIRST' && where2 == 'LAST') { + var code = text; + } else if (text.match(/^'?\w+'?$/) || + (where1 != 'FROM_END' && where1 != 'LAST' && + where2 != 'FROM_END' && where2 != 'LAST')) { + // If the text is a variable or literal or doesn't require a call for + // length, don't generate a helper function. + switch (where1) { + case 'FROM_START': + var at1 = Blockly.JavaScript.getAdjusted(block, 'AT1'); + break; + case 'FROM_END': + var at1 = Blockly.JavaScript.getAdjusted(block, 'AT1', 1, false, + Blockly.JavaScript.ORDER_SUBTRACTION); + at1 = text + '.length - ' + at1; + break; + case 'FIRST': + var at1 = '0'; + break; + default: + throw Error('Unhandled option (text_getSubstring).'); + } + switch (where2) { + case 'FROM_START': + var at2 = Blockly.JavaScript.getAdjusted(block, 'AT2', 1); + break; + case 'FROM_END': + var at2 = Blockly.JavaScript.getAdjusted(block, 'AT2', 0, false, + Blockly.JavaScript.ORDER_SUBTRACTION); + at2 = text + '.length - ' + at2; + break; + case 'LAST': + var at2 = text + '.length'; + break; + default: + throw Error('Unhandled option (text_getSubstring).'); + } + code = text + '.slice(' + at1 + ', ' + at2 + ')'; + } else { + var at1 = Blockly.JavaScript.getAdjusted(block, 'AT1'); + var at2 = Blockly.JavaScript.getAdjusted(block, 'AT2'); + var getIndex_ = Blockly.JavaScript.text.getIndex_; + var wherePascalCase = {'FIRST': 'First', 'LAST': 'Last', + 'FROM_START': 'FromStart', 'FROM_END': 'FromEnd'}; + var functionName = Blockly.JavaScript.provideFunction_( + 'subsequence' + wherePascalCase[where1] + wherePascalCase[where2], + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(sequence' + + // The value for 'FROM_END' and'FROM_START' depends on `at` so + // we add it as a parameter. + ((where1 == 'FROM_END' || where1 == 'FROM_START') ? ', at1' : '') + + ((where2 == 'FROM_END' || where2 == 'FROM_START') ? ', at2' : '') + + ') {', + ' var start = ' + getIndex_('sequence', where1, 'at1') + ';', + ' var end = ' + getIndex_('sequence', where2, 'at2') + ' + 1;', + ' return sequence.slice(start, end);', + '}']); + var code = functionName + '(' + text + + // The value for 'FROM_END' and 'FROM_START' depends on `at` so we + // pass it. + ((where1 == 'FROM_END' || where1 == 'FROM_START') ? ', ' + at1 : '') + + ((where2 == 'FROM_END' || where2 == 'FROM_START') ? ', ' + at2 : '') + + ')'; + } + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +Blockly.JavaScript['text_changeCase'] = function(block) { + // Change capitalization. + var OPERATORS = { + 'UPPERCASE': '.toUpperCase()', + 'LOWERCASE': '.toLowerCase()', + 'TITLECASE': null + }; + var operator = OPERATORS[block.getFieldValue('CASE')]; + var textOrder = operator ? Blockly.JavaScript.ORDER_MEMBER : + Blockly.JavaScript.ORDER_NONE; + var text = Blockly.JavaScript.valueToCode(block, 'TEXT', + textOrder) || '\'\''; + if (operator) { + // Upper and lower case are functions built into JavaScript. + var code = text + operator; + } else { + // Title case is not a native JavaScript function. Define one. + var functionName = Blockly.JavaScript.provideFunction_( + 'textToTitleCase', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(str) {', + ' return str.replace(/\\S+/g,', + ' function(txt) {return txt[0].toUpperCase() + ' + + 'txt.substring(1).toLowerCase();});', + '}']); + var code = functionName + '(' + text + ')'; + } + 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 text = Blockly.JavaScript.valueToCode(block, 'TEXT', + Blockly.JavaScript.ORDER_MEMBER) || '\'\''; + return [text + operator, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +Blockly.JavaScript['text_print'] = function(block) { + // Print statement. + var msg = Blockly.JavaScript.valueToCode(block, 'TEXT', + Blockly.JavaScript.ORDER_NONE) || '\'\''; + return 'window.alert(' + msg + ');\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 = 'Number(' + code + ')'; + } + return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; +}; + +Blockly.JavaScript['text_prompt'] = Blockly.JavaScript['text_prompt_ext']; + +Blockly.JavaScript['text_count'] = function(block) { + var text = Blockly.JavaScript.valueToCode(block, 'TEXT', + Blockly.JavaScript.ORDER_MEMBER) || '\'\''; + var sub = Blockly.JavaScript.valueToCode(block, 'SUB', + Blockly.JavaScript.ORDER_NONE) || '\'\''; + var functionName = Blockly.JavaScript.provideFunction_( + 'textCount', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(haystack, needle) {', + ' if (needle.length === 0) {', + ' return haystack.length + 1;', + ' } else {', + ' return haystack.split(needle).length - 1;', + ' }', + '}']); + var code = functionName + '(' + text + ', ' + sub + ')'; + return [code, Blockly.JavaScript.ORDER_SUBTRACTION]; +}; + +Blockly.JavaScript['text_replace'] = function(block) { + var text = Blockly.JavaScript.valueToCode(block, 'TEXT', + Blockly.JavaScript.ORDER_MEMBER) || '\'\''; + var from = Blockly.JavaScript.valueToCode(block, 'FROM', + Blockly.JavaScript.ORDER_NONE) || '\'\''; + var to = Blockly.JavaScript.valueToCode(block, 'TO', + Blockly.JavaScript.ORDER_NONE) || '\'\''; + // The regex escaping code below is taken from the implementation of + // goog.string.regExpEscape. + var functionName = Blockly.JavaScript.provideFunction_( + 'textReplace', + ['function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + '(haystack, needle, replacement) {', + ' needle = ' + + 'needle.replace(/([-()\\[\\]{}+?*.$\\^|,:# <= >= ~= == +Blockly.Lua.ORDER_AND = 8; // and +Blockly.Lua.ORDER_OR = 9; // or +Blockly.Lua.ORDER_NONE = 99; + +/** + * Note: Lua is not supporting zero-indexing since the language itself is + * one-indexed, so the generator does not repoct the oneBasedIndex configuration + * option used for lists and text. + */ + +/** + * Initialise the database of variable names. + * @param {!Blockly.Workspace} workspace Workspace to generate code from. + */ +Blockly.Lua.init = function(workspace) { + // Create a dictionary of definitions to be printed before the code. + Blockly.Lua.definitions_ = Object.create(null); + // Create a dictionary mapping desired function names in definitions_ + // to actual function names (to avoid collisions with user functions). + Blockly.Lua.functionNames_ = Object.create(null); + + if (!Blockly.Lua.variableDB_) { + Blockly.Lua.variableDB_ = + new Blockly.Names(Blockly.Lua.RESERVED_WORDS_); + } else { + Blockly.Lua.variableDB_.reset(); + } + Blockly.Lua.variableDB_.setVariableMap(workspace.getVariableMap()); +}; + +/** + * Prepend the generated code with the variable definitions. + * @param {string} code Generated code. + * @return {string} Completed code. + */ +Blockly.Lua.finish = function(code) { + // Convert the definitions dictionary into a list. + var definitions = []; + for (var name in Blockly.Lua.definitions_) { + definitions.push(Blockly.Lua.definitions_[name]); + } + // Clean up temporary data. + delete Blockly.Lua.definitions_; + delete Blockly.Lua.functionNames_; + Blockly.Lua.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. In Lua, an expression is not a legal statement, so we must assign + * the value to the (conventionally ignored) _. + * http://lua-users.org/wiki/ExpressionsAsStatements + * @param {string} line Line of generated code. + * @return {string} Legal line of code. + */ +Blockly.Lua.scrubNakedValue = function(line) { + return 'local _ = ' + line + '\n'; +}; + +/** + * Encode a string as a properly escaped Lua string, complete with + * quotes. + * @param {string} string Text to encode. + * @return {string} Lua string. + * @private + */ +Blockly.Lua.quote_ = function(string) { + string = string.replace(/\\/g, '\\\\') + .replace(/\n/g, '\\\n') + .replace(/'/g, '\\\''); + return '\'' + string + '\''; +}; + +/** + * Encode a string as a properly escaped multiline Lua string, complete with + * quotes. + * @param {string} string Text to encode. + * @return {string} Lua string. + * @private + */ +Blockly.Lua.multiline_quote_ = function(string) { + string = string.replace(/\\/g, '\\\\') + .replace(/\n/g, '\\\n') + .replace(/'/g, '\\\''); + return '[===' + string + '===]'; +}; + +/** + * Common tasks for generating Lua 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 Lua code created for this block. + * @param {boolean=} opt_thisOnly True to generate code for only this statement. + * @return {string} Lua code with comments and subsequent blocks added. + * @private + */ +Blockly.Lua.scrub_ = function(block, code, opt_thisOnly) { + 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) { + comment = Blockly.utils.string.wrap(comment, + Blockly.Lua.COMMENT_WRAP - 3); + commentCode += Blockly.Lua.prefixLines(comment, '-- ') + '\n'; + } + // Collect comments for all value arguments. + // Don't collect comments for nested statements. + for (var i = 0; i < block.inputList.length; i++) { + if (block.inputList[i].type == Blockly.INPUT_VALUE) { + var childBlock = block.inputList[i].connection.targetBlock(); + if (childBlock) { + comment = Blockly.Lua.allNestedComments(childBlock); + if (comment) { + commentCode += Blockly.Lua.prefixLines(comment, '-- '); + } + } + } + } + } + var nextBlock = block.nextConnection && block.nextConnection.targetBlock(); + var nextCode = opt_thisOnly ? '' : Blockly.Lua.blockToCode(nextBlock); + return commentCode + code + nextCode; +}; diff --git a/js/generators/lua/colour.js b/js/generators/lua/colour.js new file mode 100644 index 0000000..1ec5ccb --- /dev/null +++ b/js/generators/lua/colour.js @@ -0,0 +1,87 @@ +/** + * @license + * Copyright 2016 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Lua for colour blocks. + * @author rodrigoq@google.com (Rodrigo Queiro) + */ +'use strict'; + +goog.provide('Blockly.Lua.colour'); + +goog.require('Blockly.Lua'); + + +Blockly.Lua['colour_picker'] = function(block) { + // Colour picker. + var code = Blockly.Lua.quote_(block.getFieldValue('COLOUR')); + return [code, Blockly.Lua.ORDER_ATOMIC]; +}; + +Blockly.Lua['colour_random'] = function(block) { + // Generate a random colour. + var code = 'string.format("#%06x", math.random(0, 2^24 - 1))'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['colour_rgb'] = function(block) { + // Compose a colour from RGB components expressed as percentages. + var functionName = Blockly.Lua.provideFunction_( + 'colour_rgb', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(r, g, b)', + ' r = math.floor(math.min(100, math.max(0, r)) * 2.55 + .5)', + ' g = math.floor(math.min(100, math.max(0, g)) * 2.55 + .5)', + ' b = math.floor(math.min(100, math.max(0, b)) * 2.55 + .5)', + ' return string.format("#%02x%02x%02x", r, g, b)', + 'end']); + var r = Blockly.Lua.valueToCode(block, 'RED', + Blockly.Lua.ORDER_NONE) || 0; + var g = Blockly.Lua.valueToCode(block, 'GREEN', + Blockly.Lua.ORDER_NONE) || 0; + var b = Blockly.Lua.valueToCode(block, 'BLUE', + Blockly.Lua.ORDER_NONE) || 0; + var code = functionName + '(' + r + ', ' + g + ', ' + b + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['colour_blend'] = function(block) { + // Blend two colours together. + var functionName = Blockly.Lua.provideFunction_( + 'colour_blend', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + + '(colour1, colour2, ratio)', + ' local r1 = tonumber(string.sub(colour1, 2, 3), 16)', + ' local r2 = tonumber(string.sub(colour2, 2, 3), 16)', + ' local g1 = tonumber(string.sub(colour1, 4, 5), 16)', + ' local g2 = tonumber(string.sub(colour2, 4, 5), 16)', + ' local b1 = tonumber(string.sub(colour1, 6, 7), 16)', + ' local b2 = tonumber(string.sub(colour2, 6, 7), 16)', + ' local ratio = math.min(1, math.max(0, ratio))', + ' local r = math.floor(r1 * (1 - ratio) + r2 * ratio + .5)', + ' local g = math.floor(g1 * (1 - ratio) + g2 * ratio + .5)', + ' local b = math.floor(b1 * (1 - ratio) + b2 * ratio + .5)', + ' return string.format("#%02x%02x%02x", r, g, b)', + 'end']); + var colour1 = Blockly.Lua.valueToCode(block, 'COLOUR1', + Blockly.Lua.ORDER_NONE) || '\'#000000\''; + var colour2 = Blockly.Lua.valueToCode(block, 'COLOUR2', + Blockly.Lua.ORDER_NONE) || '\'#000000\''; + var ratio = Blockly.Lua.valueToCode(block, 'RATIO', + Blockly.Lua.ORDER_NONE) || 0; + var code = functionName + '(' + colour1 + ', ' + colour2 + ', ' + ratio + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; diff --git a/js/generators/lua/lists.js b/js/generators/lua/lists.js new file mode 100644 index 0000000..d56141a --- /dev/null +++ b/js/generators/lua/lists.js @@ -0,0 +1,379 @@ +/** + * @license + * Copyright 2016 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Lua for list blocks. + * @author rodrigoq@google.com (Rodrigo Queiro) + */ +'use strict'; + +goog.provide('Blockly.Lua.lists'); + +goog.require('Blockly.Lua'); + + +Blockly.Lua['lists_create_empty'] = function(block) { + // Create an empty list. + return ['{}', Blockly.Lua.ORDER_ATOMIC]; +}; + +Blockly.Lua['lists_create_with'] = function(block) { + // Create a list with any number of elements of any type. + var elements = new Array(block.itemCount_); + for (var i = 0; i < block.itemCount_; i++) { + elements[i] = Blockly.Lua.valueToCode(block, 'ADD' + i, + Blockly.Lua.ORDER_NONE) || 'None'; + } + var code = '{' + elements.join(', ') + '}'; + return [code, Blockly.Lua.ORDER_ATOMIC]; +}; + +Blockly.Lua['lists_repeat'] = function(block) { + // Create a list with one element repeated. + var functionName = Blockly.Lua.provideFunction_( + 'create_list_repeated', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(item, count)', + ' local t = {}', + ' for i = 1, count do', + ' table.insert(t, item)', + ' end', + ' return t', + 'end']); + var element = Blockly.Lua.valueToCode(block, 'ITEM', + Blockly.Lua.ORDER_NONE) || 'None'; + var repeatCount = Blockly.Lua.valueToCode(block, 'NUM', + Blockly.Lua.ORDER_NONE) || '0'; + var code = functionName + '(' + element + ', ' + repeatCount + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['lists_length'] = function(block) { + // String or array length. + var list = Blockly.Lua.valueToCode(block, 'VALUE', + Blockly.Lua.ORDER_UNARY) || '{}'; + return ['#' + list, Blockly.Lua.ORDER_UNARY]; +}; + +Blockly.Lua['lists_isEmpty'] = function(block) { + // Is the string null or array empty? + var list = Blockly.Lua.valueToCode(block, 'VALUE', + Blockly.Lua.ORDER_UNARY) || '{}'; + var code = '#' + list + ' == 0'; + return [code, Blockly.Lua.ORDER_RELATIONAL]; +}; + +Blockly.Lua['lists_indexOf'] = function(block) { + // Find an item in the list. + var item = Blockly.Lua.valueToCode(block, 'FIND', + Blockly.Lua.ORDER_NONE) || '\'\''; + var list = Blockly.Lua.valueToCode(block, 'VALUE', + Blockly.Lua.ORDER_NONE) || '{}'; + if (block.getFieldValue('END') == 'FIRST') { + var functionName = Blockly.Lua.provideFunction_( + 'first_index', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t, elem)', + ' for k, v in ipairs(t) do', + ' if v == elem then', + ' return k', + ' end', + ' end', + ' return 0', + 'end']); + } else { + var functionName = Blockly.Lua.provideFunction_( + 'last_index', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t, elem)', + ' for i = #t, 1, -1 do', + ' if t[i] == elem then', + ' return i', + ' end', + ' end', + ' return 0', + 'end']); + } + var code = functionName + '(' + list + ', ' + item + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +/** + * Returns an expression calculating the index into a list. + * @param {string} listName Name of the list, used to calculate length. + * @param {string} where The method of indexing, selected by dropdown in Blockly + * @param {string=} opt_at The optional offset when indexing from start/end. + * @return {string|undefined} Index expression. + * @private + */ +Blockly.Lua.lists.getIndex_ = function(listName, where, opt_at) { + if (where == 'FIRST') { + return '1'; + } else if (where == 'FROM_END') { + return '#' + listName + ' + 1 - ' + opt_at; + } else if (where == 'LAST') { + return '#' + listName; + } else if (where == 'RANDOM') { + return 'math.random(#' + listName + ')'; + } else { + return opt_at; + } +}; + +Blockly.Lua['lists_getIndex'] = function(block) { + // Get element at index. + // Note: Until January 2013 this block did not have MODE or WHERE inputs. + var mode = block.getFieldValue('MODE') || 'GET'; + var where = block.getFieldValue('WHERE') || 'FROM_START'; + var list = Blockly.Lua.valueToCode(block, 'VALUE', Blockly.Lua.ORDER_HIGH) || + '{}'; + var getIndex_ = Blockly.Lua.lists.getIndex_; + + // If `list` would be evaluated more than once (which is the case for LAST, + // FROM_END, and RANDOM) and is non-trivial, make sure to access it only once. + if ((where == 'LAST' || where == 'FROM_END' || where == 'RANDOM') && + !list.match(/^\w+$/)) { + // `list` is an expression, so we may not evaluate it more than once. + if (mode == 'REMOVE') { + // We can use multiple statements. + var atOrder = (where == 'FROM_END') ? Blockly.Lua.ORDER_ADDITIVE : + Blockly.Lua.ORDER_NONE; + var at = Blockly.Lua.valueToCode(block, 'AT', atOrder) || '1'; + var listVar = Blockly.Lua.variableDB_.getDistinctName( + 'tmp_list', Blockly.VARIABLE_CATEGORY_NAME); + at = getIndex_(listVar, where, at); + var code = listVar + ' = ' + list + '\n' + + 'table.remove(' + listVar + ', ' + at + ')\n'; + return code; + } else { + // We need to create a procedure to avoid reevaluating values. + var at = Blockly.Lua.valueToCode(block, 'AT', Blockly.Lua.ORDER_NONE) || + '1'; + if (mode == 'GET') { + var functionName = Blockly.Lua.provideFunction_( + 'list_get_' + where.toLowerCase(), + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t' + + // The value for 'FROM_END' and'FROM_START' depends on `at` so + // we add it as a parameter. + ((where == 'FROM_END' || where == 'FROM_START') ? + ', at)' : ')'), + ' return t[' + getIndex_('t', where, 'at') + ']', + 'end']); + } else { // mode == 'GET_REMOVE' + var functionName = Blockly.Lua.provideFunction_( + 'list_remove_' + where.toLowerCase(), + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t' + + // The value for 'FROM_END' and'FROM_START' depends on `at` so + // we add it as a parameter. + ((where == 'FROM_END' || where == 'FROM_START') ? + ', at)' : ')'), + ' return table.remove(t, ' + getIndex_('t', where, 'at') + ')', + 'end']); + } + var code = functionName + '(' + list + + // The value for 'FROM_END' and 'FROM_START' depends on `at` so we + // pass it. + ((where == 'FROM_END' || where == 'FROM_START') ? ', ' + at : '') + + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; + } + } else { + // Either `list` is a simple variable, or we only need to refer to `list` + // once. + var atOrder = (mode == 'GET' && where == 'FROM_END') ? + Blockly.Lua.ORDER_ADDITIVE : Blockly.Lua.ORDER_NONE; + var at = Blockly.Lua.valueToCode(block, 'AT', atOrder) || '1'; + at = getIndex_(list, where, at); + if (mode == 'GET') { + var code = list + '[' + at + ']'; + return [code, Blockly.Lua.ORDER_HIGH]; + } else { + var code = 'table.remove(' + list + ', ' + at + ')'; + if (mode == 'GET_REMOVE') { + return [code, Blockly.Lua.ORDER_HIGH]; + } else { // `mode` == 'REMOVE' + return code + '\n'; + } + } + } +}; + +Blockly.Lua['lists_setIndex'] = function(block) { + // Set element at index. + // Note: Until February 2013 this block did not have MODE or WHERE inputs. + var list = Blockly.Lua.valueToCode(block, 'LIST', + Blockly.Lua.ORDER_HIGH) || '{}'; + var mode = block.getFieldValue('MODE') || 'SET'; + var where = block.getFieldValue('WHERE') || 'FROM_START'; + var at = Blockly.Lua.valueToCode(block, 'AT', + Blockly.Lua.ORDER_ADDITIVE) || '1'; + var value = Blockly.Lua.valueToCode(block, 'TO', + Blockly.Lua.ORDER_NONE) || 'None'; + var getIndex_ = Blockly.Lua.lists.getIndex_; + + var code = ''; + // If `list` would be evaluated more than once (which is the case for LAST, + // FROM_END, and RANDOM) and is non-trivial, make sure to access it only once. + if ((where == 'LAST' || where == 'FROM_END' || where == 'RANDOM') && + !list.match(/^\w+$/)) { + // `list` is an expression, so we may not evaluate it more than once. + // We can use multiple statements. + var listVar = Blockly.Lua.variableDB_.getDistinctName( + 'tmp_list', Blockly.VARIABLE_CATEGORY_NAME); + code = listVar + ' = ' + list + '\n'; + list = listVar; + } + if (mode == 'SET') { + code += list + '[' + getIndex_(list, where, at) + '] = ' + value; + } else { // `mode` == 'INSERT' + // LAST is a special case, because we want to insert + // *after* not *before*, the existing last element. + code += 'table.insert(' + list + ', ' + + (getIndex_(list, where, at) + (where == 'LAST' ? ' + 1' : '')) + + ', ' + value + ')'; + } + return code + '\n'; +}; + +Blockly.Lua['lists_getSublist'] = function(block) { + // Get sublist. + var list = Blockly.Lua.valueToCode(block, 'LIST', + Blockly.Lua.ORDER_NONE) || '{}'; + var where1 = block.getFieldValue('WHERE1'); + var where2 = block.getFieldValue('WHERE2'); + var at1 = Blockly.Lua.valueToCode(block, 'AT1', + Blockly.Lua.ORDER_NONE) || '1'; + var at2 = Blockly.Lua.valueToCode(block, 'AT2', + Blockly.Lua.ORDER_NONE) || '1'; + var getIndex_ = Blockly.Lua.lists.getIndex_; + + var functionName = Blockly.Lua.provideFunction_( + 'list_sublist_' + where1.toLowerCase() + '_' + where2.toLowerCase(), + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(source' + + // The value for 'FROM_END' and'FROM_START' depends on `at` so + // we add it as a parameter. + ((where1 == 'FROM_END' || where1 == 'FROM_START') ? ', at1' : '') + + ((where2 == 'FROM_END' || where2 == 'FROM_START') ? ', at2' : '') + + ')', + ' local t = {}', + ' local start = ' + getIndex_('source', where1, 'at1'), + ' local finish = ' + getIndex_('source', where2, 'at2'), + ' for i = start, finish do', + ' table.insert(t, source[i])', + ' end', + ' return t', + 'end']); + var code = functionName + '(' + list + + // The value for 'FROM_END' and 'FROM_START' depends on `at` so we + // pass it. + ((where1 == 'FROM_END' || where1 == 'FROM_START') ? ', ' + at1 : '') + + ((where2 == 'FROM_END' || where2 == 'FROM_START') ? ', ' + at2 : '') + + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['lists_sort'] = function(block) { + // Block for sorting a list. + var list = Blockly.Lua.valueToCode( + block, 'LIST', Blockly.Lua.ORDER_NONE) || '{}'; + var direction = block.getFieldValue('DIRECTION') === '1' ? 1 : -1; + var type = block.getFieldValue('TYPE'); + + var functionName = Blockly.Lua.provideFunction_( + 'list_sort', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + + '(list, typev, direction)', + ' local t = {}', + ' for n,v in pairs(list) do table.insert(t, v) end', // Shallow-copy. + ' local compareFuncs = {', + ' NUMERIC = function(a, b)', + ' return (tonumber(tostring(a)) or 0)', + ' < (tonumber(tostring(b)) or 0) end,', + ' TEXT = function(a, b)', + ' return tostring(a) < tostring(b) end,', + ' IGNORE_CASE = function(a, b)', + ' return string.lower(tostring(a)) < string.lower(tostring(b)) end', + ' }', + ' local compareTemp = compareFuncs[typev]', + ' local compare = compareTemp', + ' if direction == -1', + ' then compare = function(a, b) return compareTemp(b, a) end', + ' end', + ' table.sort(t, compare)', + ' return t', + 'end']); + + var code = functionName + + '(' + list + ',"' + type + '", ' + direction + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['lists_split'] = function(block) { + // Block for splitting text into a list, or joining a list into text. + var input = Blockly.Lua.valueToCode(block, 'INPUT', + Blockly.Lua.ORDER_NONE); + var delimiter = Blockly.Lua.valueToCode(block, 'DELIM', + Blockly.Lua.ORDER_NONE) || '\'\''; + var mode = block.getFieldValue('MODE'); + var functionName; + if (mode == 'SPLIT') { + if (!input) { + input = '\'\''; + } + functionName = Blockly.Lua.provideFunction_( + 'list_string_split', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + + '(input, delim)', + ' local t = {}', + ' local pos = 1', + ' while true do', + ' next_delim = string.find(input, delim, pos)', + ' if next_delim == nil then', + ' table.insert(t, string.sub(input, pos))', + ' break', + ' else', + ' table.insert(t, string.sub(input, pos, next_delim-1))', + ' pos = next_delim + #delim', + ' end', + ' end', + ' return t', + 'end']); + } else if (mode == 'JOIN') { + if (!input) { + input = '{}'; + } + functionName = 'table.concat'; + } else { + throw Error('Unknown mode: ' + mode); + } + var code = functionName + '(' + input + ', ' + delimiter + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['lists_reverse'] = function(block) { + // Block for reversing a list. + var list = Blockly.Lua.valueToCode(block, 'LIST', + Blockly.Lua.ORDER_NONE) || '{}'; + var functionName = Blockly.Lua.provideFunction_( + 'list_reverse', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(input)', + ' local reversed = {}', + ' for i = #input, 1, -1 do', + ' table.insert(reversed, input[i])', + ' end', + ' return reversed', + 'end']); + var code = functionName + '(' + list + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; diff --git a/js/generators/lua/logic.js b/js/generators/lua/logic.js new file mode 100644 index 0000000..bc0d895 --- /dev/null +++ b/js/generators/lua/logic.js @@ -0,0 +1,138 @@ +/** + * @license + * Copyright 2016 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Lua for logic blocks. + * @author rodrigoq@google.com (Rodrigo Queiro) + */ +'use strict'; + +goog.provide('Blockly.Lua.logic'); + +goog.require('Blockly.Lua'); + + +Blockly.Lua['controls_if'] = function(block) { + // If/elseif/else condition. + var n = 0; + var code = '', branchCode, conditionCode; + if (Blockly.Lua.STATEMENT_PREFIX) { + // Automatic prefix insertion is switched off for this block. Add manually. + code += Blockly.Lua.injectId(Blockly.Lua.STATEMENT_PREFIX, block); + } + do { + conditionCode = Blockly.Lua.valueToCode(block, 'IF' + n, + Blockly.Lua.ORDER_NONE) || 'false'; + branchCode = Blockly.Lua.statementToCode(block, 'DO' + n); + if (Blockly.Lua.STATEMENT_SUFFIX) { + branchCode = Blockly.Lua.prefixLines( + Blockly.Lua.injectId(Blockly.Lua.STATEMENT_SUFFIX, block), + Blockly.Lua.INDENT) + branchCode; + } + code += (n > 0 ? 'else' : '') + + 'if ' + conditionCode + ' then\n' + branchCode; + ++n; + } while (block.getInput('IF' + n)); + + if (block.getInput('ELSE') || Blockly.Lua.STATEMENT_SUFFIX) { + branchCode = Blockly.Lua.statementToCode(block, 'ELSE'); + if (Blockly.Lua.STATEMENT_SUFFIX) { + branchCode = Blockly.Lua.prefixLines( + Blockly.Lua.injectId(Blockly.Lua.STATEMENT_SUFFIX, block), + Blockly.Lua.INDENT) + branchCode; + } + code += 'else\n' + branchCode; + } + return code + 'end\n'; +}; + +Blockly.Lua['controls_ifelse'] = Blockly.Lua['controls_if']; + +Blockly.Lua['logic_compare'] = function(block) { + // Comparison operator. + var OPERATORS = { + 'EQ': '==', + 'NEQ': '~=', + 'LT': '<', + 'LTE': '<=', + 'GT': '>', + 'GTE': '>=' + }; + var operator = OPERATORS[block.getFieldValue('OP')]; + var argument0 = Blockly.Lua.valueToCode(block, 'A', + Blockly.Lua.ORDER_RELATIONAL) || '0'; + var argument1 = Blockly.Lua.valueToCode(block, 'B', + Blockly.Lua.ORDER_RELATIONAL) || '0'; + var code = argument0 + ' ' + operator + ' ' + argument1; + return [code, Blockly.Lua.ORDER_RELATIONAL]; +}; + +Blockly.Lua['logic_operation'] = function(block) { + // Operations 'and', 'or'. + var operator = (block.getFieldValue('OP') == 'AND') ? 'and' : 'or'; + var order = (operator == 'and') ? Blockly.Lua.ORDER_AND : + Blockly.Lua.ORDER_OR; + var argument0 = Blockly.Lua.valueToCode(block, 'A', order); + var argument1 = Blockly.Lua.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.Lua['logic_negate'] = function(block) { + // Negation. + var argument0 = Blockly.Lua.valueToCode(block, 'BOOL', + Blockly.Lua.ORDER_UNARY) || 'true'; + var code = 'not ' + argument0; + return [code, Blockly.Lua.ORDER_UNARY]; +}; + +Blockly.Lua['logic_boolean'] = function(block) { + // Boolean values true and false. + var code = (block.getFieldValue('BOOL') == 'TRUE') ? 'true' : 'false'; + return [code, Blockly.Lua.ORDER_ATOMIC]; +}; + +Blockly.Lua['logic_null'] = function(block) { + // Null data type. + return ['nil', Blockly.Lua.ORDER_ATOMIC]; +}; + +Blockly.Lua['logic_ternary'] = function(block) { + // Ternary operator. + var value_if = Blockly.Lua.valueToCode(block, 'IF', + Blockly.Lua.ORDER_AND) || 'false'; + var value_then = Blockly.Lua.valueToCode(block, 'THEN', + Blockly.Lua.ORDER_AND) || 'nil'; + var value_else = Blockly.Lua.valueToCode(block, 'ELSE', + Blockly.Lua.ORDER_OR) || 'nil'; + var code = value_if + ' and ' + value_then + ' or ' + value_else; + return [code, Blockly.Lua.ORDER_OR]; +}; diff --git a/js/generators/lua/loops.js b/js/generators/lua/loops.js new file mode 100644 index 0000000..063aa2b --- /dev/null +++ b/js/generators/lua/loops.js @@ -0,0 +1,184 @@ +/** + * @license + * Copyright 2016 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Lua for loop blocks. + * @author rodrigoq@google.com (Rodrigo Queiro) + */ +'use strict'; + +goog.provide('Blockly.Lua.loops'); + +goog.require('Blockly.Lua'); + + +/** + * This is the text used to implement a
    continue
    . + * It is also used to recognise
    continue
    s in generated code so that + * the appropriate label can be put at the end of the loop body. + * @const {string} + */ +Blockly.Lua.CONTINUE_STATEMENT = 'goto continue\n'; + +/** + * If the loop body contains a "goto continue" statement, add a continue label + * to the loop body. Slightly inefficient, as continue labels will be generated + * in all outer loops, but this is safer than duplicating the logic of + * blockToCode. + * + * @param {string} branch Generated code of the loop body + * @return {string} Generated label or '' if unnecessary + * @private + */ +Blockly.Lua.addContinueLabel_ = function(branch) { + if (branch.indexOf(Blockly.Lua.CONTINUE_STATEMENT) != -1) { + // False positives are possible (e.g. a string literal), but are harmless. + return branch + Blockly.Lua.INDENT + '::continue::\n'; + } else { + return branch; + } +}; + +Blockly.Lua['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.Lua.valueToCode(block, 'TIMES', + Blockly.Lua.ORDER_NONE) || '0'; + } + if (Blockly.isNumber(repeats)) { + repeats = parseInt(repeats, 10); + } else { + repeats = 'math.floor(' + repeats + ')'; + } + var branch = Blockly.Lua.statementToCode(block, 'DO'); + branch = Blockly.Lua.addLoopTrap(branch, block); + branch = Blockly.Lua.addContinueLabel_(branch); + var loopVar = Blockly.Lua.variableDB_.getDistinctName( + 'count', Blockly.VARIABLE_CATEGORY_NAME); + var code = 'for ' + loopVar + ' = 1, ' + repeats + ' do\n' + + branch + 'end\n'; + return code; +}; + +Blockly.Lua['controls_repeat'] = Blockly.Lua['controls_repeat_ext']; + +Blockly.Lua['controls_whileUntil'] = function(block) { + // Do while/until loop. + var until = block.getFieldValue('MODE') == 'UNTIL'; + var argument0 = Blockly.Lua.valueToCode(block, 'BOOL', + until ? Blockly.Lua.ORDER_UNARY : + Blockly.Lua.ORDER_NONE) || 'false'; + var branch = Blockly.Lua.statementToCode(block, 'DO'); + branch = Blockly.Lua.addLoopTrap(branch, block); + branch = Blockly.Lua.addContinueLabel_(branch); + if (until) { + argument0 = 'not ' + argument0; + } + return 'while ' + argument0 + ' do\n' + branch + 'end\n'; +}; + +Blockly.Lua['controls_for'] = function(block) { + // For loop. + var variable0 = Blockly.Lua.variableDB_.getName( + block.getFieldValue('VAR'), Blockly.VARIABLE_CATEGORY_NAME); + var startVar = Blockly.Lua.valueToCode(block, 'FROM', + Blockly.Lua.ORDER_NONE) || '0'; + var endVar = Blockly.Lua.valueToCode(block, 'TO', + Blockly.Lua.ORDER_NONE) || '0'; + var increment = Blockly.Lua.valueToCode(block, 'BY', + Blockly.Lua.ORDER_NONE) || '1'; + var branch = Blockly.Lua.statementToCode(block, 'DO'); + branch = Blockly.Lua.addLoopTrap(branch, block); + branch = Blockly.Lua.addContinueLabel_(branch); + var code = ''; + var incValue; + if (Blockly.isNumber(startVar) && Blockly.isNumber(endVar) && + Blockly.isNumber(increment)) { + // All arguments are simple numbers. + var up = Number(startVar) <= Number(endVar); + var step = Math.abs(Number(increment)); + incValue = (up ? '' : '-') + step; + } else { + code = ''; + // Determine loop direction at start, in case one of the bounds + // changes during loop execution. + incValue = Blockly.Lua.variableDB_.getDistinctName( + variable0 + '_inc', Blockly.VARIABLE_CATEGORY_NAME); + code += incValue + ' = '; + if (Blockly.isNumber(increment)) { + code += Math.abs(increment) + '\n'; + } else { + code += 'math.abs(' + increment + ')\n'; + } + code += 'if (' + startVar + ') > (' + endVar + ') then\n'; + code += Blockly.Lua.INDENT + incValue + ' = -' + incValue + '\n'; + code += 'end\n'; + } + code += 'for ' + variable0 + ' = ' + startVar + ', ' + endVar + + ', ' + incValue; + code += ' do\n' + branch + 'end\n'; + return code; +}; + +Blockly.Lua['controls_forEach'] = function(block) { + // For each loop. + var variable0 = Blockly.Lua.variableDB_.getName( + block.getFieldValue('VAR'), Blockly.VARIABLE_CATEGORY_NAME); + var argument0 = Blockly.Lua.valueToCode(block, 'LIST', + Blockly.Lua.ORDER_NONE) || '{}'; + var branch = Blockly.Lua.statementToCode(block, 'DO'); + branch = Blockly.Lua.addLoopTrap(branch, block); + branch = Blockly.Lua.addContinueLabel_(branch); + var code = 'for _, ' + variable0 + ' in ipairs(' + argument0 + ') do \n' + + branch + 'end\n'; + return code; +}; + +Blockly.Lua['controls_flow_statements'] = function(block) { + // Flow statements: continue, break. + var xfix = ''; + if (Blockly.Lua.STATEMENT_PREFIX) { + // Automatic prefix insertion is switched off for this block. Add manually. + xfix += Blockly.Lua.injectId(Blockly.Lua.STATEMENT_PREFIX, block); + } + if (Blockly.Lua.STATEMENT_SUFFIX) { + // Inject any statement suffix here since the regular one at the end + // will not get executed if the break/continue is triggered. + xfix += Blockly.Lua.injectId(Blockly.Lua.STATEMENT_SUFFIX, block); + } + if (Blockly.Lua.STATEMENT_PREFIX) { + var loop = Blockly.Constants.Loops + .CONTROL_FLOW_IN_LOOP_CHECK_MIXIN.getSurroundLoop(block); + if (loop && !loop.suppressPrefixSuffix) { + // Inject loop's statement prefix here since the regular one at the end + // of the loop will not get executed if 'continue' is triggered. + // In the case of 'break', a prefix is needed due to the loop's suffix. + xfix += Blockly.Lua.injectId(Blockly.Lua.STATEMENT_PREFIX, loop); + } + } + switch (block.getFieldValue('FLOW')) { + case 'BREAK': + return xfix + 'break\n'; + case 'CONTINUE': + return xfix + Blockly.Lua.CONTINUE_STATEMENT; + } + throw Error('Unknown flow statement.'); +}; diff --git a/js/generators/lua/math.js b/js/generators/lua/math.js new file mode 100644 index 0000000..a61f318 --- /dev/null +++ b/js/generators/lua/math.js @@ -0,0 +1,434 @@ +/** + * @license + * Copyright 2016 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Lua for math blocks. + * @author rodrigoq@google.com (Rodrigo Queiro) + */ +'use strict'; + +goog.provide('Blockly.Lua.math'); + +goog.require('Blockly.Lua'); + + +Blockly.Lua['math_number'] = function(block) { + // Numeric value. + var code = Number(block.getFieldValue('NUM')); + var order = code < 0 ? Blockly.Lua.ORDER_UNARY : + Blockly.Lua.ORDER_ATOMIC; + return [code, order]; +}; + +Blockly.Lua['math_arithmetic'] = function(block) { + // Basic arithmetic operators, and power. + var OPERATORS = { + ADD: [' + ', Blockly.Lua.ORDER_ADDITIVE], + MINUS: [' - ', Blockly.Lua.ORDER_ADDITIVE], + MULTIPLY: [' * ', Blockly.Lua.ORDER_MULTIPLICATIVE], + DIVIDE: [' / ', Blockly.Lua.ORDER_MULTIPLICATIVE], + POWER: [' ^ ', Blockly.Lua.ORDER_EXPONENTIATION] + }; + var tuple = OPERATORS[block.getFieldValue('OP')]; + var operator = tuple[0]; + var order = tuple[1]; + var argument0 = Blockly.Lua.valueToCode(block, 'A', order) || '0'; + var argument1 = Blockly.Lua.valueToCode(block, 'B', order) || '0'; + var code = argument0 + operator + argument1; + return [code, order]; +}; + +Blockly.Lua['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.Lua.valueToCode(block, 'NUM', + Blockly.Lua.ORDER_UNARY) || '0'; + return ['-' + arg, Blockly.Lua.ORDER_UNARY]; + } + if (operator == 'POW10') { + arg = Blockly.Lua.valueToCode(block, 'NUM', + Blockly.Lua.ORDER_EXPONENTIATION) || '0'; + return ['10 ^ ' + arg, Blockly.Lua.ORDER_EXPONENTIATION]; + } + if (operator == 'ROUND') { + arg = Blockly.Lua.valueToCode(block, 'NUM', + Blockly.Lua.ORDER_ADDITIVE) || '0'; + } else { + arg = Blockly.Lua.valueToCode(block, 'NUM', + Blockly.Lua.ORDER_NONE) || '0'; + } + switch (operator) { + case 'ABS': + code = 'math.abs(' + arg + ')'; + break; + case 'ROOT': + code = 'math.sqrt(' + arg + ')'; + break; + case 'LN': + code = 'math.log(' + arg + ')'; + break; + case 'LOG10': + code = 'math.log(' + arg + ', 10)'; + break; + case 'EXP': + code = 'math.exp(' + arg + ')'; + break; + case 'ROUND': + // This rounds up. Blockly does not specify rounding direction. + code = 'math.floor(' + arg + ' + .5)'; + break; + case 'ROUNDUP': + code = 'math.ceil(' + arg + ')'; + break; + case 'ROUNDDOWN': + code = 'math.floor(' + arg + ')'; + break; + case 'SIN': + code = 'math.sin(math.rad(' + arg + '))'; + break; + case 'COS': + code = 'math.cos(math.rad(' + arg + '))'; + break; + case 'TAN': + code = 'math.tan(math.rad(' + arg + '))'; + break; + case 'ASIN': + code = 'math.deg(math.asin(' + arg + '))'; + break; + case 'ACOS': + code = 'math.deg(math.acos(' + arg + '))'; + break; + case 'ATAN': + code = 'math.deg(math.atan(' + arg + '))'; + break; + default: + throw Error('Unknown math operator: ' + operator); + } + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['math_constant'] = function(block) { + // Constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY. + var CONSTANTS = { + PI: ['math.pi', Blockly.Lua.ORDER_HIGH], + E: ['math.exp(1)', Blockly.Lua.ORDER_HIGH], + GOLDEN_RATIO: ['(1 + math.sqrt(5)) / 2', Blockly.Lua.ORDER_MULTIPLICATIVE], + SQRT2: ['math.sqrt(2)', Blockly.Lua.ORDER_HIGH], + SQRT1_2: ['math.sqrt(1 / 2)', Blockly.Lua.ORDER_HIGH], + INFINITY: ['math.huge', Blockly.Lua.ORDER_HIGH] + }; + return CONSTANTS[block.getFieldValue('CONSTANT')]; +}; + +Blockly.Lua['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.Lua.valueToCode(block, 'NUMBER_TO_CHECK', + Blockly.Lua.ORDER_MULTIPLICATIVE) || '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.Lua.provideFunction_( + 'math_isPrime', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(n)', + ' -- https://en.wikipedia.org/wiki/Primality_test#Naive_methods', + ' if n == 2 or n == 3 then', + ' return true', + ' end', + ' -- False if n is NaN, negative, is 1, or not whole.', + ' -- And false if n is divisible by 2 or 3.', + ' if not(n > 1) or n % 1 ~= 0 or n % 2 == 0 or n % 3 == 0 then', + ' return false', + ' end', + ' -- Check all the numbers of form 6k +/- 1, up to sqrt(n).', + ' for x = 6, math.sqrt(n) + 1.5, 6 do', + ' if n % (x - 1) == 0 or n % (x + 1) == 0 then', + ' return false', + ' end', + ' end', + ' return true', + 'end']); + code = functionName + '(' + number_to_check + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; + } + 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.Lua.valueToCode(block, 'DIVISOR', + Blockly.Lua.ORDER_MULTIPLICATIVE); + // If 'divisor' is some code that evals to 0, Lua will produce a nan. + // Let's produce nil if we can determine this at compile-time. + if (!divisor || divisor == '0') { + return ['nil', Blockly.Lua.ORDER_ATOMIC]; + } + // The normal trick to implement ?: with and/or doesn't work here: + // divisor == 0 and nil or number_to_check % divisor == 0 + // because nil is false, so allow a runtime failure. :-( + code = number_to_check + ' % ' + divisor + ' == 0'; + break; + } + return [code, Blockly.Lua.ORDER_RELATIONAL]; +}; + +Blockly.Lua['math_change'] = function(block) { + // Add to a variable in place. + var argument0 = Blockly.Lua.valueToCode(block, 'DELTA', + Blockly.Lua.ORDER_ADDITIVE) || '0'; + var varName = Blockly.Lua.variableDB_.getName( + block.getFieldValue('VAR'), Blockly.VARIABLE_CATEGORY_NAME); + return varName + ' = ' + varName + ' + ' + argument0 + '\n'; +}; + +// Rounding functions have a single operand. +Blockly.Lua['math_round'] = Blockly.Lua['math_single']; +// Trigonometry functions have a single operand. +Blockly.Lua['math_trig'] = Blockly.Lua['math_single']; + +Blockly.Lua['math_on_list'] = function(block) { + // Math functions for lists. + var func = block.getFieldValue('OP'); + var list = Blockly.Lua.valueToCode(block, 'LIST', + Blockly.Lua.ORDER_NONE) || '{}'; + var functionName; + + // Functions needed in more than one case. + function provideSum() { + return Blockly.Lua.provideFunction_( + 'math_sum', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)', + ' local result = 0', + ' for _, v in ipairs(t) do', + ' result = result + v', + ' end', + ' return result', + 'end']); + } + + switch (func) { + case 'SUM': + functionName = provideSum(); + break; + + case 'MIN': + // Returns 0 for the empty list. + functionName = Blockly.Lua.provideFunction_( + 'math_min', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)', + ' if #t == 0 then', + ' return 0', + ' end', + ' local result = math.huge', + ' for _, v in ipairs(t) do', + ' if v < result then', + ' result = v', + ' end', + ' end', + ' return result', + 'end']); + break; + + case 'AVERAGE': + // Returns 0 for the empty list. + functionName = Blockly.Lua.provideFunction_( + 'math_average', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)', + ' if #t == 0 then', + ' return 0', + ' end', + ' return ' + provideSum() + '(t) / #t', + 'end']); + break; + + case 'MAX': + // Returns 0 for the empty list. + functionName = Blockly.Lua.provideFunction_( + 'math_max', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)', + ' if #t == 0 then', + ' return 0', + ' end', + ' local result = -math.huge', + ' for _, v in ipairs(t) do', + ' if v > result then', + ' result = v', + ' end', + ' end', + ' return result', + 'end']); + break; + + case 'MEDIAN': + functionName = Blockly.Lua.provideFunction_( + 'math_median', + // This operation excludes non-numbers. + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)', + ' -- Source: http://lua-users.org/wiki/SimpleStats', + ' if #t == 0 then', + ' return 0', + ' end', + ' local temp={}', + ' for _, v in ipairs(t) do', + ' if type(v) == "number" then', + ' table.insert(temp, v)', + ' end', + ' end', + ' table.sort(temp)', + ' if #temp % 2 == 0 then', + ' return (temp[#temp/2] + temp[(#temp/2)+1]) / 2', + ' else', + ' return temp[math.ceil(#temp/2)]', + ' end', + 'end']); + break; + + case 'MODE': + functionName = Blockly.Lua.provideFunction_( + 'math_modes', + // As a list of numbers can contain more than one mode, + // the returned result is provided as an array. + // The Lua version includes non-numbers. + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)', + ' -- Source: http://lua-users.org/wiki/SimpleStats', + ' local counts={}', + ' for _, v in ipairs(t) do', + ' if counts[v] == nil then', + ' counts[v] = 1', + ' else', + ' counts[v] = counts[v] + 1', + ' end', + ' end', + ' local biggestCount = 0', + ' for _, v in pairs(counts) do', + ' if v > biggestCount then', + ' biggestCount = v', + ' end', + ' end', + ' local temp={}', + ' for k, v in pairs(counts) do', + ' if v == biggestCount then', + ' table.insert(temp, k)', + ' end', + ' end', + ' return temp', + 'end']); + break; + + case 'STD_DEV': + functionName = Blockly.Lua.provideFunction_( + 'math_standard_deviation', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)', + ' local m', + ' local vm', + ' local total = 0', + ' local count = 0', + ' local result', + ' m = #t == 0 and 0 or ' + provideSum() + '(t) / #t', + ' for _, v in ipairs(t) do', + " if type(v) == 'number' then", + ' vm = v - m', + ' total = total + (vm * vm)', + ' count = count + 1', + ' end', + ' end', + ' result = math.sqrt(total / (count-1))', + ' return result', + 'end']); + break; + + case 'RANDOM': + functionName = Blockly.Lua.provideFunction_( + 'math_random_list', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t)', + ' if #t == 0 then', + ' return nil', + ' end', + ' return t[math.random(#t)]', + 'end']); + break; + + default: + throw Error('Unknown operator: ' + func); + } + return [functionName + '(' + list + ')', Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['math_modulo'] = function(block) { + // Remainder computation. + var argument0 = Blockly.Lua.valueToCode(block, 'DIVIDEND', + Blockly.Lua.ORDER_MULTIPLICATIVE) || '0'; + var argument1 = Blockly.Lua.valueToCode(block, 'DIVISOR', + Blockly.Lua.ORDER_MULTIPLICATIVE) || '0'; + var code = argument0 + ' % ' + argument1; + return [code, Blockly.Lua.ORDER_MULTIPLICATIVE]; +}; + +Blockly.Lua['math_constrain'] = function(block) { + // Constrain a number between two limits. + var argument0 = Blockly.Lua.valueToCode(block, 'VALUE', + Blockly.Lua.ORDER_NONE) || '0'; + var argument1 = Blockly.Lua.valueToCode(block, 'LOW', + Blockly.Lua.ORDER_NONE) || '-math.huge'; + var argument2 = Blockly.Lua.valueToCode(block, 'HIGH', + Blockly.Lua.ORDER_NONE) || 'math.huge'; + var code = 'math.min(math.max(' + argument0 + ', ' + argument1 + '), ' + + argument2 + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['math_random_int'] = function(block) { + // Random integer between [X] and [Y]. + var argument0 = Blockly.Lua.valueToCode(block, 'FROM', + Blockly.Lua.ORDER_NONE) || '0'; + var argument1 = Blockly.Lua.valueToCode(block, 'TO', + Blockly.Lua.ORDER_NONE) || '0'; + var code = 'math.random(' + argument0 + ', ' + argument1 + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['math_random_float'] = function(block) { + // Random fraction between 0 and 1. + return ['math.random()', Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['math_atan2'] = function(block) { + // Arctangent of point (X, Y) in degrees from -180 to 180. + var argument0 = Blockly.Lua.valueToCode(block, 'X', + Blockly.Lua.ORDER_NONE) || '0'; + var argument1 = Blockly.Lua.valueToCode(block, 'Y', + Blockly.Lua.ORDER_NONE) || '0'; + return ['math.deg(math.atan2(' + argument1 + ', ' + argument0 + '))', + Blockly.Lua.ORDER_HIGH]; +}; diff --git a/js/generators/lua/procedures.js b/js/generators/lua/procedures.js new file mode 100644 index 0000000..fd7b3b3 --- /dev/null +++ b/js/generators/lua/procedures.js @@ -0,0 +1,122 @@ +/** + * @license + * Copyright 2016 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Lua for procedure blocks. + * @author rodrigoq@google.com (Rodrigo Queiro) + */ +'use strict'; + +goog.provide('Blockly.Lua.procedures'); + +goog.require('Blockly.Lua'); + + +Blockly.Lua['procedures_defreturn'] = function(block) { + // Define a procedure with a return value. + var funcName = Blockly.Lua.variableDB_.getName( + block.getFieldValue('NAME'), Blockly.PROCEDURE_CATEGORY_NAME); + var xfix1 = ''; + if (Blockly.Lua.STATEMENT_PREFIX) { + xfix1 += Blockly.Lua.injectId(Blockly.Lua.STATEMENT_PREFIX, block); + } + if (Blockly.Lua.STATEMENT_SUFFIX) { + xfix1 += Blockly.Lua.injectId(Blockly.Lua.STATEMENT_SUFFIX, block); + } + if (xfix1) { + xfix1 = Blockly.Lua.prefixLines(xfix1, Blockly.Lua.INDENT); + } + var loopTrap = ''; + if (Blockly.Lua.INFINITE_LOOP_TRAP) { + loopTrap = Blockly.Lua.prefixLines( + Blockly.Lua.injectId(Blockly.Lua.INFINITE_LOOP_TRAP, block), + Blockly.Lua.INDENT); + } + var branch = Blockly.Lua.statementToCode(block, 'STACK'); + var returnValue = Blockly.Lua.valueToCode(block, 'RETURN', + Blockly.Lua.ORDER_NONE) || ''; + var xfix2 = ''; + if (branch && returnValue) { + // After executing the function body, revisit this block for the return. + xfix2 = xfix1; + } + if (returnValue) { + returnValue = Blockly.Lua.INDENT + 'return ' + returnValue + '\n'; + } else if (!branch) { + branch = ''; + } + var args = []; + for (var i = 0; i < block.arguments_.length; i++) { + args[i] = Blockly.Lua.variableDB_.getName(block.arguments_[i], + Blockly.VARIABLE_CATEGORY_NAME); + } + var code = 'function ' + funcName + '(' + args.join(', ') + ')\n' + + xfix1 + loopTrap + branch + xfix2 + returnValue + 'end\n'; + code = Blockly.Lua.scrub_(block, code); + // Add % so as not to collide with helper functions in definitions list. + Blockly.Lua.definitions_['%' + funcName] = code; + return null; +}; + +// Defining a procedure without a return value uses the same generator as +// a procedure with a return value. +Blockly.Lua['procedures_defnoreturn'] = + Blockly.Lua['procedures_defreturn']; + +Blockly.Lua['procedures_callreturn'] = function(block) { + // Call a procedure with a return value. + var funcName = Blockly.Lua.variableDB_.getName( + block.getFieldValue('NAME'), Blockly.PROCEDURE_CATEGORY_NAME); + var args = []; + for (var i = 0; i < block.arguments_.length; i++) { + args[i] = Blockly.Lua.valueToCode(block, 'ARG' + i, + Blockly.Lua.ORDER_NONE) || 'nil'; + } + var code = funcName + '(' + args.join(', ') + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['procedures_callnoreturn'] = function(block) { + // Call a procedure with no return value. + // Generated code is for a function call as a statement is the same as a + // function call as a value, with the addition of line ending. + var tuple = Blockly.Lua['procedures_callreturn'](block); + return tuple[0] + '\n'; +}; + +Blockly.Lua['procedures_ifreturn'] = function(block) { + // Conditionally return value from a procedure. + var condition = Blockly.Lua.valueToCode(block, 'CONDITION', + Blockly.Lua.ORDER_NONE) || 'false'; + var code = 'if ' + condition + ' then\n'; + if (Blockly.Lua.STATEMENT_SUFFIX) { + // Inject any statement suffix here since the regular one at the end + // will not get executed if the return is triggered. + code += Blockly.Lua.prefixLines( + Blockly.Lua.injectId(Blockly.Lua.STATEMENT_SUFFIX, block), + Blockly.Lua.INDENT); + } + if (block.hasReturnValue_) { + var value = Blockly.Lua.valueToCode(block, 'VALUE', + Blockly.Lua.ORDER_NONE) || 'nil'; + code += Blockly.Lua.INDENT + 'return ' + value + '\n'; + } else { + code += Blockly.Lua.INDENT + 'return\n'; + } + code += 'end\n'; + return code; +}; diff --git a/js/generators/lua/text.js b/js/generators/lua/text.js new file mode 100644 index 0000000..cb74d7c --- /dev/null +++ b/js/generators/lua/text.js @@ -0,0 +1,364 @@ +/** + * @license + * Copyright 2016 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Lua for text blocks. + * @author rodrigoq@google.com (Rodrigo Queiro) + */ +'use strict'; + +goog.provide('Blockly.Lua.texts'); + +goog.require('Blockly.Lua'); + + +Blockly.Lua['text'] = function(block) { + // Text value. + var code = Blockly.Lua.quote_(block.getFieldValue('TEXT')); + return [code, Blockly.Lua.ORDER_ATOMIC]; +}; + +Blockly.Lua['text_multiline'] = function(block) { + // Text value. + var code = Blockly.Lua.multiline_quote_(block.getFieldValue('TEXT')); + return [code, Blockly.Lua.ORDER_ATOMIC]; +}; + +Blockly.Lua['text_join'] = function(block) { + // Create a string made up of any number of elements of any type. + if (block.itemCount_ == 0) { + return ['\'\'', Blockly.Lua.ORDER_ATOMIC]; + } else if (block.itemCount_ == 1) { + var element = Blockly.Lua.valueToCode(block, 'ADD0', + Blockly.Lua.ORDER_NONE) || '\'\''; + var code = 'tostring(' + element + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; + } else if (block.itemCount_ == 2) { + var element0 = Blockly.Lua.valueToCode(block, 'ADD0', + Blockly.Lua.ORDER_CONCATENATION) || '\'\''; + var element1 = Blockly.Lua.valueToCode(block, 'ADD1', + Blockly.Lua.ORDER_CONCATENATION) || '\'\''; + var code = element0 + ' .. ' + element1; + return [code, Blockly.Lua.ORDER_CONCATENATION]; + } else { + var elements = []; + for (var i = 0; i < block.itemCount_; i++) { + elements[i] = Blockly.Lua.valueToCode(block, 'ADD' + i, + Blockly.Lua.ORDER_NONE) || '\'\''; + } + var code = 'table.concat({' + elements.join(', ') + '})'; + return [code, Blockly.Lua.ORDER_HIGH]; + } +}; + +Blockly.Lua['text_append'] = function(block) { + // Append to a variable in place. + var varName = Blockly.Lua.variableDB_.getName( + block.getFieldValue('VAR'), Blockly.VARIABLE_CATEGORY_NAME); + var value = Blockly.Lua.valueToCode(block, 'TEXT', + Blockly.Lua.ORDER_CONCATENATION) || '\'\''; + return varName + ' = ' + varName + ' .. ' + value + '\n'; +}; + +Blockly.Lua['text_length'] = function(block) { + // String or array length. + var text = Blockly.Lua.valueToCode(block, 'VALUE', + Blockly.Lua.ORDER_UNARY) || '\'\''; + return ['#' + text, Blockly.Lua.ORDER_UNARY]; +}; + +Blockly.Lua['text_isEmpty'] = function(block) { + // Is the string null or array empty? + var text = Blockly.Lua.valueToCode(block, 'VALUE', + Blockly.Lua.ORDER_UNARY) || '\'\''; + return ['#' + text + ' == 0', Blockly.Lua.ORDER_RELATIONAL]; +}; + +Blockly.Lua['text_indexOf'] = function(block) { + // Search the text for a substring. + var substring = Blockly.Lua.valueToCode(block, 'FIND', + Blockly.Lua.ORDER_NONE) || '\'\''; + var text = Blockly.Lua.valueToCode(block, 'VALUE', + Blockly.Lua.ORDER_NONE) || '\'\''; + if (block.getFieldValue('END') == 'FIRST') { + var functionName = Blockly.Lua.provideFunction_( + 'firstIndexOf', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + + '(str, substr) ', + ' local i = string.find(str, substr, 1, true)', + ' if i == nil then', + ' return 0', + ' else', + ' return i', + ' end', + 'end']); + } else { + var functionName = Blockly.Lua.provideFunction_( + 'lastIndexOf', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + + '(str, substr)', + ' local i = string.find(string.reverse(str), ' + + 'string.reverse(substr), 1, true)', + ' if i then', + ' return #str + 2 - i - #substr', + ' end', + ' return 0', + 'end']); + } + var code = functionName + '(' + text + ', ' + substring + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['text_charAt'] = function(block) { + // Get letter at index. + // Note: Until January 2013 this block did not have the WHERE input. + var where = block.getFieldValue('WHERE') || 'FROM_START'; + var atOrder = (where == 'FROM_END') ? Blockly.Lua.ORDER_UNARY : + Blockly.Lua.ORDER_NONE; + var at = Blockly.Lua.valueToCode(block, 'AT', atOrder) || '1'; + var text = Blockly.Lua.valueToCode(block, 'VALUE', + Blockly.Lua.ORDER_NONE) || '\'\''; + var code; + if (where == 'RANDOM') { + var functionName = Blockly.Lua.provideFunction_( + 'text_random_letter', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(str)', + ' local index = math.random(string.len(str))', + ' return string.sub(str, index, index)', + 'end']); + code = functionName + '(' + text + ')'; + } else { + if (where == 'FIRST') { + var start = '1'; + } else if (where == 'LAST') { + var start = '-1'; + } else { + if (where == 'FROM_START') { + var start = at; + } else if (where == 'FROM_END') { + var start = '-' + at; + } else { + throw Error('Unhandled option (text_charAt).'); + } + } + if (start.match(/^-?\w*$/)) { + code = 'string.sub(' + text + ', ' + start + ', ' + start + ')'; + } else { + // use function to avoid reevaluation + var functionName = Blockly.Lua.provideFunction_( + 'text_char_at', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + + '(str, index)', + ' return string.sub(str, index, index)', + 'end']); + code = functionName + '(' + text + ', ' + start + ')'; + } + } + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['text_getSubstring'] = function(block) { + // Get substring. + var text = Blockly.Lua.valueToCode(block, 'STRING', + Blockly.Lua.ORDER_NONE) || '\'\''; + + // Get start index. + var where1 = block.getFieldValue('WHERE1'); + var at1Order = (where1 == 'FROM_END') ? Blockly.Lua.ORDER_UNARY : + Blockly.Lua.ORDER_NONE; + var at1 = Blockly.Lua.valueToCode(block, 'AT1', at1Order) || '1'; + if (where1 == 'FIRST') { + var start = 1; + } else if (where1 == 'FROM_START') { + var start = at1; + } else if (where1 == 'FROM_END') { + var start = '-' + at1; + } else { + throw Error('Unhandled option (text_getSubstring)'); + } + + // Get end index. + var where2 = block.getFieldValue('WHERE2'); + var at2Order = (where2 == 'FROM_END') ? Blockly.Lua.ORDER_UNARY : + Blockly.Lua.ORDER_NONE; + var at2 = Blockly.Lua.valueToCode(block, 'AT2', at2Order) || '1'; + if (where2 == 'LAST') { + var end = -1; + } else if (where2 == 'FROM_START') { + var end = at2; + } else if (where2 == 'FROM_END') { + var end = '-' + at2; + } else { + throw Error('Unhandled option (text_getSubstring)'); + } + var code = 'string.sub(' + text + ', ' + start + ', ' + end + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['text_changeCase'] = function(block) { + // Change capitalization. + var operator = block.getFieldValue('CASE'); + var text = Blockly.Lua.valueToCode(block, 'TEXT', + Blockly.Lua.ORDER_NONE) || '\'\''; + if (operator == 'UPPERCASE') { + var functionName = 'string.upper'; + } else if (operator == 'LOWERCASE') { + var functionName = 'string.lower'; + } else if (operator == 'TITLECASE') { + var functionName = Blockly.Lua.provideFunction_( + 'text_titlecase', + // There are shorter versions at + // http://lua-users.org/wiki/SciteTitleCase + // that do not preserve whitespace. + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(str)', + ' local buf = {}', + ' local inWord = false', + ' for i = 1, #str do', + ' local c = string.sub(str, i, i)', + ' if inWord then', + ' table.insert(buf, string.lower(c))', + ' if string.find(c, "%s") then', + ' inWord = false', + ' end', + ' else', + ' table.insert(buf, string.upper(c))', + ' inWord = true', + ' end', + ' end', + ' return table.concat(buf)', + 'end']); + } + var code = functionName + '(' + text + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['text_trim'] = function(block) { + // Trim spaces. + var OPERATORS = { + LEFT: '^%s*(,-)', + RIGHT: '(.-)%s*$', + BOTH: '^%s*(.-)%s*$' + }; + var operator = OPERATORS[block.getFieldValue('MODE')]; + var text = Blockly.Lua.valueToCode(block, 'TEXT', + Blockly.Lua.ORDER_NONE) || '\'\''; + var code = 'string.gsub(' + text + ', "' + operator + '", "%1")'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['text_print'] = function(block) { + // Print statement. + var msg = Blockly.Lua.valueToCode(block, 'TEXT', + Blockly.Lua.ORDER_NONE) || '\'\''; + return 'print(' + msg + ')\n'; +}; + +Blockly.Lua['text_prompt_ext'] = function(block) { + // Prompt function. + if (block.getField('TEXT')) { + // Internal message. + var msg = Blockly.Lua.quote_(block.getFieldValue('TEXT')); + } else { + // External message. + var msg = Blockly.Lua.valueToCode(block, 'TEXT', + Blockly.Lua.ORDER_NONE) || '\'\''; + } + + var functionName = Blockly.Lua.provideFunction_( + 'text_prompt', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(msg)', + ' io.write(msg)', + ' io.flush()', + ' return io.read()', + 'end']); + var code = functionName + '(' + msg + ')'; + + var toNumber = block.getFieldValue('TYPE') == 'NUMBER'; + if (toNumber) { + code = 'tonumber(' + code + ', 10)'; + } + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['text_prompt'] = Blockly.Lua['text_prompt_ext']; + +Blockly.Lua['text_count'] = function(block) { + var text = Blockly.Lua.valueToCode(block, 'TEXT', + Blockly.Lua.ORDER_NONE) || '\'\''; + var sub = Blockly.Lua.valueToCode(block, 'SUB', + Blockly.Lua.ORDER_NONE) || '\'\''; + var functionName = Blockly.Lua.provideFunction_( + 'text_count', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + + '(haystack, needle)', + ' if #needle == 0 then', + ' return #haystack + 1', + ' end', + ' local i = 1', + ' local count = 0', + ' while true do', + ' i = string.find(haystack, needle, i, true)', + ' if i == nil then', + ' break', + ' end', + ' count = count + 1', + ' i = i + #needle', + ' end', + ' return count', + 'end', + ]); + var code = functionName + '(' + text + ', ' + sub + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['text_replace'] = function(block) { + var text = Blockly.Lua.valueToCode(block, 'TEXT', + Blockly.Lua.ORDER_NONE) || '\'\''; + var from = Blockly.Lua.valueToCode(block, 'FROM', + Blockly.Lua.ORDER_NONE) || '\'\''; + var to = Blockly.Lua.valueToCode(block, 'TO', + Blockly.Lua.ORDER_NONE) || '\'\''; + var functionName = Blockly.Lua.provideFunction_( + 'text_replace', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + + '(haystack, needle, replacement)', + ' local buf = {}', + ' local i = 1', + ' while i <= #haystack do', + ' if string.sub(haystack, i, i + #needle - 1) == needle then', + ' for j = 1, #replacement do', + ' table.insert(buf, string.sub(replacement, j, j))', + ' end', + ' i = i + #needle', + ' else', + ' table.insert(buf, string.sub(haystack, i, i))', + ' i = i + 1', + ' end', + ' end', + ' return table.concat(buf)', + 'end', + ]); + var code = functionName + '(' + text + ', ' + from + ', ' + to + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; + +Blockly.Lua['text_reverse'] = function(block) { + var text = Blockly.Lua.valueToCode(block, 'TEXT', + Blockly.Lua.ORDER_HIGH) || '\'\''; + var code = 'string.reverse(' + text + ')'; + return [code, Blockly.Lua.ORDER_HIGH]; +}; diff --git a/js/generators/lua/variables.js b/js/generators/lua/variables.js new file mode 100644 index 0000000..3cb2d18 --- /dev/null +++ b/js/generators/lua/variables.js @@ -0,0 +1,43 @@ +/** + * @license + * Copyright 2016 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Lua for variable blocks. + * @author rodrigoq@google.com (Rodrigo Queiro) + */ +'use strict'; + +goog.provide('Blockly.Lua.variables'); + +goog.require('Blockly.Lua'); + + +Blockly.Lua['variables_get'] = function(block) { + // Variable getter. + var code = Blockly.Lua.variableDB_.getName(block.getFieldValue('VAR'), + Blockly.VARIABLE_CATEGORY_NAME); + return [code, Blockly.Lua.ORDER_ATOMIC]; +}; + +Blockly.Lua['variables_set'] = function(block) { + // Variable setter. + var argument0 = Blockly.Lua.valueToCode(block, 'VALUE', + Blockly.Lua.ORDER_NONE) || '0'; + var varName = Blockly.Lua.variableDB_.getName( + block.getFieldValue('VAR'), Blockly.VARIABLE_CATEGORY_NAME); + return varName + ' = ' + argument0 + '\n'; +}; diff --git a/js/generators/lua/variables_dynamic.js b/js/generators/lua/variables_dynamic.js new file mode 100644 index 0000000..841c779 --- /dev/null +++ b/js/generators/lua/variables_dynamic.js @@ -0,0 +1,32 @@ +/** + * @license + * Copyright 2018 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Lua for dynamic variable blocks. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.Lua.variablesDynamic'); + +goog.require('Blockly.Lua'); +goog.require('Blockly.Lua.variables'); + + +// Lua is dynamically typed. +Blockly.Lua['variables_get_dynamic'] = Blockly.Lua['variables_get']; +Blockly.Lua['variables_set_dynamic'] = Blockly.Lua['variables_set']; diff --git a/js/generators/php.js b/js/generators/php.js new file mode 100644 index 0000000..5c4ebcd --- /dev/null +++ b/js/generators/php.js @@ -0,0 +1,325 @@ +/** + * @license + * Copyright 2015 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Helper functions for generating PHP for blocks. + * @author daarond@gmail.com (Daaron Dwyer) + */ +'use strict'; + +goog.provide('Blockly.PHP'); + +goog.require('Blockly.Generator'); +goog.require('Blockly.utils.string'); + + +/** + * 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.1; // [] +Blockly.PHP.ORDER_FUNCTION_CALL = 2.2; // () +Blockly.PHP.ORDER_POWER = 3; // ** +Blockly.PHP.ORDER_INCREMENT = 4; // ++ +Blockly.PHP.ORDER_DECREMENT = 4; // -- +Blockly.PHP.ORDER_BITWISE_NOT = 4; // ~ +Blockly.PHP.ORDER_CAST = 4; // (int) (float) (string) (array) ... +Blockly.PHP.ORDER_SUPPRESS_ERROR = 4; // @ +Blockly.PHP.ORDER_INSTANCEOF = 5; // instanceof +Blockly.PHP.ORDER_LOGICAL_NOT = 6; // ! +Blockly.PHP.ORDER_UNARY_PLUS = 7.1; // + +Blockly.PHP.ORDER_UNARY_NEGATION = 7.2; // - +Blockly.PHP.ORDER_MULTIPLICATION = 8.1; // * +Blockly.PHP.ORDER_DIVISION = 8.2; // / +Blockly.PHP.ORDER_MODULUS = 8.3; // % +Blockly.PHP.ORDER_ADDITION = 9.1; // + +Blockly.PHP.ORDER_SUBTRACTION = 9.2; // - +Blockly.PHP.ORDER_STRING_CONCAT = 9.3; // . +Blockly.PHP.ORDER_BITWISE_SHIFT = 10; // << >> +Blockly.PHP.ORDER_RELATIONAL = 11; // < <= > >= +Blockly.PHP.ORDER_EQUALITY = 12; // == != === !== <> <=> +Blockly.PHP.ORDER_REFERENCE = 13; // & +Blockly.PHP.ORDER_BITWISE_AND = 13; // & +Blockly.PHP.ORDER_BITWISE_XOR = 14; // ^ +Blockly.PHP.ORDER_BITWISE_OR = 15; // | +Blockly.PHP.ORDER_LOGICAL_AND = 16; // && +Blockly.PHP.ORDER_LOGICAL_OR = 17; // || +Blockly.PHP.ORDER_IF_NULL = 18; // ?? +Blockly.PHP.ORDER_CONDITIONAL = 19; // ?: +Blockly.PHP.ORDER_ASSIGNMENT = 20; // = += -= *= /= %= <<= >>= ... +Blockly.PHP.ORDER_LOGICAL_AND_WEAK = 21; // and +Blockly.PHP.ORDER_LOGICAL_XOR = 22; // xor +Blockly.PHP.ORDER_LOGICAL_OR_WEAK = 23; // or +Blockly.PHP.ORDER_COMMA = 24; // , +Blockly.PHP.ORDER_NONE = 99; // (...) + +/** + * List of outer-inner pairings that do NOT require parentheses. + * @type {!Array.>} + */ +Blockly.PHP.ORDER_OVERRIDES = [ + // (foo()).bar() -> foo().bar() + // (foo())[0] -> foo()[0] + [Blockly.PHP.ORDER_MEMBER, Blockly.PHP.ORDER_FUNCTION_CALL], + // (foo[0])[1] -> foo[0][1] + // (foo.bar).baz -> foo.bar.baz + [Blockly.PHP.ORDER_MEMBER, Blockly.PHP.ORDER_MEMBER], + // !(!foo) -> !!foo + [Blockly.PHP.ORDER_LOGICAL_NOT, Blockly.PHP.ORDER_LOGICAL_NOT], + // a * (b * c) -> a * b * c + [Blockly.PHP.ORDER_MULTIPLICATION, Blockly.PHP.ORDER_MULTIPLICATION], + // a + (b + c) -> a + b + c + [Blockly.PHP.ORDER_ADDITION, Blockly.PHP.ORDER_ADDITION], + // a && (b && c) -> a && b && c + [Blockly.PHP.ORDER_LOGICAL_AND, Blockly.PHP.ORDER_LOGICAL_AND], + // a || (b || c) -> a || b || c + [Blockly.PHP.ORDER_LOGICAL_OR, Blockly.PHP.ORDER_LOGICAL_OR] +]; + +/** + * 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(); + } + + Blockly.PHP.variableDB_.setVariableMap(workspace.getVariableMap()); + + var defvars = []; + // Add developer variables (not created or named by the user). + var devVarList = Blockly.Variables.allDeveloperVariables(workspace); + for (var i = 0; i < devVarList.length; i++) { + defvars.push(Blockly.PHP.variableDB_.getName(devVarList[i], + Blockly.Names.DEVELOPER_VARIABLE_TYPE) + ';'); + } + + // Add user variables, but only ones that are being used. + var variables = Blockly.Variables.allUsedVarModels(workspace); + for (var i = 0, variable; variable = variables[i]; i++) { + defvars.push(Blockly.PHP.variableDB_.getName(variable.getId(), + Blockly.VARIABLE_CATEGORY_NAME) + ';'); + } + + // Declare all of the variables. + 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) { + string = string.replace(/\\/g, '\\\\') + .replace(/\n/g, '\\\n') + .replace(/'/g, '\\\''); + return '\'' + string + '\''; +}; + +/** + * Encode a string as a properly escaped multiline PHP string, complete with + * quotes. + * @param {string} string Text to encode. + * @return {string} PHP string. + * @private + */ +Blockly.PHP.multiline_quote_ = function(string) { + return '<< 0) { + var at = Blockly.PHP.valueToCode(block, atId, + Blockly.PHP.ORDER_ADDITION) || defaultAtIndex; + } else if (delta < 0) { + var at = Blockly.PHP.valueToCode(block, atId, + Blockly.PHP.ORDER_SUBTRACTION) || defaultAtIndex; + } else if (opt_negate) { + var at = Blockly.PHP.valueToCode(block, atId, + Blockly.PHP.ORDER_UNARY_NEGATION) || defaultAtIndex; + } else { + var at = Blockly.PHP.valueToCode(block, atId, order) || + defaultAtIndex; + } + + if (Blockly.isNumber(at)) { + // If the index is a naked number, adjust it right now. + at = Number(at) + delta; + if (opt_negate) { + at = -at; + } + } else { + // If the index is dynamic, adjust it in code. + if (delta > 0) { + at = at + ' + ' + delta; + var innerOrder = Blockly.PHP.ORDER_ADDITION; + } else if (delta < 0) { + at = at + ' - ' + -delta; + var innerOrder = Blockly.PHP.ORDER_SUBTRACTION; + } + if (opt_negate) { + if (delta) { + at = '-(' + at + ')'; + } else { + at = '-' + at; + } + var innerOrder = Blockly.PHP.ORDER_UNARY_NEGATION; + } + innerOrder = Math.floor(innerOrder); + order = Math.floor(order); + if (innerOrder && order >= innerOrder) { + at = '(' + at + ')'; + } + } + return at; +}; diff --git a/js/generators/php/colour.js b/js/generators/php/colour.js new file mode 100644 index 0000000..b1f7b73 --- /dev/null +++ b/js/generators/php/colour.js @@ -0,0 +1,102 @@ +/** + * @license + * Copyright 2015 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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 = Blockly.PHP.quote_(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/js/generators/php/lists.js b/js/generators/php/lists.js new file mode 100644 index 0000000..1facc35 --- /dev/null +++ b/js/generators/php/lists.js @@ -0,0 +1,509 @@ +/** + * @license + * Copyright 2015 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating PHP for list blocks. + * @author daarond@gmail.com (Daaron Dwyer) + */ + +/** + * Lists in PHP are known to break when non-variables are passed into blocks + * that require a list. PHP, unlike other languages, passes arrays as reference + * value instead of value so we are unable to support it to the extent we can + * for the other languages. + * For example, a ternary operator with two arrays will return the array by + * value and that cannot be passed into any of the built-in array functions for + * PHP (because only variables can be passed by reference). + * ex: end(true ? list1 : list2) + */ +'use strict'; + +goog.provide('Blockly.PHP.lists'); + +goog.require('Blockly.PHP'); + + +Blockly.PHP['lists_create_empty'] = function(block) { + // Create an empty list. + return ['array()', Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['lists_create_with'] = function(block) { + // Create a list with any number of elements of any type. + var code = new Array(block.itemCount_); + for (var i = 0; i < block.itemCount_; i++) { + code[i] = Blockly.PHP.valueToCode(block, 'ADD' + i, + Blockly.PHP.ORDER_COMMA) || 'null'; + } + code = 'array(' + code.join(', ') + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['lists_repeat'] = function(block) { + // Create a list with one element repeated. + var functionName = Blockly.PHP.provideFunction_( + 'lists_repeat', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '($value, $count) {', + ' $array = array();', + ' for ($index = 0; $index < $count; $index++) {', + ' $array[] = $value;', + ' }', + ' return $array;', + '}']); + var element = Blockly.PHP.valueToCode(block, 'ITEM', + Blockly.PHP.ORDER_COMMA) || 'null'; + var repeatCount = Blockly.PHP.valueToCode(block, 'NUM', + Blockly.PHP.ORDER_COMMA) || '0'; + var code = functionName + '(' + element + ', ' + repeatCount + ')'; + 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 list = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_NONE) || '\'\''; + return [functionName + '(' + list + ')', 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 argument0 = Blockly.PHP.valueToCode(block, 'FIND', + Blockly.PHP.ORDER_NONE) || '\'\''; + var argument1 = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_MEMBER) || '[]'; + if (block.workspace.options.oneBasedIndex) { + var errorIndex = ' 0'; + var indexAdjustment = ' + 1'; + } else { + var errorIndex = ' -1'; + var indexAdjustment = ''; + } + if (block.getFieldValue('END') == 'FIRST') { + // indexOf + var functionName = Blockly.PHP.provideFunction_( + 'indexOf', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '($haystack, $needle) {', + ' for ($index = 0; $index < count($haystack); $index++) {', + ' if ($haystack[$index] == $needle) return $index' + + indexAdjustment + ';', + ' }', + ' return ' + errorIndex + ';', + '}']); + } else { + // lastIndexOf + var functionName = Blockly.PHP.provideFunction_( + 'lastIndexOf', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '($haystack, $needle) {', + ' $last = ' + errorIndex + ';', + ' for ($index = 0; $index < count($haystack); $index++) {', + ' if ($haystack[$index] == $needle) $last = $index' + + indexAdjustment + ';', + ' }', + ' return $last;', + '}']); + } + + var code = functionName + '(' + argument1 + ', ' + argument0 + ')'; + 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'; + switch (where) { + case 'FIRST': + if (mode == 'GET') { + var list = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_MEMBER) || 'array()'; + var code = list + '[0]'; + return [code, Blockly.PHP.ORDER_MEMBER]; + } else if (mode == 'GET_REMOVE') { + var list = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_NONE) || 'array()'; + var code = 'array_shift(' + list + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + } else if (mode == 'REMOVE') { + var list = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_NONE) || 'array()'; + return 'array_shift(' + list + ');\n'; + } + break; + case 'LAST': + if (mode == 'GET') { + var list = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_NONE) || 'array()'; + var code = 'end(' + list + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + } else if (mode == 'GET_REMOVE') { + var list = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_NONE) || 'array()'; + var code = 'array_pop(' + list + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + } else if (mode == 'REMOVE') { + var list = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_NONE) || 'array()'; + return 'array_pop(' + list + ');\n'; + } + break; + case 'FROM_START': + var at = Blockly.PHP.getAdjusted(block, 'AT'); + if (mode == 'GET') { + var list = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_MEMBER) || 'array()'; + var code = list + '[' + at + ']'; + return [code, Blockly.PHP.ORDER_MEMBER]; + } else if (mode == 'GET_REMOVE') { + var list = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_COMMA) || 'array()'; + var code = 'array_splice(' + list + ', ' + at + ', 1)[0]'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + } else if (mode == 'REMOVE') { + var list = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_COMMA) || 'array()'; + return 'array_splice(' + list + ', ' + at + ', 1);\n'; + } + break; + case 'FROM_END': + if (mode == 'GET') { + var list = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_COMMA) || 'array()'; + var at = Blockly.PHP.getAdjusted(block, 'AT', 1, true); + var code = 'array_slice(' + list + ', ' + at + ', 1)[0]'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + } else if (mode == 'GET_REMOVE' || mode == 'REMOVE') { + var list = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_NONE) || 'array()'; + var at = Blockly.PHP.getAdjusted(block, 'AT', 1, false, + Blockly.PHP.ORDER_SUBTRACTION); + code = 'array_splice(' + list + + ', count(' + list + ') - ' + at + ', 1)[0]'; + if (mode == 'GET_REMOVE') { + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + } else if (mode == 'REMOVE') { + return code + ';\n'; + } + } + break; + case 'RANDOM': + var list = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_NONE) || 'array()'; + if (mode == 'GET') { + var functionName = Blockly.PHP.provideFunction_( + 'lists_get_random_item', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '($list) {', + ' return $list[rand(0,count($list)-1)];', + '}']); + code = functionName + '(' + list + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + } else if (mode == 'GET_REMOVE') { + var functionName = Blockly.PHP.provideFunction_( + 'lists_get_remove_random_item', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '(&$list) {', + ' $x = rand(0,count($list)-1);', + ' unset($list[$x]);', + ' return array_values($list);', + '}']); + code = functionName + '(' + list + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + } else if (mode == 'REMOVE') { + var functionName = Blockly.PHP.provideFunction_( + 'lists_remove_random_item', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '(&$list) {', + ' unset($list[rand(0,count($list)-1)]);', + '}']); + return functionName + '(' + list + ');\n'; + } + break; + } + throw Error('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 mode = block.getFieldValue('MODE') || 'GET'; + var where = block.getFieldValue('WHERE') || 'FROM_START'; + 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.VARIABLE_CATEGORY_NAME); + var code = listVar + ' = &' + list + ';\n'; + list = listVar; + return code; + } + switch (where) { + case 'FIRST': + if (mode == 'SET') { + var list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_MEMBER) || 'array()'; + return list + '[0] = ' + value + ';\n'; + } else if (mode == 'INSERT') { + var list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_COMMA) || 'array()'; + return 'array_unshift(' + list + ', ' + value + ');\n'; + } + break; + case 'LAST': + var list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_COMMA) || 'array()'; + if (mode == 'SET') { + var functionName = Blockly.PHP.provideFunction_( + 'lists_set_last_item', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '(&$list, $value) {', + ' $list[count($list) - 1] = $value;', + '}']); + return functionName + '(' + list + ', ' + value + ');\n'; + } else if (mode == 'INSERT') { + return 'array_push(' + list + ', ' + value + ');\n'; + } + break; + case 'FROM_START': + var at = Blockly.PHP.getAdjusted(block, 'AT'); + if (mode == 'SET') { + var list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_MEMBER) || 'array()'; + return list + '[' + at + '] = ' + value + ';\n'; + } else if (mode == 'INSERT') { + var list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_COMMA) || 'array()'; + return 'array_splice(' + list + ', ' + at + ', 0, ' + value + ');\n'; + } + break; + case 'FROM_END': + var list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_COMMA) || 'array()'; + var at = Blockly.PHP.getAdjusted(block, 'AT', 1); + if (mode == 'SET') { + var functionName = Blockly.PHP.provideFunction_( + 'lists_set_from_end', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '(&$list, $at, $value) {', + ' $list[count($list) - $at] = $value;', + '}']); + return functionName + '(' + list + ', ' + at + ', ' + value + ');\n'; + } else if (mode == 'INSERT') { + var functionName = Blockly.PHP.provideFunction_( + 'lists_insert_from_end', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '(&$list, $at, $value) {', + ' return array_splice($list, count($list) - $at, 0, $value);', + '}']); + return functionName + '(' + list + ', ' + at + ', ' + value + ');\n'; + } + break; + case 'RANDOM': + var list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_REFERENCE) || 'array()'; + var code = cacheList(); + var xVar = Blockly.PHP.variableDB_.getDistinctName( + 'tmp_x', Blockly.VARIABLE_CATEGORY_NAME); + code += xVar + ' = rand(0, count(' + list + ')-1);\n'; + if (mode == 'SET') { + code += list + '[' + xVar + '] = ' + value + ';\n'; + return code; + } else if (mode == 'INSERT') { + code += 'array_splice(' + list + ', ' + xVar + ', 0, ' + value + + ');\n'; + return code; + } + break; + } + throw Error('Unhandled combination (lists_setIndex).'); +}; + +Blockly.PHP['lists_getSublist'] = function(block) { + // Get sublist. + var list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_COMMA) || 'array()'; + var where1 = block.getFieldValue('WHERE1'); + var where2 = block.getFieldValue('WHERE2'); + if (where1 == 'FIRST' && where2 == 'LAST') { + var code = list; + } else if (list.match(/^\$\w+$/) || + (where1 != 'FROM_END' && where2 == 'FROM_START')) { + // If the list is a simple value or doesn't require a call for length, don't + // generate a helper function. + switch (where1) { + case 'FROM_START': + var at1 = Blockly.PHP.getAdjusted(block, 'AT1'); + break; + case 'FROM_END': + var at1 = Blockly.PHP.getAdjusted(block, 'AT1', 1, false, + Blockly.PHP.ORDER_SUBTRACTION); + at1 = 'count(' + list + ') - ' + at1; + break; + case 'FIRST': + var at1 = '0'; + break; + default: + throw Error('Unhandled option (lists_getSublist).'); + } + switch (where2) { + case 'FROM_START': + var at2 = Blockly.PHP.getAdjusted(block, 'AT2', 0, false, + Blockly.PHP.ORDER_SUBTRACTION); + var length = at2 + ' - '; + if (Blockly.isNumber(String(at1)) || String(at1).match(/^\(.+\)$/)) { + length += at1; + } else { + length += '(' + at1 + ')'; + } + length += ' + 1'; + break; + case 'FROM_END': + var at2 = Blockly.PHP.getAdjusted(block, 'AT2', 0, false, + Blockly.PHP.ORDER_SUBTRACTION); + var length = 'count(' + list + ') - ' + at2 + ' - '; + if (Blockly.isNumber(String(at1)) || String(at1).match(/^\(.+\)$/)) { + length += at1; + } else { + length += '(' + at1 + ')'; + } + break; + case 'LAST': + var length = 'count(' + list + ') - '; + if (Blockly.isNumber(String(at1)) || String(at1).match(/^\(.+\)$/)) { + length += at1; + } else { + length += '(' + at1 + ')'; + } + break; + default: + throw Error('Unhandled option (lists_getSublist).'); + } + code = 'array_slice(' + list + ', ' + at1 + ', ' + length + ')'; + } else { + var at1 = Blockly.PHP.getAdjusted(block, 'AT1'); + var at2 = Blockly.PHP.getAdjusted(block, 'AT2'); + var functionName = Blockly.PHP.provideFunction_( + 'lists_get_sublist', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '($list, $where1, $at1, $where2, $at2) {', + ' if ($where1 == \'FROM_END\') {', + ' $at1 = count($list) - 1 - $at1;', + ' } else if ($where1 == \'FIRST\') {', + ' $at1 = 0;', + ' } else if ($where1 != \'FROM_START\') {', + ' throw new Exception(\'Unhandled option (lists_get_sublist).\');', + ' }', + ' $length = 0;', + ' if ($where2 == \'FROM_START\') {', + ' $length = $at2 - $at1 + 1;', + ' } else if ($where2 == \'FROM_END\') {', + ' $length = count($list) - $at1 - $at2;', + ' } else if ($where2 == \'LAST\') {', + ' $length = count($list) - $at1;', + ' } else {', + ' throw new Exception(\'Unhandled option (lists_get_sublist).\');', + ' }', + ' return array_slice($list, $at1, $length);', + '}']); + var code = functionName + '(' + list + ', \'' + + where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')'; + } + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['lists_sort'] = function(block) { + // Block for sorting a list. + var listCode = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_COMMA) || 'array()'; + var direction = block.getFieldValue('DIRECTION') === '1' ? 1 : -1; + var type = block.getFieldValue('TYPE'); + var functionName = Blockly.PHP.provideFunction_( + 'lists_sort', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '($list, $type, $direction) {', + ' $sortCmpFuncs = array(', + ' "NUMERIC" => "strnatcasecmp",', + ' "TEXT" => "strcmp",', + ' "IGNORE_CASE" => "strcasecmp"', + ' );', + ' $sortCmp = $sortCmpFuncs[$type];', + ' $list2 = $list;', // Clone list. + ' usort($list2, $sortCmp);', + ' if ($direction == -1) {', + ' $list2 = array_reverse($list2);', + ' }', + ' return $list2;', + '}']); + var sortCode = functionName + + '(' + listCode + ', "' + type + '", ' + direction + ')'; + return [sortCode, 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_COMMA); + var value_delim = Blockly.PHP.valueToCode(block, 'DELIM', + Blockly.PHP.ORDER_COMMA) || '\'\''; + 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 Error('Unknown mode: ' + mode); + } + var code = functionName + '(' + value_delim + ', ' + value_input + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['lists_reverse'] = function(block) { + // Block for reversing a list. + var list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_COMMA) || '[]'; + var code = 'array_reverse(' + list + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; diff --git a/js/generators/php/logic.js b/js/generators/php/logic.js new file mode 100644 index 0000000..290eeb2 --- /dev/null +++ b/js/generators/php/logic.js @@ -0,0 +1,139 @@ +/** + * @license + * Copyright 2015 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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 code = '', branchCode, conditionCode; + if (Blockly.PHP.STATEMENT_PREFIX) { + // Automatic prefix insertion is switched off for this block. Add manually. + code += Blockly.PHP.injectId(Blockly.PHP.STATEMENT_PREFIX, block); + } + do { + conditionCode = Blockly.PHP.valueToCode(block, 'IF' + n, + Blockly.PHP.ORDER_NONE) || 'false'; + branchCode = Blockly.PHP.statementToCode(block, 'DO' + n); + if (Blockly.PHP.STATEMENT_SUFFIX) { + branchCode = Blockly.PHP.prefixLines( + Blockly.PHP.injectId(Blockly.PHP.STATEMENT_SUFFIX, block), + Blockly.PHP.INDENT) + branchCode; + } + code += (n > 0 ? ' else ' : '') + + 'if (' + conditionCode + ') {\n' + branchCode + '}'; + ++n; + } while (block.getInput('IF' + n)); + + if (block.getInput('ELSE') || Blockly.PHP.STATEMENT_SUFFIX) { + branchCode = Blockly.PHP.statementToCode(block, 'ELSE'); + if (Blockly.PHP.STATEMENT_SUFFIX) { + branchCode = Blockly.PHP.prefixLines( + Blockly.PHP.injectId(Blockly.PHP.STATEMENT_SUFFIX, block), + Blockly.PHP.INDENT) + branchCode; + } + code += ' else {\n' + branchCode + '}'; + } + return code + '\n'; +}; + +Blockly.PHP['controls_ifelse'] = Blockly.PHP['controls_if']; + +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/js/generators/php/loops.js b/js/generators/php/loops.js new file mode 100644 index 0000000..dc8a1d2 --- /dev/null +++ b/js/generators/php/loops.js @@ -0,0 +1,181 @@ +/** + * @license + * Copyright 2015 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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); + var code = ''; + var loopVar = Blockly.PHP.variableDB_.getDistinctName( + 'count', Blockly.VARIABLE_CATEGORY_NAME); + var endVar = repeats; + if (!repeats.match(/^\w+$/) && !Blockly.isNumber(repeats)) { + endVar = Blockly.PHP.variableDB_.getDistinctName( + 'repeat_end', Blockly.VARIABLE_CATEGORY_NAME); + 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); + 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.VARIABLE_CATEGORY_NAME); + 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); + var code; + if (Blockly.isNumber(argument0) && Blockly.isNumber(argument1) && + Blockly.isNumber(increment)) { + // All arguments are simple numbers. + var up = Number(argument0) <= Number(argument1); + code = 'for (' + variable0 + ' = ' + argument0 + '; ' + + variable0 + (up ? ' <= ' : ' >= ') + argument1 + '; ' + + variable0; + var step = Math.abs(Number(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.VARIABLE_CATEGORY_NAME); + code += startVar + ' = ' + argument0 + ';\n'; + } + var endVar = argument1; + if (!argument1.match(/^\w+$/) && !Blockly.isNumber(argument1)) { + endVar = Blockly.PHP.variableDB_.getDistinctName( + variable0 + '_end', Blockly.VARIABLE_CATEGORY_NAME); + 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.VARIABLE_CATEGORY_NAME); + 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 + '; ' + + incVar + ' >= 0 ? ' + + variable0 + ' <= ' + endVar + ' : ' + + variable0 + ' >= ' + endVar + '; ' + + 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.VARIABLE_CATEGORY_NAME); + var argument0 = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_ASSIGNMENT) || '[]'; + var branch = Blockly.PHP.statementToCode(block, 'DO'); + branch = Blockly.PHP.addLoopTrap(branch, block); + var code = ''; + code += 'foreach (' + argument0 + ' as ' + variable0 + + ') {\n' + branch + '}\n'; + return code; +}; + +Blockly.PHP['controls_flow_statements'] = function(block) { + // Flow statements: continue, break. + var xfix = ''; + if (Blockly.PHP.STATEMENT_PREFIX) { + // Automatic prefix insertion is switched off for this block. Add manually. + xfix += Blockly.PHP.injectId(Blockly.PHP.STATEMENT_PREFIX, block); + } + if (Blockly.PHP.STATEMENT_SUFFIX) { + // Inject any statement suffix here since the regular one at the end + // will not get executed if the break/continue is triggered. + xfix += Blockly.PHP.injectId(Blockly.PHP.STATEMENT_SUFFIX, block); + } + if (Blockly.PHP.STATEMENT_PREFIX) { + var loop = Blockly.Constants.Loops + .CONTROL_FLOW_IN_LOOP_CHECK_MIXIN.getSurroundLoop(block); + if (loop && !loop.suppressPrefixSuffix) { + // Inject loop's statement prefix here since the regular one at the end + // of the loop will not get executed if 'continue' is triggered. + // In the case of 'break', a prefix is needed due to the loop's suffix. + xfix += Blockly.PHP.injectId(Blockly.PHP.STATEMENT_PREFIX, loop); + } + } + switch (block.getFieldValue('FLOW')) { + case 'BREAK': + return xfix + 'break;\n'; + case 'CONTINUE': + return xfix + 'continue;\n'; + } + throw Error('Unknown flow statement.'); +}; diff --git a/js/generators/php/math.js b/js/generators/php/math.js new file mode 100644 index 0000000..a0b36c8 --- /dev/null +++ b/js/generators/php/math.js @@ -0,0 +1,381 @@ +/** + * @license + * Copyright 2015 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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 = Number(block.getFieldValue('NUM')); + var order = code >= 0 ? Blockly.PHP.ORDER_ATOMIC : + Blockly.PHP.ORDER_UNARY_NEGATION; + if (code == Infinity) { + code = 'INF'; + } else if (code == -Infinity) { + code = '-INF'; + } + return [code, order]; +}; + +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': [' ** ', Blockly.PHP.ORDER_POWER] + }; + var tuple = OPERATORS[block.getFieldValue('OP')]; + var operator = tuple[0]; + var order = tuple[1]; + var argument0 = Blockly.PHP.valueToCode(block, 'A', order) || '0'; + var argument1 = Blockly.PHP.valueToCode(block, 'B', order) || '0'; + var code = 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 Error('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.PHP.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.VARIABLE_CATEGORY_NAME); + 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) {', + ' if (empty($values)) return array();', + ' $counts = array_count_values($values);', + ' arsort($counts); // Sort counts in descending order', + ' $modes = array_keys($counts, current($counts), true);', + ' return $modes;', + '}']); + list = Blockly.PHP.valueToCode(block, 'LIST', + Blockly.PHP.ORDER_NONE) || '[]'; + code = functionName + '(' + list + ')'; + 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 Error('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]; +}; + +Blockly.PHP['math_atan2'] = function(block) { + // Arctangent of point (X, Y) in degrees from -180 to 180. + var argument0 = Blockly.PHP.valueToCode(block, 'X', + Blockly.PHP.ORDER_COMMA) || '0'; + var argument1 = Blockly.PHP.valueToCode(block, 'Y', + Blockly.PHP.ORDER_COMMA) || '0'; + return ['atan2(' + argument1 + ', ' + argument0 + ') / pi() * 180', + Blockly.PHP.ORDER_DIVISION]; +}; diff --git a/js/generators/php/procedures.js b/js/generators/php/procedures.js new file mode 100644 index 0000000..be811c6 --- /dev/null +++ b/js/generators/php/procedures.js @@ -0,0 +1,141 @@ +/** + * @license + * Copyright 2015 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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 not shadowed by + // a local parameter. + var globals = []; + var varName; + var workspace = block.workspace; + var variables = Blockly.Variables.allUsedVarModels(workspace) || []; + for (var i = 0, variable; variable = variables[i]; i++) { + varName = variable.name; + if (block.arguments_.indexOf(varName) == -1) { + globals.push(Blockly.PHP.variableDB_.getName(varName, + Blockly.VARIABLE_CATEGORY_NAME)); + } + } + // Add developer variables. + var devVarList = Blockly.Variables.allDeveloperVariables(workspace); + for (var i = 0; i < devVarList.length; i++) { + globals.push(Blockly.PHP.variableDB_.getName(devVarList[i], + Blockly.Names.DEVELOPER_VARIABLE_TYPE)); + } + globals = globals.length ? + Blockly.PHP.INDENT + 'global ' + globals.join(', ') + ';\n' : ''; + + var funcName = Blockly.PHP.variableDB_.getName( + block.getFieldValue('NAME'), Blockly.PROCEDURE_CATEGORY_NAME); + var xfix1 = ''; + if (Blockly.PHP.STATEMENT_PREFIX) { + xfix1 += Blockly.PHP.injectId(Blockly.PHP.STATEMENT_PREFIX, block); + } + if (Blockly.PHP.STATEMENT_SUFFIX) { + xfix1 += Blockly.PHP.injectId(Blockly.PHP.STATEMENT_SUFFIX, block); + } + if (xfix1) { + xfix1 = Blockly.PHP.prefixLines(xfix1, Blockly.PHP.INDENT); + } + var loopTrap = ''; + if (Blockly.PHP.INFINITE_LOOP_TRAP) { + loopTrap = Blockly.PHP.prefixLines( + Blockly.PHP.injectId(Blockly.PHP.INFINITE_LOOP_TRAP, block), + Blockly.PHP.INDENT); + } + var branch = Blockly.PHP.statementToCode(block, 'STACK'); + var returnValue = Blockly.PHP.valueToCode(block, 'RETURN', + Blockly.PHP.ORDER_NONE) || ''; + var xfix2 = ''; + if (branch && returnValue) { + // After executing the function body, revisit this block for the return. + xfix2 = xfix1; + } + if (returnValue) { + returnValue = Blockly.PHP.INDENT + 'return ' + returnValue + ';\n'; + } + var args = []; + for (var i = 0; i < block.arguments_.length; i++) { + args[i] = Blockly.PHP.variableDB_.getName(block.arguments_[i], + Blockly.VARIABLE_CATEGORY_NAME); + } + var code = 'function ' + funcName + '(' + args.join(', ') + ') {\n' + + globals + xfix1 + loopTrap + branch + xfix2 + returnValue + '}'; + code = Blockly.PHP.scrub_(block, code); + // Add % so as not to collide with helper functions in definitions list. + 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.PROCEDURE_CATEGORY_NAME); + var args = []; + for (var i = 0; i < block.arguments_.length; i++) { + args[i] = Blockly.PHP.valueToCode(block, 'ARG' + i, + Blockly.PHP.ORDER_COMMA) || 'null'; + } + var code = funcName + '(' + args.join(', ') + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['procedures_callnoreturn'] = function(block) { + // Call a procedure with no return value. + // Generated code is for a function call as a statement is the same as a + // function call as a value, with the addition of line ending. + var tuple = Blockly.PHP['procedures_callreturn'](block); + return tuple[0] + ';\n'; +}; + +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 (Blockly.PHP.STATEMENT_SUFFIX) { + // Inject any statement suffix here since the regular one at the end + // will not get executed if the return is triggered. + code += Blockly.PHP.prefixLines( + Blockly.PHP.injectId(Blockly.PHP.STATEMENT_SUFFIX, block), + Blockly.PHP.INDENT); + } + if (block.hasReturnValue_) { + var value = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_NONE) || 'null'; + code += Blockly.PHP.INDENT + 'return ' + value + ';\n'; + } else { + code += Blockly.PHP.INDENT + 'return;\n'; + } + code += '}\n'; + return code; +}; diff --git a/js/generators/php/text.js b/js/generators/php/text.js new file mode 100644 index 0000000..a9d0813 --- /dev/null +++ b/js/generators/php/text.js @@ -0,0 +1,282 @@ +/** + * @license + * Copyright 2015 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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_multiline'] = function(block) { + // Text value. + var code = Blockly.PHP.multiline_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. + if (block.itemCount_ == 0) { + return ['\'\'', Blockly.PHP.ORDER_ATOMIC]; + } else if (block.itemCount_ == 1) { + var element = Blockly.PHP.valueToCode(block, 'ADD0', + Blockly.PHP.ORDER_NONE) || '\'\''; + var code = element; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + } else if (block.itemCount_ == 2) { + var element0 = Blockly.PHP.valueToCode(block, 'ADD0', + Blockly.PHP.ORDER_ATOMIC) || '\'\''; + var element1 = Blockly.PHP.valueToCode(block, 'ADD1', + Blockly.PHP.ORDER_ATOMIC) || '\'\''; + var code = element0 + ' . ' + element1; + return [code, Blockly.PHP.ORDER_STRING_CONCAT]; + } else { + var elements = new Array(block.itemCount_); + for (var i = 0; i < block.itemCount_; i++) { + elements[i] = Blockly.PHP.valueToCode(block, 'ADD' + i, + Blockly.PHP.ORDER_COMMA) || '\'\''; + } + var code = 'implode(\'\', array(' + elements.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.VARIABLE_CATEGORY_NAME); + var value = Blockly.PHP.valueToCode(block, 'TEXT', + Blockly.PHP.ORDER_ASSIGNMENT) || '\'\''; + return varName + ' .= ' + value + ';\n'; +}; + +Blockly.PHP['text_length'] = function(block) { + // String or array length. + var functionName = Blockly.PHP.provideFunction_( + 'length', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '($value) {', + ' if (is_string($value)) {', + ' return strlen($value);', + ' } else {', + ' return count($value);', + ' }', + '}']); + var text = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_NONE) || '\'\''; + return [functionName + '(' + text + ')', Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['text_isEmpty'] = function(block) { + // Is the string null or array empty? + var text = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_NONE) || '\'\''; + return ['empty(' + text + ')', Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['text_indexOf'] = function(block) { + // Search the text for a substring. + var operator = block.getFieldValue('END') == 'FIRST' ? + 'strpos' : 'strrpos'; + var substring = Blockly.PHP.valueToCode(block, 'FIND', + Blockly.PHP.ORDER_NONE) || '\'\''; + var text = Blockly.PHP.valueToCode(block, 'VALUE', + Blockly.PHP.ORDER_NONE) || '\'\''; + if (block.workspace.options.oneBasedIndex) { + var errorIndex = ' 0'; + var indexAdjustment = ' + 1'; + } else { + var errorIndex = ' -1'; + var indexAdjustment = ''; + } + var functionName = Blockly.PHP.provideFunction_( + block.getFieldValue('END') == 'FIRST' ? + 'text_indexOf' : 'text_lastIndexOf', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '($text, $search) {', + ' $pos = ' + operator + '($text, $search);', + ' return $pos === false ? ' + errorIndex + ' : $pos' + + indexAdjustment + ';', + '}']); + var code = functionName + '(' + text + ', ' + substring + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['text_charAt'] = function(block) { + // Get letter at index. + var where = block.getFieldValue('WHERE') || 'FROM_START'; + var textOrder = (where == 'RANDOM') ? Blockly.PHP.ORDER_NONE : + Blockly.PHP.ORDER_COMMA; + var text = Blockly.PHP.valueToCode(block, 'VALUE', textOrder) || '\'\''; + switch (where) { + case 'FIRST': + var code = 'substr(' + text + ', 0, 1)'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + case 'LAST': + var code = 'substr(' + text + ', -1)'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + case 'FROM_START': + var at = Blockly.PHP.getAdjusted(block, 'AT'); + var code = 'substr(' + text + ', ' + at + ', 1)'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + case 'FROM_END': + var at = Blockly.PHP.getAdjusted(block, 'AT', 1, true); + var code = 'substr(' + text + ', ' + at + ', 1)'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + case 'RANDOM': + var functionName = Blockly.PHP.provideFunction_( + 'text_random_letter', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '($text) {', + ' return $text[rand(0, strlen($text) - 1)];', + '}']); + code = functionName + '(' + text + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; + } + throw Error('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'); + if (where1 == 'FIRST' && where2 == 'LAST') { + var code = text; + } else { + var at1 = Blockly.PHP.getAdjusted(block, 'AT1'); + var at2 = Blockly.PHP.getAdjusted(block, 'AT2'); + var functionName = Blockly.PHP.provideFunction_( + 'text_get_substring', + ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + '($text, $where1, $at1, $where2, $at2) {', + ' if ($where1 == \'FROM_END\') {', + ' $at1 = strlen($text) - 1 - $at1;', + ' } else if ($where1 == \'FIRST\') {', + ' $at1 = 0;', + ' } else if ($where1 != \'FROM_START\') {', + ' throw new Exception(\'Unhandled option (text_get_substring).\');', + ' }', + ' $length = 0;', + ' if ($where2 == \'FROM_START\') {', + ' $length = $at2 - $at1 + 1;', + ' } else if ($where2 == \'FROM_END\') {', + ' $length = strlen($text) - $at1 - $at2;', + ' } else if ($where2 == \'LAST\') {', + ' $length = strlen($text) - $at1;', + ' } else {', + ' throw new Exception(\'Unhandled option (text_get_substring).\');', + ' }', + ' return substr($text, $at1, $length);', + '}']); + var code = functionName + '(' + text + ', \'' + + where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')'; + } + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['text_changeCase'] = function(block) { + // Change capitalization. + var text = Blockly.PHP.valueToCode(block, 'TEXT', + Blockly.PHP.ORDER_NONE) || '\'\''; + if (block.getFieldValue('CASE') == 'UPPERCASE') { + var code = 'strtoupper(' + text + ')'; + } else if (block.getFieldValue('CASE') == 'LOWERCASE') { + var code = 'strtolower(' + text + ')'; + } else if (block.getFieldValue('CASE') == 'TITLECASE') { + var code = 'ucwords(strtolower(' + text + '))'; + } + 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 text = Blockly.PHP.valueToCode(block, 'TEXT', + Blockly.PHP.ORDER_NONE) || '\'\''; + return [operator + '(' + text + ')', Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['text_print'] = function(block) { + // Print statement. + var msg = Blockly.PHP.valueToCode(block, 'TEXT', + Blockly.PHP.ORDER_NONE) || '\'\''; + return 'print(' + msg + ');\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']; + +Blockly.PHP['text_count'] = function(block) { + var text = Blockly.PHP.valueToCode(block, 'TEXT', + Blockly.PHP.ORDER_MEMBER) || '\'\''; + var sub = Blockly.PHP.valueToCode(block, 'SUB', + Blockly.PHP.ORDER_NONE) || '\'\''; + var code = 'strlen(' + sub + ') === 0' + + ' ? strlen(' + text + ') + 1' + + ' : substr_count(' + text + ', ' + sub + ')'; + return [code, Blockly.PHP.ORDER_CONDITIONAL]; +}; + +Blockly.PHP['text_replace'] = function(block) { + var text = Blockly.PHP.valueToCode(block, 'TEXT', + Blockly.PHP.ORDER_MEMBER) || '\'\''; + var from = Blockly.PHP.valueToCode(block, 'FROM', + Blockly.PHP.ORDER_NONE) || '\'\''; + var to = Blockly.PHP.valueToCode(block, 'TO', + Blockly.PHP.ORDER_NONE) || '\'\''; + var code = 'str_replace(' + from + ', ' + to + ', ' + text + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; + +Blockly.PHP['text_reverse'] = function(block) { + var text = Blockly.PHP.valueToCode(block, 'TEXT', + Blockly.PHP.ORDER_MEMBER) || '\'\''; + var code = 'strrev(' + text + ')'; + return [code, Blockly.PHP.ORDER_FUNCTION_CALL]; +}; diff --git a/js/generators/php/variables.js b/js/generators/php/variables.js new file mode 100644 index 0000000..5be864e --- /dev/null +++ b/js/generators/php/variables.js @@ -0,0 +1,43 @@ +/** + * @license + * Copyright 2015 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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.VARIABLE_CATEGORY_NAME); + 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.VARIABLE_CATEGORY_NAME); + return varName + ' = ' + argument0 + ';\n'; +}; diff --git a/js/generators/php/variables_dynamic.js b/js/generators/php/variables_dynamic.js new file mode 100644 index 0000000..1a5383b --- /dev/null +++ b/js/generators/php/variables_dynamic.js @@ -0,0 +1,32 @@ +/** + * @license + * Copyright 2018 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating PHP for dynamic variable blocks. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.PHP.variablesDynamic'); + +goog.require('Blockly.PHP'); +goog.require('Blockly.PHP.variables'); + + +// PHP is dynamically typed. +Blockly.PHP['variables_get_dynamic'] = Blockly.PHP['variables_get']; +Blockly.PHP['variables_set_dynamic'] = Blockly.PHP['variables_set']; diff --git a/js/generators/python.js b/js/generators/python.js new file mode 100644 index 0000000..8291014 --- /dev/null +++ b/js/generators/python.js @@ -0,0 +1,332 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Helper functions for generating Python for blocks. + * @author fraser@google.com (Neil Fraser) + */ +'use strict'; + +goog.provide('Blockly.Python'); + +goog.require('Blockly.Generator'); +goog.require('Blockly.utils.string'); + + +/** + * 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(sorted(keyword.kwlist))) + // https://docs.python.org/3/reference/lexical_analysis.html#keywords + // https://docs.python.org/2/reference/lexical_analysis.html#keywords + 'False,None,True,and,as,assert,break,class,continue,def,del,elif,else,' + + 'except,exec,finally,for,from,global,if,import,in,is,lambda,nonlocal,not,' + + 'or,pass,print,raise,return,try,while,with,yield,' + + // https://docs.python.org/3/library/constants.html + // https://docs.python.org/2/library/constants.html + 'NotImplemented,Ellipsis,__debug__,quit,exit,copyright,license,credits,' + + // >>> print(','.join(sorted(dir(__builtins__)))) + // https://docs.python.org/3/library/functions.html + // https://docs.python.org/2/library/functions.html + 'ArithmeticError,AssertionError,AttributeError,BaseException,' + + 'BlockingIOError,BrokenPipeError,BufferError,BytesWarning,' + + 'ChildProcessError,ConnectionAbortedError,ConnectionError,' + + 'ConnectionRefusedError,ConnectionResetError,DeprecationWarning,EOFError,' + + 'Ellipsis,EnvironmentError,Exception,FileExistsError,FileNotFoundError,' + + 'FloatingPointError,FutureWarning,GeneratorExit,IOError,ImportError,' + + 'ImportWarning,IndentationError,IndexError,InterruptedError,' + + 'IsADirectoryError,KeyError,KeyboardInterrupt,LookupError,MemoryError,' + + 'ModuleNotFoundError,NameError,NotADirectoryError,NotImplemented,' + + 'NotImplementedError,OSError,OverflowError,PendingDeprecationWarning,' + + 'PermissionError,ProcessLookupError,RecursionError,ReferenceError,' + + 'ResourceWarning,RuntimeError,RuntimeWarning,StandardError,' + + 'StopAsyncIteration,StopIteration,SyntaxError,SyntaxWarning,SystemError,' + + 'SystemExit,TabError,TimeoutError,TypeError,UnboundLocalError,' + + 'UnicodeDecodeError,UnicodeEncodeError,UnicodeError,' + + 'UnicodeTranslateError,UnicodeWarning,UserWarning,ValueError,Warning,' + + 'ZeroDivisionError,_,__build_class__,__debug__,__doc__,__import__,' + + '__loader__,__name__,__package__,__spec__,abs,all,any,apply,ascii,' + + 'basestring,bin,bool,buffer,bytearray,bytes,callable,chr,classmethod,cmp,' + + 'coerce,compile,complex,copyright,credits,delattr,dict,dir,divmod,' + + 'enumerate,eval,exec,execfile,exit,file,filter,float,format,frozenset,' + + 'getattr,globals,hasattr,hash,help,hex,id,input,int,intern,isinstance,' + + 'issubclass,iter,len,license,list,locals,long,map,max,memoryview,min,' + + 'next,object,oct,open,ord,pow,print,property,quit,range,raw_input,reduce,' + + 'reload,repr,reversed,round,set,setattr,slice,sorted,staticmethod,str,' + + 'sum,super,tuple,type,unichr,unicode,vars,xrange,zip' +); + +/** + * 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.1; // . [] +Blockly.Python.ORDER_FUNCTION_CALL = 2.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; // (...) + +/** + * List of outer-inner pairings that do NOT require parentheses. + * @type {!Array.>} + */ +Blockly.Python.ORDER_OVERRIDES = [ + // (foo()).bar -> foo().bar + // (foo())[0] -> foo()[0] + [Blockly.Python.ORDER_FUNCTION_CALL, Blockly.Python.ORDER_MEMBER], + // (foo())() -> foo()() + [Blockly.Python.ORDER_FUNCTION_CALL, Blockly.Python.ORDER_FUNCTION_CALL], + // (foo.bar).baz -> foo.bar.baz + // (foo.bar)[0] -> foo.bar[0] + // (foo[0]).bar -> foo[0].bar + // (foo[0])[1] -> foo[0][1] + [Blockly.Python.ORDER_MEMBER, Blockly.Python.ORDER_MEMBER], + // (foo.bar)() -> foo.bar() + // (foo[0])() -> foo[0]() + [Blockly.Python.ORDER_MEMBER, Blockly.Python.ORDER_FUNCTION_CALL], + + // not (not foo) -> not not foo + [Blockly.Python.ORDER_LOGICAL_NOT, Blockly.Python.ORDER_LOGICAL_NOT], + // a and (b and c) -> a and b and c + [Blockly.Python.ORDER_LOGICAL_AND, Blockly.Python.ORDER_LOGICAL_AND], + // a or (b or c) -> a or b or c + [Blockly.Python.ORDER_LOGICAL_OR, Blockly.Python.ORDER_LOGICAL_OR] +]; + +/** + * Initialise the database of variable names. + * @param {!Blockly.Workspace} workspace Workspace to generate code from. + * @this {Blockly.Generator} + */ +Blockly.Python.init = function(workspace) { + /** + * Empty loops or conditionals are not allowed in Python. + */ + Blockly.Python.PASS = this.INDENT + 'pass\n'; + // 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(); + } + + Blockly.Python.variableDB_.setVariableMap(workspace.getVariableMap()); + + var defvars = []; + // Add developer variables (not created or named by the user). + var devVarList = Blockly.Variables.allDeveloperVariables(workspace); + for (var i = 0; i < devVarList.length; i++) { + defvars.push(Blockly.Python.variableDB_.getName(devVarList[i], + Blockly.Names.DEVELOPER_VARIABLE_TYPE) + ' = None'); + } + + // Add user variables, but only ones that are being used. + var variables = Blockly.Variables.allUsedVarModels(workspace); + for (var i = 0; i < variables.length; i++) { + defvars.push(Blockly.Python.variableDB_.getName(variables[i].getId(), + Blockly.VARIABLE_CATEGORY_NAME) + ' = 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) { + // Can't use goog.string.quote since % must also be escaped. + string = string.replace(/\\/g, '\\\\') + .replace(/\n/g, '\\\n'); + + // Follow the CPython behaviour of repr() for a non-byte string. + var quote = '\''; + if (string.indexOf('\'') !== -1) { + if (string.indexOf('"') === -1) { + quote = '"'; + } else { + string = string.replace(/'/g, '\\\''); + } + }; + return quote + string + quote; +}; + +/** + * Encode a string as a properly escaped multiline Python string, complete + * with quotes. + * @param {string} string Text to encode. + * @return {string} Python string. + * @private + */ +Blockly.Python.multiline_quote_ = function(string) { + // Can't use goog.string.quote since % must also be escaped. + string = string.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. + * @param {boolean=} opt_thisOnly True to generate code for only this statement. + * @return {string} Python code with comments and subsequent blocks added. + * @private + */ +Blockly.Python.scrub_ = function(block, code, opt_thisOnly) { + 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) { + comment = Blockly.utils.string.wrap(comment, + Blockly.Python.COMMENT_WRAP - 3); + commentCode += Blockly.Python.prefixLines(comment + '\n', '# '); + } + // Collect comments for all value arguments. + // Don't collect comments for nested statements. + for (var i = 0; i < block.inputList.length; i++) { + if (block.inputList[i].type == Blockly.INPUT_VALUE) { + var childBlock = block.inputList[i].connection.targetBlock(); + if (childBlock) { + comment = Blockly.Python.allNestedComments(childBlock); + if (comment) { + commentCode += Blockly.Python.prefixLines(comment, '# '); + } + } + } + } + } + var nextBlock = block.nextConnection && block.nextConnection.targetBlock(); + var nextCode = opt_thisOnly ? '' : Blockly.Python.blockToCode(nextBlock); + return commentCode + code + nextCode; +}; + +/** + * Gets a property and adjusts the value, taking into account indexing, and + * casts to an integer. + * @param {!Blockly.Block} block The block. + * @param {string} atId The property ID of the element to get. + * @param {number=} opt_delta Value to add. + * @param {boolean=} opt_negate Whether to negate the value. + * @return {string|number} + */ +Blockly.Python.getAdjustedInt = function(block, atId, opt_delta, opt_negate) { + var delta = opt_delta || 0; + if (block.workspace.options.oneBasedIndex) { + delta--; + } + var defaultAtIndex = block.workspace.options.oneBasedIndex ? '1' : '0'; + var atOrder = delta ? Blockly.Python.ORDER_ADDITIVE : + Blockly.Python.ORDER_NONE; + var at = Blockly.Python.valueToCode(block, atId, atOrder) || defaultAtIndex; + + if (Blockly.isNumber(at)) { + // If the index is a naked number, adjust it right now. + at = parseInt(at, 10) + delta; + if (opt_negate) { + at = -at; + } + } else { + // If the index is dynamic, adjust it in code. + if (delta > 0) { + at = 'int(' + at + ' + ' + delta + ')'; + } else if (delta < 0) { + at = 'int(' + at + ' - ' + -delta + ')'; + } else { + at = 'int(' + at + ')'; + } + if (opt_negate) { + at = '-' + at; + } + } + return at; +}; diff --git a/js/generators/python/colour.js b/js/generators/python/colour.js new file mode 100644 index 0000000..6b1d2ad --- /dev/null +++ b/js/generators/python/colour.js @@ -0,0 +1,83 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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 = Blockly.Python.quote_(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/js/generators/python/lists.js b/js/generators/python/lists.js new file mode 100644 index 0000000..3321880 --- /dev/null +++ b/js/generators/python/lists.js @@ -0,0 +1,360 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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 elements = new Array(block.itemCount_); + for (var i = 0; i < block.itemCount_; i++) { + elements[i] = Blockly.Python.valueToCode(block, 'ADD' + i, + Blockly.Python.ORDER_NONE) || 'None'; + } + var code = '[' + elements.join(', ') + ']'; + return [code, Blockly.Python.ORDER_ATOMIC]; +}; + +Blockly.Python['lists_repeat'] = function(block) { + // Create a list with one element repeated. + var item = Blockly.Python.valueToCode(block, 'ITEM', + Blockly.Python.ORDER_NONE) || 'None'; + var times = Blockly.Python.valueToCode(block, 'NUM', + Blockly.Python.ORDER_MULTIPLICATIVE) || '0'; + var code = '[' + item + '] * ' + times; + return [code, Blockly.Python.ORDER_MULTIPLICATIVE]; +}; + +Blockly.Python['lists_length'] = function(block) { + // String or array length. + var list = Blockly.Python.valueToCode(block, 'VALUE', + Blockly.Python.ORDER_NONE) || '[]'; + return ['len(' + list + ')', Blockly.Python.ORDER_FUNCTION_CALL]; +}; + +Blockly.Python['lists_isEmpty'] = function(block) { + // Is the string null or array empty? + var list = Blockly.Python.valueToCode(block, 'VALUE', + Blockly.Python.ORDER_NONE) || '[]'; + var code = 'not len(' + list + ')'; + return [code, Blockly.Python.ORDER_LOGICAL_NOT]; +}; + +Blockly.Python['lists_indexOf'] = function(block) { + // Find an item in the list. + var item = Blockly.Python.valueToCode(block, 'FIND', + Blockly.Python.ORDER_NONE) || '[]'; + var list = Blockly.Python.valueToCode(block, 'VALUE', + Blockly.Python.ORDER_NONE) || '\'\''; + if (block.workspace.options.oneBasedIndex) { + var errorIndex = ' 0'; + var firstIndexAdjustment = ' + 1'; + var lastIndexAdjustment = ''; + } else { + var errorIndex = ' -1'; + var firstIndexAdjustment = ''; + var lastIndexAdjustment = ' - 1'; + } + if (block.getFieldValue('END') == 'FIRST') { + var functionName = Blockly.Python.provideFunction_( + 'first_index', + ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + + '(my_list, elem):', + ' try: index = my_list.index(elem)' + firstIndexAdjustment, + ' except: index =' + errorIndex, + ' return index']); + var code = functionName + '(' + list + ', ' + item + ')'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; + } + var functionName = Blockly.Python.provideFunction_( + 'last_index', + ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(my_list, elem):', + ' try: index = len(my_list) - my_list[::-1].index(elem)' + + lastIndexAdjustment, + ' except: index =' + errorIndex, + ' return index']); + var code = functionName + '(' + list + ', ' + item + ')'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; +}; + +Blockly.Python['lists_getIndex'] = function(block) { + // 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 listOrder = (where == 'RANDOM') ? Blockly.Python.ORDER_NONE : + Blockly.Python.ORDER_MEMBER; + var list = Blockly.Python.valueToCode(block, 'VALUE', listOrder) || '[]'; + + switch (where) { + case 'FIRST': + if (mode == 'GET') { + var code = list + '[0]'; + return [code, Blockly.Python.ORDER_MEMBER]; + } else if (mode == 'GET_REMOVE') { + var code = list + '.pop(0)'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; + } else if (mode == 'REMOVE') { + return list + '.pop(0)\n'; + } + break; + case 'LAST': + if (mode == 'GET') { + var code = list + '[-1]'; + return [code, Blockly.Python.ORDER_MEMBER]; + } else if (mode == 'GET_REMOVE') { + var code = list + '.pop()'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; + } else if (mode == 'REMOVE') { + return list + '.pop()\n'; + } + break; + case 'FROM_START': + var at = Blockly.Python.getAdjustedInt(block, 'AT'); + if (mode == 'GET') { + var code = list + '[' + at + ']'; + return [code, Blockly.Python.ORDER_MEMBER]; + } else if (mode == 'GET_REMOVE') { + var code = list + '.pop(' + at + ')'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; + } else if (mode == 'REMOVE') { + return list + '.pop(' + at + ')\n'; + } + break; + case'FROM_END': + var at = Blockly.Python.getAdjustedInt(block, 'AT', 1, true); + if (mode == 'GET') { + var code = list + '[' + at + ']'; + return [code, Blockly.Python.ORDER_MEMBER]; + } else if (mode == 'GET_REMOVE') { + var code = list + '.pop(' + at + ')'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; + } else if (mode == 'REMOVE') { + return list + '.pop(' + at + ')\n'; + } + break; + case 'RANDOM': + Blockly.Python.definitions_['import_random'] = 'import random'; + if (mode == 'GET') { + code = 'random.choice(' + list + ')'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; + } else { + var functionName = Blockly.Python.provideFunction_( + 'lists_remove_random_item', + ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(myList):', + ' x = int(random.random() * len(myList))', + ' return myList.pop(x)']); + code = functionName + '(' + list + ')'; + if (mode == 'GET_REMOVE') { + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; + } else if (mode == 'REMOVE') { + return code + '\n'; + } + } + break; + } + throw Error('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 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.VARIABLE_CATEGORY_NAME); + var code = listVar + ' = ' + list + '\n'; + list = listVar; + return code; + } + + switch (where) { + case 'FIRST': + if (mode == 'SET') { + return list + '[0] = ' + value + '\n'; + } else if (mode == 'INSERT') { + return list + '.insert(0, ' + value + ')\n'; + } + break; + case 'LAST': + if (mode == 'SET') { + return list + '[-1] = ' + value + '\n'; + } else if (mode == 'INSERT') { + return list + '.append(' + value + ')\n'; + } + break; + case 'FROM_START': + var at = Blockly.Python.getAdjustedInt(block, 'AT'); + if (mode == 'SET') { + return list + '[' + at + '] = ' + value + '\n'; + } else if (mode == 'INSERT') { + return list + '.insert(' + at + ', ' + value + ')\n'; + } + break; + case 'FROM_END': + var at = Blockly.Python.getAdjustedInt(block, 'AT', 1, true); + if (mode == 'SET') { + return list + '[' + at + '] = ' + value + '\n'; + } else if (mode == 'INSERT') { + return list + '.insert(' + at + ', ' + value + ')\n'; + } + break; + case 'RANDOM': + Blockly.Python.definitions_['import_random'] = 'import random'; + var code = cacheList(); + var xVar = Blockly.Python.variableDB_.getDistinctName( + 'tmp_x', Blockly.VARIABLE_CATEGORY_NAME); + code += xVar + ' = int(random.random() * len(' + list + '))\n'; + if (mode == 'SET') { + code += list + '[' + xVar + '] = ' + value + '\n'; + return code; + } else if (mode == 'INSERT') { + code += list + '.insert(' + xVar + ', ' + value + ')\n'; + return code; + } + break; + } + throw Error('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'); + switch (where1) { + case 'FROM_START': + var at1 = Blockly.Python.getAdjustedInt(block, 'AT1'); + if (at1 == '0') { + at1 = ''; + } + break; + case 'FROM_END': + var at1 = Blockly.Python.getAdjustedInt(block, 'AT1', 1, true); + break; + case 'FIRST': + var at1 = ''; + break; + default: + throw Error('Unhandled option (lists_getSublist)'); + } + switch (where2) { + case 'FROM_START': + var at2 = Blockly.Python.getAdjustedInt(block, 'AT2', 1); + break; + case 'FROM_END': + var at2 = Blockly.Python.getAdjustedInt(block, 'AT2', 0, true); + // Ensure that if the result calculated is 0 that sub-sequence will + // include all elements as expected. + if (!Blockly.isNumber(String(at2))) { + Blockly.Python.definitions_['import_sys'] = 'import sys'; + at2 += ' or sys.maxsize'; + } else if (at2 == '0') { + at2 = ''; + } + break; + case 'LAST': + var at2 = ''; + break; + default: + throw Error('Unhandled option (lists_getSublist)'); + } + var code = list + '[' + at1 + ' : ' + at2 + ']'; + return [code, Blockly.Python.ORDER_MEMBER]; +}; + +Blockly.Python['lists_sort'] = function(block) { + // Block for sorting a list. + var list = (Blockly.Python.valueToCode(block, 'LIST', + Blockly.Python.ORDER_NONE) || '[]'); + var type = block.getFieldValue('TYPE'); + var reverse = block.getFieldValue('DIRECTION') === '1' ? 'False' : 'True'; + var sortFunctionName = Blockly.Python.provideFunction_('lists_sort', + ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + + '(my_list, type, reverse):', + ' def try_float(s):', + ' try:', + ' return float(s)', + ' except:', + ' return 0', + ' key_funcs = {', + ' "NUMERIC": try_float,', + ' "TEXT": str,', + ' "IGNORE_CASE": lambda s: str(s).lower()', + ' }', + ' key_func = key_funcs[type]', + ' list_cpy = list(my_list)', // Clone the list. + ' return sorted(list_cpy, key=key_func, reverse=reverse)' + ]); + + var code = sortFunctionName + + '(' + list + ', "' + type + '", ' + reverse + ')'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; +}; + +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 Error('Unknown mode: ' + mode); + } + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; +}; + +Blockly.Python['lists_reverse'] = function(block) { + // Block for reversing a list. + var list = Blockly.Python.valueToCode(block, 'LIST', + Blockly.Python.ORDER_NONE) || '[]'; + var code = 'list(reversed(' + list + '))'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; +}; diff --git a/js/generators/python/logic.js b/js/generators/python/logic.js new file mode 100644 index 0000000..bd29f3e --- /dev/null +++ b/js/generators/python/logic.js @@ -0,0 +1,138 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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 code = '', branchCode, conditionCode; + if (Blockly.Python.STATEMENT_PREFIX) { + // Automatic prefix insertion is switched off for this block. Add manually. + code += Blockly.Python.injectId(Blockly.Python.STATEMENT_PREFIX, block); + } + do { + conditionCode = Blockly.Python.valueToCode(block, 'IF' + n, + Blockly.Python.ORDER_NONE) || 'False'; + branchCode = Blockly.Python.statementToCode(block, 'DO' + n) || + Blockly.Python.PASS; + if (Blockly.Python.STATEMENT_SUFFIX) { + branchCode = Blockly.Python.prefixLines( + Blockly.Python.injectId(Blockly.Python.STATEMENT_SUFFIX, block), + Blockly.Python.INDENT) + branchCode; + } + code += (n == 0 ? 'if ' : 'elif ' ) + conditionCode + ':\n' + branchCode; + ++n; + } while (block.getInput('IF' + n)); + + if (block.getInput('ELSE') || Blockly.Python.STATEMENT_SUFFIX) { + branchCode = Blockly.Python.statementToCode(block, 'ELSE') || + Blockly.Python.PASS; + if (Blockly.Python.STATEMENT_SUFFIX) { + branchCode = Blockly.Python.prefixLines( + Blockly.Python.injectId(Blockly.Python.STATEMENT_SUFFIX, block), + Blockly.Python.INDENT) + branchCode; + } + code += 'else:\n' + branchCode; + } + return code; +}; + +Blockly.Python['controls_ifelse'] = Blockly.Python['controls_if']; + +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/js/generators/python/loops.js b/js/generators/python/loops.js new file mode 100644 index 0000000..71a7f30 --- /dev/null +++ b/js/generators/python/loops.js @@ -0,0 +1,224 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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) || Blockly.Python.PASS; + var loopVar = Blockly.Python.variableDB_.getDistinctName( + 'count', Blockly.VARIABLE_CATEGORY_NAME); + 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) || 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.VARIABLE_CATEGORY_NAME); + 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) || 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 = Number(argument0); + argument1 = Number(argument1); + increment = Math.abs(Number(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 = Number(arg); + } else if (arg.match(/^\w+$/)) { + // Variable. + arg = 'float(' + arg + ')'; + } else { + // It's complicated. + var varName = Blockly.Python.variableDB_.getDistinctName( + variable0 + suffix, Blockly.VARIABLE_CATEGORY_NAME); + 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.VARIABLE_CATEGORY_NAME); + var argument0 = Blockly.Python.valueToCode(block, 'LIST', + Blockly.Python.ORDER_RELATIONAL) || '[]'; + var branch = Blockly.Python.statementToCode(block, 'DO'); + branch = Blockly.Python.addLoopTrap(branch, block) || Blockly.Python.PASS; + var code = 'for ' + variable0 + ' in ' + argument0 + ':\n' + branch; + return code; +}; + +Blockly.Python['controls_flow_statements'] = function(block) { + // Flow statements: continue, break. + var xfix = ''; + if (Blockly.Python.STATEMENT_PREFIX) { + // Automatic prefix insertion is switched off for this block. Add manually. + xfix += Blockly.Python.injectId(Blockly.Python.STATEMENT_PREFIX, block); + } + if (Blockly.Python.STATEMENT_SUFFIX) { + // Inject any statement suffix here since the regular one at the end + // will not get executed if the break/continue is triggered. + xfix += Blockly.Python.injectId(Blockly.Python.STATEMENT_SUFFIX, block); + } + if (Blockly.Python.STATEMENT_PREFIX) { + var loop = Blockly.Constants.Loops + .CONTROL_FLOW_IN_LOOP_CHECK_MIXIN.getSurroundLoop(block); + if (loop && !loop.suppressPrefixSuffix) { + // Inject loop's statement prefix here since the regular one at the end + // of the loop will not get executed if 'continue' is triggered. + // In the case of 'break', a prefix is needed due to the loop's suffix. + xfix += Blockly.Python.injectId(Blockly.Python.STATEMENT_PREFIX, loop); + } + } + switch (block.getFieldValue('FLOW')) { + case 'BREAK': + return xfix + 'break\n'; + case 'CONTINUE': + return xfix + 'continue\n'; + } + throw Error('Unknown flow statement.'); +}; diff --git a/js/generators/python/math.js b/js/generators/python/math.js new file mode 100644 index 0000000..1a003c4 --- /dev/null +++ b/js/generators/python/math.js @@ -0,0 +1,396 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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 = Number(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. + 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 Error('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.VARIABLE_CATEGORY_NAME); + 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 Error('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]; +}; + +Blockly.Python['math_atan2'] = function(block) { + // Arctangent of point (X, Y) in degrees from -180 to 180. + Blockly.Python.definitions_['import_math'] = 'import math'; + var argument0 = Blockly.Python.valueToCode(block, 'X', + Blockly.Python.ORDER_NONE) || '0'; + var argument1 = Blockly.Python.valueToCode(block, 'Y', + Blockly.Python.ORDER_NONE) || '0'; + return ['math.atan2(' + argument1 + ', ' + argument0 + ') / math.pi * 180', + Blockly.Python.ORDER_MULTIPLICATIVE]; +}; diff --git a/js/generators/python/procedures.js b/js/generators/python/procedures.js new file mode 100644 index 0000000..d69fae6 --- /dev/null +++ b/js/generators/python/procedures.js @@ -0,0 +1,143 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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 not shadowed by + // a local parameter. + var globals = []; + var varName; + var workspace = block.workspace; + var variables = Blockly.Variables.allUsedVarModels(workspace) || []; + for (var i = 0, variable; variable = variables[i]; i++) { + varName = variable.name; + if (block.arguments_.indexOf(varName) == -1) { + globals.push(Blockly.Python.variableDB_.getName(varName, + Blockly.VARIABLE_CATEGORY_NAME)); + } + } + // Add developer variables. + var devVarList = Blockly.Variables.allDeveloperVariables(workspace); + for (var i = 0; i < devVarList.length; i++) { + globals.push(Blockly.Python.variableDB_.getName(devVarList[i], + Blockly.Names.DEVELOPER_VARIABLE_TYPE)); + } + + globals = globals.length ? + Blockly.Python.INDENT + 'global ' + globals.join(', ') + '\n' : ''; + var funcName = Blockly.Python.variableDB_.getName( + block.getFieldValue('NAME'), Blockly.PROCEDURE_CATEGORY_NAME); + var xfix1 = ''; + if (Blockly.Python.STATEMENT_PREFIX) { + xfix1 += Blockly.Python.injectId(Blockly.Python.STATEMENT_PREFIX, block); + } + if (Blockly.Python.STATEMENT_SUFFIX) { + xfix1 += Blockly.Python.injectId(Blockly.Python.STATEMENT_SUFFIX, block); + } + if (xfix1) { + xfix1 = Blockly.Python.prefixLines(xfix1, Blockly.Python.INDENT); + } + var loopTrap = ''; + if (Blockly.Python.INFINITE_LOOP_TRAP) { + loopTrap = Blockly.Python.prefixLines( + Blockly.Python.injectId(Blockly.Python.INFINITE_LOOP_TRAP, block), + Blockly.Python.INDENT); + } + var branch = Blockly.Python.statementToCode(block, 'STACK'); + var returnValue = Blockly.Python.valueToCode(block, 'RETURN', + Blockly.Python.ORDER_NONE) || ''; + var xfix2 = ''; + if (branch && returnValue) { + // After executing the function body, revisit this block for the return. + xfix2 = xfix1; + } + if (returnValue) { + returnValue = Blockly.Python.INDENT + 'return ' + returnValue + '\n'; + } else if (!branch) { + branch = Blockly.Python.PASS; + } + var args = []; + for (var i = 0; i < block.arguments_.length; i++) { + args[i] = Blockly.Python.variableDB_.getName(block.arguments_[i], + Blockly.VARIABLE_CATEGORY_NAME); + } + var code = 'def ' + funcName + '(' + args.join(', ') + '):\n' + + globals + xfix1 + loopTrap + branch + xfix2 + returnValue; + code = Blockly.Python.scrub_(block, code); + // Add % so as not to collide with helper functions in definitions list. + 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.PROCEDURE_CATEGORY_NAME); + var args = []; + for (var i = 0; i < block.arguments_.length; i++) { + args[i] = Blockly.Python.valueToCode(block, 'ARG' + i, + Blockly.Python.ORDER_NONE) || 'None'; + } + var code = funcName + '(' + args.join(', ') + ')'; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; +}; + +Blockly.Python['procedures_callnoreturn'] = function(block) { + // Call a procedure with no return value. + // Generated code is for a function call as a statement is the same as a + // function call as a value, with the addition of line ending. + var tuple = Blockly.Python['procedures_callreturn'](block); + return tuple[0] + '\n'; +}; + +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 (Blockly.Python.STATEMENT_SUFFIX) { + // Inject any statement suffix here since the regular one at the end + // will not get executed if the return is triggered. + code += Blockly.Python.prefixLines( + Blockly.Python.injectId(Blockly.Python.STATEMENT_SUFFIX, block), + Blockly.Python.INDENT); + } + if (block.hasReturnValue_) { + var value = Blockly.Python.valueToCode(block, 'VALUE', + Blockly.Python.ORDER_NONE) || 'None'; + code += Blockly.Python.INDENT + 'return ' + value + '\n'; + } else { + code += Blockly.Python.INDENT + 'return\n'; + } + return code; +}; diff --git a/js/generators/python/text.js b/js/generators/python/text.js new file mode 100644 index 0000000..94241ed --- /dev/null +++ b/js/generators/python/text.js @@ -0,0 +1,304 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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_multiline'] = function(block) { + // Text value. + var code = Blockly.Python.multiline_quote_(block.getFieldValue('TEXT')); + return [code, Blockly.Python.ORDER_ATOMIC]; +}; + +/** + * Enclose the provided value in 'str(...)' function. + * Leave string literals alone. + * @param {string} value Code evaluating to a value. + * @return {string} Code evaluating to a string. + * @private + */ +Blockly.Python.text.forceString_ = function(value) { + if (Blockly.Python.text.forceString_.strRegExp.test(value)) { + return value; + } + return 'str(' + value + ')'; +}; + +/** + * Regular expression to detect a single-quoted string literal. + */ +Blockly.Python.text.forceString_.strRegExp = /^\s*'([^']|\\')*'\s*$/; + +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? + switch (block.itemCount_) { + case 0: + return ['\'\'', Blockly.Python.ORDER_ATOMIC]; + break; + case 1: + var element = Blockly.Python.valueToCode(block, 'ADD0', + Blockly.Python.ORDER_NONE) || '\'\''; + var code = Blockly.Python.text.forceString_(element); + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; + break; + case 2: + var element0 = Blockly.Python.valueToCode(block, 'ADD0', + Blockly.Python.ORDER_NONE) || '\'\''; + var element1 = Blockly.Python.valueToCode(block, 'ADD1', + Blockly.Python.ORDER_NONE) || '\'\''; + var code = Blockly.Python.text.forceString_(element0) + ' + ' + + Blockly.Python.text.forceString_(element1); + return [code, Blockly.Python.ORDER_ADDITIVE]; + break; + default: + var elements = []; + for (var i = 0; i < block.itemCount_; i++) { + elements[i] = Blockly.Python.valueToCode(block, 'ADD' + i, + Blockly.Python.ORDER_NONE) || '\'\''; + } + var tempVar = Blockly.Python.variableDB_.getDistinctName('x', + Blockly.VARIABLE_CATEGORY_NAME); + var code = '\'\'.join([str(' + tempVar + ') for ' + tempVar + ' in [' + + elements.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.VARIABLE_CATEGORY_NAME); + var value = Blockly.Python.valueToCode(block, 'TEXT', + Blockly.Python.ORDER_NONE) || '\'\''; + return varName + ' = str(' + varName + ') + ' + + Blockly.Python.text.forceString_(value) + '\n'; +}; + +Blockly.Python['text_length'] = function(block) { + // Is the string null or array empty? + var text = Blockly.Python.valueToCode(block, 'VALUE', + Blockly.Python.ORDER_NONE) || '\'\''; + return ['len(' + text + ')', Blockly.Python.ORDER_FUNCTION_CALL]; +}; + +Blockly.Python['text_isEmpty'] = function(block) { + // Is the string null or array empty? + var text = Blockly.Python.valueToCode(block, 'VALUE', + Blockly.Python.ORDER_NONE) || '\'\''; + var code = 'not len(' + text + ')'; + 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 substring = Blockly.Python.valueToCode(block, 'FIND', + Blockly.Python.ORDER_NONE) || '\'\''; + var text = Blockly.Python.valueToCode(block, 'VALUE', + Blockly.Python.ORDER_MEMBER) || '\'\''; + var code = text + '.' + operator + '(' + substring + ')'; + if (block.workspace.options.oneBasedIndex) { + return [code + ' + 1', Blockly.Python.ORDER_ADDITIVE]; + } + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; +}; + +Blockly.Python['text_charAt'] = function(block) { + // Get letter at index. + // Note: Until January 2013 this block did not have the WHERE input. + var where = block.getFieldValue('WHERE') || 'FROM_START'; + var 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': + var at = Blockly.Python.getAdjustedInt(block, 'AT'); + var code = text + '[' + at + ']'; + return [code, Blockly.Python.ORDER_MEMBER]; + case 'FROM_END': + var at = Blockly.Python.getAdjustedInt(block, 'AT', 1, true); + var code = text + '[' + at + ']'; + return [code, Blockly.Python.ORDER_MEMBER]; + case 'RANDOM': + Blockly.Python.definitions_['import_random'] = 'import random'; + 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 Error('Unhandled option (text_charAt).'); +}; + +Blockly.Python['text_getSubstring'] = function(block) { + // Get substring. + var where1 = block.getFieldValue('WHERE1'); + var where2 = block.getFieldValue('WHERE2'); + var text = Blockly.Python.valueToCode(block, 'STRING', + Blockly.Python.ORDER_MEMBER) || '\'\''; + switch (where1) { + case 'FROM_START': + var at1 = Blockly.Python.getAdjustedInt(block, 'AT1'); + if (at1 == '0') { + at1 = ''; + } + break; + case 'FROM_END': + var at1 = Blockly.Python.getAdjustedInt(block, 'AT1', 1, true); + break; + case 'FIRST': + var at1 = ''; + break; + default: + throw Error('Unhandled option (text_getSubstring)'); + } + switch (where2) { + case 'FROM_START': + var at2 = Blockly.Python.getAdjustedInt(block, 'AT2', 1); + break; + case 'FROM_END': + var at2 = Blockly.Python.getAdjustedInt(block, 'AT2', 0, true); + // Ensure that if the result calculated is 0 that sub-sequence will + // include all elements as expected. + if (!Blockly.isNumber(String(at2))) { + Blockly.Python.definitions_['import_sys'] = 'import sys'; + at2 += ' or sys.maxsize'; + } else if (at2 == '0') { + at2 = ''; + } + break; + case 'LAST': + var at2 = ''; + break; + default: + throw Error('Unhandled option (text_getSubstring)'); + } + 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 text = Blockly.Python.valueToCode(block, 'TEXT', + Blockly.Python.ORDER_MEMBER) || '\'\''; + var code = text + operator; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; +}; + +Blockly.Python['text_trim'] = function(block) { + // Trim spaces. + var OPERATORS = { + 'LEFT': '.lstrip()', + 'RIGHT': '.rstrip()', + 'BOTH': '.strip()' + }; + var operator = OPERATORS[block.getFieldValue('MODE')]; + var text = Blockly.Python.valueToCode(block, 'TEXT', + Blockly.Python.ORDER_MEMBER) || '\'\''; + var code = text + operator; + return [code, Blockly.Python.ORDER_FUNCTION_CALL]; +}; + +Blockly.Python['text_print'] = function(block) { + // Print statement. + var msg = Blockly.Python.valueToCode(block, 'TEXT', + Blockly.Python.ORDER_NONE) || '\'\''; + return 'print(' + msg + ')\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']; + +Blockly.Python['text_count'] = function(block) { + var text = Blockly.Python.valueToCode(block, 'TEXT', + Blockly.Python.ORDER_MEMBER) || '\'\''; + var sub = Blockly.Python.valueToCode(block, 'SUB', + Blockly.Python.ORDER_NONE) || '\'\''; + var code = text + '.count(' + sub + ')'; + return [code, Blockly.Python.ORDER_MEMBER]; +}; + +Blockly.Python['text_replace'] = function(block) { + var text = Blockly.Python.valueToCode(block, 'TEXT', + Blockly.Python.ORDER_MEMBER) || '\'\''; + var from = Blockly.Python.valueToCode(block, 'FROM', + Blockly.Python.ORDER_NONE) || '\'\''; + var to = Blockly.Python.valueToCode(block, 'TO', + Blockly.Python.ORDER_NONE) || '\'\''; + var code = text + '.replace(' + from + ', ' + to + ')'; + return [code, Blockly.Python.ORDER_MEMBER]; +}; + +Blockly.Python['text_reverse'] = function(block) { + var text = Blockly.Python.valueToCode(block, 'TEXT', + Blockly.Python.ORDER_MEMBER) || '\'\''; + var code = text + '[::-1]'; + return [code, Blockly.Python.ORDER_MEMBER]; +}; diff --git a/js/generators/python/variables.js b/js/generators/python/variables.js new file mode 100644 index 0000000..7567b29 --- /dev/null +++ b/js/generators/python/variables.js @@ -0,0 +1,43 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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.VARIABLE_CATEGORY_NAME); + 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.VARIABLE_CATEGORY_NAME); + return varName + ' = ' + argument0 + '\n'; +}; diff --git a/js/generators/python/variables_dynamic.js b/js/generators/python/variables_dynamic.js new file mode 100644 index 0000000..6a3376d --- /dev/null +++ b/js/generators/python/variables_dynamic.js @@ -0,0 +1,32 @@ +/** + * @license + * Copyright 2018 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Python for dynamic variable blocks. + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +goog.provide('Blockly.Python.variablesDynamic'); + +goog.require('Blockly.Python'); +goog.require('Blockly.Python.variables'); + + +// Python is dynamically typed. +Blockly.Python['variables_get_dynamic'] = Blockly.Python['variables_get']; +Blockly.Python['variables_set_dynamic'] = Blockly.Python['variables_set']; diff --git a/js/gulpfile.js b/js/gulpfile.js new file mode 100644 index 0000000..ef9fb41 --- /dev/null +++ b/js/gulpfile.js @@ -0,0 +1,1021 @@ +/** + * @license + * Copyright 2018 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Gulp script to build Blockly for Node & NPM. + * Run this script by calling "npm install" in this directory. + */ + +var gulp = require('gulp'); +gulp.shell = require('gulp-shell'); +gulp.concat = require('gulp-concat'); +gulp.replace = require('gulp-replace'); +gulp.rename = require('gulp-rename'); +gulp.insert = require('gulp-insert'); +gulp.umd = require('gulp-umd'); + +var path = require('path'); +var fs = require('fs'); +var rimraf = require('rimraf'); +var execSync = require('child_process').execSync; +var through2 = require('through2'); + +var closureCompiler = require('google-closure-compiler').gulp(); +var closureDeps = require('google-closure-deps'); +var packageJson = require('./package.json'); +var argv = require('yargs').argv; + +const upstream_url = "https://github.com/google/blockly.git"; + +//////////////////////////////////////////////////////////// +// Build // +//////////////////////////////////////////////////////////// + +const licenseRegex = `\\/\\*\\* + \\* @license + \\* (Copyright \\d+ (Google LLC|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. + \\*\\/`; + +/** + * Helper method for stripping the Google's and MIT's Apache Licenses. + */ +function stripApacheLicense() { + // Strip out Google's and MIT's Apache licences. + // Closure Compiler preserves dozens of Apache licences in the Blockly code. + // Remove these if they belong to Google or MIT. + // MIT's permission to do this is logged in Blockly issue #2412. + return gulp.replace(new RegExp(licenseRegex, "g"), ''); +} + +/** + * Helper method for prepending the auto-generated header text. + */ +function prependHeader() { + return gulp.insert.prepend(`// Do not edit this file; automatically generated by gulp.\n`); +} + +/** + * Closure compiler warning groups used to treat warnings as errors. + * For a full list of closure compiler groups, consult: + * https://github.com/google/closure-compiler/blob/master/src/com/google/javascript/jscomp/DiagnosticGroups.java#L113 + */ +var JSCOMP_ERROR = [ + 'accessControls', + 'checkPrototypalTypes', + 'checkRegExp', + 'checkTypes', + 'checkVars', + 'conformanceViolations', + 'const', + 'constantProperty', + 'deprecated', + 'deprecatedAnnotations', + 'duplicateMessage', + 'es5Strict', + 'externsValidation', + 'functionParams', + 'globalThis', + 'invalidCasts', + 'misplacedTypeAnnotation', + 'missingGetCssName', + // 'missingOverride', + 'missingPolyfill', + 'missingProperties', + 'missingProvide', + 'missingRequire', + 'missingReturn', + // 'missingSourcesWarnings', + 'moduleLoad', + 'msgDescriptions', + 'nonStandardJsDocs', + // 'polymer', + // 'reportUnknownTypes', + // 'strictCheckTypes', + // 'strictMissingProperties', + 'strictModuleDepCheck', + // 'strictPrimitiveOperators', + 'suspiciousCode', + 'typeInvalidation', + 'undefinedNames', + 'undefinedVars', + 'underscore', + 'unknownDefines', + 'unusedLocalVariables', + // 'unusedPrivateMembers', + 'useOfGoogBase', + 'uselessCode', + 'untranspilableFeatures', + 'visibility' +]; + +/** + * Helper method for calling the Closure compiler. + * @param {*} compilerOptions + * @param {boolean=} opt_verbose Optional option for verbose logging + * @param {boolean=} opt_warnings_as_error Optional option for treating warnings + * as errors. + */ +function compile(compilerOptions, opt_verbose, opt_warnings_as_error) { + compilerOptions = compilerOptions || {}; + compilerOptions.compilation_level = 'SIMPLE_OPTIMIZATIONS'; + compilerOptions.warning_level = opt_verbose ? 'VERBOSE' : 'DEFAULT'; + compilerOptions.language_in = + compilerOptions.language_in || 'ECMASCRIPT5_STRICT'; + compilerOptions.language_out = 'ECMASCRIPT5_STRICT'; + compilerOptions.rewrite_polyfills = false; + compilerOptions.hide_warnings_for = 'node_modules'; + if (opt_warnings_as_error) { + compilerOptions.jscomp_error = JSCOMP_ERROR; + } + + const platform = ['native', 'java', 'javascript']; + + return closureCompiler(compilerOptions, { platform }); +} + +/** + * Helper method for possibly adding the closure library into a sources array. + * @param {Array.} srcs + */ +function maybeAddClosureLibrary(srcs) { + if (argv.closureLibrary) { + // If you require the google closure library, you can include it in your + // build by adding the --closure-library flag. + // You will also need to include the "google-closure-library" in your list + // of devDependencies. + console.log('Including the google-closure-library in your build.'); + if (!fs.existsSync('./node_modules/google-closure-library')) { + throw Error('You must add the google-closure-library to your ' + + 'devDependencies in package.json, and run `npm install`.'); + } + srcs.push('./node_modules/google-closure-library/closure/goog/**/**/*.js'); + } + return srcs; +} + +/** + * This task builds Blockly's core files. + * blockly_compressed.js + */ +gulp.task('build-compressed', function (cb) { + const defines = 'Blockly.VERSION="' + packageJson.version + '"'; + return gulp.src(maybeAddClosureLibrary(['core/**/**/*.js']), {base: './'}) + // Directories in Blockly are used to group similar files together + // but are not used to limit access with @package, instead the + // method means something is internal to Blockly and not a public + // API. + // Flatten all files so they're in the same directory, but ensure that + // files with the same name don't conflict. + .pipe(gulp.rename(function (p) { + var dirname = p.dirname.replace(new RegExp(path.sep, "g"), "-"); + p.dirname = ""; + p.basename = dirname + "-" + p.basename; + })) + .pipe(stripApacheLicense()) + .pipe(compile({ + dependency_mode: 'PRUNE', + entry_point: './core-requires.js', + js_output_file: 'blockly_compressed.js', + externs: ['./externs/svg-externs.js', './externs/goog-externs.js'], + define: defines, + language_in: + argv.closureLibrary ? 'ECMASCRIPT_2015' : 'ECMASCRIPT5_STRICT' + }, argv.verbose, argv.strict)) + .pipe(prependHeader()) + .pipe(gulp.dest('./')); +}); + +/** + * This task builds the Blockly's built in blocks. + * blocks_compressed.js + */ +gulp.task('build-blocks', function () { + // Add provides used throughout blocks/ in order to be compatible with the + // compiler. Anything added to this list must be removed from the compiled + // result using the remove regex steps below. + const provides = ` +goog.provide('Blockly'); +goog.provide('Blockly.Blocks'); +goog.provide('Blockly.Comment'); +goog.provide('Blockly.FieldCheckbox'); +goog.provide('Blockly.FieldColour'); +goog.provide('Blockly.FieldDropdown'); +goog.provide('Blockly.FieldImage'); +goog.provide('Blockly.FieldLabel'); +goog.provide('Blockly.FieldMultilineInput'); +goog.provide('Blockly.FieldNumber'); +goog.provide('Blockly.FieldTextInput'); +goog.provide('Blockly.FieldVariable'); +goog.provide('Blockly.Mutator'); +goog.provide('Blockly.Warning');`; + return gulp.src(maybeAddClosureLibrary(['blocks/*.js']), {base: './'}) + // Add Blockly.Blocks to be compatible with the compiler. + .pipe(gulp.replace(`goog.provide('Blockly.Constants.Colour');`, + `${provides}goog.provide('Blockly.Constants.Colour');`)) + .pipe(stripApacheLicense()) + .pipe(compile({ + dependency_mode: 'NONE', + externs: ['./externs/goog-externs.js'], + js_output_file: 'blocks_compressed.js' + }, argv.verbose, argv.strict)) + .pipe(gulp.replace('\'use strict\';', '\'use strict\';\n\n\n')) + // Remove Blockly.Blocks to be compatible with Blockly. + .pipe(gulp.replace(/var Blockly=\{[^;]*\};\n?/, '')) + // Remove Blockly Fields to be compatible with Blockly. + .pipe(gulp.replace(/Blockly\.Field[^=\(]+=\{[^;]*\};/g, '')) + // Remove Blockly Warning, Comment & Mutator to be compatible with Blockly. + .pipe(gulp.replace(/Blockly\.(Comment|Warning|Mutator)=\{[^;]*\};/g, '')) + .pipe(prependHeader()) + .pipe(gulp.dest('./')); +}); + +/** + * A helper method for building a Blockly code generator. + * @param {string} language Generator language. + * @param {string} namespace Language namespace. + */ +function buildGenerator(language, namespace) { + var provides = ` +goog.provide('Blockly.Generator'); +goog.provide('Blockly.utils.global'); +goog.provide('Blockly.utils.string');`; + return gulp.src([`generators/${language}.js`, `generators/${language}/*.js`], {base: './'}) + .pipe(stripApacheLicense()) + // Add Blockly.Generator and Blockly.utils.string to be compatible with the compiler. + .pipe(gulp.replace(`goog.provide('Blockly.${namespace}');`, + `${provides}goog.provide('Blockly.${namespace}');`)) + .pipe(compile({ + dependency_mode: 'NONE', + externs: ['./externs/goog-externs.js'], + js_output_file: `${language}_compressed.js` + }, argv.verbose, argv.strict)) + .pipe(gulp.replace('\'use strict\';', '\'use strict\';\n\n\n')) + // Remove Blockly.Generator and Blockly.utils.string to be compatible with Blockly. + .pipe(gulp.replace(/var Blockly=\{[^;]*\};\s*Blockly.utils.global={};\s*Blockly.utils.string={};\n?/, '')) + .pipe(prependHeader()) + .pipe(gulp.dest('./')); +}; + +/** + * This task builds the javascript generator. + * javascript_compressed.js + */ +gulp.task('build-javascript', function() { + return buildGenerator('javascript', 'JavaScript'); +}); + +/** + * This task builds the python generator. + * python_compressed.js + */ +gulp.task('build-python', function() { + return buildGenerator('python', 'Python'); +}); + +/** + * This task builds the php generator. + * php_compressed.js + */ +gulp.task('build-php', function() { + return buildGenerator('php', 'PHP'); +}); + +/** + * This task builds the lua generator. + * lua_compressed.js + */ +gulp.task('build-lua', function() { + return buildGenerator('lua', 'Lua'); +}); + +/** + * This task builds the dart generator: + * dart_compressed.js + */ +gulp.task('build-dart', function() { + return buildGenerator('dart', 'Dart'); +}); + +/** + * This tasks builds all the generators: + * javascript_compressed.js + * python_compressed.js + * php_compressed.js + * lua_compressed.js + * dart_compressed.js + */ +gulp.task('build-generators', gulp.parallel( + 'build-javascript', + 'build-python', + 'build-php', + 'build-lua', + 'build-dart' +)); + +/** + * This task builds Blockly's uncompressed file. + * blockly_uncompressed.js + */ +gulp.task('build-uncompressed', function() { + const closurePath = argv.closureLibrary ? + 'node_modules/google-closure-library/closure/goog' : + 'closure/goog'; + const header = `// Do not edit this file; automatically generated by gulp. +'use strict'; + +this.IS_NODE_JS = !!(typeof module !== 'undefined' && module.exports); + +this.BLOCKLY_DIR = (function(root) { + if (!root.IS_NODE_JS) { + // Find name of current directory. + var scripts = document.getElementsByTagName('script'); + var re = new RegExp('(.+)[\\\/]blockly_(.*)uncompressed\\\.js$'); + for (var i = 0, script; script = scripts[i]; i++) { + var match = re.exec(script.src); + if (match) { + return match[1]; + } + } + alert('Could not detect Blockly\\'s directory name.'); + } + return ''; +})(this); + +this.BLOCKLY_BOOT = function(root) { + // Execute after Closure has loaded. +`; + const footer = ` +delete root.BLOCKLY_DIR; +delete root.BLOCKLY_BOOT; +delete root.IS_NODE_JS; +}; + +if (this.IS_NODE_JS) { + this.BLOCKLY_BOOT(this); + module.exports = Blockly; +} else { + document.write(''); + document.write(''); +} +`; + +let deps = []; +return gulp.src(maybeAddClosureLibrary(['core/**/**/*.js'])) + .pipe(through2.obj((file, _enc, cb) => { + const result = closureDeps.parser.parseFile(file.path); + for (const dep of result.dependencies) { + deps.push(dep); + } + cb(null); + })) + .on('end', () => { + // Update the path to closure for any files that we don't know the full path + // of (parsed from a goog.addDependency call). + for (const dep of deps) { + dep.setClosurePath(closurePath); + } + + const addDependency = closureDeps.depFile.getDepFileText(closurePath, deps); + + const requires = `goog.addDependency("base.js", [], []); + +// Load Blockly. +goog.require('Blockly.requires') +`; + fs.writeFileSync('blockly_uncompressed.js', + header + + addDependency + + requires + + footer); + }); +}); + +/** + * This task builds Blockly's lang files. + * msg/*.js + */ +gulp.task('build-langfiles', function(done) { + // Run js_to_json.py + const jsToJsonCmd = `python ./i18n/js_to_json.py \ +--input_file ${path.join('msg', 'messages.js')} \ +--output_dir ${path.join('msg', 'json')} \ +--quiet`; + execSync(jsToJsonCmd, { stdio: 'inherit' }); + + // Run create_messages.py + let json_files = fs.readdirSync(path.join('msg', 'json')); + json_files = json_files.filter(file => file.endsWith('json') && + !(new RegExp(/(keys|synonyms|qqq|constants)\.json$/).test(file))); + json_files = json_files.map(file => path.join('msg', 'json', file)); + const createMessagesCmd = `python ./i18n/create_messages.py \ + --source_lang_file ${path.join('msg', 'json', 'en.json')} \ + --source_synonym_file ${path.join('msg', 'json', 'synonyms.json')} \ + --source_constants_file ${path.join('msg', 'json', 'constants.json')} \ + --key_file ${path.join('msg', 'json', 'keys.json')} \ + --output_dir ${path.join('msg', 'js')} \ + --quiet ${json_files.join(' ')}`; + execSync(createMessagesCmd, { stdio: 'inherit' }); + + done(); +}); + +/** + * This tasks builds Blockly's core files: + * blockly_compressed.js + * blocks_compressed.js + * blockly_uncompressed.js + */ +gulp.task('build-core', gulp.parallel( + 'build-compressed', + 'build-blocks', + 'build-uncompressed' +)); + +/** + * This task builds all of Blockly: + * blockly_compressed.js + * blocks_compressed.js + * javascript_compressed.js + * python_compressed.js + * php_compressed.js + * lua_compressed.js + * dart_compressed.js + * blockly_uncompressed.js + * msg/json/*.js + */ +gulp.task('build', gulp.parallel( + 'build-core', + 'build-generators', + 'build-langfiles' +)); + +//////////////////////////////////////////////////////////// +// Typings // +//////////////////////////////////////////////////////////// + +// Generates the TypeScript definition file (d.ts) for Blockly. +// As well as generating the typings of each of the files under core/ and msg/, +// the script also pulls in a number of part files from typings/parts. +// This includes the header (incl License), additional useful interfaces +// including Blockly Options and Google Closure typings. +gulp.task('typings', function (cb) { + const tmpDir = './typings/tmp'; + const blocklySrcs = [ + "core/", + "core/components", + "core/components/tree", + "core/components/menu", + "core/keyboard_nav", + "core/renderers/common", + "core/renderers/measurables", + "core/theme", + "core/utils", + "msg/" + ]; + // Clean directory if exists. + if (fs.existsSync(tmpDir)) { + rimraf.sync(tmpDir); + } + fs.mkdirSync(tmpDir); + + // Find all files that will be included in the typings file. + let files = []; + blocklySrcs.forEach((src) => { + files = files.concat(fs.readdirSync(src) + .filter(fn => fn.endsWith('.js')) + .map(fn => path.join(src, fn))); + }); + + // Generate typings file for each file. + files.forEach((file) => { + const typescriptFileName = `${path.join(tmpDir, file)}.d.ts`; + if (file.indexOf('core/msg.js') > -1) { + return; + } + const cmd = `node ./node_modules/typescript-closure-tools/definition-generator/src/main.js ${file} ${typescriptFileName}`; + console.log(`Generating typings for ${file}`); + execSync(cmd, { stdio: 'inherit' }); + }); + + const srcs = [ + 'typings/parts/blockly-header.d.ts', + 'typings/parts/blockly-interfaces.d.ts', + `${tmpDir}/core/**`, + `${tmpDir}/core/components/**`, + `${tmpDir}/core/components/tree/**`, + `${tmpDir}/core/components/menu/**`, + `${tmpDir}/core/keyboard_nav/**`, + `${tmpDir}/core/renderers/common/**`, + `${tmpDir}/core/renderers/measurables/**`, + `${tmpDir}/core/utils/**`, + `${tmpDir}/core/theme/**`, + `${tmpDir}/msg/**` + ]; + return gulp.src(srcs) + .pipe(gulp.concat('blockly.d.ts')) + .pipe(gulp.dest('typings')) + .on('end', function () { + // Clean up tmp directory. + if (fs.existsSync(tmpDir)) { + rimraf.sync(tmpDir); + } + }); +}); + +//////////////////////////////////////////////////////////// +// NPM packaging tasks // +//////////////////////////////////////////////////////////// + +// The destination path where all the NPM distribution files will go. +const packageDistribution = './dist'; + +/** + * A helper method for wrapping a file into a Universal Module Definition. + * @param {string} namespace The export namespace. + * @param {Array} dependencies An array of dependencies to inject. + */ +function packageUMD(namespace, dependencies) { + return gulp.umd({ + dependencies: function () { return dependencies; }, + namespace: function () { return namespace; }, + exports: function () { return namespace; }, + template: path.join(__dirname, 'package/templates/umd.template') + }); +}; + +/** + * A helper method for wrapping a file into a CommonJS module for Node.js. + * @param {string} namespace The export namespace. + * @param {Array} dependencies An array of dependencies to inject. + */ +function packageCommonJS(namespace, dependencies) { + return gulp.umd({ + dependencies: function () { return dependencies; }, + namespace: function () { return namespace; }, + exports: function () { return namespace; }, + template: path.join(__dirname, 'package/templates/node.template') + }); +}; + +/** + * This task wraps blockly_compressed.js into a UMD module. + * @example import 'blockly/blockly'; + */ +gulp.task('package-blockly', function() { + return gulp.src('blockly_compressed.js') + .pipe(packageUMD('Blockly', [])) + .pipe(gulp.rename('blockly.js')) + .pipe(gulp.dest(packageDistribution)); +}); + +/** + * This task wraps blocks_compressed.js into a CommonJS module for Node.js. + * This is an equivelant task to package-blockly but for Node.js. + * @example import 'blockly/blockly-node'; + */ +gulp.task('package-blockly-node', function() { + // Override textToDomDocument, providing a Node.js alternative to DOMParser. + return gulp.src('blockly_compressed.js') + .pipe(gulp.insert.append(` + if (typeof DOMParser !== 'function') { + var DOMParser = require("jsdom/lib/jsdom/living").DOMParser; + var XMLSerializer = require("jsdom/lib/jsdom/living").XMLSerializer; + var doc = Blockly.utils.xml.textToDomDocument( + ''); + Blockly.utils.xml.document = function() { + return doc; + }; + }`)) + .pipe(packageCommonJS('Blockly', [])) + .pipe(gulp.rename('blockly-node.js')) + .pipe(gulp.dest(packageDistribution)); +}) + +/** + * This task wraps blocks_compressed.js into a UMD module. + * @example import 'blockly/blocks'; + */ +gulp.task('package-blocks', function() { + return gulp.src('blocks_compressed.js') + .pipe(gulp.insert.prepend(` + Blockly.Blocks={};`)) + .pipe(packageUMD('Blockly.Blocks', [{ + name: 'Blockly', + amd: './core', + cjs: './core', + }])) + .pipe(gulp.rename('blocks.js')) + .pipe(gulp.dest(packageDistribution)); +}); + +/** + * This task wraps package/index.js into a UMD module. + * We implicitly require the Node entry point in CommonJS environments, + * and the Browser entry point for AMD environments. + * @example import * as Blockly from 'blockly'; + */ +gulp.task('package-index', function() { + return gulp.src('package/index.js') + .pipe(packageUMD('Blockly', [{ + name: 'Blockly', + amd: './browser', + cjs: './node', + }])) + .pipe(gulp.rename('index.js')) + .pipe(gulp.dest(packageDistribution)); +}); + +/** + * This task wraps package/browser/index.js into a UMD module. + * By default, the module includes Blockly core and built-in blocks, + * as well as the JavaScript code generator and the English block + * localization files. + * This module is configured (in package.json) to replaces the module + * built by package-node in browser environments. + * @example import * as Blockly from 'blockly/browser'; + */ +gulp.task('package-browser', function() { + return gulp.src('package/browser/index.js') + .pipe(packageUMD('Blockly', [{ + name: 'Blockly', + amd: './core-browser', + cjs: './core-browser', + },{ + name: 'En', + amd: './msg/en', + cjs: './msg/en', + },{ + name: 'BlocklyBlocks', + amd: './blocks', + cjs: './blocks', + },{ + name: 'BlocklyJS', + amd: './javascript', + cjs: './javascript', + }])) + .pipe(gulp.rename('browser.js')) + .pipe(gulp.dest(packageDistribution)); +}); + +/** + * This task wraps package/browser/core.js into a UMD module. + * By default, the module includes the Blockly core package and a + * helper method to set the locale. + * This module is configured (in package.json) to replaces the module + * built by package-node-core in browser environments. + * @example import * as Blockly from 'blockly/core'; + */ +gulp.task('package-core', function() { + return gulp.src('package/browser/core.js') + .pipe(packageUMD('Blockly', [{ + name: 'Blockly', + amd: './blockly', + cjs: './blockly', + }])) + .pipe(gulp.rename('core-browser.js')) + .pipe(gulp.dest(packageDistribution)); +}); + +/** + * This task wraps package/node/index.js into a CommonJS module for Node.js. + * By default, the module includes Blockly core and built-in blocks, + * as well as all the code generators and the English block localization files. + * This module is configured (in package.json) to be replaced by the module + * built by package-browser in browser environments. + * @example import * as Blockly from 'blockly/node'; + */ +gulp.task('package-node', function() { + return gulp.src('package/node/index.js') + .pipe(packageCommonJS('Blockly', [{ + name: 'Blockly', + cjs: './core', + },{ + name: 'En', + cjs: './msg/en', + },{ + name: 'BlocklyBlocks', + cjs: './blocks', + },{ + name: 'BlocklyJS', + cjs: './javascript', + },{ + name: 'BlocklyPython', + cjs: './python', + },{ + name: 'BlocklyPHP', + cjs: './php', + },{ + name: 'BlocklyLua', + cjs: './lua', + }, { + name: 'BlocklyDart', + cjs: './dart', + }])) + .pipe(gulp.rename('node.js')) + .pipe(gulp.dest(packageDistribution)); +}); + +/** + * This task wraps package/node/core.js into a CommonJS module for Node.js. + * By default, the module includes the Blockly core package for Node.js + * and a helper method to set the locale. + * This module is configured (in package.json) to be replaced by the module + * built by package-core in browser environments. + * @example import * as Blockly from 'blockly/core'; + */ +gulp.task('package-node-core', function() { + return gulp.src('package/node/core.js') + .pipe(packageCommonJS('Blockly', [{ + name: 'Blockly', + amd: './blockly-node', + cjs: './blockly-node', + }])) + .pipe(gulp.rename('core.js')) + .pipe(gulp.dest(packageDistribution)); +}); + +/** + * A helper method for packaging a Blockly code generator into a UMD module. + * @param {string} file Source file name. + * @param {string} rename Destination file name. + * @param {string} generator Generator export namespace. + */ +function packageGenerator(file, rename, generator) { + return gulp.src(file) + .pipe(packageUMD(generator, [{ + name: 'Blockly', + amd: './core', + cjs: './core', + }])) + .pipe(gulp.rename(rename)) + .pipe(gulp.dest(packageDistribution)); +}; + +/** + * This task wraps javascript_compressed.js into a UMD module. + * @example import 'blockly/javascript'; + */ +gulp.task('package-javascript', function() { + return packageGenerator('javascript_compressed.js', 'javascript.js', 'Blockly.JavaScript'); +}); + +/** + * This task wraps python_compressed.js into a UMD module. + * @example import 'blockly/python'; + */ +gulp.task('package-python', function() { + return packageGenerator('python_compressed.js', 'python.js', 'Blockly.Python'); +}); + +/** + * This task wraps lua_compressed.js into a UMD module. + * @example import 'blockly/lua'; + */ +gulp.task('package-lua', function() { + return packageGenerator('lua_compressed.js', 'lua.js', 'Blockly.Lua'); +}); + +/** + * This task wraps dart_compressed.js into a UMD module. + * @example import 'blockly/dart'; + */ +gulp.task('package-dart', function() { + return packageGenerator('dart_compressed.js', 'dart.js', 'Blockly.Dart'); +}); + +/** + * This task wraps php_compressed.js into a UMD module. + * @example import 'blockly/php'; + */ +gulp.task('package-php', function() { + return packageGenerator('php_compressed.js', 'php.js', 'Blockly.PHP'); +}); + +/** + * This task wraps each of the msg/js/* files into a UMD module. + * @example import * as En from 'blockly/msg/en'; + */ +gulp.task('package-locales', function() { + // Remove references to goog.provide and goog.require. + return gulp.src('msg/js/*.js') + .pipe(gulp.replace(/goog\.[^\n]+/g, '')) + .pipe(gulp.insert.prepend(` + var Blockly = {};Blockly.Msg={};`)) + .pipe(packageUMD('Blockly.Msg', [{ + name: 'Blockly', + amd: '../core', + cjs: '../core', + }])) + .pipe(gulp.dest(`${packageDistribution}/msg`)); +}); + +/** + * This task creates a UMD bundle of Blockly which includes the Blockly + * core files, the built-in blocks, the JavaScript code generator and the + * English localization files. + * @example + */ +gulp.task('package-umd-bundle', function() { + var srcs = [ + 'blockly_compressed.js', + 'msg/js/en.js', + 'blocks_compressed.js', + 'javascript_compressed.js' + ]; + return gulp.src(srcs) + .pipe(gulp.concat('blockly.min.js')) + .pipe(packageUMD('Blockly', [])) + .pipe(gulp.dest(`${packageDistribution}`)) +}); + +/** + * This task copies all the media/* files into the distribution directory. + */ +gulp.task('package-media', function() { + return gulp.src('./media/*') + .pipe(gulp.dest(`${packageDistribution}/media`)); +}); + +/** + * This task copies the package.json file into the distribution directory. + */ +gulp.task('package-json', function() { + return gulp.src('./package.json') + .pipe(gulp.dest(`${packageDistribution}`)) +}); + +/** + * This task copies the package/README.md file into the distribution directory. + * This file is what developers will see at https://www.npmjs.com/package/blockly. + */ +gulp.task('package-readme', function() { + return gulp.src('./package/README.md') + .pipe(gulp.dest(`${packageDistribution}`)) +}); + +/** + * This task copies the typings/blockly.d.ts TypeScript definition file into the + * distribution directory. + * The bundled declaration file is referenced in package.json in the types property. + */ +gulp.task('package-dts', function() { + return gulp.src('./typings/blockly.d.ts') + .pipe(gulp.dest(`${packageDistribution}`)) +}); + +/** + * This task prepares the NPM distribution files under the /dist directory. + */ +gulp.task('package', gulp.parallel( + 'package-index', + 'package-browser', + 'package-node', + 'package-core', + 'package-node-core', + 'package-blockly', + 'package-blockly-node', + 'package-blocks', + 'package-javascript', + 'package-python', + 'package-lua', + 'package-dart', + 'package-php', + 'package-locales', + 'package-media', + 'package-umd-bundle', + 'package-json', + 'package-readme', + 'package-dts' + )); + +// The default task builds Blockly. +gulp.task('default', gulp.series(['build'])); + + +// Stash current state, check out the named branch, and sync with +// google/blockly. +function syncBranch(branchName) { + return function(done) { + execSync('git stash save -m "Stash for sync"', { stdio: 'inherit' }); + execSync('git checkout ' + branchName, { stdio: 'inherit' }); + execSync('git pull ' + upstream_url + ' ' + branchName, + { stdio: 'inherit' }); + execSync('git push origin ' + branchName, { stdio: 'inherit' }); + done(); + } +} + +// Stash current state, check out develop, and sync with google/blockly. +gulp.task('git-sync-develop', syncBranch('develop')); + +// Stash current state, check out master, and sync with google/blockly. +gulp.task('git-sync-master', syncBranch('master')); + +// Helper function: get a name for a rebuild branch. Format: rebuild_mm_dd_yyyy. +function getRebuildBranchName() { + var date = new Date(); + var mm = date.getMonth() + 1; // Month, 0-11 + var dd = date.getDate(); // Day of the month, 1-31 + var yyyy = date.getFullYear(); + return 'rebuild_' + mm + '_' + dd + '_' + yyyy; +}; + +// Helper function: get a name for a rebuild branch. Format: rebuild_yyyy_mm. +function getRCBranchName() { + var date = new Date(); + var mm = date.getMonth() + 1; // Month, 0-11 + var yyyy = date.getFullYear(); + return 'rc_' + yyyy + '_' + mm; +}; + +// Recompile and push to origin. +gulp.task('git-recompile', gulp.series([ + 'git-sync-develop', + function(done) { + var branchName = getRebuildBranchName(); + console.log('make-rebuild-branch: creating branch ' + branchName); + execSync('git checkout -b ' + branchName, { stdio: 'inherit' }); + done(); + }, + 'build', + 'typings', + function(done) { + console.log('push-rebuild-branch: committing rebuild'); + execSync('git commit -am "Rebuild"', { stdio: 'inherit' }); + var branchName = getRebuildBranchName(); + execSync('git push origin ' + branchName, { stdio: 'inherit' }); + console.log('Branch ' + branchName + ' pushed to GitHub.'); + console.log('Next step: create a pull request against develop.'); + done(); + } + ]) +); + +// Create and push an RC branch. +// Note that this pushes to google/blockly. +gulp.task('git-create-rc', gulp.series([ + 'git-sync-develop', + function(done) { + var branchName = getRCBranchName(); + execSync('git checkout -b ' + branchName, { stdio: 'inherit' }); + execSync('git push ' + upstream_url + ' ' + branchName, + { stdio: 'inherit' }); + execSync('git checkout -b gh-pages'); + execSync('git push ' + upstream_url + ' gh-pages'); + done(); + }, + ]) +); + +// See https://docs.npmjs.com/cli/version. +gulp.task('preversion', gulp.series([ + 'git-sync-master', + function(done) { + // Create a branch named bump_version for the bump and rebuild. + execSync('git checkout -b bump_version', { stdio: 'inherit' }); + done(); + }, + ]) +); + +// See https://docs.npmjs.com/cli/version +gulp.task('postversion', gulp.series([ + function(done) { + // Push both the branch and tag to google/blockly. + execSync('git push ' + upstream_url + ' bump_version', + { stdio: 'inherit' }); + var tagName = 'v' + packageJson.version; + execSync('git push ' + upstream_url + ' ' + tagName, + { stdio: 'inherit' }); + done(); + } + ]) +); diff --git a/js/i18n/common.py b/js/i18n/common.py new file mode 100644 index 0000000..7e568a5 --- /dev/null +++ b/js/i18n/common.py @@ -0,0 +1,233 @@ +#!/usr/bin/python + +# Code shared by translation conversion scripts. +# +# Copyright 2013 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import codecs +import json +import os +from datetime import datetime + +class InputError(Exception): + """Exception raised for errors in the input. + + Attributes: + location -- where error occurred + msg -- explanation of the error + + """ + + def __init__(self, location, msg): + Exception.__init__(self, '{0}: {1}'.format(location, msg)) + self.location = location + self.msg = msg + + +def read_json_file(filename): + """Read a JSON file as UTF-8 into a dictionary, discarding @metadata. + + Args: + filename: The filename, which must end ".json". + + Returns: + The dictionary. + + Raises: + InputError: The filename did not end with ".json" or an error occurred + while opening or reading the file. + """ + if not filename.endswith('.json'): + raise InputError(filename, 'filenames must end with ".json"') + try: + # Read in file. + with codecs.open(filename, 'r', 'utf-8') as infile: + defs = json.load(infile) + if '@metadata' in defs: + del defs['@metadata'] + return defs + except ValueError as e: + print('Error reading ' + filename) + raise InputError(filename, str(e)) + + +def _create_qqq_file(output_dir): + """Creates a qqq.json file with message documentation for translatewiki.net. + + The file consists of key-value pairs, where the keys are message ids and + the values are descriptions for the translators of the messages. + What documentation exists for the format can be found at: + http://translatewiki.net/wiki/Translating:Localisation_for_developers#Message_documentation + + The file should be closed by _close_qqq_file(). + + Parameters: + output_dir: The output directory. + + Returns: + A pointer to a file to which a left brace and newline have been written. + + Raises: + IOError: An error occurred while opening or writing the file. + """ + qqq_file_name = os.path.join(os.curdir, output_dir, 'qqq.json') + qqq_file = codecs.open(qqq_file_name, 'w', 'utf-8') + print('Created file: ' + qqq_file_name) + qqq_file.write('{\n') + return qqq_file + + +def _close_qqq_file(qqq_file): + """Closes a qqq.json file created and opened by _create_qqq_file(). + + This writes the final newlines and right brace. + + Args: + qqq_file: A file created by _create_qqq_file(). + + Raises: + IOError: An error occurred while writing to or closing the file. + """ + qqq_file.write('\n}\n') + qqq_file.close() + + +def _create_lang_file(author, lang, output_dir): + """Creates a .json file for translatewiki.net. + + The file consists of metadata, followed by key-value pairs, where the keys + are message ids and the values are the messages in the language specified + by the corresponding command-line argument. The file should be closed by + _close_lang_file(). + + Args: + author: Name and email address of contact for translators. + lang: ISO 639-1 source language code. + output_dir: Relative directory for output files. + + Returns: + A pointer to a file to which the metadata has been written. + + Raises: + IOError: An error occurred while opening or writing the file. + """ + lang_file_name = os.path.join(os.curdir, output_dir, lang + '.json') + lang_file = codecs.open(lang_file_name, 'w', 'utf-8') + print('Created file: ' + lang_file_name) + # string.format doesn't like printing braces, so break up our writes. + lang_file.write('{\n\t"@metadata": {') + lang_file.write(""" +\t\t"author": "{0}", +\t\t"lastupdated": "{1}", +\t\t"locale": "{2}", +\t\t"messagedocumentation" : "qqq" +""".format(author, str(datetime.now()), lang)) + lang_file.write('\t},\n') + return lang_file + + +def _close_lang_file(lang_file): + """Closes a .json file created with _create_lang_file(). + + This also writes the terminating left brace and newline. + + Args: + lang_file: A file opened with _create_lang_file(). + + Raises: + IOError: An error occurred while writing to or closing the file. + """ + lang_file.write('\n}\n') + lang_file.close() + + +def _create_key_file(output_dir): + """Creates a keys.json file mapping Closure keys to Blockly keys. + + Args: + output_dir: Relative directory for output files. + + Raises: + IOError: An error occurred while creating the file. + """ + key_file_name = os.path.join(os.curdir, output_dir, 'keys.json') + key_file = open(key_file_name, 'w') + key_file.write('{\n') + print('Created file: ' + key_file_name) + return key_file + + +def _close_key_file(key_file): + """Closes a key file created and opened with _create_key_file(). + + Args: + key_file: A file created by _create_key_file(). + + Raises: + IOError: An error occurred while writing to or closing the file. + """ + key_file.write('\n}\n') + key_file.close() + + +def write_files(author, lang, output_dir, units, write_key_file): + """Writes the output files for the given units. + + There are three possible output files: + * lang_file: JSON file mapping meanings (e.g., Maze.turnLeft) to the + English text. The base name of the language file is specified by the + "lang" command-line argument. + * key_file: JSON file mapping meanings to Soy-generated keys (long hash + codes). This is only output if the parameter write_key_file is True. + * qqq_file: JSON file mapping meanings to descriptions. + + Args: + author: Name and email address of contact for translators. + lang: ISO 639-1 source language code. + output_dir: Relative directory for output files. + units: A list of dictionaries with entries for 'meaning', 'source', + 'description', and 'keys' (the last only if write_key_file is true), + in the order desired in the output files. + write_key_file: Whether to output a keys.json file. + + Raises: + IOError: An error occurs opening, writing to, or closing a file. + KeyError: An expected key is missing from units. + """ + lang_file = _create_lang_file(author, lang, output_dir) + qqq_file = _create_qqq_file(output_dir) + if write_key_file: + key_file = _create_key_file(output_dir) + first_entry = True + for unit in units: + if not first_entry: + lang_file.write(',\n') + if write_key_file: + key_file.write(',\n') + qqq_file.write(',\n') + lang_file.write(u'\t"{0}": "{1}"'.format( + unit['meaning'], + unit['source'].replace('"', "'"))) + if write_key_file: + key_file.write('"{0}": "{1}"'.format(unit['meaning'], unit['key'])) + qqq_file.write(u'\t"{0}": "{1}"'.format( + unit['meaning'], + unit['description'].replace('"', "'").replace( + '{lb}', '{').replace('{rb}', '}'))) + first_entry = False + _close_lang_file(lang_file) + if write_key_file: + _close_key_file(key_file) + _close_qqq_file(qqq_file) diff --git a/js/i18n/create_messages.py b/js/i18n/create_messages.py new file mode 100644 index 0000000..dba3b35 --- /dev/null +++ b/js/i18n/create_messages.py @@ -0,0 +1,162 @@ +#!/usr/bin/python + +# Generate .js files defining Blockly core and language messages. +# +# Copyright 2013 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import codecs +import os +import re +import sys +from common import read_json_file + + +_NEWLINE_PATTERN = re.compile('[\n\r]') + + +def string_is_ascii(s): + try: + # This approach is better for compatibility + return all(ord(c) < 128 for c in s) + except TypeError: + return False + +def load_constants(filename): + """Read in constants file, which must be output in every language.""" + constant_defs = read_json_file(filename) + constants_text = '\n' + for key in constant_defs: + value = constant_defs[key] + value = value.replace('"', '\\"') + constants_text += u'\nBlockly.Msg["{0}"] = \"{1}\";'.format( + key, value) + return constants_text + +def main(): + """Generate .js files defining Blockly core and language messages.""" + + # Process command-line arguments. + parser = argparse.ArgumentParser(description='Convert JSON files to JS.') + parser.add_argument('--source_lang', default='en', + help='ISO 639-1 source language code') + parser.add_argument('--source_lang_file', + default=os.path.join('json', 'en.json'), + help='Path to .json file for source language') + parser.add_argument('--source_synonym_file', + default=os.path.join('json', 'synonyms.json'), + help='Path to .json file with synonym definitions') + parser.add_argument('--source_constants_file', + default=os.path.join('json', 'constants.json'), + help='Path to .json file with constant definitions') + parser.add_argument('--output_dir', default='js/', + help='relative directory for output files') + parser.add_argument('--key_file', default='keys.json', + help='relative path to input keys file') + parser.add_argument('--quiet', action='store_true', default=False, + help='do not write anything to standard output') + parser.add_argument('files', nargs='+', help='input files') + args = parser.parse_args() + if not args.output_dir.endswith(os.path.sep): + args.output_dir += os.path.sep + + # Read in source language .json file, which provides any values missing + # in target languages' .json files. + source_defs = read_json_file(os.path.join(os.curdir, args.source_lang_file)) + # Make sure the source file doesn't contain a newline or carriage return. + for key, value in source_defs.items(): + if _NEWLINE_PATTERN.search(value): + print('ERROR: definition of {0} in {1} contained a newline character.'. + format(key, args.source_lang_file)) + sys.exit(1) + sorted_keys = sorted(source_defs.keys()) + + # Read in synonyms file, which must be output in every language. + synonym_defs = read_json_file(os.path.join( + os.curdir, args.source_synonym_file)) + + # synonym_defs is also being sorted to ensure the same order is kept + synonym_text = '\n'.join([u'Blockly.Msg["{0}"] = Blockly.Msg["{1}"];' + .format(key, synonym_defs[key]) for key in sorted(synonym_defs)]) + + # Read in constants file, which must be output in every language. + constants_text = load_constants(os.path.join(os.curdir, args.source_constants_file)) + + # Create each output file. + for arg_file in args.files: + (_, filename) = os.path.split(arg_file) + target_lang = filename[:filename.index('.')] + if target_lang not in ('qqq', 'keys', 'synonyms', 'constants'): + target_defs = read_json_file(os.path.join(os.curdir, arg_file)) + + # Verify that keys are 'ascii' + bad_keys = [key for key in target_defs if not string_is_ascii(key)] + if bad_keys: + print(u'These keys in {0} contain non ascii characters: {1}'.format( + filename, ', '.join(bad_keys))) + + # If there's a '\n' or '\r', remove it and print a warning. + for key, value in target_defs.items(): + if _NEWLINE_PATTERN.search(value): + print(u'WARNING: definition of {0} in {1} contained ' + 'a newline character.'. + format(key, arg_file)) + target_defs[key] = _NEWLINE_PATTERN.sub(' ', value) + + # Output file. + outname = os.path.join(os.curdir, args.output_dir, target_lang + '.js') + with codecs.open(outname, 'w', 'utf-8') as outfile: + outfile.write( + """// This file was automatically generated. Do not modify. + +'use strict'; + +""".format(target_lang.replace('-', '.'))) + # For each key in the source language file, output the target value + # if present; otherwise, output the source language value with a + # warning comment. + for key in sorted_keys: + if key in target_defs: + value = target_defs[key] + comment = '' + del target_defs[key] + else: + value = source_defs[key] + comment = ' // untranslated' + value = value.replace('"', '\\"') + outfile.write(u'Blockly.Msg["{0}"] = "{1}";{2}\n' + .format(key, value, comment)) + + # Announce any keys defined only for target language. + if target_defs: + extra_keys = [key for key in target_defs if key not in synonym_defs] + synonym_keys = [key for key in target_defs if key in synonym_defs] + if not args.quiet: + if extra_keys: + print(u'These extra keys appeared in {0}: {1}'.format( + filename, ', '.join(extra_keys))) + if synonym_keys: + print(u'These synonym keys appeared in {0}: {1}'.format( + filename, ', '.join(synonym_keys))) + + outfile.write(synonym_text) + outfile.write(constants_text) + + if not args.quiet: + print('Created {0}.'.format(outname)) + + +if __name__ == '__main__': + main() diff --git a/js/i18n/dedup_json.py b/js/i18n/dedup_json.py new file mode 100644 index 0000000..1329e47 --- /dev/null +++ b/js/i18n/dedup_json.py @@ -0,0 +1,72 @@ +#!/usr/bin/python + +# Consolidates duplicate key-value pairs in a JSON file. +# If the same key is used with different values, no warning is given, +# and there is no guarantee about which key-value pair will be output. +# There is also no guarantee as to the order of the key-value pairs +# output. +# +# Copyright 2013 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import codecs +import json +from common import InputError + + +def main(): + """Parses arguments and iterates over files. + + Raises: + IOError: An I/O error occurred with an input or output file. + InputError: Input JSON could not be parsed. + """ + + # Set up argument parser. + parser = argparse.ArgumentParser( + description='Removes duplicate key-value pairs from JSON files.') + parser.add_argument('--suffix', default='', + help='optional suffix for output files; ' + 'if empty, files will be changed in place') + parser.add_argument('files', nargs='+', help='input files') + args = parser.parse_args() + + # Iterate over files. + for filename in args.files: + # Read in json using Python libraries. This eliminates duplicates. + print('Processing ' + filename + '...') + try: + with codecs.open(filename, 'r', 'utf-8') as infile: + j = json.load(infile) + except ValueError as e: + print('Error reading ' + filename) + raise InputError(filename, str(e)) + + # Built up output strings as an array to make output of delimiters easier. + output = [] + for key in j: + if key != '@metadata': + output.append('\t"' + key + '": "' + + j[key].replace('\n', '\\n') + '"') + + # Output results. + with codecs.open(filename + args.suffix, 'w', 'utf-8') as outfile: + outfile.write('{\n') + outfile.write(',\n'.join(output)) + outfile.write('\n}\n') + + +if __name__ == '__main__': + main() diff --git a/js/i18n/js_to_json.py b/js/i18n/js_to_json.py new file mode 100644 index 0000000..cd3d4dc --- /dev/null +++ b/js/i18n/js_to_json.py @@ -0,0 +1,135 @@ +#!/usr/bin/python + +# Gives the translation status of the specified apps and languages. +# +# Copyright 2013 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Extracts messages from messages.js file into .json files for translation. + +Specifically, lines with the following formats are extracted: + + /// Here is a description of the following message. + Blockly.SOME_KEY = 'Some value'; + +Adjacent "///" lines are concatenated. + +There are two output files, each of which is proper JSON. For each key, the +file en.json would get an entry of the form: + + "Blockly.SOME_KEY", "Some value", + +The file qqq.json would get: + + "Blockly.SOME_KEY", "Here is a description of the following message.", + +Commas would of course be omitted for the final entry of each value. + +@author Ellen Spertus (ellen.spertus@gmail.com) +""" + +import argparse +import codecs +import json +import os +import re +from common import write_files + + +_INPUT_DEF_PATTERN = re.compile("""Blockly.Msg.(\w*)\s*=\s*'(.*)';?\r?$""") + +_INPUT_SYN_PATTERN = re.compile( + """Blockly.Msg.(\w*)\s*=\s*Blockly.Msg.(\w*);""") + +_CONSTANT_DESCRIPTION_PATTERN = re.compile( + """{{Notranslate}}""", re.IGNORECASE) + +def main(): + # Set up argument parser. + parser = argparse.ArgumentParser(description='Create translation files.') + parser.add_argument( + '--author', + default='Ellen Spertus ', + help='name and email address of contact for translators') + parser.add_argument('--lang', default='en', + help='ISO 639-1 source language code') + parser.add_argument('--output_dir', default='json', + help='relative directory for output files') + parser.add_argument('--input_file', default='messages.js', + help='input file') + parser.add_argument('--quiet', action='store_true', default=False, + help='only display warnings, not routine info') + args = parser.parse_args() + if (not args.output_dir.endswith(os.path.sep)): + args.output_dir += os.path.sep + + # Read and parse input file. + results = [] + synonyms = {} + constants = {} # Values that are constant across all languages. + description = '' + infile = codecs.open(args.input_file, 'r', 'utf-8') + for line in infile: + if line.startswith('///'): + if description: + description = description + ' ' + line[3:].strip() + else: + description = line[3:].strip() + else: + match = _INPUT_DEF_PATTERN.match(line) + if match: + key = match.group(1) + value = match.group(2).replace("\\'", "'") + if not description: + print('Warning: No description for ' + result['meaning']) + if (description and _CONSTANT_DESCRIPTION_PATTERN.search(description)): + constants[key] = value + else: + result = {} + result['meaning'] = key + result['source'] = value + result['description'] = description + results.append(result) + description = '' + else: + match = _INPUT_SYN_PATTERN.match(line) + if match: + if description: + print('Warning: Description preceding definition of synonym {0}.'. + format(match.group(1))) + description = '' + synonyms[match.group(1)] = match.group(2) + infile.close() + + # Create .json, keys.json, and qqq.json. + write_files(args.author, args.lang, args.output_dir, results, False) + + # Create synonyms.json. + synonym_file_name = os.path.join(os.curdir, args.output_dir, 'synonyms.json') + with open(synonym_file_name, 'w') as outfile: + json.dump(synonyms, outfile) + if not args.quiet: + print("Wrote {0} synonym pairs to {1}.".format( + len(synonyms), synonym_file_name)) + + # Create constants.json + constants_file_name = os.path.join(os.curdir, args.output_dir, 'constants.json') + with open(constants_file_name, 'w') as outfile: + json.dump(constants, outfile) + if not args.quiet: + print("Wrote {0} constant pairs to {1}.".format( + len(constants), synonym_file_name)) + +if __name__ == '__main__': + main() diff --git a/js/i18n/tests.py b/js/i18n/tests.py new file mode 100644 index 0000000..2fd3bc7 --- /dev/null +++ b/js/i18n/tests.py @@ -0,0 +1,46 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# Tests of i18n scripts. +# +# Copyright 2013 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import common +import re +import unittest + +class TestSequenceFunctions(unittest.TestCase): + def test_insert_breaks(self): + spaces = re.compile(r'\s+|\\n') + def contains_all_chars(orig, result): + return re.sub(spaces, '', orig) == re.sub(spaces, '', result) + + sentences = [u'Quay Pegman qua bên trái hoặc bên phải 90 độ.', + u'Foo bar baz this is english that is okay bye.', + u'If there is a path in the specified direction, \nthen ' + + u'do some actions.', + u'If there is a path in the specified direction, then do ' + + u'the first block of actions. Otherwise, do the second ' + + u'block of actions.'] + for sentence in sentences: + output = common.insert_breaks(sentence, 30, 50) + self.assertTrue(contains_all_chars(sentence, output), + u'Mismatch between:\n{0}\n{1}'.format( + re.sub(spaces, '', sentence), + re.sub(spaces, '', output))) + + +if __name__ == '__main__': + unittest.main() diff --git a/js/javascript_compressed.js b/js/javascript_compressed.js new file mode 100644 index 0000000..f57f7c7 --- /dev/null +++ b/js/javascript_compressed.js @@ -0,0 +1,102 @@ +// Do not edit this file; automatically generated by gulp. +'use strict'; + + +Blockly.JavaScript=new Blockly.Generator("JavaScript");Blockly.JavaScript.addReservedWords("break,case,catch,class,const,continue,debugger,default,delete,do,else,export,extends,finally,for,function,if,import,in,instanceof,new,return,super,switch,this,throw,try,typeof,var,void,while,with,yield,enum,implements,interface,let,package,private,protected,public,static,await,null,true,false,arguments,"+Object.getOwnPropertyNames(Blockly.utils.global).join(",")); +Blockly.JavaScript.ORDER_ATOMIC=0;Blockly.JavaScript.ORDER_NEW=1.1;Blockly.JavaScript.ORDER_MEMBER=1.2;Blockly.JavaScript.ORDER_FUNCTION_CALL=2;Blockly.JavaScript.ORDER_INCREMENT=3;Blockly.JavaScript.ORDER_DECREMENT=3;Blockly.JavaScript.ORDER_BITWISE_NOT=4.1;Blockly.JavaScript.ORDER_UNARY_PLUS=4.2;Blockly.JavaScript.ORDER_UNARY_NEGATION=4.3;Blockly.JavaScript.ORDER_LOGICAL_NOT=4.4;Blockly.JavaScript.ORDER_TYPEOF=4.5;Blockly.JavaScript.ORDER_VOID=4.6;Blockly.JavaScript.ORDER_DELETE=4.7; +Blockly.JavaScript.ORDER_AWAIT=4.8;Blockly.JavaScript.ORDER_EXPONENTIATION=5;Blockly.JavaScript.ORDER_MULTIPLICATION=5.1;Blockly.JavaScript.ORDER_DIVISION=5.2;Blockly.JavaScript.ORDER_MODULUS=5.3;Blockly.JavaScript.ORDER_SUBTRACTION=6.1;Blockly.JavaScript.ORDER_ADDITION=6.2;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_YIELD=17;Blockly.JavaScript.ORDER_COMMA=18;Blockly.JavaScript.ORDER_NONE=99; +Blockly.JavaScript.ORDER_OVERRIDES=[[Blockly.JavaScript.ORDER_FUNCTION_CALL,Blockly.JavaScript.ORDER_MEMBER],[Blockly.JavaScript.ORDER_FUNCTION_CALL,Blockly.JavaScript.ORDER_FUNCTION_CALL],[Blockly.JavaScript.ORDER_MEMBER,Blockly.JavaScript.ORDER_MEMBER],[Blockly.JavaScript.ORDER_MEMBER,Blockly.JavaScript.ORDER_FUNCTION_CALL],[Blockly.JavaScript.ORDER_LOGICAL_NOT,Blockly.JavaScript.ORDER_LOGICAL_NOT],[Blockly.JavaScript.ORDER_MULTIPLICATION,Blockly.JavaScript.ORDER_MULTIPLICATION],[Blockly.JavaScript.ORDER_ADDITION, +Blockly.JavaScript.ORDER_ADDITION],[Blockly.JavaScript.ORDER_LOGICAL_AND,Blockly.JavaScript.ORDER_LOGICAL_AND],[Blockly.JavaScript.ORDER_LOGICAL_OR,Blockly.JavaScript.ORDER_LOGICAL_OR]]; +Blockly.JavaScript.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_);Blockly.JavaScript.variableDB_.setVariableMap(a.getVariableMap());for(var b=[],c=Blockly.Variables.allDeveloperVariables(a),d=0;dc?Blockly.JavaScript.valueToCode(a,b,Blockly.JavaScript.ORDER_SUBTRACTION)||f:d?Blockly.JavaScript.valueToCode(a,b,Blockly.JavaScript.ORDER_UNARY_NEGATION)||f:Blockly.JavaScript.valueToCode(a,b,e)||f;if(Blockly.isNumber(a))a=Number(a)+c,d&& +(a=-a);else{if(0c&&(a=a+" - "+-c,g=Blockly.JavaScript.ORDER_SUBTRACTION);d&&(a=c?"-("+a+")":"-"+a,g=Blockly.JavaScript.ORDER_UNARY_NEGATION);g=Math.floor(g);e=Math.floor(e);g&&e>=g&&(a="("+a+")")}return a};Blockly.JavaScript.colour={};Blockly.JavaScript.colour_picker=function(a){return[Blockly.JavaScript.quote_(a.getFieldValue("COLOUR")),Blockly.JavaScript.ORDER_ATOMIC]};Blockly.JavaScript.colour_random=function(a){return[Blockly.JavaScript.provideFunction_("colourRandom",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"() {"," var num = Math.floor(Math.random() * Math.pow(2, 24));"," return '#' + ('00000' + num.toString(16)).substr(-6);","}"])+"()",Blockly.JavaScript.ORDER_FUNCTION_CALL]}; +Blockly.JavaScript.colour_rgb=function(a){var b=Blockly.JavaScript.valueToCode(a,"RED",Blockly.JavaScript.ORDER_COMMA)||0,c=Blockly.JavaScript.valueToCode(a,"GREEN",Blockly.JavaScript.ORDER_COMMA)||0;a=Blockly.JavaScript.valueToCode(a,"BLUE",Blockly.JavaScript.ORDER_COMMA)||0;return[Blockly.JavaScript.provideFunction_("colourRgb",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(r, g, b) {"," r = Math.max(Math.min(Number(r), 100), 0) * 2.55;"," g = Math.max(Math.min(Number(g), 100), 0) * 2.55;", +" b = Math.max(Math.min(Number(b), 100), 0) * 2.55;"," r = ('0' + (Math.round(r) || 0).toString(16)).slice(-2);"," g = ('0' + (Math.round(g) || 0).toString(16)).slice(-2);"," b = ('0' + (Math.round(b) || 0).toString(16)).slice(-2);"," return '#' + r + g + b;","}"])+"("+b+", "+c+", "+a+")",Blockly.JavaScript.ORDER_FUNCTION_CALL]}; +Blockly.JavaScript.colour_blend=function(a){var b=Blockly.JavaScript.valueToCode(a,"COLOUR1",Blockly.JavaScript.ORDER_COMMA)||"'#000000'",c=Blockly.JavaScript.valueToCode(a,"COLOUR2",Blockly.JavaScript.ORDER_COMMA)||"'#000000'";a=Blockly.JavaScript.valueToCode(a,"RATIO",Blockly.JavaScript.ORDER_COMMA)||.5;return[Blockly.JavaScript.provideFunction_("colourBlend",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(c1, c2, ratio) {"," ratio = Math.max(Math.min(Number(ratio), 1), 0);"," var r1 = parseInt(c1.substring(1, 3), 16);", +" var g1 = parseInt(c1.substring(3, 5), 16);"," var b1 = parseInt(c1.substring(5, 7), 16);"," var r2 = parseInt(c2.substring(1, 3), 16);"," var g2 = parseInt(c2.substring(3, 5), 16);"," var b2 = parseInt(c2.substring(5, 7), 16);"," var r = Math.round(r1 * (1 - ratio) + r2 * ratio);"," var g = Math.round(g1 * (1 - ratio) + g2 * ratio);"," var b = Math.round(b1 * (1 - ratio) + b2 * ratio);"," r = ('0' + (r || 0).toString(16)).slice(-2);"," g = ('0' + (g || 0).toString(16)).slice(-2);"," b = ('0' + (b || 0).toString(16)).slice(-2);", +" return '#' + r + g + b;","}"])+"("+b+", "+c+", "+a+")",Blockly.JavaScript.ORDER_FUNCTION_CALL]};Blockly.JavaScript.lists={};Blockly.JavaScript.lists_create_empty=function(a){return["[]",Blockly.JavaScript.ORDER_ATOMIC]};Blockly.JavaScript.lists_create_with=function(a){for(var b=Array(a.itemCount_),c=0;c b.toString() ? 1 : -1; },", +' "IGNORE_CASE": function(a, b) {'," return a.toString().toLowerCase() > b.toString().toLowerCase() ? 1 : -1; },"," };"," var compare = compareFuncs[type];"," return function(a, b) { return compare(a, b) * direction; }","}"]);return[b+".slice().sort("+d+'("'+a+'", '+c+"))",Blockly.JavaScript.ORDER_FUNCTION_CALL]}; +Blockly.JavaScript.lists_split=function(a){var b=Blockly.JavaScript.valueToCode(a,"INPUT",Blockly.JavaScript.ORDER_MEMBER),c=Blockly.JavaScript.valueToCode(a,"DELIM",Blockly.JavaScript.ORDER_NONE)||"''";a=a.getFieldValue("MODE");if("SPLIT"==a)b||(b="''"),a="split";else if("JOIN"==a)b||(b="[]"),a="join";else throw Error("Unknown mode: "+a);return[b+"."+a+"("+c+")",Blockly.JavaScript.ORDER_FUNCTION_CALL]}; +Blockly.JavaScript.lists_reverse=function(a){return[(Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_FUNCTION_CALL)||"[]")+".slice().reverse()",Blockly.JavaScript.ORDER_FUNCTION_CALL]};Blockly.JavaScript.logic={}; +Blockly.JavaScript.controls_if=function(a){var b=0,c="";Blockly.JavaScript.STATEMENT_PREFIX&&(c+=Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_PREFIX,a));do{var d=Blockly.JavaScript.valueToCode(a,"IF"+b,Blockly.JavaScript.ORDER_NONE)||"false";var e=Blockly.JavaScript.statementToCode(a,"DO"+b);Blockly.JavaScript.STATEMENT_SUFFIX&&(e=Blockly.JavaScript.prefixLines(Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_SUFFIX,a),Blockly.JavaScript.INDENT)+e);c+=(0",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);a="";var d=Blockly.JavaScript.variableDB_.getDistinctName("count",Blockly.VARIABLE_CATEGORY_NAME),e=b;b.match(/^\w+$/)||Blockly.isNumber(b)||(e=Blockly.JavaScript.variableDB_.getDistinctName("repeat_end",Blockly.VARIABLE_CATEGORY_NAME), +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);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.VARIABLE_CATEGORY_NAME),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);if(Blockly.isNumber(c)&&Blockly.isNumber(d)&& +Blockly.isNumber(e)){var g=Number(c)<=Number(d);a="for ("+b+" = "+c+"; "+b+(g?" <= ":" >= ")+d+"; "+b;b=Math.abs(Number(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.VARIABLE_CATEGORY_NAME),a+="var "+g+" = "+c+";\n"),c=d,d.match(/^\w+$/)||Blockly.isNumber(d)||(c=Blockly.JavaScript.variableDB_.getDistinctName(b+"_end",Blockly.VARIABLE_CATEGORY_NAME),a+= +"var "+c+" = "+d+";\n"),d=Blockly.JavaScript.variableDB_.getDistinctName(b+"_inc",Blockly.VARIABLE_CATEGORY_NAME),a+="var "+d+" = ",a=Blockly.isNumber(e)?a+(Math.abs(e)+";\n"):a+("Math.abs("+e+");\n"),a=a+("if ("+g+" > "+c+") {\n")+(Blockly.JavaScript.INDENT+d+" = -"+d+";\n"),a+="}\n",a+="for ("+b+" = "+g+"; "+d+" >= 0 ? "+b+" <= "+c+" : "+b+" >= "+c+"; "+b+" += "+d+") {\n"+f+"}\n";return a}; +Blockly.JavaScript.controls_forEach=function(a){var b=Blockly.JavaScript.variableDB_.getName(a.getFieldValue("VAR"),Blockly.VARIABLE_CATEGORY_NAME),c=Blockly.JavaScript.valueToCode(a,"LIST",Blockly.JavaScript.ORDER_ASSIGNMENT)||"[]",d=Blockly.JavaScript.statementToCode(a,"DO");d=Blockly.JavaScript.addLoopTrap(d,a);a="";var e=c;c.match(/^\w+$/)||(e=Blockly.JavaScript.variableDB_.getDistinctName(b+"_list",Blockly.VARIABLE_CATEGORY_NAME),a+="var "+e+" = "+c+";\n");c=Blockly.JavaScript.variableDB_.getDistinctName(b+ +"_index",Blockly.VARIABLE_CATEGORY_NAME);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){var b="";Blockly.JavaScript.STATEMENT_PREFIX&&(b+=Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_PREFIX,a));Blockly.JavaScript.STATEMENT_SUFFIX&&(b+=Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_SUFFIX,a));if(Blockly.JavaScript.STATEMENT_PREFIX){var c=Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN.getSurroundLoop(a);c&&!c.suppressPrefixSuffix&&(b+=Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_PREFIX, +c))}switch(a.getFieldValue("FLOW")){case "BREAK":return b+"break;\n";case "CONTINUE":return b+"continue;\n"}throw Error("Unknown flow statement.");};Blockly.JavaScript.math={};Blockly.JavaScript.math_number=function(a){a=Number(a.getFieldValue("NUM"));return[a,0<=a?Blockly.JavaScript.ORDER_ATOMIC:Blockly.JavaScript.ORDER_UNARY_NEGATION]}; +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];var 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");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":var 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 Error("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");if("PRIME"==c)return[Blockly.JavaScript.provideFunction_("mathIsPrime",["function "+Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(n) {"," // https://en.wikipedia.org/wiki/Primality_test#Naive_methods"," if (n == 2 || n == 3) {"," return true;"," }"," // False if n is NaN, negative, is 1, or not whole."," // And false if n is divisible by 2 or 3.", +" if (isNaN(n) || n <= 1 || n % 1 != 0 || n % 2 == 0 || 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+")",Blockly.JavaScript.ORDER_FUNCTION_CALL];switch(c){case "EVEN":var 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.VARIABLE_CATEGORY_NAME);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_("mathMean", +["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_("mathMedian",["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_("mathModes",["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_("mathStandardDeviation",["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_("mathRandomList",["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 Error("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_("mathRandomInt",["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.math_atan2=function(a){var b=Blockly.JavaScript.valueToCode(a,"X",Blockly.JavaScript.ORDER_COMMA)||"0";return["Math.atan2("+(Blockly.JavaScript.valueToCode(a,"Y",Blockly.JavaScript.ORDER_COMMA)||"0")+", "+b+") / Math.PI * 180",Blockly.JavaScript.ORDER_DIVISION]};Blockly.JavaScript.procedures={}; +Blockly.JavaScript.procedures_defreturn=function(a){var b=Blockly.JavaScript.variableDB_.getName(a.getFieldValue("NAME"),Blockly.PROCEDURE_CATEGORY_NAME),c="";Blockly.JavaScript.STATEMENT_PREFIX&&(c+=Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_PREFIX,a));Blockly.JavaScript.STATEMENT_SUFFIX&&(c+=Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_SUFFIX,a));c&&(c=Blockly.JavaScript.prefixLines(c,Blockly.JavaScript.INDENT));var d="";Blockly.JavaScript.INFINITE_LOOP_TRAP&&(d=Blockly.JavaScript.prefixLines(Blockly.JavaScript.injectId(Blockly.JavaScript.INFINITE_LOOP_TRAP, +a),Blockly.JavaScript.INDENT));var e=Blockly.JavaScript.statementToCode(a,"STACK"),f=Blockly.JavaScript.valueToCode(a,"RETURN",Blockly.JavaScript.ORDER_NONE)||"",g="";e&&f&&(g=c);f&&(f=Blockly.JavaScript.INDENT+"return "+f+";\n");for(var k=[],h=0;h",GTE:">="}[a.getFieldValue("OP")],c=Blockly.Lua.valueToCode(a,"A",Blockly.Lua.ORDER_RELATIONAL)||"0";a=Blockly.Lua.valueToCode(a,"B",Blockly.Lua.ORDER_RELATIONAL)||"0";return[c+" "+b+" "+a,Blockly.Lua.ORDER_RELATIONAL]}; +Blockly.Lua.logic_operation=function(a){var b="AND"==a.getFieldValue("OP")?"and":"or",c="and"==b?Blockly.Lua.ORDER_AND:Blockly.Lua.ORDER_OR,d=Blockly.Lua.valueToCode(a,"A",c);a=Blockly.Lua.valueToCode(a,"B",c);if(d||a){var e="and"==b?"true":"false";d||(d=e);a||(a=e)}else a=d="false";return[d+" "+b+" "+a,c]};Blockly.Lua.logic_negate=function(a){return["not "+(Blockly.Lua.valueToCode(a,"BOOL",Blockly.Lua.ORDER_UNARY)||"true"),Blockly.Lua.ORDER_UNARY]}; +Blockly.Lua.logic_boolean=function(a){return["TRUE"==a.getFieldValue("BOOL")?"true":"false",Blockly.Lua.ORDER_ATOMIC]};Blockly.Lua.logic_null=function(a){return["nil",Blockly.Lua.ORDER_ATOMIC]};Blockly.Lua.logic_ternary=function(a){var b=Blockly.Lua.valueToCode(a,"IF",Blockly.Lua.ORDER_AND)||"false",c=Blockly.Lua.valueToCode(a,"THEN",Blockly.Lua.ORDER_AND)||"nil";a=Blockly.Lua.valueToCode(a,"ELSE",Blockly.Lua.ORDER_OR)||"nil";return[b+" and "+c+" or "+a,Blockly.Lua.ORDER_OR]};Blockly.Lua.loops={};Blockly.Lua.CONTINUE_STATEMENT="goto continue\n";Blockly.Lua.addContinueLabel_=function(a){return-1!=a.indexOf(Blockly.Lua.CONTINUE_STATEMENT)?a+Blockly.Lua.INDENT+"::continue::\n":a}; +Blockly.Lua.controls_repeat_ext=function(a){var b=a.getField("TIMES")?String(Number(a.getFieldValue("TIMES"))):Blockly.Lua.valueToCode(a,"TIMES",Blockly.Lua.ORDER_NONE)||"0";b=Blockly.isNumber(b)?parseInt(b,10):"math.floor("+b+")";var c=Blockly.Lua.statementToCode(a,"DO");c=Blockly.Lua.addLoopTrap(c,a);c=Blockly.Lua.addContinueLabel_(c);return"for "+Blockly.Lua.variableDB_.getDistinctName("count",Blockly.VARIABLE_CATEGORY_NAME)+" = 1, "+b+" do\n"+c+"end\n"};Blockly.Lua.controls_repeat=Blockly.Lua.controls_repeat_ext; +Blockly.Lua.controls_whileUntil=function(a){var b="UNTIL"==a.getFieldValue("MODE"),c=Blockly.Lua.valueToCode(a,"BOOL",b?Blockly.Lua.ORDER_UNARY:Blockly.Lua.ORDER_NONE)||"false",d=Blockly.Lua.statementToCode(a,"DO");d=Blockly.Lua.addLoopTrap(d,a);d=Blockly.Lua.addContinueLabel_(d);b&&(c="not "+c);return"while "+c+" do\n"+d+"end\n"}; +Blockly.Lua.controls_for=function(a){var b=Blockly.Lua.variableDB_.getName(a.getFieldValue("VAR"),Blockly.VARIABLE_CATEGORY_NAME),c=Blockly.Lua.valueToCode(a,"FROM",Blockly.Lua.ORDER_NONE)||"0",d=Blockly.Lua.valueToCode(a,"TO",Blockly.Lua.ORDER_NONE)||"0",e=Blockly.Lua.valueToCode(a,"BY",Blockly.Lua.ORDER_NONE)||"1",f=Blockly.Lua.statementToCode(a,"DO");f=Blockly.Lua.addLoopTrap(f,a);f=Blockly.Lua.addContinueLabel_(f);a="";if(Blockly.isNumber(c)&&Blockly.isNumber(d)&&Blockly.isNumber(e))var g=(Number(c)<= +Number(d)?"":"-")+Math.abs(Number(e));else a="",g=Blockly.Lua.variableDB_.getDistinctName(b+"_inc",Blockly.VARIABLE_CATEGORY_NAME),a+=g+" = ",a=Blockly.isNumber(e)?a+(Math.abs(e)+"\n"):a+("math.abs("+e+")\n"),a=a+("if ("+c+") > ("+d+") then\n")+(Blockly.Lua.INDENT+g+" = -"+g+"\n"),a+="end\n";return a+("for "+b+" = "+c+", "+d+", "+g)+(" do\n"+f+"end\n")}; +Blockly.Lua.controls_forEach=function(a){var b=Blockly.Lua.variableDB_.getName(a.getFieldValue("VAR"),Blockly.VARIABLE_CATEGORY_NAME),c=Blockly.Lua.valueToCode(a,"LIST",Blockly.Lua.ORDER_NONE)||"{}",d=Blockly.Lua.statementToCode(a,"DO");d=Blockly.Lua.addLoopTrap(d,a);d=Blockly.Lua.addContinueLabel_(d);return"for _, "+b+" in ipairs("+c+") do \n"+d+"end\n"}; +Blockly.Lua.controls_flow_statements=function(a){var b="";Blockly.Lua.STATEMENT_PREFIX&&(b+=Blockly.Lua.injectId(Blockly.Lua.STATEMENT_PREFIX,a));Blockly.Lua.STATEMENT_SUFFIX&&(b+=Blockly.Lua.injectId(Blockly.Lua.STATEMENT_SUFFIX,a));if(Blockly.Lua.STATEMENT_PREFIX){var c=Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN.getSurroundLoop(a);c&&!c.suppressPrefixSuffix&&(b+=Blockly.Lua.injectId(Blockly.Lua.STATEMENT_PREFIX,c))}switch(a.getFieldValue("FLOW")){case "BREAK":return b+"break\n";case "CONTINUE":return b+ +Blockly.Lua.CONTINUE_STATEMENT}throw Error("Unknown flow statement.");};Blockly.Lua.math={};Blockly.Lua.math_number=function(a){a=Number(a.getFieldValue("NUM"));return[a,0>a?Blockly.Lua.ORDER_UNARY:Blockly.Lua.ORDER_ATOMIC]}; +Blockly.Lua.math_arithmetic=function(a){var b={ADD:[" + ",Blockly.Lua.ORDER_ADDITIVE],MINUS:[" - ",Blockly.Lua.ORDER_ADDITIVE],MULTIPLY:[" * ",Blockly.Lua.ORDER_MULTIPLICATIVE],DIVIDE:[" / ",Blockly.Lua.ORDER_MULTIPLICATIVE],POWER:[" ^ ",Blockly.Lua.ORDER_EXPONENTIATION]}[a.getFieldValue("OP")],c=b[0];b=b[1];var d=Blockly.Lua.valueToCode(a,"A",b)||"0";a=Blockly.Lua.valueToCode(a,"B",b)||"0";return[d+c+a,b]}; +Blockly.Lua.math_single=function(a){var b=a.getFieldValue("OP");if("NEG"==b)return a=Blockly.Lua.valueToCode(a,"NUM",Blockly.Lua.ORDER_UNARY)||"0",["-"+a,Blockly.Lua.ORDER_UNARY];if("POW10"==b)return a=Blockly.Lua.valueToCode(a,"NUM",Blockly.Lua.ORDER_EXPONENTIATION)||"0",["10 ^ "+a,Blockly.Lua.ORDER_EXPONENTIATION];a="ROUND"==b?Blockly.Lua.valueToCode(a,"NUM",Blockly.Lua.ORDER_ADDITIVE)||"0":Blockly.Lua.valueToCode(a,"NUM",Blockly.Lua.ORDER_NONE)||"0";switch(b){case "ABS":b="math.abs("+a+")";break; +case "ROOT":b="math.sqrt("+a+")";break;case "LN":b="math.log("+a+")";break;case "LOG10":b="math.log("+a+", 10)";break;case "EXP":b="math.exp("+a+")";break;case "ROUND":b="math.floor("+a+" + .5)";break;case "ROUNDUP":b="math.ceil("+a+")";break;case "ROUNDDOWN":b="math.floor("+a+")";break;case "SIN":b="math.sin(math.rad("+a+"))";break;case "COS":b="math.cos(math.rad("+a+"))";break;case "TAN":b="math.tan(math.rad("+a+"))";break;case "ASIN":b="math.deg(math.asin("+a+"))";break;case "ACOS":b="math.deg(math.acos("+ +a+"))";break;case "ATAN":b="math.deg(math.atan("+a+"))";break;default:throw Error("Unknown math operator: "+b);}return[b,Blockly.Lua.ORDER_HIGH]};Blockly.Lua.math_constant=function(a){return{PI:["math.pi",Blockly.Lua.ORDER_HIGH],E:["math.exp(1)",Blockly.Lua.ORDER_HIGH],GOLDEN_RATIO:["(1 + math.sqrt(5)) / 2",Blockly.Lua.ORDER_MULTIPLICATIVE],SQRT2:["math.sqrt(2)",Blockly.Lua.ORDER_HIGH],SQRT1_2:["math.sqrt(1 / 2)",Blockly.Lua.ORDER_HIGH],INFINITY:["math.huge",Blockly.Lua.ORDER_HIGH]}[a.getFieldValue("CONSTANT")]}; +Blockly.Lua.math_number_property=function(a){var b=Blockly.Lua.valueToCode(a,"NUMBER_TO_CHECK",Blockly.Lua.ORDER_MULTIPLICATIVE)||"0",c=a.getFieldValue("PROPERTY");if("PRIME"==c)return[Blockly.Lua.provideFunction_("math_isPrime",["function "+Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(n)"," -- https://en.wikipedia.org/wiki/Primality_test#Naive_methods"," if n == 2 or n == 3 then"," return true"," end"," -- False if n is NaN, negative, is 1, or not whole."," -- And false if n is divisible by 2 or 3.", +" if not(n > 1) or n % 1 ~= 0 or n % 2 == 0 or n % 3 == 0 then"," return false"," end"," -- Check all the numbers of form 6k +/- 1, up to sqrt(n)."," for x = 6, math.sqrt(n) + 1.5, 6 do"," if n % (x - 1) == 0 or n % (x + 1) == 0 then"," return false"," end"," end"," return true","end"])+"("+b+")",Blockly.Lua.ORDER_HIGH];switch(c){case "EVEN":var 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.Lua.valueToCode(a,"DIVISOR",Blockly.Lua.ORDER_MULTIPLICATIVE);if(!a||"0"==a)return["nil",Blockly.Lua.ORDER_ATOMIC];d=b+" % "+a+" == 0"}return[d,Blockly.Lua.ORDER_RELATIONAL]};Blockly.Lua.math_change=function(a){var b=Blockly.Lua.valueToCode(a,"DELTA",Blockly.Lua.ORDER_ADDITIVE)||"0";a=Blockly.Lua.variableDB_.getName(a.getFieldValue("VAR"),Blockly.VARIABLE_CATEGORY_NAME);return a+" = "+a+" + "+b+"\n"};Blockly.Lua.math_round=Blockly.Lua.math_single; +Blockly.Lua.math_trig=Blockly.Lua.math_single; +Blockly.Lua.math_on_list=function(a){function b(){return Blockly.Lua.provideFunction_("math_sum",["function "+Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(t)"," local result = 0"," for _, v in ipairs(t) do"," result = result + v"," end"," return result","end"])}var c=a.getFieldValue("OP");a=Blockly.Lua.valueToCode(a,"LIST",Blockly.Lua.ORDER_NONE)||"{}";switch(c){case "SUM":c=b();break;case "MIN":c=Blockly.Lua.provideFunction_("math_min",["function "+Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(t)", +" if #t == 0 then"," return 0"," end"," local result = math.huge"," for _, v in ipairs(t) do"," if v < result then"," result = v"," end"," end"," return result","end"]);break;case "AVERAGE":c=Blockly.Lua.provideFunction_("math_average",["function "+Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(t)"," if #t == 0 then"," return 0"," end"," return "+b()+"(t) / #t","end"]);break;case "MAX":c=Blockly.Lua.provideFunction_("math_max",["function "+Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+ +"(t)"," if #t == 0 then"," return 0"," end"," local result = -math.huge"," for _, v in ipairs(t) do"," if v > result then"," result = v"," end"," end"," return result","end"]);break;case "MEDIAN":c=Blockly.Lua.provideFunction_("math_median",["function "+Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(t)"," -- Source: http://lua-users.org/wiki/SimpleStats"," if #t == 0 then"," return 0"," end"," local temp={}"," for _, v in ipairs(t) do",' if type(v) == "number" then'," table.insert(temp, v)", +" end"," end"," table.sort(temp)"," if #temp % 2 == 0 then"," return (temp[#temp/2] + temp[(#temp/2)+1]) / 2"," else"," return temp[math.ceil(#temp/2)]"," end","end"]);break;case "MODE":c=Blockly.Lua.provideFunction_("math_modes",["function "+Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(t)"," -- Source: http://lua-users.org/wiki/SimpleStats"," local counts={}"," for _, v in ipairs(t) do"," if counts[v] == nil then"," counts[v] = 1"," else"," counts[v] = counts[v] + 1", +" end"," end"," local biggestCount = 0"," for _, v in pairs(counts) do"," if v > biggestCount then"," biggestCount = v"," end"," end"," local temp={}"," for k, v in pairs(counts) do"," if v == biggestCount then"," table.insert(temp, k)"," end"," end"," return temp","end"]);break;case "STD_DEV":c=Blockly.Lua.provideFunction_("math_standard_deviation",["function "+Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(t)"," local m"," local vm"," local total = 0"," local count = 0", +" local result"," m = #t == 0 and 0 or "+b()+"(t) / #t"," for _, v in ipairs(t) do"," if type(v) == 'number' then"," vm = v - m"," total = total + (vm * vm)"," count = count + 1"," end"," end"," result = math.sqrt(total / (count-1))"," return result","end"]);break;case "RANDOM":c=Blockly.Lua.provideFunction_("math_random_list",["function "+Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(t)"," if #t == 0 then"," return nil"," end"," return t[math.random(#t)]","end"]);break; +default:throw Error("Unknown operator: "+c);}return[c+"("+a+")",Blockly.Lua.ORDER_HIGH]};Blockly.Lua.math_modulo=function(a){var b=Blockly.Lua.valueToCode(a,"DIVIDEND",Blockly.Lua.ORDER_MULTIPLICATIVE)||"0";a=Blockly.Lua.valueToCode(a,"DIVISOR",Blockly.Lua.ORDER_MULTIPLICATIVE)||"0";return[b+" % "+a,Blockly.Lua.ORDER_MULTIPLICATIVE]}; +Blockly.Lua.math_constrain=function(a){var b=Blockly.Lua.valueToCode(a,"VALUE",Blockly.Lua.ORDER_NONE)||"0",c=Blockly.Lua.valueToCode(a,"LOW",Blockly.Lua.ORDER_NONE)||"-math.huge";a=Blockly.Lua.valueToCode(a,"HIGH",Blockly.Lua.ORDER_NONE)||"math.huge";return["math.min(math.max("+b+", "+c+"), "+a+")",Blockly.Lua.ORDER_HIGH]}; +Blockly.Lua.math_random_int=function(a){var b=Blockly.Lua.valueToCode(a,"FROM",Blockly.Lua.ORDER_NONE)||"0";a=Blockly.Lua.valueToCode(a,"TO",Blockly.Lua.ORDER_NONE)||"0";return["math.random("+b+", "+a+")",Blockly.Lua.ORDER_HIGH]};Blockly.Lua.math_random_float=function(a){return["math.random()",Blockly.Lua.ORDER_HIGH]}; +Blockly.Lua.math_atan2=function(a){var b=Blockly.Lua.valueToCode(a,"X",Blockly.Lua.ORDER_NONE)||"0";return["math.deg(math.atan2("+(Blockly.Lua.valueToCode(a,"Y",Blockly.Lua.ORDER_NONE)||"0")+", "+b+"))",Blockly.Lua.ORDER_HIGH]};Blockly.Lua.procedures={}; +Blockly.Lua.procedures_defreturn=function(a){var b=Blockly.Lua.variableDB_.getName(a.getFieldValue("NAME"),Blockly.PROCEDURE_CATEGORY_NAME),c="";Blockly.Lua.STATEMENT_PREFIX&&(c+=Blockly.Lua.injectId(Blockly.Lua.STATEMENT_PREFIX,a));Blockly.Lua.STATEMENT_SUFFIX&&(c+=Blockly.Lua.injectId(Blockly.Lua.STATEMENT_SUFFIX,a));c&&(c=Blockly.Lua.prefixLines(c,Blockly.Lua.INDENT));var d="";Blockly.Lua.INFINITE_LOOP_TRAP&&(d=Blockly.Lua.prefixLines(Blockly.Lua.injectId(Blockly.Lua.INFINITE_LOOP_TRAP,a),Blockly.Lua.INDENT)); +var e=Blockly.Lua.statementToCode(a,"STACK"),f=Blockly.Lua.valueToCode(a,"RETURN",Blockly.Lua.ORDER_NONE)||"",g="";e&&f&&(g=c);f?f=Blockly.Lua.INDENT+"return "+f+"\n":e||(e="");for(var h=[],k=0;kdropdown-arrow \ No newline at end of file diff --git a/js/media/handclosed.cur b/js/media/handclosed.cur new file mode 100644 index 0000000..4851755 Binary files /dev/null and b/js/media/handclosed.cur differ diff --git a/js/media/handdelete.cur b/js/media/handdelete.cur new file mode 100644 index 0000000..170320f Binary files /dev/null and b/js/media/handdelete.cur differ diff --git a/js/media/handopen.cur b/js/media/handopen.cur new file mode 100644 index 0000000..da44588 Binary files /dev/null and b/js/media/handopen.cur differ diff --git a/js/media/pilcrow.png b/js/media/pilcrow.png new file mode 100644 index 0000000..f224c35 Binary files /dev/null and b/js/media/pilcrow.png differ diff --git a/js/media/quote0.png b/js/media/quote0.png new file mode 100644 index 0000000..c7820d6 Binary files /dev/null and b/js/media/quote0.png differ diff --git a/js/media/quote1.png b/js/media/quote1.png new file mode 100644 index 0000000..826583e Binary files /dev/null and b/js/media/quote1.png differ diff --git a/js/media/sprites.png b/js/media/sprites.png new file mode 100644 index 0000000..20aadb6 Binary files /dev/null and b/js/media/sprites.png differ diff --git a/js/media/sprites.svg b/js/media/sprites.svg new file mode 100644 index 0000000..3f09ef3 --- /dev/null +++ b/js/media/sprites.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/js/msg/js/ab.js b/js/msg/js/ab.js new file mode 100644 index 0000000..c0e9d01 --- /dev/null +++ b/js/msg/js/ab.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Иацҵатәуп ахцәажәара"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Ишәыҧсах аҵакы"; +Blockly.Msg["CLEAN_UP"] = "Иқәгатәуп аблокқәа"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "аҧштәы 1 ахәҭа"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "еилаҵатәуп"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Blends two colours together with a given ratio (0.0 - 1.0)."; // untranslated +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://ru.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"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "аҟаҧшь"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "аҧштәы аҟынтәи"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Create a colour with the specified amount of red, green, and blue. All values must be between 0 and 100."; // untranslated +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"] = "Skip the rest of this loop, and continue with the next iteration."; // untranslated +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_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"] = "ацикл %1 ала %2 инаркны %3 рҟынӡа ашьаҿа %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"] = "Иацнаҵоит аҭагыазаашьа аблок \"акәзар\" ахь"; +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"] = "Аҭагылазаашьа иашазар, инанагӡоит акомандақәа."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Аҭагылазаашьа иашазар, инанагӡоит актәи аблок акомандақәа. Акәымзар инанагӡоит аҩбатәи аблок акомандақәа."; +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://ru.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_VARIABLE"] = "Ианыхтәуп аҽеиҭак '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg["DELETE_X_BLOCKS"] = "Ианыхтәуп %1 блокк"; +Blockly.Msg["DISABLE_BLOCK"] = "Иаҿыхтәуп Аблок"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Акопиа ахыхтәуп"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +Blockly.Msg["ENABLE_BLOCK"] = "Иаҿыхтәуп Аблокқәа"; +Blockly.Msg["EXPAND_ALL"] = "Иаарҧштәуп Аблокқәа"; +Blockly.Msg["EXPAND_BLOCK"] = "Иаарҧштәуп Аблокқәа"; +Blockly.Msg["EXTERNAL_INPUTS"] = "External Inputs"; // untranslated +Blockly.Msg["HELP"] = "Ацхыраара"; +Blockly.Msg["INLINE_INPUTS"] = "Inline Inputs"; // untranslated +Blockly.Msg["IOS_CANCEL"] = "Аҟәыхра"; +Blockly.Msg["IOS_ERROR"] = "Агха"; +Blockly.Msg["IOS_OK"] = "OK"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Иацҵатәуп аҭагаларатә ҽеиҭак"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Аоператорқәа азин рыҭара"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "Аҭаларҭа"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Иацҵатәуп"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Иацҵатәуп аҽеиҭак"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Ианыхтәуп"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Шәара ишәылшом аҽеиҭак азы иҭацәу ахьӡ ахархәара"; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Ахьӡ аҧсахра"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Аҽеиҭак ахьӡ"; +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"] = "иаҧҵатәуп ахьӡынҵа аҟынтәи"; +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"] = "игатәуп"; +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"] = "Иҳанаҭоит ахьӡынҵа актәи аелемент."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Returns the item at the specified position in a list."; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Иҳанаҭоит ахьӡынҵа аҵыхәтәантәи аелемент."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Иҳанаҭоит ахьӡынҵа иарбанзаалакь елементк."; +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"] = "Removes and returns the item at the specified position in a list."; // 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"] = "Ианнахәуеит ахьӡынҵа актәи аелемент."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Removes the item at the specified position in a list."; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Ианнахәуеит ахьӡынҵа аҵыхәтәантәи аелемент."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Ианнахәуеит ахьӡынҵа иарбанзаалакь елементк."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "to # from end"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "№ ала"; +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_FROM_END_TOOLTIP"] = "%1 - аҵыхәтәантәи аелемент."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 - актәи аелемент."; +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 %1 if item is not found."; // untranslated +Blockly.Msg["LISTS_INLIST"] = "ахьӡынҵа аҟны"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 ҭацәуп"; +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"] = "Иҳанаҭоит ахьӡынҵа аура."; +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_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "Inserts the item at the specified position in a list."; // untranslated +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Иацнаҵоит аелемент ахьӡынҵа анҵәамҭахь."; +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"] = "Sets the item at the specified position in a list."; // 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"] = "еиҵоу-еиҳауала"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "еиҳау-еиҵоуала"; +Blockly.Msg["LISTS_SORT_TITLE"] = "еилыҧшаатәуп %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Еилыҧшаатәуп ахьӡынҵа акопиа."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alphabetic, ignore case"; // untranslated +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "ахыҧхьаӡаратәи"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "алфавитла"; +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"] = "еизгатәуп атеқст ахьӡынҵа аҟынтәи"; +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://ru.wikipedia.org/wiki/Аиҟарамра"; +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"] = "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://ru.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"] = "Return the first number raised to the power of the second number."; // untranslated +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // 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"] = "Иацнаҵоит ахыҧхьаӡара аҽеиҭак'%1' ахь."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://ru.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_(graphics)"; // 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://ru.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://ru.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"] = "standard deviation of list"; // untranslated +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"] = "Return a list of the most common item(s) in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Иҳанаҭоит ахьӡынҵа аҟны иарбанзаалакь елементк."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Return the standard deviation of the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Иҳанаҭоит ахьӡынҵа иаҵанакуа ахыҧхьаӡарақәа зегьы реицҵалыҵ."; +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"] = "иарбанзаалакь ахыҧхьашара 0 инаркны (иалаҵаны) 1 аҟынӡа"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Иҳанаҭоит иарбанзаалакь ахыҧхьаӡара 0.0 инаркны (иалаҵаны) 1.0 аҟынӡа."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "иарбанзаалакь еибгоу ахыҧхьаӡара %1 инаркны %2 нӡа"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Return a random integer between the two specified limits, inclusive."; // untranslated +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://ru.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"] = "Round a number up or down."; // untranslated +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; // untranslated +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "амодуль"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "square root"; // untranslated +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_LN"] = "Иҳанаҭоит ахыҧхьаӡара иҧсабаратәу алагорифм."; +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_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://ru.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["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "Иаҧҵатәуп аҽеиҭак"; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Аҽеиҭак ахьӡ ҿыц:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "Аоператорқәа азин рыҭара"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "аҟынтәи:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://ru.wikipedia.org/wiki/Ацхыраагӡатә программа"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://ru.wikipedia.org/wiki/Ацхыраагӡатә программа"; +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"] = "Абри афункциа ахҳәа азыҟашәҵа..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "иҟаҵатәуп џьара акы"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "азы"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Иаҧнаҵоит апроцедура, аҵакы ҳазымҭо."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "ирхынҳәтәуп"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Иаҧнаҵоит апроцедура, аҵакы ҳазҭо."; +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"] = "Актәи аҵакы иашазар, иҳанаҭоит аҩбатәи аҵакы."; +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_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_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "%1 ахьы иацҵатәуп атеқст %2"; +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_LAST"] = "игатәуп аҵыхәтәантәи анбан"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "игатәуп иарбанзаалакь нбанк"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "атеқст %1 %2 аҟны"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Иҳанаҭоит анбан иарбоу апозициа аҟны"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // 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"] = "Иҳанаҭоит атеқст аҟны иарбоу ахәҭа."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-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_TITLE"] = "атеқст %1 %2 %3 аҟны"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 ҭацәуп"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Иҳанаҭоит аҵакы аиаша, иҟоу атеқст ҭацәызар."; +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"] = "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"] = "аура %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"] = "Иакьыҧхьуеит атеқст, ахыҧхьаӡара ма даҽа обиеқтк."; +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_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "иҧсахтәуп %1 %2 ала %3 аҟны"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://ru.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"] = "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["UNNAMED_KEY"] = "unnamed"; // 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 +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Иҳанаҭоит аҽеиҭак аҵакы."; +Blockly.Msg["VARIABLES_SET"] = "иаҭатәуп %1 = %2"; +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["VARIABLE_ALREADY_EXISTS"] = "Аҽеиҭак ахьӡ '%1' змоу ыҟоуп."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/ar.js b/js/msg/js/ar.js new file mode 100644 index 0000000..67b9bab --- /dev/null +++ b/js/msg/js/ar.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "أضف تعليقًا"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "لايمكن حذف متغير \"%1\" بسبب انه جزء من الدالة \"%2\""; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "تغيير قيمة:"; +Blockly.Msg["CLEAN_UP"] = "ترتيب القطع"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "الكتل المطوية تحتوي على تحذيرات."; +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/"; +Blockly.Msg["COLOUR_BLEND_RATIO"] = "نسبة"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "دمج"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "دمج لونين ببعضهما البعض بنسبة (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://ar.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"; +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"] = "عد بـ %1 من %2 إلى %3 بمعدل %4"; +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/For_loop"; +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_VARIABLE"] = "حذف المتغير %1"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "حذف%1 1 استخدامات المتغير '%2'؟"; +Blockly.Msg["DELETE_X_BLOCKS"] = "احذف %1 قطع"; +Blockly.Msg["DISABLE_BLOCK"] = "عطّل القطعة"; +Blockly.Msg["DUPLICATE_BLOCK"] = "مكرر"; +Blockly.Msg["DUPLICATE_COMMENT"] = "تعليق مكرر"; +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["IOS_CANCEL"] = "إلغاء"; +Blockly.Msg["IOS_ERROR"] = "خطأ"; +Blockly.Msg["IOS_OK"] = "أوافق"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+اضافة ادخال"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "العبارات المسموحة"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "هذه الدالة لها مدخلات مكررة."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "المدخلات"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "أضف"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+اضف متغير"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "احذف"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "لا يمكنك استخدام اسم متغير فارغ."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "أعد التسمية"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "اسم المتغير"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +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_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"] = "أتشئ قائمة مع"; +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"] = "# من نهاية"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; +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"] = "يرجع العنصر الأول في قائمة ما."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "يقوم بإرجاع العنصر في الموضع المحدد في قائمة ما."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "يرجع العنصر الأخير في قائمة ما."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "يرجع عنصرا عشوائيا في قائمة."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "يزيل ويرجع العنصر الأول في قائمة."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "يزيل ويقوم بإرجاع العنصر في الموضع المحدد في قائمة ما."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "يزيل ويرجع العنصر الأخير في قائمة ما."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "يزيل و يرجع عنصرا عشوائيا في قائمة ما."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "يزيل العنصر الأول في قائمة ما."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "يزيل العنصر الموجود في الموضع المحدد في قائمة ما."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "يزيل العنصر الأخير في قائمة ما."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "يزيل عنصرا عشوائيا في قائمة ما."; +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"] = "احصل على قائمة فرعية من الأول"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "احصل على قائمة فرعية من # من نهاية"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "احصل على قائمة فرعية من #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "يقوم بإنشاء نسخة من الجزء المحدد من قائمة ما."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 هو العنصر الأخير."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 هو العنصر الأول."; +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"] = "تقوم بإرجاع مؤشر التواجد الأول/الأخير في القائمة. تقوم بإرجاع %1 إذا لم يتم العثور على النص."; +Blockly.Msg["LISTS_INLIST"] = "في قائمة"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 فارغ"; +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"] = "تقوم بإرجاع طول قائمة."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "إنشئ قائمة مع العنصر %1 %2 مرات"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "انشئ قائمة تتألف من القيمة المعطاة متكررة لعدد محدد من المرات."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "عكس %1"; +Blockly.Msg["LISTS_REVERSE_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_SET"] = "تعيين"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "يقوم بإدراج هذا العنصر في بداية قائمة."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "يقوم بإدخال العنصر في الموضع المحدد في قائمة ما."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "ألصق هذا العنصر بنهاية قائمة."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "ادخل العنصر عشوائياً في القائمة."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "يحدد العنصر الأول في قائمة."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "يحدد العنصر في الموضع المحدد في قائمة ما."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "تصاعديا"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "تنازليا"; +Blockly.Msg["LISTS_SORT_TITLE"] = "رتب %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "فرز نسخة من القائمة."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "أبجديا، وتجاهل الحالة"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "رقمي"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "أبجديًا"; +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"] = "إعداد نص من القائمة"; +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"] = "يرجع صحيح أو خاطئ."; +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"] = "فارغ"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +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:"; +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "إذا كانت العبارة خاطئة"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "إذا كانت العبارة صحيحة"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "تحقق الشرط في 'الاختبار'. إذا كان الشرط صحيح، يقوم بإرجاع قيمة 'اذا كانت العبارة صحيحة'؛ خلاف ذلك يرجع قيمة 'اذا كانت العبارة خاطئة'."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +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"] = "يرجع الرقم الأول مرفوع إلى تربيع الرقم الثاني."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 من X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "عودة قوس ظل النقطة (س، ص) بالدرجات من -180 إلى 180."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.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://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "ير جع واحد من الثوابت الشائعة : π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "تقيد %1 منخفض %2 مرتفع %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "تقييد العددليكون بين الحدود المحددة (ضمناً)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +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://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "باقي %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "يرجع الباقي من قسمة الرقمين."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://ar.wikipedia.org/wiki/%D8%B9%D8%AF%D8%AF"; +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"] = "^"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "كسر عشوائي"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "يرجع جزء عشوائي بين 0.0 (ضمنياً) و 1.0 (خارجيا)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = " عدد صحيح عشوائي من %1 إلى %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "يرجع عدد صحيح عشوائي بين حدين محددين, ضمنيا."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +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"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "مطلق"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "الجذر التربيعي"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "يرجع القيمة المطلقة لرقم."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "يرجع ه‍ (e) مرفوعا لأس بقيمة الرقم المدخل."; +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"] = "يرجع مضروب الرقم 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"] = "جيب تمام"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg["MATH_TRIG_SIN"] = "جيب"; +Blockly.Msg["MATH_TRIG_TAN"] = "ظل"; +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["NEW_COLOUR_VARIABLE"] = "انشاء متغير لوني..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "انشاء متغير رقمي..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "انشاء متغير نصي..."; +Blockly.Msg["NEW_VARIABLE"] = "إنشاء متغير..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "اسم المتغير الجديد:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "نوع متغير جديد:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "اسمح بالبيانات"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "مع:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "تشغيل الدالة المعرفة من قبل المستخدم '%1'."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "تشغيل الدالة المعرفة من قبل المستخدم %1 واستخدام مخرجاتها."; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "مع:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "إنشئ '%1'"; +Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "صف هذه الوظيفة..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "القيام بشيء ما"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "إلى"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "انشئ دالة بدون مخرجات ."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +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_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' إلى:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "إلى %1 إلصق نص %2"; +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"] = "الى حروف العنوان"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "الى حروف كبيرة"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "يرجع نسخة من النص في حالة مختلفة."; +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_LAST"] = "احصل على آخر حرف"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "الحصول على حرف عشوائي"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "في النص %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "يرجع حرف ما في الموضع المحدد."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "العدد %1 في %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "احسب كم عدد بعض النصوص تتكرر ضمن نص اخر."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "إضف عنصر إلى النص."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "الانضمام إلى"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "أضف, إحذف, أو أعد ترتيب المقاطع لإعادة تكوين النص من القطع التالية."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "إلى حرف # من نهاية"; +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"] = "الحصول على سلسلة فرعية من الحرف الأول"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "الحصول على سلسلة حروف فرعية من الحرف # من نهاية"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "الحصول على سلسلة حروف فرعية من الحرف #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "يرجع جزء معين من النص."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "ابحث عن التواجد الأول للنص"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "ابحث عن التواجد الأخير للنص"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "في النص %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "تقوم بإرجاع مؤشر التواجد الأول/الأخير للنص الأول في النص الثاني. تقوم بإرجاع %1 إذا لم يتم العثور على النص."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 فارغ"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "يرجع \"صحيح\" إذا كان النص المقدم فارغ."; +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"] = "اطبع النص المحدد أو العدد أو قيمة أخرى."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "انتظر ادخال المستخذم لرقم ما."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "انتظر ادخال المستخدم لنص ما."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "انتظر ادخال المستخدم لرقم ما مع اظهار رسالة"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "انتظر ادخال المستخدم لنص ما مع اظهار رسالة"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "بدل %1 ب %2 في %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "استبدل جميع حالات حدوث بعض النصوص داخل نص آخر."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "عكس %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "يعكس ترتيب حروف النص"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +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["UNNAMED_KEY"] = "غير مسمى"; +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_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["VARIABLE_ALREADY_EXISTS"] = "المتغير '%1' موجود بالفعل"; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "متغير بأسم '%1' معرف من نوع اخر : '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "مساحة عمل بلوكلي"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "قل شيئا..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/az.js b/js/msg/js/az.js new file mode 100644 index 0000000..d7a5443 --- /dev/null +++ b/js/msg/js/az.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Şərh əlavə et"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "'%1' dəyişənini silmək mümkün deyil, çünki o '%2' funksiyasının təyin hissəsidir"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Qiyməti dəyiş:"; +Blockly.Msg["CLEAN_UP"] = "Blokları təmizlə"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "Blokları yığ"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Bloku yığ"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "rəng 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "rəng 2"; +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://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"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Təsadüfi bir rəng seçin."; +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ə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"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "dövrün növbəti addımından davam et"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Cari dövrdən çıx."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Bu dövrün qalanını ötür və növbəti addımla davam et."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Xəbərdarlıq: Bu blok ancaq dövr daxilində istifadə oluna bilər."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "hər element üçün %1 siyahıda %2"; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "say: %1 %2 ilə başlayıb, %3 qiymətinə kimi %4 qədər dəyiş"; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "\"Əgər\" blokuna bir şərt əlavə et."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "\"Əgər\" blokuna qalan bütün halları əhatə edəb son bir şərt əlavə et."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["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ş."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "əks halda"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "əks halda əgər"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "əgər"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Əgər qiymət doğrudursa, onda bəzi əmrləri yerinə yetir."; +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://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."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +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"] = "Bütün %1 blok silinsin?"; +Blockly.Msg["DELETE_BLOCK"] = "Bloku sil"; +Blockly.Msg["DELETE_VARIABLE"] = "'%1' adlı dəyişəni sil"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "'%2' dəyişəninin %1 istifadəsini silək?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "%1 bloku sil"; +Blockly.Msg["DISABLE_BLOCK"] = "Bloku söndür"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Dublikat"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Şərhin nüsxəsini yarat"; +Blockly.Msg["ENABLE_BLOCK"] = "Bloku aktivləşdir"; +Blockly.Msg["EXPAND_ALL"] = "Blokları aç"; +Blockly.Msg["EXPAND_BLOCK"] = "Bloku aç"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Xarici girişlər"; +Blockly.Msg["HELP"] = "Kömək"; +Blockly.Msg["INLINE_INPUTS"] = "Sətiriçi girişlər"; +Blockly.Msg["IOS_CANCEL"] = "Ləğv et"; +Blockly.Msg["IOS_ERROR"] = "Xəta"; +Blockly.Msg["IOS_OK"] = "OK"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Giriş əlavə et"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Operatorlara icazə"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Bu funksiyada təkrarlanan giriş dəyişənləri vardır."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "GİRİŞ"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Əlavə et"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Dəyişən əlavə et"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Sil"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Adsız dəyişən istifadə edə bilməzsiniz."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Adını dəyiş"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Dəyişənin adı"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "boş siyahı düzəlt"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Heç bir verilən qeyd olunmamış, uzunluğu 0 olan bir siyahı verir"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "siyahı"; +Blockly.Msg["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."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "bunlardan siyahı düzəlt"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Siyahıya element əlavə edin."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "İstənilən ölçülü siyahı yaradın."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "birinci"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "axırdan # nömrəli"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; +Blockly.Msg["LISTS_GET_INDEX_GET"] = "götür"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "götür və sil"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "axırıncı"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "təsadüfi"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "yığışdır"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Siyahının ilk elementini qaytarır."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Siyahıdan təyin olunmuş indeksli elementi qaytarır."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Siyahının son elementini qaytarır."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Siyahıdan hər hansı təsadüfi elementi qaytarır."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Siyahıdan ilk elementi silir və qaytarır."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Siyahıdan təyin olunmuş indeksli elementi silir və qaytarır."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Siyahıdan son elementi silir və qaytarır."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Siyahıdan təsadufi elementi silir və qaytarır."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Siyahıdan ilk elementi silir."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Siyahıdan təyin olunmuş indeksli elementi silir."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Siyahıdan son elementi silir."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Siyahıdan təsadüfi bir elementi silir."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "sondan # nömrəliyə"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "# nömrəliyə"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "Sonuncuya"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "Birincidən alt-siyahını alın"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "# sonuncudan alt-siyahını alın"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "# - dən alt-siyahını alın"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Siyahının təyin olunmuş hissəsinin surətini yaradın."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 son elementdir."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 ilk elementdir."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "Element ilə ilk rastlaşma indeksini müəyyən edin"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "Element ilə son rastlaşma indeksini müəyyən edin"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Elementin siyahıda ilk/son rastlaşma indeksini qaytarır. Əgər siyahıda mətn tapılmadısa, %1 qaytarılır."; +Blockly.Msg["LISTS_INLIST"] = "siyahıda"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 boşdur"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Siyahı boşdursa \"doğru\" cavabını qaytarır."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "%1 siyahısının uzunluğu"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Siyahının uzunluğunu verir."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "%1 elementinin %2 dəfə təkrarlandığı siyahı düzəlt"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Təyin olunmuş elementin/qiymətin təyin olunmuş sayda təkrarlandığı siyahını yaradır."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "əksinə dəyiş %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Siyahının nüsxəsini əksinə dəyiş."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "Kimi"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "daxil et"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "təyin et"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Elementi siyahının əvvəlinə daxil edir."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Elementi siyahıda göstərilən yerə daxil edir."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Elementi siyahının sonuna artırır."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Elementi siyahıda təsadüfi seçilmiş bir yerə atır."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Siyahıda birinci elementi təyin edir."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Siyahının göstərilən yerdəki elementini təyin edir."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "artan üzrə"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "azalan üzrə"; +Blockly.Msg["LISTS_SORT_TITLE"] = "%1 %2 %3 sortlaşdır"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Siyahının nüsxəsini sortlaşdır."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "əlifba üzrə, registrı nəzərə almadan"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "say üzrə"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "əlifba üzrə"; +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"] = "mətndən siyahı düzəlt"; +Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "siyahıdan mətn düzəlt"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Mətnlər siyahısından ayırıcılarla birgə bir mətn yaradır."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Mətni ayırıcılara görə bölərək mətnlər siyahısı yaradır."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "ayırıcıyla"; +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 \"səhf\" cavanını qaytarır."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "doğru"; +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."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Birinci giriş ikincidən kiçikdirsə \"doğru\" cavabını qaytarır."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Birinci giriş ikincidən kiçik və ya bərarbərdirsə \"doğru\" cavabını qaytarır."; +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 \"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."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "və"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "və ya"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Hər iki giriş \"doğru\"-dursa \"doğru\" cavabını qaytarır."; +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 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"] = "+"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://az.wikipedia.org/wiki/Hesab"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "İki ədədin cəmini qaytarır."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "İki ədədin nisbətini qaytarır."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "İki ədədin fərqini qaytarır."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "İki ədədin hasilini verir."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Birinci ədədin ikinci ədəd dərəcəsindən qüvvətini qaytarır."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "(X,Y) nöqtələrinin -180 - 180 dərəcədə arktangensini hesabla."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +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://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_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "%1 üçün ən aşağı %2, ən yuxarı %3 olmağı tələb et"; +Blockly.Msg["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)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "bölünür"; +Blockly.Msg["MATH_IS_EVEN"] = "cütdür"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "mənfidir"; +Blockly.Msg["MATH_IS_ODD"] = "təkdir"; +Blockly.Msg["MATH_IS_POSITIVE"] = "müsbətdir"; +Blockly.Msg["MATH_IS_PRIME"] = "sadədir"; +Blockly.Msg["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."; +Blockly.Msg["MATH_IS_WHOLE"] = "tamdır"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +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://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ı"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "siyahının maksimumu"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "siyahının medianı"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "siyahının minimumu"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "Siyahı modları( Ən çox rastlaşılan elementləri)"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "siyahıdan təsadüfi seçilmiş bir element"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "Siyahının standart deviasiyası"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "Siyahının cəmi"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Siyahıdaki ədədlərin ədədi ortasını qaytarır."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Siyahıdaki ən böyük elementi qaytarır."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Siyahının median elementini qaytarır."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Siyahıdaki ən kiçik ədədi qaytarır."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Siyahıdaki ən çox rastlanan element(lər)dən ibarət siyahı qaytarır."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Siyahıdan təsadüfi bir element qaytarır."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Siyahının standart deviasiyasını qaytarır."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Siyahıdakı bütün ədədlərin cəmini qaytarır."; +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"] = "təsadüfi kəsr"; +Blockly.Msg["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."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "%1 ilə %2 arasından təsadüfi tam ədəd"; +Blockly.Msg["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."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +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://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."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "e sabitinin verilmiş ədədə qüvvətini qaytarır."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Ədədin natural loqarifmini tapır."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Ədədin 10-cu dərəcədən loqarifmini tapır."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Ədədin əksini qaytarır."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "10-un verilmiş ədədə qüvvətini qaytarır."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Ədədin kvadrat kökünü qaytarır."; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +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://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."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Ədədin arcsinusunu qaytarır."; +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["NEW_COLOUR_VARIABLE"] = "Yeni rəng dəyişəni..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Yeni rəqəm dəyişəni..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Yeni sətir dəyişəni..."; +Blockly.Msg["NEW_VARIABLE"] = "Yeni dəyişən..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Yeni dəyişənin adı:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Yeni dəyişənin tipi:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "operatorlara icazə"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "ilə:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Yaradılmış '%1' funksiyasını çalışdır."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Yaradılmış '%1' funksiyasını çalışdır və nəticəni istifadə et."; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "ilə:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "'%1' yarat"; +Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Bu funksiyanı təsvir et"; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "hansısa əməliyyat"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "icra et:"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Nəticəsi olmayan funksiya yaradır."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "qaytar"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Nəticəsi olan funksiya yaradır."; +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Xəbərdarlıq: Bu funksiyanın təkrar olunmuş parametrləri var."; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Funksiyanın təyinatını vurğula"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Əgər bir dəyər \"doğru\"-dursa onda ikinci dəyəri qaytar."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Xəbərdarlıq: Bu blok ancaq bir funksiyanın təyinatı daxilində işlədilə bilər."; +Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "Giriş adı:"; +Blockly.Msg["PROCEDURES_MUTATORARG_TOOLTIP"] = "Funksiyaya giriş parametrləri əlavə et."; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TITLE"] = "girişlər"; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TOOLTIP"] = "Bu funksiyanın giriş parametrləri üçün əlavə et, sil, və ya yenilə."; +Blockly.Msg["REDO"] = "İrəli"; +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ş:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "bu mətnin sonuna: %1 bu mətni əlavə et: %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "'%1' dəyişəninin sonuna nəsə əlavə et."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "kiçik hərflərlə"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "Baş Hərflərlə"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "BÖYÜK HƏRFLƏRLƏ"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Mətndə hərflərin böyük-kiçikliyini dəyiş."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "birinci hərfi götür"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "axırdan bu nömrəli hərfi götür"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "bu nömrəli hərfi götür"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "axırıncı hərfi götür"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "təsadüfi hərf götür"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "mətndə %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Göstərilən mövqedəki hərfi qaytarır."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "%2 içindən %1 sayını hesabla"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Hesablayaq, mətnin bu hissəsi başqa mətndə neçə dəfə rast gəlinir."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Mətnə bir element əlavə et."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "birləşdir"; +Blockly.Msg["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."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "axırdan bu nömrəli hərfə qədər"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "bu nömrəli hərfə qədər"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "son hərfə qədər"; +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"] = "mətndə"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "Mətnin surətini ilk hərfdən"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "Mətnin surətini sondan bu nömrəli # hərfdən"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "Mətnin surətini bu nömrəli hərfdən"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Mətnin təyin olunmuş hissəsini qaytarır."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "Bu mətn ilə ilk rastlaşmanı tap:"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "Bu mətn ilə son rastlaşmanı tap:"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "mətndə %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Birinci mətnin ikinci mətndə ilk/son rastlaşma indeksini qaytarır. Əgər rastlaşma baş verməzsə, %1 qaytarır."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 boşdur"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Verilmiş mətn boşdursa, doğru qiymətini qaytarır."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "Verilmişlərlə mətn yarat"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "İxtiyari sayda elementlərinin birləşməsi ilə mətn parçası yarat."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "%1 - ın uzunluğu"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Verilmiş mətndəki hərflərin(sözlər arası boşluqlar sayılmaqla) sayını qaytarır."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "%1 - i çap elə"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Təyin olunmuş mətn, ədəd və ya hər hansı bir başqa elementi çap elə."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "İstifadəçiyə ədəd daxil etməsi üçün sorğu/tələb göndərin."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "İstifadəçiyə mətn daxil etməsi üçün sorğu/tələb göndərin."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "İstifadəçiyə ədəd daxil etməsi üçün sorğunu/tələbi ismarıc kimi göndərin"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "İstifadəçiyə mətn daxil etməsi üçün sorğunu/tələbi ismarıc ilə göndərin"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "%3 -də %1 əvəz et %2"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Bütün uyğunluqlu bəzi mətnlərin digər bəzi mətnlərə dəyişdirilməsi."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "əksinə dəyiş %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Mətndəki simvolların ardıcıllığını əksinə dəyiş."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Mətndəki hərf, söz və ya sətir."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +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"] = "Bugün"; +Blockly.Msg["UNDO"] = "Geri"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // 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 +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Bu dəyişənin qiymətini qaytarır."; +Blockly.Msg["VARIABLES_SET"] = "%1 - i bu qiymət ilə təyin et: %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "'%1 - i götür' - ü yarat"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Bu dəyişəni daxil edilmiş qiymətə bərabər edir."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "'%1' adlı dəyişən artıq mövcuddur."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "'%1' adlı dəyişən artıq '%2': tipində istifadə edilir ."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Buraya nə isə yaz..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/ba.js b/js/msg/js/ba.js new file mode 100644 index 0000000..0e2ca7b --- /dev/null +++ b/js/msg/js/ba.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Фекер өҫтәргә"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Мәғәнәне үҙгәртегеҙ:"; +Blockly.Msg["CLEAN_UP"] = "Блоктарҙы таҙартырға"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // 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"] = "https://www.december.com/html/spec/colorpercompact.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_VARIABLE"] = "Delete the '%1' variable"; // untranslated +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg["DELETE_X_BLOCKS"] = " %1 блокты юйҙырырға"; +Blockly.Msg["DISABLE_BLOCK"] = "Блокты һүндерергә"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Күсереп алырға"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +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["IOS_CANCEL"] = "Cancel"; // untranslated +Blockly.Msg["IOS_ERROR"] = "Error"; // untranslated +Blockly.Msg["IOS_OK"] = "OK"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Add Input"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INPUTS"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Add"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Add Variable"; // untranslated +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Delete"; // untranslated +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "You can't use an empty variable name."; // untranslated +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Rename"; // untranslated +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Variable name"; // untranslated +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"] = "Returns the item at the specified position in a list."; // 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"] = "Removes and returns the item at the specified position in a list."; // 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"] = "Removes the item at the specified position in a list."; // 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_FROM_END_TOOLTIP"] = "%1 is the last item."; // untranslated +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 is the first item."; // 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 %1 if item is not found."; // untranslated +Blockly.Msg["LISTS_INLIST"] = "исемлеккә"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 буш"; +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_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "Inserts the item at the specified position in a list."; // 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"] = "Sets the item at the specified position in a list."; // 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_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +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_(graphics)"; // 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["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "Яңы үҙгәреүсән..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Яңы үҙгәреүсәндең исеме:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // 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/Subroutine"; // 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/Subroutine"; // 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_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "to %1 append text %2"; // 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_LAST"] = "һуңғы хәрефте алырға"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "осраҡлы хәрефте алырға"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returns the letter at the specified position."; // untranslated +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // 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_OPERATOR_FIRST"] = "текстың тәүге инеүен табырға"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "Текстың һуңғы инеүен табырға"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "текстҡа %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 буш"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Returns true if the provided text is empty."; // untranslated +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_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // 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["UNNAMED_KEY"] = "unnamed"; // 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["VARIABLE_ALREADY_EXISTS"] = "A variable named '%1' already exists."; // untranslated +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/bcc.js b/js/msg/js/bcc.js new file mode 100644 index 0000000..9e6888e --- /dev/null +++ b/js/msg/js/bcc.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "افزودن نظر"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "تغییر مقدار:"; +Blockly.Msg["CLEAN_UP"] = "Clean up Blocks"; // untranslated +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "فروپاشی بلوک‌ها"; +Blockly.Msg["COLLAPSE_BLOCK"] = "فروپاشی بلوک"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "رنگ ۱"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "رنگ ۲"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "نسبت"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "مخلوط"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "دو رنگ را با نسبت مشخص‌شده مخلوط می‌کند (۰٫۰ - ۱٫۰)"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://fa.wikipedia.org/wiki/%D8%B1%D9%86%DA%AF"; +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"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "قرمز"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "رنگ با"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "ساخت یک رنگ با مقدار مشخص‌شده‌ای از قرمز، سبز و آبی. همهٔ مقادیر باید بین ۰ تا ۱۰۰ باشند."; +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"] = "با تعداد %1 از %2 به %3 با گام‌های %4"; +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://fa.wikipedia.org/wiki/%D8%AD%D9%84%D9%82%D9%87_%D9%81%D9%88%D8%B1"; +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"] = "Delete all %1 blocks?"; // untranslated +Blockly.Msg["DELETE_BLOCK"] = "حذف بلوک"; +Blockly.Msg["DELETE_VARIABLE"] = "Delete the '%1' variable"; // untranslated +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg["DELETE_X_BLOCKS"] = "حذف بلوک‌های %1"; +Blockly.Msg["DISABLE_BLOCK"] = "غیرفعال‌سازی بلوک"; +Blockly.Msg["DUPLICATE_BLOCK"] = "تکراری"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +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["IOS_CANCEL"] = "Cancel"; // untranslated +Blockly.Msg["IOS_ERROR"] = "Error"; // untranslated +Blockly.Msg["IOS_OK"] = "OK"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Add Input"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INPUTS"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Add"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Add Variable"; // untranslated +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Delete"; // untranslated +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "You can't use an empty variable name."; // untranslated +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Rename"; // untranslated +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Variable name"; // 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"] = "فهرستی با طول صفر شامل هیچ رکورد داده‌ای بر می‌گرداند."; +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"] = "ایجاد فهرست با"; +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"] = "# از انتها"; +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"] = "اولین مورد یک فهرست را بر می‌گرداند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "موردی در محل مشخص‌شده بر می‌گرداند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "آخرین مورد در یک فهرست را بر می‌گرداند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "یک مورد تصادفی در یک فهرست بر می‌گرداند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "اولین مورد مشخص‌شده در فهرست را حذف و بر می‌گرداند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "مورد در محل مشخص‌شده در فهرست را حذف و بر می‌گرداند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "آخرین مورد مشخص‌شده در فهرست را حذف و بر می‌گرداند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "مورد تصادفی‌ای را در فهرست حذف و بر می‌گرداند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "اولین مورد را در یک فهرست حذف می‌کند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "مورد مشخص‌شده در موقعیت مشخص در یک فهرست را حذف و بر می‌گرداند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "آخرین مورد را در یک فهرست حذف می‌کند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "یک مورد تصادفی را یک فهرست حذف می‌کند."; +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"] = "گرفتن زیرمجموعه‌ای از ابتدا"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "گرفتن زیرمجموعه‌ای از # از انتها"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "گرفتن زیرمجموعه‌ای از #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "کپی از قسمت مشخص‌شدهٔ لیست درست می‌کند."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 آخرین مورد است."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 اولین مورد است."; +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"] = "شاخصی از اولین/آخرین رخ‌داد مورد در فهرست را بر می‌گرداند. %1 بر می‌گرداند اگر متن موجود نبود."; +Blockly.Msg["LISTS_INLIST"] = "مہ لیست‌ئا"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 خالی است"; +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"] = "طول یک فهرست را برمی‌گرداند."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "فهرستی با %1 تکرارشده به اندازهٔ %2 می‌سازد"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "فهرستی شامل مقادیر داده‌شدهٔ تکرار شده عدد مشخص‌شده می‌سازد."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "موردی به ته فهرست اضافه می‌کند."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "موردی در موقعیت مشخص‌شده در یک فهرست اضافه می‌کند."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "موردی به ته فهرست الحاق می‌کند."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "مورد را به صورت تصادفی در یک فهرست می‌افزاید."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "اولین مورد در یک فهرست را تعیین می‌کند."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "مورد مشخص‌شده در یک فهرست را قرار می‌دهد."; +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["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://fa.wikipedia.org/wiki/%D9%86%D8%A7%D8%A8%D8%B1%D8%A7%D8%A8%D8%B1%DB%8C"; +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://fa.wikipedia.org/wiki/%D8%AD%D8%B3%D8%A7%D8%A8"; +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_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["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"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "تغییر %1 با %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "افزودن یک عدد به متغیر '%1'."; +Blockly.Msg["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"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "یکی از مقادیر مشترک را برمی‌گرداند: π (۳٫۱۴۱…)، e (۲٫۷۱۸...)، φ (۱٫۶۱۸)، sqrt(۲) (۱٫۴۱۴)، sqrt(۱/۲) (۰٫۷۰۷...) و یا ∞ (بی‌نهایت)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // 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://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"; +Blockly.Msg["MATH_MODULO_TITLE"] = "باقی‌ماندهٔ %1 + %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "باقی‌ماندهٔ تقسیم دو عدد را بر می‌گرداند."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://fa.wikipedia.org/wiki/%D8%B9%D8%AF%D8%AF"; +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://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"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "کسر تصادفی"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "بازگرداندن کسری تصادفی بین ۰٫۰ (بسته) تا ۱٫۰ (باز)."; +Blockly.Msg["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"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "عدد صحیح تصادفی بین %1 تا %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "یک عدد تصادفی بین دو مقدار مشخص‌شده به صورت بسته باز می‌گرداند."; +Blockly.Msg["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"; +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://fa.wikipedia.org/wiki/%D8%B1%DB%8C%D8%B4%D9%87_%D8%AF%D9%88%D9%85"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "مطلق"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "ریشهٔ دوم"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "قدر مطلق یک عدد را بازمی‌گرداند."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "بازگرداندن توان e یک عدد."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "لوگاریتم طبیعی یک عدد را باز می‌گرداند."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "بازگرداندن لگاریتم بر پایهٔ ۱۰ یک عدد."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "منفی‌شدهٔ یک عدد را باز می‌گرداند."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "بازگرداندن توان ۱۰ یک عدد."; +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://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"; +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["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "متغیر تازه..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "نام متغیر تازه:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "اجازه اظهارات"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "با:"; +Blockly.Msg["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"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "اجرای تابع تعریف‌شده توسط کاربر «%1»."; +Blockly.Msg["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"; +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_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "انجام چیزی"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "به"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "تابعی می‌سازد بدون هیچ خروجی."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +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_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» به:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "به %1 الحاق متن %2"; +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"] = "به حروف بزرگ عنوان"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "به حروف بزرگ"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "بازگرداندن کپی متن در حالتی متفاوت."; +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_LAST"] = "گرفتن آخرین حرف"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "گرفتن حرف تصادفی"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "حرفی در موقعیت مشخص‌شده بر می‌گرداند."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "افزودن یک مورد به متن."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "عضویت"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "اضافه، حذف یا ترتیب‌سازی قسمت‌ها برای تنظیم مجدد این بلوک اگر مسدود است."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "به حرف # از انتها"; +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"] = "گرفتن زیرمتن از اولین حرف"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "گرفتن زیرمتن از حرف # به انتها"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "گرفتن زیرمتن از حرف #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "قسمت مشخصی‌شده‌ای از متن را بر می‌گرداند."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "اولین رخداد متن را بیاب"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "آخرین رخداد متن را بیاب"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "در متن %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "شاخصی از اولین آخرین رخ‌داد متن اول در متن دوم بر می‌گرداند. اگر متن یافت نشد %1 باز می‌گرداند."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 خالی است"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "اضافه‌کردن صحیح اگر متن فراهم‌شده خالی است."; +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"] = "چاپ متن، عدد یا هر مقدار دیگر مشخص‌شده."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "اعلان برای کاربر با یک عدد."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "اعلان برای کاربر برای یک متن."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "اعلان برای عدد با پیام"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "اعلان برای متن با پیام"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg["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"; +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"] = "Today"; // untranslated +Blockly.Msg["UNDO"] = "Undo"; // untranslated +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // 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 +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["VARIABLE_ALREADY_EXISTS"] = "A variable named '%1' already exists."; // untranslated +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/be-tarask.js b/js/msg/js/be-tarask.js new file mode 100644 index 0000000..b8459e8 --- /dev/null +++ b/js/msg/js/be-tarask.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Дадаць камэнтар"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Немагчыма выдаліць зьменную «%1», таму што яна зьяўляецца часткай вызначэньня функцыі «%2»"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Зьмяніць значэньне:"; +Blockly.Msg["CLEAN_UP"] = "Ачысьціць блёкі"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Згорнутыя блёкі ўтрымліваюць папярэджаньні."; +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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "дзеля"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "зьмяшаць"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Зьмешвае два колеры ў дадзенай прапорцыі (0.0 — 1.0)"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://be-x-old.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BB%D0%B5%D1%80"; +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"] = "https://www.december.com/html/spec/colorpercompact.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"] = "лічыць з %1 ад %2 да %3 па %4"; +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/For_loop"; +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_VARIABLE"] = "Выдаліць зьменную «%1»"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Выдаліць %1 выкарыстаньняў зьменнай «%2»?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Выдаліць %1 блёкі"; +Blockly.Msg["DISABLE_BLOCK"] = "Адключыць блёк"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Капіяваць"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Прадубляваць камэнтар"; +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["IOS_CANCEL"] = "Адмяніць"; +Blockly.Msg["IOS_ERROR"] = "Памылка"; +Blockly.Msg["IOS_OK"] = "Добра"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Дадаць уваходныя зьвесткі"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Дазволіць сьцьверджаньні"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Уваходныя зьвесткі гэтай функцыі дублююцца."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "УВАХОДНЫЯ ЗЬВЕСТКІ"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Дадаць"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Дадаць зьменную"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Выдаліць"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Вы ня можаце выкарыстоўваць пустую назву зьменнай."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Перайменаваць"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Назва зьменнай"; +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_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"] = "стварыць сьпіс з"; +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"] = "№ з канца"; +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"] = "Вяртае першы элемэнт у сьпісе."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Вяртае элемэнт у пазначанай пазыцыі ў сьпісе."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Вяртае апошні элемэнт у сьпісе."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Вяртае выпадковы элемэнт у сьпісе."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Выдаляе і вяртае першы элемэнт у сьпісе."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Выдаляе і вяртае элемэнт у пазначанай пазыцыі ў сьпісе."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Выдаляе і вяртае апошні элемэнт у сьпісе."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Выдаляе і вяртае выпадковы элемэнт у сьпісе."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Выдаляе першы элемэнт у сьпісе."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Выдаляе элемэнт у пазначанай пазыцыі ў сьпісе."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Выдаляе апошні элемэнт у сьпісе."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Выдаляе выпадковы элемэнт у сьпісе."; +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"] = "атрымаць падсьпіс зь першага"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "атрымаць падсьпіс з № з канца"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "атрымаць падсьпіс з №"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Стварае копію пазначанай часткі сьпісу."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "№%1 — апошні элемэнт."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "№%1 — першы элемэнт."; +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"] = "Вяртае індэкс першага/апошняга ўваходжаньня элемэнту ў сьпіс. Вяртае %1, калі элемэнт ня знойдзены."; +Blockly.Msg["LISTS_INLIST"] = "у сьпісе"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 пусты"; +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"] = "Вяртае даўжыню сьпісу."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "стварыць сьпіс з элемэнту %1, які паўтараецца %2 разоў"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Стварае сьпіс, які ўтрымлівае пададзеную колькасьць копіяў элемэнту."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "адваротна %1"; +Blockly.Msg["LISTS_REVERSE_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_SET"] = "усталяваць"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Устаўляе элемэнт у пачатак сьпісу."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Устаўляе элемэнт у пазначанай пазыцыі ў сьпісе."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Дадае элемэнт у канец сьпісу."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Выпадковым чынам устаўляе элемэнт у сьпіс."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Задае першы элемэнт у сьпісе."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Задае элемэнт у пазначанай пазыцыі ў сьпісе."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "па павелічэньні"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "па зьмяншэньні"; +Blockly.Msg["LISTS_SORT_TITLE"] = "сартаваць %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Сартаваць копію сьпісу."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "паводле альфабэту, ігнараваць рэгістар"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "як лікі"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "паводле альфабэту"; +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"] = "стварыць тэкст са сьпісу"; +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"] = "Вяртае «ісьціна» ці «хлусьня»."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "ісьціна"; +Blockly.Msg["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"; +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://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"; +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_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 ад X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Вяртае арктангенс пункту (X, Y) у градусах ад -180 да 180."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.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://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"; +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_(graphics)"; // 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://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "рэшта дзяленьня %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Вяртае рэшту дзяленьня двух лікаў."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://be-x-old.wikipedia.org/wiki/%D0%9B%D1%96%D0%BA"; +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://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "выпадковая дроб"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Вяртае выпадковую дроб у дыяпазоне ад 0,0 (уключна) да 1,0."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "выпадковая цэлая з %1 для %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Вяртае выпадковы цэлы лік паміж двума зададзенымі абмежаваньнямі ўключна."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +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://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"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "модуль"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "квадратны корань"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Вяртае модуль ліку."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Вяртае e ў ступені ліку."; +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://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"; +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["NEW_COLOUR_VARIABLE"] = "Стварыць зьменную колеру…"; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Стварыць лікавую зьменную…"; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Стварыць радковую зьменную…"; +Blockly.Msg["NEW_VARIABLE"] = "Стварыць зьменную…"; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Імя новай зьменнай:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Новы тып зьменнай:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "дазволіць зацьвярджэньне"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "з:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Запусьціць функцыю вызначаную карыстальнікам '%1'."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Запусьціць функцыю вызначаную карыстальнікам '%1' і выкарыстаць яе вынік."; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "з:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "Стварыць '%1'"; +Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Апішыце гэтую функцыю…"; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "зрабіць што-небудзь"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "да"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Стварае функцыю бяз выніку."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +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"; +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' на:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "да %1 дадаць тэкст %2"; +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"] = "Вялікія Першыя Літары"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "да ВЕРХНЯГА РЭГІСТРУ"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Вярнуць копію тэксту зь іншай велічынёй літар."; +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_LAST"] = "узяць апошнюю літару"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "узяць выпадковую літару"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "у тэксьце %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Вяртае літару ў пазначанай пазыцыі."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "падлічыць %1 сярод %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Падлічвае колькі разоў нейкі тэкст сустракаецца ўнутры нейкага іншага тэксту."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Дадаць элемэнт да тэксту."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "далучыць"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Дадайце, выдаліце ці зьмяніце парадак разьдзелаў для перадачы тэкставага блёку."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "да літары № з канца"; +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"] = "атрымаць падрадок зь першай літары"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "узяць падрадок зь літары № з канца"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "узяць падрадок зь літары №"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Вяртае пазначаную частку тэксту."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "знайсьці першае ўваходжаньне тэксту"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "знайсьці апошняе ўваходжаньне тэксту"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "у тэксьце %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Вяртае індэкс першага/апошняга ўваходжаньня першага тэксту ў другі тэкст. Вяртае %1, калі тэкст ня знойдзены."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 пусты"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Вяртае значэньне ісьціна, калі тэкст пусты."; +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"] = "Надрукаваць пазначаны тэкст, лічбу ці іншыя сымбалі."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Запытаць у карыстальніка лічбу."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Запытаць у карыстальніка тэкст."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "запытаць лічбу з падказкай"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "запытаць тэкст з падказкай"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "замяніць %1 на %2 у %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Замяняе ўсе выпадкі нейкага тэксту на іншы тэкст."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "адваротна %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Мяняе парадак сымбаляў у тэксьце на адваротны."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +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["UNNAMED_KEY"] = "безназоўны"; +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_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["VARIABLE_ALREADY_EXISTS"] = "Зьменная з назвай «%1» ужо існуе."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Зьменная з назвай «%1» ужо існуе зь іншым тыпам: «%2»."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Працоўная прастора Blockly"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Напішыце што-небудзь…"; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/be.js b/js/msg/js/be.js new file mode 100644 index 0000000..dd82192 --- /dev/null +++ b/js/msg/js/be.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Дадаць каментарый"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Немагчыма выдаліць пераменную '%1', паколькі яна з'яўляецца часткай вызначэння функцыі '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Змяніць значэння:"; +Blockly.Msg["CLEAN_UP"] = "Выраўнаваць блокі"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "суадносіны"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "змяшаць"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Змешвае два колеры разам у паказаных суадносінах (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://be.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"] = "https://www.december.com/html/spec/colorpercompact.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"] = "лічыць з %1 ад %2 да %3 праз %4"; +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://be.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_VARIABLE"] = "Выдаліць пераменную '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Выдаліць %1 выкарыстання пераменнай '%2'?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Выдаліць %1 блокаў"; +Blockly.Msg["DISABLE_BLOCK"] = "Адключыць блок"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Дубляваць"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +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["IOS_CANCEL"] = "Адмяніць"; +Blockly.Msg["IOS_ERROR"] = "Памылка"; +Blockly.Msg["IOS_OK"] = "Добра"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Дадаць уваходную пераменную"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Дазволіць аператары"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "У гэтай функцыі ёсць уваходныя пераменныя, якія дубліруюцца."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "УВАХОД"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Дадаць"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Дадаць пераменную"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Выдаліць"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Вы не можаце выкарыстоўваць пустое імя пераменнай."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Перайменаваць"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Назва пераменнай"; +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_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"] = "стварыць спіс з"; +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"] = "# з канца"; +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"] = "Вяртае першы элемент спіса."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Вяртае элемент ва ўказанай пазіцыі спіса."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Вяртае апошні элемент спіса."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Вяртае выпадковы элемент спіса."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Видаляє і повертає перший елемент списку."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Выдаляе і вяртае элемент ва ўказанай пазіцыі спіса."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Видаляє і повертає апошні элемент спіса."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Видаляє і повертає выпадковы элемент спіса."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Видаляє першы элемент спіса."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Видаляє элемент ва ўказанай пазіцыі спіса."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Видаляє апошні элемент спіса."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Видаляє выпадковы элемент спіса."; +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"] = "узяць падспіс з першага"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "узяць падспіс з # з канца"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "узяць падспіс з #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Стварае копію ўказанай частцы спісу."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 - апошні элемент."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 - першы элемент."; +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"] = "Вяртае нумар пазіцыі першага/апошняга ўваходжання элемента ў спісе. Вяртае %1, калі элемент не знойдзены."; +Blockly.Msg["LISTS_INLIST"] = "у спісе"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 пусты"; +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"] = "Вяртае даўжыню спісу."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "стварыць спіс з элемента %1, паўтаральнага %2 разоў"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Стварае спіс, які складаецца з зададзенага ліку копій элемента."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "змяніць парадак на зваротны %1"; +Blockly.Msg["LISTS_REVERSE_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_SET"] = "прысабечыць"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Устаўляе элемент у пачатак спіса."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Устаўляе элемент ва ўказанай пазіцыі спіса."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Дадае элемент у канец спісу."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Устаўляе элемент у выпадковае месца ў спісе."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Прысабечвае значэнне элемента спісу."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Прысабечвае значэнне элемента ва ўказанай пазіцыі спіса."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "па ўзрастанню"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "па спаданню"; +Blockly.Msg["LISTS_SORT_TITLE"] = "сартаваць %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Сартаваць копію спісу."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "па алфавіце, без уліку рэгістра"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "лікавая"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "па алфавіце"; +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"] = "сабраць тэкст са спісу"; +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"] = "Вяртае значэнне ісціна або хлусня."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "ісціна"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://be.wikipedia.org/wiki/Няроўнасць"; +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://be.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_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://be.wikipedia.org/wiki/Ідыёма (праграмаванне)"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "павялічыць %1 на %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Дадае лік да пераменнай '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://be.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_(graphics)"; // 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://be.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://be.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://be.wikipedia.org/wiki/Генератар_псевдослучайных_лікаў"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "выпадковы лік ад 0 (уключна) да 1"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Вяртае выпадковы лік ад 0.0 (уключна) да 1.0."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://be.wikipedia.org/wiki/Генератар_псевдослучайных_лікаў"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "выпадковы цэлы лік ад %1 для %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Вяртае выпадковы лік паміж двума зададзенымі межамі (уключаючы і іх)."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://be.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://be.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://be.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["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "Стварыць пераменную..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Новая назва пераменнай:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "дазволіць аператары"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "з:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://be.wikipedia.org/wiki/Падпраграма"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Выконвае вызначаную карыстальнікам працэдуру '%1'."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://be.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"] = "Апішыце гэтую функцыю..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "выканаць нешта"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "каб"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Стварыць працэдуру, якая ня вяртае значэнне."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +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_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' да:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "да %1 дадаць тэкст %2"; +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"] = "у Загалоўныя Пачатковыя Літары"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "у ВЯЛІКІХ ЛІТАРАЎ"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Вяртае копію тэксту з ВЯЛІКІМІ або малымі літарамі."; +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_LAST"] = "узяць апошнюю літару"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "узяць выпадковую літару"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "у тэксце %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Вяртае літару ў названай пазіцыі."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "падлічыць колькасць %1 у %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Падлічыць колькі разоў урывак тэксту з'яўляецца ў іншым тэксце."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Дадаць элемент да тэксту."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "спалучыць"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Дадайце, выдаліце, перастаўце фрагменты для пераробкі тэкставага блока."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "па літару # з канца"; +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"] = "узяць падрадок з першай літары"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "узяць падрадок з літары # з канца"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "узяць падрадок з літары #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Вяртае указаную частку тэксту."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "знайсці першае ўваходжанне тэксту"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "знайсці апошняе ўваходжанне тэксту"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "у тэксце %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Вяртае нумар пазіцыі першага/апошняга ўваходжання першага тэксту ў другім. Вяртае %1, калі тэкст не знойдзены."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 пусты"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Вяртае значэнне ісціна, калі пададзены тэкст пусты."; +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"] = "Друкуе тэкст, лік або іншы аб'ект."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Запытаць у карыстальніка лік."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Запытаць у карыстальніка тэкст."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "запытаць лік з падказкай"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "запытаць тэкст з падказкай"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "замяніць %1 на %2 у %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Замяніць усе ўваходжанні некаторага тэксту іншым тэкстам."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "змяніць парадак на зваротны %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Мяняе парадак знакаў у тэксце на адваротны."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://be.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_LEFT"] = "абрэзаць прагалы злева"; +Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "абрэзаць прагалы справа"; +Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "Вяртае копію тэксту з прагаламі, выдаленымі з аднаго або абодвух канцоў."; +Blockly.Msg["TODAY"] = "Сёння"; +Blockly.Msg["UNDO"] = "Адкаціць"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // 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 +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["VARIABLE_ALREADY_EXISTS"] = "Пераменная з назвай '%1' ужо існуе."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Назва пераменнай '%1' ужо выкарыстоўваецца іншай пераменнай тыпу '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/bg.js b/js/msg/js/bg.js new file mode 100644 index 0000000..9fd8214 --- /dev/null +++ b/js/msg/js/bg.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Добави коментар"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Променливата '%1' не може да бъде изтрита, защото е част от определението на функцията '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Промени стойността:"; +Blockly.Msg["CLEAN_UP"] = "Премахни блокове"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Свитите блокове съдържат предупреждения."; +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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "съотношение"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "смеси"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Смесва два цвят в дадено съотношение (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://bg.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"] = "https://www.december.com/html/spec/colorpercompact.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"] = "преброй чрез %1 от %2 до %3 през %4"; +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://bg.wikipedia.org/wiki/Цикъл_(програмиране)#For_.D1.86.D0.B8.D0.BA.D1.8A.D0.BB.D1.8A.D1.82"; +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_VARIABLE"] = "Изтриване на променливата \"%1\""; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Изтриване на %1 използване на променлива '%2'?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Изтрий %1 блока"; +Blockly.Msg["DISABLE_BLOCK"] = "Деактивирай блок"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Копирай"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Дублиране на коментара"; +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["IOS_CANCEL"] = "Отказ"; +Blockly.Msg["IOS_ERROR"] = "Грешка"; +Blockly.Msg["IOS_OK"] = "Добре"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Добавяне на данни"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Позволи твърденията"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Тази функция има дублирани входни данни."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "Входни данни"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Добавяне"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Добавяне на променлива"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Изтриване"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Не може да използвате празно име за променлива"; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Преименуване"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Име на променливата"; +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_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"] = "създай списък с"; +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"] = "№ от края"; +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"] = "Връща първия елемент в списък."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Връща елемента на определената позиция в списък."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Връща последния елемент в списък."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Връща случаен елемент от списъка."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Премахва и връща първия елемент в списък."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Премахва и връща елемента на определена позиция в списък."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Премахва и връща последния елемент в списък."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Премахва и връща случаен елемент от списък."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Премахва първия елемент от списък."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Премахва елемент на определена позиция от списък."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Премахва последния елемент от списък."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Премахва случаен елемент от списък."; +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"] = "вземи подсписък от първия"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "вземи подсписък от № от края"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "вземи подсписък от №"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Копира част от списък."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 е последният елемент."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 е първият елемент."; +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"] = "Връща индекса на първото/последното появяване на елемента в списъка. Връща %1, ако елементът не е намерен."; +Blockly.Msg["LISTS_INLIST"] = "в списъка"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 е празен"; +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"] = "Връща дължината на списък."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "създай списък от %1 повторен %2 пъти"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Създава списък, състоящ се от определен брой копия на елемента."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "промени реда на обратно %1"; +Blockly.Msg["LISTS_REVERSE_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_SET"] = "промени"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Вмъква елемент в началото на списъка."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Вмъква елемент на определена позиция в списък."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Добави елемент в края на списък."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Вмъква елемент на произволно място в списък."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Променя първия елемент в списък."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Променя елемента на определена позиция в списък."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "възходящо"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "низходящо"; +Blockly.Msg["LISTS_SORT_TITLE"] = "сортиране по %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Подреди копие на списъка."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "по азбучен ред, без отчитане на малки и главни букви"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "в числов ред"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "по азбучен ред"; +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"] = "направи текст от списък"; +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"] = "Връща вярно или невярно."; +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"] = "нула"; +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://bg.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_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 от X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Връща аркустангенс на точка (X, Y) в градуси от -180 до 180."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://bg.wikipedia.org/wiki/Събиране"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "промени %1 на %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Добави число към променлива „%1“."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "http://bg.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_(graphics)"; // 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"] = "http://bg.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://bg.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://bg.wikipedia.org/wiki/Генератор_на_случайни_числа"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "случайно дробно число"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Върни случайно дробно число между 0.0 (включително) и 1.0 (без да го включва)"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://bg.wikipedia.org/wiki/Генератор_на_случайни_числа"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "случайно цяло число между %1 и %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Върни случайно число в определените граници (включително)."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +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"; +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://bg.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["NEW_COLOUR_VARIABLE"] = "Създаване на цветова променлива..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Създаване на числова променлива..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Създаване на низова променлива..."; +Blockly.Msg["NEW_VARIABLE"] = "Създаване на променлива..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Ново име на променливата:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Тип на новата променлива:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "позволи операциите"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "с:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://bg.wikipedia.org/wiki/Подпрограма"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Изпълни дефинирана от потребителя функция „%1“."; +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"] = "Опишете тази функция..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "направиш"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "за да"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Създава функция, която не връща резултат."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +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"; +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' променливи на:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "добавете текст %2 към %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"] = "с Главна Буква На Всяка Дума"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "с ГЛАВНИ БУКВИ"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Връща копие на текста със сменени малки и главни букви."; +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_LAST"] = "вземи последната буква"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "вземи произволна буква"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "в текст %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Връща буквата в определена позиция."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "пресмята броя на %1 в %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Преброй колко пъти даден текст се среща в друг текст."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Добави елемент към текста."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "свържи"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Добави, премахни или пренареди частите, за да промениш този текстов блок."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "до буква № от края"; +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"] = "вземи текста от първата буква"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "вземи текста от буква № (броено отзад-напред)"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "вземи текста от буква №"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Връща определена част от текста."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "намери първата поява на текста"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "намери последната поява на текста"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "в текст %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Връща индекса на първото/последното срещане на първия текст във втория текст. Връща %1, ако текстът не е намерен."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 е празен"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Връща вярно, ако текста е празен."; +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"] = "Отпечатай текста, числото или друга стойност."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Питай потребителя за число."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Питай потребителя за текст."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "питай за число със съобщение"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "питай за текст със съобщение"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "замяна на %1 с %2 в %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Замени всички появи на даден текст в друг текст."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "промени реда на обратно %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Промени реда на знаците в текста на обратно."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://bg.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_LEFT"] = "премахни интервалите отляво"; +Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "премахни интервалите отдясно"; +Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "Връща копие на текста с премахнати интервали от единия или двата края."; +Blockly.Msg["TODAY"] = "Днес"; +Blockly.Msg["UNDO"] = "Отмяна"; +Blockly.Msg["UNNAMED_KEY"] = "без име"; +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_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["VARIABLE_ALREADY_EXISTS"] = "Променлива с име '%1' вече съществува."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Променлива с име '%1' вече съществува за друг тип: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Работна област на Blockly"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Коментирайте нещо..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/bn.js b/js/msg/js/bn.js new file mode 100644 index 0000000..1a672ce --- /dev/null +++ b/js/msg/js/bn.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "মন্তব্য যোগ করুন"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "'%1' চলক অপসারণ করা যাবে না কারণ এটি '%2' কার্যপ্রণালীর সংজ্ঞার অংশ"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "মান পরিবর্তন করুন:"; +Blockly.Msg["CLEAN_UP"] = "ব্লকসমূহ পরিস্কার করুন"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "ব্লকসমূহ সঙ্কুচিত করুন"; +Blockly.Msg["COLLAPSE_BLOCK"] = "ব্লক সঙ্কুচিত করুন"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "রং ১"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "রং ২"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "অনুপাত"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "মিশ্রণ"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "প্রদত্ত অনুপাত(০.০ - ১.০) অনুসারে দুটি রং একসাথে মিশ্রিত করুন।"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://bn.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"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "লাল"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "রং সহ"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "একটি রং তৈরি করুন নির্দিষ্ট পরিমাণে লাল, সবুজ এবং নীল রং মিশ্রিত করে। প্রত্যেকটির মান অবশ্যই ০ থেকে ১০০ এর মধ্যে হতে হবে।"; +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"] = "গণনা কর %1 %4 দিয়ে %2 থেকে %3"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "চলক %1 প্রস্তুত করুন, শুরু থেকে শেষ পর্যন্ত সংখ্যা গ্রহন করতে যা নির্দেশিত বিরতি গণনা করছে এবং নির্দেশিত ব্লক সমূহ সম্পন্ন করতে।"; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "যদি নামক ব্লক এ একটি শর্ত যোগ করুন।"; +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"] = "যদি একটি মূল্যমাস সত্য হয়, তবে কিছু বিবরণ দিন"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "যদি একটি মূল্যমান সত্য হয়, তবে বিবৃতিসমূহের প্রথম ব্লকটা অন্যথায় বিবৃতির দ্বিতীয় ব্লক।"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "যদি প্রথম মূল্যমান সঠিক হয়, তবে বর্ণিত প্রথম ব্লকটি সম্পন্ন করুন। অন্যথায়, দ্বিতীয় মূল্যমান সঠিক হয়, দ্বিতীয় ব্লক সম্পন্ন করুন।"; +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://bn.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_VARIABLE"] = "'%1' চলকটি অপসারণ করুন"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "'%2' চলকের '%1'টি ব্যবহার অপসারণ করবেন?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "%1 ব্লক অপসারণ কর"; +Blockly.Msg["DISABLE_BLOCK"] = "ব্লকটি বিকল কর"; +Blockly.Msg["DUPLICATE_BLOCK"] = "প্রতিলিপি"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +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["IOS_CANCEL"] = "বাতিল"; +Blockly.Msg["IOS_ERROR"] = "ত্রুটি"; +Blockly.Msg["IOS_OK"] = "ঠিক আছে"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Add Input"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INPUTS"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "যোগ"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Add Variable"; // untranslated +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "অপসারণ"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "অাপনি চলকের নাম খালি রাখতে পারেননা।"; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "পুনরায় শুরু"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "চলকের নাম"; +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"] = "পাঠাবে একটি তালিকা, দের্ঘ্য হবে ০, কোন উপাত্ত থাকবে না"; +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"] = "যেকোন সংখ্যক পদ নিয়ে একটি তালিকা তৈরি করুন।"; +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"] = "তালিকার প্রথম পদটি পাঠাবে।"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Returns the item at the specified position in a list."; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "তালিকার শেষ পদটি পাঠাবে।"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "এলোমেলোভাবে তালিকার যেকোন একটি পদ পাঠাবে।"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "অপসারণ করুন এবং তালিকার প্রথম পদটি পাঠান।"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Removes and returns the item at the specified position in a list."; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "অপসারণ করুন এবং তালিকার শেষ পদটি পাঠান।"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "অপসারণ করুন এবং তালিকার এলোমেলো একটি পদ পাঠান।"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "তালিকার প্রথম পদটি অপসারণ করা হয়েছে।"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Removes the item at the specified position in a list."; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "তালিকার শেষ পদটি অপসারণ করা হয়েছে।"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "তালিকা থেকে এলোমেলো একটি পদ অপসারণ করা হয়েছে।"; +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_FROM_END_TOOLTIP"] = "%1 is the last item."; // untranslated +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 is the first 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"] = "আইটেমের শেষ সংঘটন খুঁজুন"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; // untranslated +Blockly.Msg["LISTS_INLIST"] = "তালিকার মধ্যে"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 খালি"; +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"] = "একটি তালিকার দৈর্ঘ্য পাঠাবে।"; +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_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_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"] = "as"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "insert at"; // untranslated +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"] = "Inserts the item at the specified position in a list."; // 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"] = "Sets the item at the specified position in a list."; // 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"] = "তালিকা থেকে লিখা তৈরি করুন"; +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)"; // 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"] = "%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"] = "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"] = "পাঠাবে দুটি সংখ্যার যোগফল।"; +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_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated +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 +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // 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"] = "is whole"; // untranslated +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated +Blockly.Msg["MATH_MODULO_TITLE"] = "%1 ÷ %2 এর ভাগশেষ"; +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://bn.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"] = "modes of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "তালিকার এলোমেলো পদ"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "standard deviation of list"; // untranslated +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"] = "Return a list of the most common item(s) in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "তালিকা থেকে এলোমেলোভাবে একটি পদ পাঠাবে।"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Return the standard deviation of the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "পাঠাবে তালিকার সব সংখ্যার যোগফল।"; +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"] = "এলোমেলো ভগ্নাংশ"; +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/Square_root"; // untranslated +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_LN"] = "Return the natural logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Return the base 10 logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Return the negation of a number."; // untranslated +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/Trigonometric_functions"; // untranslated +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["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "চলক তৈরি করুন..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "নতুন চলকের নাম:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // 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"] = "Create '%1'"; // untranslated +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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "do something"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "এতে"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "আউটপুট ছাড়া একটি ক্রিয়া তৈরি করুন।"; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "পাঠাবে"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "আউটপুট সহ একটি ক্রিয়া তৈরি করুন।"; +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Warning: This function has duplicate parameters."; // untranslated +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"] = "Warning: This block may be used only within a function definition."; // untranslated +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"] = "'%1' চলকগুলোর নতুন নাম দিন:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "to %1 append text %2"; // 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_LAST"] = "get last letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "get random letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returns the letter at the specified position."; // untranslated +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // 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"] = "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_OPERATOR_FIRST"] = "find first occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "find last occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "in text %1 %2 %3"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 খালি"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "পাঠাবে সত্য যদি সরবরাহকৃত লেখাটি খালি হয়।"; +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"] = "%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_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_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "%1 উল্টান"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // 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"] = "উভয় পাশ থেকে খালি অংশ ছাটাই"; +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["UNNAMED_KEY"] = "নামহীন"; +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"] = "'%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["VARIABLE_ALREADY_EXISTS"] = "'%1' নামের চলক পূর্ব থেকে অাছে।"; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "'%1' নামের চলক '%2' ধরনের চলকের জন্য পূর্ব থেকেই অাছে।"; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/br.js b/js/msg/js/br.js new file mode 100644 index 0000000..5700561 --- /dev/null +++ b/js/msg/js/br.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Ouzhpennañ un evezhiadenn"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Ne ch'aller ket dilemel an argemmenn \"%1\" dre m'eo lod eus dielfennadur an arc'hwel \"%2\""; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Kemmañ an dalvoudenn :"; +Blockly.Msg["CLEAN_UP"] = "Naetaat ar bloc'hoù"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Kemennoù-diwall zo er bloc'hadoù pleget."; +Blockly.Msg["COLLAPSE_ALL"] = "Bihanaat ar bloc'hoù"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Bihanaat ar bloc'h"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "liv 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "liv 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "feur"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "meskañ"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "a gemmesk daou liv gant ur feur roet(0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "http://br.wikipedia.org/wiki/Liv"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Dibab ul liv diwar al livaoueg."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "liv dargouezhek"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Tennañ ul liv d'ar sord"; +Blockly.Msg["COLOUR_RGB_BLUE"] = "glas"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "gwer"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "ruz"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "liv gant"; +Blockly.Msg["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ù."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "Mont e-maez an adlañsañ"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "Kenderc'hel gant iteradur nevez ar rodell"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Mont e-maez ar boukl engronnus."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Lammat ar rest eus ar rodell, ha kenderc'hel gant an iteradur war-lerc'h."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Diwallit : ne c'hall ar bloc'h-mañ bezañ implijet nemet e-barzh ur boukl."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "evit pep elfenn %1 er roll %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Evit pep elfenn en ur roll, reiñ talvoud an elfenn d'an argemmenn '%1', ha seveniñ urzhioù zo da c'houde."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "kontañ gant %1 eus %2 da %3 dre %4"; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Ouzhpennañ un amplegad d'ar bloc'h ma."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Ouzhpennañ un amplegad dibenn lak-pep-tra d'ar bloc'h ma."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Ouzhpennañ, lemel pe adurzhiañ ar rannoù evit kefluniañ ar bloc'h ma."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "a-hend-all"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "mod all ma"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "ma"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Ma vez gwir un dalvoudenn, seveniñ urzhioù zo neuze."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Ma vez gwir un dalvoudenn, seveniñ ar c'henañ bloc'had urzhioù neuze. Anez seveniñ an eil bloc'had urzhioù."; +Blockly.Msg["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ù."; +Blockly.Msg["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ù."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "ober"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "adober %1 gwech"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Seveniñ urzhioù zo meur a wech"; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "adober betek"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "adober keit ha ma"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Keit ha ma vez faos un dalvoudenn, seveniñ urzhioù zo neuze."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Keit ha ma vez gwir un dalvoudenn, seveniñ urzhioù zo neuze."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Diverkañ an holl vloc'hoù %1 ?"; +Blockly.Msg["DELETE_BLOCK"] = "Dilemel ar bloc'h"; +Blockly.Msg["DELETE_VARIABLE"] = "Lemel an argemm '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Lemel %1 implij eus an argemm '%2' ?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Dilemel %1 bloc'h"; +Blockly.Msg["DISABLE_BLOCK"] = "Diweredekaat ar bloc'h"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Eiladuriñ"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Eiladiñ an eilenn"; +Blockly.Msg["ENABLE_BLOCK"] = "Gweredekaat ar bloc'h"; +Blockly.Msg["EXPAND_ALL"] = "Astenn ar bloc'hoù"; +Blockly.Msg["EXPAND_BLOCK"] = "Astenn ar bloc'h"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Monedoù diavaez"; +Blockly.Msg["HELP"] = "Skoazell"; +Blockly.Msg["INLINE_INPUTS"] = "Monedoù enlinenn"; +Blockly.Msg["IOS_CANCEL"] = "Nullañ"; +Blockly.Msg["IOS_ERROR"] = "Fazi"; +Blockly.Msg["IOS_OK"] = "Mat eo"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Ouzhpennañ ur moned"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Urzhioù aotreet"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "An arc'hwel-mañ en deus monedoù eiladet."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "MONEDOÙ"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Ouzhpennañ"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Ouzhpennañ un argemmenn"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Diverkañ"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Ne c'hallit ket implijout un anv argemmenn c'houllo."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Adenvel"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Anv an argemmenn"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "krouiñ ur roll goullo"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Distreiñ ul listenn, 0 a hirder, n'eus enrolladenn ebet enni"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "roll"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Ouzhpennañ, lemel pe adurzhiañ ar rannoù evit kefluniañ ar bloc'h listenn-mañ."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "krouiñ ur roll gant"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Ouzhpennañ un elfenn d'ar roll"; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Krouiñ ur roll gant un niver bennak a elfennoù."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "kentañ"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# adalek ar fin"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_GET"] = "tapout"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "tapout ha lemel"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "diwezhañ"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "dre zegouezh"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "lemel"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Distreiñ an elfenn gentañ en ul listenn."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Distreiñ an elfenn el lec'h meneget en ul listenn."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Distreiñ un elfenn diwezhañ en ul listenn."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Distreiñ un elfenn dre zegouezh en ul listenn."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Lemel ha distreiñ a ra an elfenn gentañ en ul listenn."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Lemel ha distreiñ a ra an elfenn el lec'h meneget en ul listenn."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Lemel ha distreiñ a ra an elfenn diwezhañ en ul listenn."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Lemel ha distreiñ a ra an elfenn dre zegouezh en ul listenn."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Lemel a ra an elfenn gentañ en ul listenn."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Lemel a ra an elfenn el lec'h meneget en ul listenn."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Lemel a ra an elfenn diwezhañ en ul listenn."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Lemel a ra un elfenn dre zegouezh en ul listenn."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "betek # adalek an dibenn"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "da #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "betek ar fin"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "Kaout an islistenn adalek an deroù"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "Kaout an islistenn adalek # adalek an dibenn"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "Kaout an islistenn adalek #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Krouiñ un eilad eus lodenn spisaet ul listenn."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 eo an elfenn gentañ."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 eo an elfenn gentañ."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "kavout reveziadenn gentañ un elfenn"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "kavout reveziadenn diwezhañ un elfenn"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Distreiñ meneger ar c'hentañ/an eil reveziadenn eus an elfenn en ul listenn. Distreiñ %1 ma n'eo ket kavet an destenn."; +Blockly.Msg["LISTS_INLIST"] = "el listenn"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 zo goullo"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Distreiñ gwir m'eo goullo al listenn."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "hirder %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Distreiñ hirder ul listenn."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "Krouiñ ul listenn gant an elfenn %1 arreet %2 div wech"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Krouiñ ul listenn a c'hoarvez eus an dalvoudenn roet arreet an niver a wech meneget"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "eilpennañ %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Eilpennañ un eilskrid eus ur roll."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "evel"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "ensoc'hañ evel"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "termenañ"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Ensoc'hañ a ra an elfenn e deroù ul listenn."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Ensoc'hañ a ra an elfenn el lec'h meneget en ul listenn."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Ouzhpennañ a ra an elfenn e fin al listenn."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Ensoc'hañ a ra an elfenn dre zegouezh en ul listenn."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Termenañ a ra an elfenn gentañ en ul listenn."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Termenañ a ra an elfenn el lec'h meneget en ul listenn."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Termenañ a ra an elfenn diwezhañ en ul listenn."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Termenañ a ra un elfenn dre zegouezh en ul listenn."; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "war gresk"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "war zigresk"; +Blockly.Msg["LISTS_SORT_TITLE"] = "Rummañ%1,%2,%3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Rummañ un eilenn eus ar roll"; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "Dre urzh al lizherenneg, hep derc'hel kont eus an direnneg"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "niverel"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "Dre urzh al lizherenneg"; +Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg["LISTS_SPLIT_LIST_FROM_TEXT"] = "Krouiñ ul listenn diwar an destenn"; +Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "Krouiñ un destenn diwar al listenn"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Bodañ ul listennad testennoù en ul listenn hepken, o tispartiañ anezho gant un dispartier."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Troc'hañ un destenn en ul listennad testennoù, o troc'hañ e pep dispartier."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "gant an dispartier"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "gaou"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Distreiñ pe gwir pe faos"; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "gwir"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Distreiñ gwir m'eo par an daou voned."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Distreiñ gwir m'eo brasoc'h ar moned kentañ eget an eil."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Distreiñ gwir m'eo brasoc'h ar moned kentañ eget an eil pe par dezhañ."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Distreiñ gwir m'eo bihanoc'h ar moned kentañ eget an eil."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Distreiñ gwir m'eo bihanoc'h ar moned kentañ eget an eil pe m'eo par dezhañ."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Distreiñ gwir ma n'eo ket par an daou voned."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "nann %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Distreiñ gwir m'eo faos ar moned. Distreiñ faos m'eo gwir ar moned."; +Blockly.Msg["LOGIC_NULL"] = "Null"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Distreiñ null."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "ha(g)"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "pe"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Distreiñ gwir m'eo gwir an da daou voned."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Distreiñ gwir m'eo gwir unan eus an daou voned da nebeutañ."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "amprouad"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "m'eo gaou"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "m'eo gwir"; +Blockly.Msg["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'."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://br.wikipedia.org/wiki/Aritmetik"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Distreiñ sammad daou niver."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Distreiñ rannad daou niver."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Distreiñ diforc'h daou niver"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Distreiñ liesad daou niver."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Distreiñ an niver kentañ lakaet dindan gallouter an eil niver."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://fr.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 eus X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Adkas a ra ark tangent ar poent (X, Y) e derezioù etre -180 ha 180"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "kemmañ %1 gant %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Ouzhpennañ un niver d'an argemmenn '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Distreiñ unan eus digemmennoù red : π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (anvevenn)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "destrizhañ %1 etre %2 ha %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Destrizhañ un niver da vezañ etre ar bevennoù spisaet (enlakaet)"; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "a zo rannadus dre"; +Blockly.Msg["MATH_IS_EVEN"] = "zo par"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "a zo negativel"; +Blockly.Msg["MATH_IS_ODD"] = "zo ampar"; +Blockly.Msg["MATH_IS_POSITIVE"] = "a zo pozitivel"; +Blockly.Msg["MATH_IS_PRIME"] = "zo kentañ"; +Blockly.Msg["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."; +Blockly.Msg["MATH_IS_WHOLE"] = "zo anterin"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "rest eus %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Distreiñ dilerc'h rannadur an div niver"; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://br.wikipedia.org/wiki/Niver"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Un niver."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "Keitat al listenn"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "Uc'hegenn al listenn"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "Kreizad al listenn"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "Izegenn al listenn"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "modoù stankañ el listenn"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "Elfennn eus al listenn tennet d'ar sord"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "forc'had standart eus al listenn"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "Sammad al listenn"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Distreiñ keitad (niveroniel) an talvoudennoù niverel el listenn."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Distreiñ an niver brasañ el listenn."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Distreiñ an niver kreiz el listenn"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Distreiñ an niver bihanañ el listenn"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Distreiñ ul listennad elfennoù stankoc'h el listenn."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Distreiñ un elfenn zargouezhek el listenn"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Distreiñ forc'had standart al listenn."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Distreiñ sammad an holl niveroù zo el listenn."; +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"] = "Rann dargouezhek"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Distreiñ ur rann dargouezhek etre 0.0 (enkaelat) hag 1.0 (ezkaelat)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "anterin dargouezhek etre %1 ha %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Distreiñ un anterin dargouezhek etre an div vevenn spisaet, endalc'het."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "Rontaat"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "Rontaat dindan"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "Rontaat a-us"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Rontaat un niver dindan pe a-us"; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://br.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "dizave"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "gwrizienn garrez"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Distreiñ talvoud dizave un niver."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Distreiñ galloudad un niver."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Distreiñ logaritm naturel un niver"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Distreiñ logaritm diazez 10 un niver"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Distreiñ enebad un niver"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Distreiñ 10 da c'halloudad un niver."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Distreiñ gwrizienn garrez un niver"; +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://br.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"] = "Distreiñ ark kosinuz un niver"; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Distreiñ ark sinuz un niver"; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Distreiñ ark tangent un niver"; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Distreiñ kosinuz ur c'horn (ket e radianoù)"; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Distreiñ sinuz ur c'horn (ket e radianoù)"; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Distreiñ tangent ur c'horn (ket e radianoù)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Krouiñ un argemmenn liv..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Krouiñ un argemm niver..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Krouiñ un argemmenn chadenn..."; +Blockly.Msg["NEW_VARIABLE"] = "Krouiñ un argemmenn nevez..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Anv an argemmenn nevez :"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Doare nevez a argemm:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "aotren an disklêriadurioù"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "gant :"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Seveniñ an arc'hwel '%1' termenet gant an implijer."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +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"] = "Deskrivañ an arc'hwel-mañ..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "ober un dra bennak"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "da"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Krouiñ un arc'hwel hep mont er-maez."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "distreiñ"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Kouiñ un arc'hwel gant ur mont er-maez"; +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Diwallit : an arc'hwel-mañ en deus arventennoù eiladet."; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Dreislinennañ termenadur an arc'hwel"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Ma'z eo gwir un dalvoudenn, distreiñ un eil talvoudenn neuze."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Diwallit : Gallout a rafe ar bloc'h bezañ implijet e termenadur un arc'hwel hepken."; +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"] = "Adober"; +Blockly.Msg["REMOVE_COMMENT"] = "Lemel an evezhiadenn kuit"; +Blockly.Msg["RENAME_VARIABLE"] = "Adenvel an argemmenn..."; +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Adenvel an holl argemmennoù '%1' e :"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "Ouzhpennañ an destenn %2 da %1"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Ouzhpennañ testenn d'an argemmenn'%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "e lizherennoù bihan"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "Gant Ur Bennlizherenn E Deroù Pep Ger"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "e PENNLIZHERENNOÙ"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Distreiñ un eilenn eus an eilenn en un direnneg all"; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "tapout al lizherenn gentañ"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "Kaout al lizherenn # adalek an dibenn."; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "Kaout al lizherenn #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "tapout al lizherenn ziwezhañ"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "Kaout ul lizherenn dre zegouezh"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "en destenn %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Distreiñ al lizherenn d'al lec'h spisaet."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "niver %1 war %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Kontañ pet gwech e c'hoarvez un destenn bennak en un destenn bennak all."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Ouzhpennañ un elfenn d'an destenn."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "stagañ"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Ouzhpennañ, lemel pe adurzhiañ ar rannoù evit kefluniañ ar bloc'h testenn-mañ."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "Betek al lizherenn # adalek an dibenn."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "betek al lizherenn #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "d'al lizherenn diwezhañ"; +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"] = "en destenn"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "Kaout an ischadenn adalek al lizherenn gentañ"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "Kaout an ischadenn adalek al lizherenn # betek an dibenn"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "Kaout an ischadenn adalek al lizherenn #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Distreiñ un tamm spisaet eus an destenn."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "kavout reveziadenn gentañ an destenn"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "kavout reveziadenn diwezhañ an destenn"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "en destenn %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Distreiñ meneger ar c'hentañ/an eil reveziadenn eus ar chadenn gentañ en eil chadenn. Distreiñ %1 ma n'eo ket kavet ar chadenn."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 zo goullo"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Adkas gwir m'eo goullo an destenn roet."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "krouiñ un destenn gant"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Krouit un tamm testenn en ur gevelstrollañ un niver bennak a elfennoù"; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "hirder %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Distreiñ an niver a lizherennoù(en ur gontañ an esaouennoù e-barzh) en destenn roet."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "moullañ %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Moullañ an destenn, an niverenn pe un dalvoudenn spisaet all"; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Goulenn un niver gant an implijer."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Goulenn un destenn gant an implijer."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "pedadenn evit un niver gant ur c'hemennad"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "pedadenn evit un destenn gant ur c'hemennad"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "erlec'hiañ %1 gant %2 e %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Erlec'hiañ holl reveziadennoù un destenn bennak gant un destenn all."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "eilpennañ %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Eilpennañ urzh an arouezennoù en destenn."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Ul lizherenn, ur ger pe ul linennad testenn."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "Lemel an esaouennoù en daou du"; +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"] = "Dizober"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // 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 +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Distreiñ talvoud an argemm-mañ."; +Blockly.Msg["VARIABLES_SET"] = "termenañ %1 da %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Krouiñ 'kaout %1'"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Termenañ a ra argemm-mañ evit ma vo par da dalvoudenn ar moned."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Un argemmenn anvet '%1' zo anezhi dija."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Un argemenn anvet '%1' zo c'hoazh evit un argemenn all eus ar seurt : '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Lavaret un dra bennak..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/ca.js b/js/msg/js/ca.js new file mode 100644 index 0000000..bba2b42 --- /dev/null +++ b/js/msg/js/ca.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Afegeix un comentari"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "No podem esborrar la variable '%1' perquè forma part de la definició de la funció '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Canvia valor:"; +Blockly.Msg["CLEAN_UP"] = "Netejar blocs"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "Contraure blocs"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Contraure bloc"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "color 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "color 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "proporció"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "barreja"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Barreja dos colors amb una proporció donada (0,0 - 1,0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://ca.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Escolliu un color de la paleta."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "color aleatori"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Escolliu un color a l'atzar."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "blau"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "verd"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "vermell"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "color amb"; +Blockly.Msg["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."; +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 del bucle"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "continuar amb la següent iteració del bucle"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Sortir del bucle interior."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Ometre la resta d'aquest bucle, i continuar amb la següent iteració."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Advertència: Aquest bloc només es pot utilitzar dins d'un bucle."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "per a cada element %1 en la llista %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Per a cada element en la llista, desar l'element dins la variable '%1', i llavors executar unes sentències."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "comptar amb %1 des de %2 fins a %3 en increments de %4"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Fer que la variable \"%1\" prengui els valors des del nombre inicial fins al nombre final, incrementant a cada pas l'intèrval indicat, i executar els blocs especificats."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Afegeix una condició al bloc 'si'."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Afegeix una condició final, que recull qualsevol altra possibilitat, al bloc 'si'."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Afegeix, esborra o reordena seccions per reconfigurar aquest bloc 'si'."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "si no"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "si no, si"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "si"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Si un valor és cert, llavors executar unes sentències."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://ca.wikipedia.org/wiki/Bucle_For"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "fer"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "repetir %1 vegades"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Executar unes sentències diverses vegades."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "repetir fins que"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "repetir mentre"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Mentre un valor sigui fals, llavors executar unes sentències."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Mentre un valor sigui cert, llavors executar unes sentències."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Esborrar els %1 blocs?"; +Blockly.Msg["DELETE_BLOCK"] = "Esborra bloc"; +Blockly.Msg["DELETE_VARIABLE"] = "Esborrar la variable '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Esborrar '%1' crides de la variable '%2'?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Esborra %1 blocs"; +Blockly.Msg["DISABLE_BLOCK"] = "Desactiva bloc"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Duplica"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Comentari duplicat"; +Blockly.Msg["ENABLE_BLOCK"] = "Activa bloc"; +Blockly.Msg["EXPAND_ALL"] = "Expandir blocs"; +Blockly.Msg["EXPAND_BLOCK"] = "Expandir bloc"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Entrades externes"; +Blockly.Msg["HELP"] = "Ajuda"; +Blockly.Msg["INLINE_INPUTS"] = "Entrades en línia"; +Blockly.Msg["IOS_CANCEL"] = "Cancel·lar"; +Blockly.Msg["IOS_ERROR"] = "Error"; +Blockly.Msg["IOS_OK"] = "D'acord"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Afegeix Entrada"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Permetre instruccions"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Aquesta funció té entrades duplicades."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "ENTRADES"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Afegir"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Afegeix Variable"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Esborrar"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "You can't use an empty variable name."; // untranslated +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Reanomena"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Variable name"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "crear llista buida"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Retorna una llista, de longitud 0, que no conté cap dada."; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "llista"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Afegeix, esborra o reordena seccions per reconfigurar aquest bloc de llista."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "crear llista amb"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Afegeix un element a la llista."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Crea una llista amb qualsevol nombre d'elements."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "primer"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "núm.# des del final"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_GET"] = "recupera"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "recupera i esborra"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "últim"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "a l'atzar"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "esborra"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Retorna el primer element d'una llista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Retorna l'element de la posició especificada a la llista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Retorna l'últim element d'una llista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Retorna un element a l'atzar d'una llista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Esborra i retorna el primer element d'una llista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Esborra i retorna l'element de la posició especificada de la llista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Esborra i retorna l'últim element d'una llista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Esborra i retorna un element a l'atzar d'una llista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Esborra el primer element d'una llista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Esborra l'element de la posició especificada de la llista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Esborra l'últim element d'una llista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Esborra un element a l'atzar d'una llista."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "fins # des del final"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "fins #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "fins l'últim"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "recupera sub-llista des del principi"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "recupera sub-llista des de # des del final"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "recupera sub-llista des de #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Crea una còpia de la part especificada d'una llista."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 és l'últim element."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 és el primer element."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "buscar primera aparició d'un element"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "buscar última aparició d'un element"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Retorna l'índex de la primera/última aparició d'un element a la llista. Retorna %1 si no s'hi troba el text."; +Blockly.Msg["LISTS_INLIST"] = "en la llista"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 és buida"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Retorna cert si la llista és buida."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "longitud de %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Retorna la longitud d'una llista."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "crea llista amb element %1 repetit %2 vegades"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Crea una llista formada pel valor donat, repetit tantes vegades com s'indiqui."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "com"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "insereix a"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "modifica"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Insereix l'element al principi d'una llista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Insereix l'element a la posició especificada d'una llista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Afegeix l'element al final d'una llista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Insereix l'element en una posició a l'atzar d'una llista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Modifica el primer element d'una llista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Modifica l'element de la posició especificada d'una llista."; +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"] = "alfabètic"; +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"] = "amb delimitador"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "fals"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Retorna o bé cert o bé fals."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "cert"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://ca.wikipedia.org/wiki/Inequaci%C3%B3"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Retorna cert si totes dues entrades són iguals."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Retorna cert si la primera entrada és més gran que la segona entrada."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Retorna cert si la primera entrada és més gran o igual a la segona entrada."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Retorna cert si la primera entrada és més petita que la segona entrada."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Retorna cert si la primera entra és més petita o igual a la segona entrada."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Retorna cert si totes dues entrades són diferents."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "no %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Retorna cert si l'entrada és falsa. Retorna fals si l'entrada és certa."; +Blockly.Msg["LOGIC_NULL"] = "nul"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Retorna nul."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "i"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "o"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Retorna cer si totes dues entrades són certes."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Retorna cert si almenys una de les entrades és certa."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "condició"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "si és fals"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "si és cert"; +Blockly.Msg["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'."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://ca.wikipedia.org/wiki/Aritm%C3%A8tica"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Retorna la suma dels dos nombres."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Retorna el quocient dels dos nombres."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Retorna la diferència entre els dos nombres."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Retorna el producte del dos nombres."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Retorna el primer nombre elevat a la potència indicada pel segon nombre."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://ca.wikipedia.org/wiki/Suma"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "canvia %1 per %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Afegeix un nombre a la variable '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://ca.wikipedia.org/wiki/Constant_matem%C3%A0tica"; +Blockly.Msg["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)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "limitar %1 entre %2 i %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Limita un nombre perquè estigui entre els límits especificats (inclosos)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "és divisible per"; +Blockly.Msg["MATH_IS_EVEN"] = "és parell"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "és negatiu"; +Blockly.Msg["MATH_IS_ODD"] = "és senar"; +Blockly.Msg["MATH_IS_POSITIVE"] = "és positiu"; +Blockly.Msg["MATH_IS_PRIME"] = "és primer"; +Blockly.Msg["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."; +Blockly.Msg["MATH_IS_WHOLE"] = "és enter"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://ca.wikipedia.org/wiki/Residu_%28aritm%C3%A8tica%29"; +Blockly.Msg["MATH_MODULO_TITLE"] = "residu de %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Retorna el residu de dividir els dos nombres."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://ca.wikipedia.org/wiki/Nombre"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Un nombre."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "mitjana de llista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "màxim de llista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "mediana de llista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "mínim de llista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "moda de llista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "element aleatori de llista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "desviació estàndard de llista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "suma de llista"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Retorna la mitjana (mitjana aritmètica) dels valors numèrics de la llista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Retorna el nombre més gran de la llista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Retorna la mediana de la llista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Retorna el nombre més petit de la llista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Retorna una llista dels elements que apareixen més vegades a la llista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Retorna un element aleatori de la lllista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Retorna la desviació estàndard de la llista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Retorna la suma de tots els nombres de la llista."; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://ca.wikipedia.org/wiki/Generaci%C3%B3_de_nombres_aleatoris"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "fracció aleatòria"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Retorna una fracció aleatòria entre 0,0 (inclòs) i 1,0 (exclòs)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://ca.wikipedia.org/wiki/Generaci%C3%B3_de_nombres_aleatoris"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "nombre aleatori entre %1 i %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Retorna un nombre aleatori entre els dos límits especificats, inclosos."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://ca.wikipedia.org/wiki/Arrodoniment"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "arrodonir"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "arrodonir cap avall"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "arrodonir cap amunt"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Arrodonir un nombre cap amunt o cap avall."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://ca.wikipedia.org/wiki/Arrel_quadrada"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absolut"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "arrel quadrada"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Retorna el valor absolut d'un nombre."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Retorna ''e'' elevat a la potència del nombre indicat."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Retorna el logaritme natural d'un nombre."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Retorna el logaritme en base 10 d'un nombre."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Retorna l'oposat d'un nombre."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Retorna 10 elevat a la potència del nombre indicat."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Retorna l'arrel quadrada d'un nombre."; +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://ca.wikipedia.org/wiki/Funci%C3%B3_trigonom%C3%A8trica"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Retorna l'arccosinus d'un nombre."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Retorna l'arcsinus d'un nombre."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Retorna l'arctangent d'un nombre."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Retorna el cosinus d'un grau (no radiant)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Retorna el sinus d'un grau (no radiant)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Retorna la tangent d'un grau (no radiant)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Crear variable de color..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Crea variable numèrica..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Crear variable de cadena…"; +Blockly.Msg["NEW_VARIABLE"] = "Crea una variable…"; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Nou nom de variable:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Nou tipus de variable:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "permetre declaracions"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "amb:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://ca.wikipedia.org/wiki/Procediment_%28Programació%29"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Executa la funció definida per usuari '%1'."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://ca.wikipedia.org/wiki/Procediment_%28Programació%29"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Executa la funció definida per l'usuari '%1' i utilitza la seva sortida."; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "amb:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "Crear '%1'"; +Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Descriure aquesta funció..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "fes alguna cosa"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "a"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Crea una funció sense sortida."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "retorna"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Crea una funció amb una sortida."; +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Advertència: Aquesta funció té paràmetres duplicats."; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Iluminar la definició de la funció"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Si el valor és cert, llavors retorna un segon valor."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Advertència: Aquest bloc només es pot utilitzar dins de la definició d'una funció."; +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"] = "Refer"; +Blockly.Msg["REMOVE_COMMENT"] = "Elimina el comentari"; +Blockly.Msg["RENAME_VARIABLE"] = "Reanomena variable..."; +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Reanomena totes les variables '%1' a:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "a %1 afegir text %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Afegir un text a la variable '%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "a minúscules"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "a Text De Títol"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "a MAJÚSCULES"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Retorna una còpia del text amb diferents majúscules/minúscules."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "recupera la primera lletra"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "recupera la lletra núm.# des del final"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "recupera la lletra núm.#"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "recupera l'última lletra"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "recupera una lletra a l'atzar"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Recupera la lletra de la posició especificada."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Afegeix un element al text."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "unir"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Afegeix, esborrar o reordenar seccions per reconfigurar aquest bloc de text."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "fins a la lletra núm.# des del final"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "fins a la lletra núm.#"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "fins a l'última lletra"; +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"] = "en el text"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "recupera subcadena des de la primera lletra"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "recupera subcadena des de la lletra núm.# des del final"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "recupera subcadena des de la lletra núm.#"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Recupera una part especificada del text."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "trobar la primera aparició del text"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "trobar l'última aparició del text"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "en el text %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Retorna l'índex de la primera/última aparició del primer text dins el segon. Retorna %1 si no es troba el text."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 està buit"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Retorna cert si el text proporcionat està buit."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "crear text amb"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Crea un tros de text per unió de qualsevol nombre d'elements."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "llargària de %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Retorna el nombre de lletres (espais inclosos) en el text proporcionat."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "imprimir %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Imprimir el text, el nombre o altre valor especificat."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Demana que l'usuari introdueixi un nombre."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Demana que l'usuari introdueixi un text."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "demanar un nombre amb el missatge"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "demanar text amb el missatge"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://ca.wikipedia.org/wiki/Cadena_%28inform%C3%A0tica%29"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Una lletra, paraula o línia de text."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "retalla espais de tots dos extrems de"; +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"] = "Avui"; +Blockly.Msg["UNDO"] = "Desfer"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // 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 +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Retorna el valor d'aquesta variable."; +Blockly.Msg["VARIABLES_SET"] = "modifica %1 a %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Crear 'recupera %1'"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Modifica aquesta variable al valor introduït."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Ja existeix una variable anomenada '%1'."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Una variable anomenada '%1' ja existeix per al tipus '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Digues alguna cosa..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/cs.js b/js/msg/js/cs.js new file mode 100644 index 0000000..3150db9 --- /dev/null +++ b/js/msg/js/cs.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Přidat komentář"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Změnit hodnotu:"; +Blockly.Msg["CLEAN_UP"] = "Uspořádat bloky"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "poměr"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "smíchat"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Smíchá dvě barvy v daném poměru (0.0–1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://cs.wikipedia.org/wiki/Barva"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Vyberte barvu z palety."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "náhodná barva"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Zvolte barvu náhodně."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "modrá"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "zelená"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "červená"; +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"] = "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"] = "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 +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í 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_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_MSG_ELSE"] = "jinak"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "nebo pokud"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "pokud"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Je-li hodnota pravda, proveď určité příkazy."; +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_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"] = "Smazat všech %1 bloků?"; +Blockly.Msg["DELETE_BLOCK"] = "Smazat blok"; +Blockly.Msg["DELETE_VARIABLE"] = "Delete the '%1' variable"; // untranslated +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg["DELETE_X_BLOCKS"] = "Smazat %1 bloků"; +Blockly.Msg["DISABLE_BLOCK"] = "Deaktivovat blok"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Duplikovat"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +Blockly.Msg["ENABLE_BLOCK"] = "Povolit blok"; +Blockly.Msg["EXPAND_ALL"] = "Rozbalit bloky"; +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"; +Blockly.Msg["IOS_CANCEL"] = "Cancel"; // untranslated +Blockly.Msg["IOS_ERROR"] = "Chyba"; +Blockly.Msg["IOS_OK"] = "OK"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Add Input"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "vstupy"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Přidat"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Add Variable"; // untranslated +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Smazat"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "You can't use an empty variable name."; // untranslated +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Přejmenovat"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Variable name"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "vytvořit prázdný seznam"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Vrátí seznam nulové délky, který neobsahuje žádné datové záznamy"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "seznam"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Přidat, odebrat nebo změnit pořadí oddílů tohoto seznamu bloku."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "vytvořit seznam s"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Přidat položku do seznamu."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Vytvoř seznam s libovolným počtem položek."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "první"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# od konce"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; +Blockly.Msg["LISTS_GET_INDEX_GET"] = "získat"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "získat a odstranit"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "poslední"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "náhodné"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "odstranit"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Vrátí první položku v seznamu."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Získá položku z určené pozice v seznamu."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Vrátí poslední položku v seznamu."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Vrátí náhodnou položku ze seznamu."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Odstraní a vrátí první položku v seznamu."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Odstraní a získá položku z určené pozice v seznamu."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Odstraní a vrátí poslední položku v seznamu."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Odstraní a vrátí náhodnou položku v seznamu."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Odstraní první položku v seznamu."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Odebere položku na konkrétním místě v seznamu."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Odstraní poslední položku v seznamu."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Odstraní náhodou položku v seznamu."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "do # od konce"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "do #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "jako poslední"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "získat podseznam od první položky"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "získat podseznam od # od konce"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "získat podseznam od #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Vytvoří kopii určené části seznamu."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 je poslední položka."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 je první položka."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "najít první výskyt položky"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "najít poslední výskyt položky"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Vrací index prvního/posledního výskytu položky v seznamu. Vrací %1, pokud položka nebyla nalezena."; +Blockly.Msg["LISTS_INLIST"] = "v seznamu"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 je prázdné"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Vrátí hodnotu pravda, pokud je seznam prázdný."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "délka %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Vrací počet položek v seznamu."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "vytvoř seznam s položkou %1 opakovanou %2 krát"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Vytváří seznam obsahující danou hodnotu n-krát."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "jako"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "vložit na"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "nastavit"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Vložit položku na začátek seznamu."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Vloží položku na určenou pozici v seznamu."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Připojí položku na konec seznamu."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Připojí položku náhodně do seznamu."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Nastaví první položku v seznamu."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Nastaví položku na konkrétní místo v seznamu."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "vzestupně"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "sestupně"; +Blockly.Msg["LISTS_SORT_TITLE"] = "seřadit %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Seřadit kopii seznamu."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "abecedně, na velikosti písmen nezáleží"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "číselné"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "abecedně"; +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"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Spojit seznam textů do jednoho textu, rozdělaného oddělovači."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Rozdělit text do seznamu textů, lámání na oddělovačích."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "s oddělovačem"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "nepravda"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Vrací pravda nebo nepravda."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "pravda"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://cs.wikipedia.org/wiki/Nerovnost_(matematika)"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Vrátí hodnotu pravda, pokud se oba vstupy rovnají jeden druhému."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Navrátí hodnotu pravda, pokud první vstup je větší než druhý vstup."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Navrátí hodnotu pravda, pokud je první vstup větší a nebo rovný druhému vstupu."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Navrátí hodnotu pravda, pokud je první vstup menší než druhý vstup."; +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"] = "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"] = "prázdný"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +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://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"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Vrátí součet dvou čísel."; +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_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +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 ∞ (nekonečno)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // 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é číslem"; +Blockly.Msg["MATH_IS_EVEN"] = "je sudé"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "je záporné"; +Blockly.Msg["MATH_IS_ODD"] = "je liché"; +Blockly.Msg["MATH_IS_POSITIVE"] = "je kladné"; +Blockly.Msg["MATH_IS_PRIME"] = "je prvočíslo"; +Blockly.Msg["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."; +Blockly.Msg["MATH_IS_WHOLE"] = "je celé"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://cs.wikipedia.org/wiki/Modul%C3%A1rn%C3%AD_aritmetika"; +Blockly.Msg["MATH_MODULO_TITLE"] = "zbytek po dělení %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Vrátí zbytek po dělení dvou čísel."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://cs.wikipedia.org/wiki/Číslo"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Číslo."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "průměr v seznamu"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "největší v seznamu"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "medián v seznamu"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "nejmenší v seznamu"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "nejčastější ze seznamu"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "náhodná položka seznamu"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "směrodatná odchylka ze seznamu"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "suma seznamu"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Vrátí průměr (aritmetický průměr) číselných hodnot v seznamu."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Vrátí největší číslo v seznamu."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Vrátí medián seznamu."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Vrátí nejmenší číslo v seznamu."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Vrátí seznam nejčastějších položek seznamu."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Vrátí náhodnou položku ze seznamu."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Vrátí směrodatnou odchylku seznamu."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Vrátí součet všech čísel v seznamu."; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://cs.wikipedia.org/wiki/Gener%C3%A1tor_n%C3%A1hodn%C3%BDch_%C4%8D%C3%ADsel"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "náhodné číslo mezi 0 (včetně) do 1"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Vrátí náhodné číslo mezi 0,0 (včetně) až 1,0"; +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://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "zaokrouhlit"; +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í 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."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Vrátí přirozený logaritmus čísla."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Vrátí desítkový logaritmus čísla."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Vrátí zápornou hodnotu čísla."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Vrátí mocninu čísla 10."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Vrátí druhou odmocninu čísla."; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +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://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í 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."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Vytvořit barvu proměnné..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Vytvořit číselnou proměnnou..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Vytvořit řetězcovou proměnnou..."; +Blockly.Msg["NEW_VARIABLE"] = "Vytvořte proměnnou..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Nový název proměnné:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Nový typ proměnné:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "povolit příkazy"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "s:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://cs.wikipedia.org/wiki/Podprogram"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Spustí uživatelem definovanou funkci '%1'."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://cs.wikipedia.org/wiki/Podprogram"; +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"] = "Popište tuto funkci..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // 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://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"; +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"] = "Znovu"; +Blockly.Msg["REMOVE_COMMENT"] = "Odstranit komentář"; +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_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "do %1 přidat text %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Přidá určitý text k proměnné '%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "na malá písmena"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "na Počáteční Velká Písmena"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "na VELKÁ PÍSMENA"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Vrátí kopii textu s jinou velikostí písmen."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "získat první písmeno"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "získat # písmeno od konce"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "získat písmeno #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "získat poslední písmeno"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "získat náhodné písmeno"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Získat písmeno na konkrétní pozici."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Přidat položku do textu."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "spojit"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Přidat, odebrat nebo změnit pořadí oddílů tohoto textového bloku."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "do # písmene od konce"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "do písmene #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "do posledního písmene"; +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"] = "v textu"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "získat podřetězec od prvního písmene"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "získat podřetězec od písmene # od konce"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "získat podřetězec od písmene #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Získat zadanou část textu."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "najít první výskyt textu"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "najít poslední výskyt textu"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "v textu %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Vrátí index prvního/posledního výskytu prvního textu v druhém textu. Pokud text není nalezen, vypíše %1."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 je prázdný"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Vrátí pravda pokud je zadaný text prázdný."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "vytvořit text s"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Vytvoří kousek textu spojením libovolného počtu položek."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "délka %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Vrátí počet písmen (včetně mezer) v zadaném textu."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "tisk %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Tisk zadaného textu, čísla nebo jiné hodnoty."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Výzva pro uživatele k zadání čísla."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Výzva pro uživatele k zadání nějakého textu."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "výzva k zadání čísla se zprávou"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "výzva k zadání textu se zprávou"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://cs.wikipedia.org/wiki/Textov%C3%BD_%C5%99et%C4%9Bzec"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Písmeno, slovo nebo řádek textu."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "odstranit mezery z obou stran"; +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"] = "Zpět"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // 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 +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Vrátí hodnotu této proměnné."; +Blockly.Msg["VARIABLES_SET"] = "nastavit %1 na %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Vytvořit \"získat %1\""; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Nastaví tuto proměnnou, aby se rovnala vstupu."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "A variable named '%1' already exists."; // untranslated +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Proměnná pojmenovaná jako '%1' již existuje pro jiný typ: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/da.js b/js/msg/js/da.js new file mode 100644 index 0000000..2a53b43 --- /dev/null +++ b/js/msg/js/da.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Tilføj Kommentar"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Kan ikke slette variablen »%1« da den er en del af definitionen af funktionen »%2«"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Skift værdi:"; +Blockly.Msg["CLEAN_UP"] = "Ryd op i blokke"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "Fold blokkene sammen"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Fold blokken sammen"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "farve 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "farve 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "i forholdet"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "bland"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Blander to farver sammen i et bestemt forhold (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://da.wikipedia.org/wiki/Farve"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Vælg en farve fra paletten."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "tilfældig farve"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Vælg en tilfældig farve."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "blå"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "grøn"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "rød"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "farve med"; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "bryd ud af løkken"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "fortsæt med den næste gentagelse i løkken"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Bryd ud af den omgivende løkke."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Spring resten af denne løkke over, og fortsæt med den næste gentagelse."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Advarsel: Denne blok kan kun bruges i en løkke."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "for hvert element %1 i listen %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "For hvert element i en liste, sæt variablen '%1' til elementet, og udfør derefter nogle kommandoer."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "tæl med %1 fra %2 til %3 med %4"; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Tilføj en betingelse til denne \"hvis\" blok."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Tilføj en sidste fang-alt betingelse, til denne \"hvis\" blok."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Tilføj, fjern eller byt om på rækkefølgen af delene for at konfigurere denne \"hvis\" blok."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "ellers"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "ellers hvis"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "hvis"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Hvis en værdi er sand, så udfør nogle kommandoer."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://da.wikipedia.org/wiki/For-l%C3%B8kke"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "udfør"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "gentag %1 gange"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Udfør nogle kommandoer flere gange."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "gentag indtil"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "gentag sålænge"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Udfør nogle kommandoer, sålænge en værdi er falsk."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Udfør nogle kommandoer, sålænge en værdi er sand."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Slet alle %1 blokke?"; +Blockly.Msg["DELETE_BLOCK"] = "Slet blok"; +Blockly.Msg["DELETE_VARIABLE"] = "Slet variablen »%1«"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Slet %1's brug af variablen »%2«?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Slet %1 blokke"; +Blockly.Msg["DISABLE_BLOCK"] = "Deaktivér blok"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Duplikér"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplikér Kommentar"; +Blockly.Msg["ENABLE_BLOCK"] = "Aktivér blok"; +Blockly.Msg["EXPAND_ALL"] = "Fold blokkene ud"; +Blockly.Msg["EXPAND_BLOCK"] = "Fold blokken ud"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Udvendige inputs"; +Blockly.Msg["HELP"] = "Hjælp"; +Blockly.Msg["INLINE_INPUTS"] = "Indlejrede inputs"; +Blockly.Msg["IOS_CANCEL"] = "Annuller"; +Blockly.Msg["IOS_ERROR"] = "Fejl"; +Blockly.Msg["IOS_OK"] = "O.k."; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Tilføj inddata"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Tillad udsagn"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Denne funktion har duplikerede inddata."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INDDATA"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Tilføj"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Tilføj variabel"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Slet"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Du kan ikke bruge et tomt variabelnavn."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Omdøb"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Variabelnavn"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "opret en tom liste"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Returnerer en liste af længde 0, som ikke indeholder nogen data"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "liste"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Tilføj, fjern eller byt om på rækkefølgen af delene for at konfigurere denne blok."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "opret liste med"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Føj et element til listen."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Opret en liste med et vilkårligt antal elementer."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "første"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# fra slutningen"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_GET"] = "hent"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "hent og fjern"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "sidste"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "tilfældig"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "fjern"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Returnerer det første element i en liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Returnerer elementet på den angivne position på en liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Returnerer den sidste element i en liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Returnerer et tilfældigt element i en liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Fjerner og returnerer det første element i en liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Fjerner og returnerer elementet på den angivne position på en liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Fjerner og returnerer det sidste element i en liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Fjerner og returnerer et tilfældigt element i en liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Fjerner det første element i en liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Fjerner elementet på den angivne position på en liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Fjerner sidste element i en liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Fjerner et tilfældigt element i en liste."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "til # fra slutningen"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "til #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "til sidste"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "hent underliste fra første"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "hent underliste fra # fra slutningen"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "hent underliste fra #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Opretter en kopi af den angivne del af en liste."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 er det sidste element."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 er det første element."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "find første forekomst af elementet"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "find sidste forekomst af elementet"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Returnerer indeks for første/sidste forekomst af elementet i listen. Returnerer %1, hvis elementet ikke kan findes."; +Blockly.Msg["LISTS_INLIST"] = "i listen"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 er tom"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Returnerer sand, hvis listen er tom."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "længden af %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Returnerer længden af en liste."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "opret liste med elementet %1 gentaget %2 gange"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Opretter en liste bestående af den givne værdi gentaget et bestemt antal gange."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "vend %1 om"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Vend en kopi af en liste om."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "som"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "indsæt ved"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "sæt"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Indsætter elementet i starten af en liste."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Indsætter elementet på den angivne position i en liste."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Føj elementet til slutningen af en liste."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Indsætter elementet tilfældigt i en liste."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Sætter det første element i en liste."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Sætter elementet på den angivne position i en liste."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "stigende"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "faldende"; +Blockly.Msg["LISTS_SORT_TITLE"] = "sorter %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Sorter en kopi af en liste."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alfabetisk, ignorer store/små bogstaver"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "nummerorden"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alfabetisk"; +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"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Saml en liste af tekster til én tekst, der er adskilt af et skilletegn."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Bryd tekst op i en liste af tekster med brud ved hvert skilletegn."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "med skilletegn"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "falsk"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Returnerer enten sand eller falsk."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "sand"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://da.wikipedia.org/wiki/Ulighed_(matematik)"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Returnere sand, hvis begge inputs er lig med hinanden."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Returnere sand, hvis det første input er større end det andet input."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Returnere sand, hvis det første input er større end eller lig med det andet input."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Returnere sand, hvis det første input er mindre end det andet input."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Returnere sand, hvis det første input er mindre end eller lig med det andet input."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Returnere sand, hvis begge inputs ikke er lig med hinanden."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "ikke %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Returnerer sand, hvis input er falsk. Returnerer falsk, hvis input er sandt."; +Blockly.Msg["LOGIC_NULL"] = "null"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Returnerer null."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "og"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "eller"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Returnere sand, hvis begge inputs er sande."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Returnere sand, hvis mindst et af inputtene er sande."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "test"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "hvis falsk"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "hvis sand"; +Blockly.Msg["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."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://da.wikipedia.org/wiki/Aritmetik"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Returnere summen af de to tal."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Returnere kvotienten af de to tal."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Returnere forskellen mellem de to tal."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Returnere produktet af de to tal."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Returnere det første tal opløftet til potensen af det andet tal."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 af X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "skift %1 med %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Læg et tal til variablen '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://da.wikipedia.org/wiki/Matematisk_konstant"; +Blockly.Msg["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)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "begræns %1 til mellem %2 og %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Begræns et tal til at være mellem de angivne grænser (inklusiv)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = ":"; +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "er deleligt med"; +Blockly.Msg["MATH_IS_EVEN"] = "er lige"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "er negativt"; +Blockly.Msg["MATH_IS_ODD"] = "er ulige"; +Blockly.Msg["MATH_IS_POSITIVE"] = "er positivt"; +Blockly.Msg["MATH_IS_PRIME"] = "er et primtal"; +Blockly.Msg["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."; +Blockly.Msg["MATH_IS_WHOLE"] = "er helt"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://da.wikipedia.org/wiki/Modulo"; +Blockly.Msg["MATH_MODULO_TITLE"] = "resten af %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Returner resten fra at dividere de to tal."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://da.wikipedia.org/wiki/Tal"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Et tal."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "gennemsnit af listen"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "største tal i listen"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "listens median"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "mindste tal i listen"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "listens typetal"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "tilfældigt element fra listen"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "standardafvigelsen for listen"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "summen af listen"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Returner gennemsnittet (middelværdien) af de numeriske værdier i listen."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Returner det største tal i listen."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Returner listens median."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Returner det mindste tal i listen."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Returner en liste over de mest almindelige elementer på listen."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Returner et tilfældigt element fra listen."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Returner standardafvigelsen for listen."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Returner summen af alle tal i listen."; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://da.wikipedia.org/wiki/Tilfældighedsgenerator"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "tilfældigt decimaltal (mellem 0 og 1)"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Returner et tilfældigt decimaltal mellem 0,0 (inklusiv) og 1,0 (eksklusiv)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://da.wikipedia.org/wiki/Tilfældighedsgenerator"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "tilfældigt heltal mellem %1 og %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Returner et tilfældigt heltal mellem de to angivne grænser (inklusiv)."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://da.wikipedia.org/wiki/Afrunding"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "afrund"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "rund ned"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "rund op"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Runde et tal op eller ned."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://da.wikipedia.org/wiki/Kvadratrod"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absolut"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "kvadratrod"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Returnere den absolutte værdi af et tal."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Returnere e til potensen af et tal."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Returnere den naturlige logaritme af et tal."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Returnere 10-talslogaritmen af et tal."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Returnere negationen af et tal."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Returnere 10 til potensen af et tal."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Returnere kvadratroden af et tal."; +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://da.wikipedia.org/wiki/Trigonometrisk_funktion"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Returnere arcus cosinus af et tal."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Returnere arcus sinus af et tal."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Returnere arcus tangens af et tal."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Returnere cosinus af en vinkel (i grader)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Returnere sinus af en vinkel (i grader)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Returnere tangens af en vinkel (i grader)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Opret farvevariabel ..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Opret nummervariabel ..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Opret strengvariabel ..."; +Blockly.Msg["NEW_VARIABLE"] = "Opret variabel ..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Navn til den nye variabel:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Ny variabeltype:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "tillad erklæringer"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "med:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Kør den brugerdefinerede funktion '%1'."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +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"] = "Beskriv denne funktion..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "gøre noget"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "for at"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Opretter en funktion der ikke har nogen returværdi."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +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"; +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"] = "Omgør"; +Blockly.Msg["REMOVE_COMMENT"] = "Fjern Kommentar"; +Blockly.Msg["RENAME_VARIABLE"] = "Omdøb variabel..."; +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Omdøb alle '%1' variabler til:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "til %1 tilføj tekst %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Tilføj noget tekst til variablen '%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "til små bogstaver"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "til Stort Begyndelsesbogstav"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "til STORE BOGSTAVER"; +Blockly.Msg["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."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "hent første bogstav"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "hent bogstav # fra slutningen"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "hent bogstav #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "hent sidste bogstav"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "hent tilfældigt bogstav"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "i tekst %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returnerer bogstavet på den angivne placering."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "tæl %1 i %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Tæl hvor mange gange noget tekst fremgår i en anden tekst."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Føj et element til teksten."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "sammenføj"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Tilføj, fjern eller byt om på rækkefølgen af delene for at konfigurere denne tekstblok."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "til bogstav # fra slutningen"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "til bogstav #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "til sidste bogstav"; +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"] = "i teksten"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "hent delstreng fra første bogstav"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "hent delstreng fra bogstav # fra slutningen"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "hent delstreng fra bogstav #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Returnerer den angivne del af teksten."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "find første forekomst af teksten"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "find sidste forekomst af teksten"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "i tekst %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returnerer indeks for første/sidste forekomst af første tekst i den anden tekst. Returnerer %1, hvis teksten ikke kan findes."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 er tom"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Returnerer sand, hvis den angivne tekst er tom."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "lav en tekst med"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Lav et stykke tekst ved at sætte et antal elementer sammen."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "længden af %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Returnerer antallet af bogstaver (herunder mellemrum) i den angivne tekst."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "skriv %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Skriv den angivne tekst, tal eller anden værdi."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Spørg brugeren efter et tal"; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Spørg brugeren efter en tekst"; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "spørg efter et tal med meddelelsen"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "spørg efter tekst med meddelelsen"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "erstat %1 med %2 i %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Erstat alle forekomster af noget tekst i en anden tekst."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "vend %1 om"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Vender rækkefølgen om for tegnene i teksten."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://da.wikipedia.org/wiki/Tekststreng"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "En bogstav, et ord eller en linje med tekst."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "fjern mellemrum fra begge sider af"; +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"] = "Fortryd"; +Blockly.Msg["UNNAMED_KEY"] = "unavngivet"; +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 +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Returnerer værdien af denne variabel."; +Blockly.Msg["VARIABLES_SET"] = "sæt %1 til %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Opret 'hent %1'"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Sætter denne variabel til at være lig med input."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "En variabel med navnet »%1« findes allerede."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "En variabel med navnet »%1« findes allerede for en anden type: »%2«."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Sig noget ..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/de.js b/js/msg/js/de.js new file mode 100644 index 0000000..fc1bd17 --- /dev/null +++ b/js/msg/js/de.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Kommentar hinzufügen"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Die Variable „%1“ kann nicht gelöscht werden, da sie Teil der Definition der Funktion „%2“ ist."; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Wert ändern:"; +Blockly.Msg["CLEAN_UP"] = "Bausteine aufräumen"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Eingeklappte Blöcke enthalten Warnungen."; +Blockly.Msg["COLLAPSE_ALL"] = "Alle Bausteine zusammenfalten"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Baustein zusammenfalten"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "Farbe 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "und Farbe 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; +Blockly.Msg["COLOUR_BLEND_RATIO"] = "im Verhältnis"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "mische"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Vermischt 2 Farben mit konfigurierbarem Farbverhältnis (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://de.wikipedia.org/wiki/Farbe"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Wählt eine Farbe aus der Palette aus."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "zufällige Farbe"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Erzeugt eine Farbe nach dem Zufallsprinzip."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "blau"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "grün"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; +Blockly.Msg["COLOUR_RGB_RED"] = "rot"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "Farbe aus"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Erzeugt eine Farbe mit selbst definierten Rot-, Grün- und Blauwerten. Alle Werte müssen zwischen 0 und 100 liegen."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://de.wikipedia.org/wiki/Kontrollstruktur"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "die Schleife abbrechen"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "sofort mit nächstem Schleifendurchlauf fortfahren"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Die umgebende Schleife beenden."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Diese Anweisung abbrechen und mit dem nächsten Schleifendurchlauf fortfahren."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Warnung: Dieser Baustein kann nur in einer Schleife verwendet werden."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://de.wikipedia.org/wiki/For-Schleife"; +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "für jeden Wert %1 aus der Liste %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Führt eine Anweisung für jeden Wert in der Liste aus und setzt dabei die Variable \"%1\" auf den aktuellen Listenwert."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://de.wikipedia.org/wiki/For-Schleife"; +Blockly.Msg["CONTROLS_FOR_TITLE"] = "zähle %1 von %2 bis %3 in Schritten von %4"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Zählt die Variable \"%1\" von einem Startwert bis zu einem Endwert und führt für jeden Wert eine Anweisung aus."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Eine weitere Bedingung hinzufügen."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Eine sonst-Bedingung hinzufügen. Führt eine Anweisung aus, falls keine Bedingung zutrifft."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Hinzufügen, entfernen oder sortieren von Sektionen"; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "sonst"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "sonst falls"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "falls"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Führt eine Anweisung aus, falls eine Bedingung wahr ist."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Führt die erste Anweisung aus, falls eine Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Führt die erste Anweisung aus, falls die erste Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus, falls die zweite Bedingung wahr ist."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Führe die erste Anweisung aus, falls die erste Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus, falls die zweite Bedingung wahr ist. Führt die dritte Anweisung aus, falls keine der beiden Bedingungen wahr ist"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://de.wikipedia.org/wiki/For-Schleife"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "mache"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "wiederhole %1 mal:"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Eine Anweisung mehrfach ausführen."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://de.wikipedia.org/wiki/Schleife_%28Programmierung%29"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "wiederhole bis"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "wiederhole solange"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Führt Anweisungen aus solange die Bedingung unwahr ist."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Führt Anweisungen aus solange die Bedingung wahr ist."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Alle %1 Bausteine löschen?"; +Blockly.Msg["DELETE_BLOCK"] = "Baustein löschen"; +Blockly.Msg["DELETE_VARIABLE"] = "Die Variable „%1“ löschen"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "%1 Verwendungen der Variable „%2“ löschen?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "%1 Bausteine löschen"; +Blockly.Msg["DISABLE_BLOCK"] = "Baustein deaktivieren"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Kopieren"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Kommentar kopieren"; +Blockly.Msg["ENABLE_BLOCK"] = "Baustein aktivieren"; +Blockly.Msg["EXPAND_ALL"] = "Alle Bausteine entfalten"; +Blockly.Msg["EXPAND_BLOCK"] = "Baustein entfalten"; +Blockly.Msg["EXTERNAL_INPUTS"] = "externe Eingänge"; +Blockly.Msg["HELP"] = "Hilfe"; +Blockly.Msg["INLINE_INPUTS"] = "interne Eingänge"; +Blockly.Msg["IOS_CANCEL"] = "Abbrechen"; +Blockly.Msg["IOS_ERROR"] = "Fehler"; +Blockly.Msg["IOS_OK"] = "OK"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Parameter hinzufügen"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Anweisungen erlauben"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Diese Funktion hat doppelte Parameter."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "PARAMETER"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Hinzufügen"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Variable hinzufügen"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Löschen"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Du kannst keinen leeren Variablennamen verwenden."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Umbenennen"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Name der Variable"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "erzeuge eine leere Liste"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Erzeugt eine leere Liste ohne Inhalt."; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "Liste"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Hinzufügen, entfernen und sortieren von Elementen."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "erzeuge Liste mit"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Ein Element zur Liste hinzufügen."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Erzeugt eine Liste aus den angegebenen Elementen."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "Erste"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "von hinten das"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "das"; +Blockly.Msg["LISTS_GET_INDEX_GET"] = "nimm"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "nimm und entferne"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "Letzte"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "Zufällig"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "entferne"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = "Element"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Extrahiert das erste Element aus der Liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Extrahiert das Element an der angegebenen Position in der Liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Extrahiert das letzte Element aus der Liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Extrahiert ein zufälliges Element aus der Liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Extrahiert und entfernt das erste Element aus der Liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Extrahiert und entfernt das Element an der angegebenen Position aus der Liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Extrahiert und entfernt das letzte Element aus der Liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Extrahiert und entfernt ein zufälliges Element aus der Liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Entfernt das erste Element aus der Liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Entfernt das Element an der angegebenen Position aus der Liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Entfernt das letzte Element aus der Liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Entfernt ein zufälliges Element aus der Liste."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "bis von hinten"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "bis"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "bis letztes"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "nimm Teilliste ab erstes"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "nimm Teilliste ab von hinten"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "nimm Teilliste ab"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = "Element"; +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Erstellt eine Kopie mit dem angegebenen Abschnitt der Liste."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 ist das letzte Element."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 ist das erste Element."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "suche erstes Auftreten von"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "suche letztes Auftreten von"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Sucht die Position (Index) eines Elementes in der Liste. Gibt %1 zurück, falls kein Element gefunden wurde."; +Blockly.Msg["LISTS_INLIST"] = "in der Liste"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 ist leer"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Ist wahr, falls die Liste leer ist."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "Länge von %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Die Anzahl von Elementen in der Liste."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; +Blockly.Msg["LISTS_REPEAT_TITLE"] = "erzeuge Liste mit %2 mal dem Element %1​"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Erzeugt eine Liste mit einer variablen Anzahl von Elementen"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "kehre %1 um"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Kehre eine Kopie einer Liste um."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "ein"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "füge als"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "setze für"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Fügt das Element an den Anfang der Liste an."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Fügt das Element an der angegebenen Position in die Liste ein."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Fügt das Element ans Ende der Liste an."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Fügt das Element zufällig in die Liste ein."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Setzt das erste Element in der Liste."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Setzt das Element an der angegebenen Position in der Liste."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Setzt das letzte Element in die Liste."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Setzt ein zufälliges Element in der Liste."; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "aufsteigend"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "absteigend"; +Blockly.Msg["LISTS_SORT_TITLE"] = "%1 %2 %3 sortieren"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Eine Kopie einer Liste sortieren."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alphabetisch, Großschreibung ignorieren"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numerisch"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alphabetisch"; +Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg["LISTS_SPLIT_LIST_FROM_TEXT"] = "Liste aus Text erstellen"; +Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "Text aus Liste erstellen"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Liste mit Texten in einen Text vereinen, getrennt durch ein Trennzeichen."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Text in eine Liste mit Texten aufteilen, unterbrochen bei jedem Trennzeichen."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "mit Trennzeichen"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "falsch"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Ist entweder wahr oder falsch"; +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, falls beide Werte gleich sind."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Ist wahr, falls der erste Wert größer als der zweite Wert ist."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Ist wahr, falls der erste Wert größer als oder gleich groß wie der zweite Wert ist."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Ist wahr, falls der erste Wert kleiner als der zweite Wert ist."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Ist wahr, falls der erste Wert kleiner als oder gleich groß wie der zweite Wert ist."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Ist wahr, falls beide Werte unterschiedlich sind."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "nicht %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Ist wahr, falls der Eingabewert unwahr ist. Ist unwahr, falls der Eingabewert wahr ist."; +Blockly.Msg["LOGIC_NULL"] = "null"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://de.wikipedia.org/wiki/Nullwert"; +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Ist \"null\"."; +Blockly.Msg["LOGIC_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, falls beide Werte wahr sind."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Ist wahr, falls einer der beiden Werte wahr ist."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "prüfe"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://de.wikipedia.org/wiki/%3F:#Auswahloperator"; +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "falls falsch"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "falls wahr"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Überprüft eine Bedingung \"prüfe\". Falls die Bedingung wahr ist, wird der \"falls wahr\" Wert zurückgegeben, andernfalls der \"falls unwahr\" Wert"; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://de.wikipedia.org/wiki/Grundrechenart"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Ist die Summe zweier Zahlen."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Ist der Quotient zweier Zahlen."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Ist die Differenz zweier Zahlen."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Ist das Produkt zweier Zahlen."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Ist die erste Zahl potenziert mit der zweiten Zahl."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://de.wikipedia.org/wiki/Arctan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 von X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Gibt den Arkustangens des Punktes (X, Y) in Grad von -180 bis 180 zurück."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://de.wikipedia.org/wiki/Inkrement_und_Dekrement"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "erhöhe %1 um %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Addiert eine Zahl zu \"%1\"."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://de.wikipedia.org/wiki/Mathematische_Konstante"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Mathematische Konstanten wie: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…) oder ∞ (unendlich)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "begrenze %1 zwischen %2 und %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Begrenzt eine Zahl auf den Wertebereich zwischen zwei anderen Zahlen (inklusiv)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "ist teilbar durch"; +Blockly.Msg["MATH_IS_EVEN"] = "ist gerade"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "ist negativ"; +Blockly.Msg["MATH_IS_ODD"] = "ist ungerade"; +Blockly.Msg["MATH_IS_POSITIVE"] = "ist positiv"; +Blockly.Msg["MATH_IS_PRIME"] = "ist eine Primzahl"; +Blockly.Msg["MATH_IS_TOOLTIP"] = "Überprüft ob eine Zahl gerade, ungerade, eine Primzahl, ganzzahlig, positiv, negativ oder durch eine zweite Zahl teilbar ist. Gibt wahr oder falsch zurück."; +Blockly.Msg["MATH_IS_WHOLE"] = "ist eine ganze Zahl"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://de.wikipedia.org/wiki/Modulo"; +Blockly.Msg["MATH_MODULO_TITLE"] = "Rest von %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Der Rest nach einer Division."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://de.wikipedia.org/wiki/Zahl"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Eine Zahl."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = "http://www.sysplus.ch/einstieg.php?links=menu&seite=4125&grad=Crash&prog=Excel"; +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "Mittelwert der Liste"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "Maximalwert der Liste"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "Median der Liste"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "Minimalwert der Liste"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "am häufigsten in der Liste"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "Zufallswert aus der Liste"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "Standardabweichung der Liste"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "Summe über die Liste"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Ist der Durchschnittswert aller Zahlen in einer Liste."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Ist die größte Zahl in einer Liste."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Ist der Median aller Zahlen in einer Liste."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Ist die kleinste Zahl in einer Liste."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Findet die Werte mit dem häufigstem Vorkommen in der Liste."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Gibt einen zufälligen Wert aus der Liste zurück."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Ist die Standardabweichung aller Werte in der Liste."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Ist die Summe aller Zahlen in einer Liste."; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://de.wikipedia.org/wiki/Zufallszahlen"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "Zufallszahl (0.0 - 1.0)"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Erzeugt eine Zufallszahl zwischen 0.0 (inklusiv) und 1.0 (exklusiv)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://de.wikipedia.org/wiki/Zufallszahlen"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "ganzzahlige Zufallszahl zwischen %1 und %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Erzeugt eine ganzzahlige Zufallszahl zwischen zwei Zahlen (inklusiv)."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://de.wikipedia.org/wiki/Runden"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "runde"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "runde ab"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "runde auf"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Eine Zahl auf- oder abrunden."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://de.wikipedia.org/wiki/Quadratwurzel"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "Betrag"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "Quadratwurzel"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Ist der Betrag einer Zahl."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Ist Wert der Exponentialfunktion einer Zahl."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Ist der natürliche Logarithmus einer Zahl."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Ist der dekadische Logarithmus einer Zahl."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Negiert eine Zahl."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Rechnet 10 hoch eine Zahl."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Ist die Quadratwurzel einer Zahl."; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated +Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; // untranslated +Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; // untranslated +Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; // untranslated +Blockly.Msg["MATH_TRIG_COS"] = "cos"; // untranslated +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://de.wikipedia.org/wiki/Trigonometrie"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Ist der Arkuskosinus des Eingabewertes."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Ist der Arkussinus des Eingabewertes."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Ist der Arkustangens des Eingabewertes."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Ist der Kosinus des Winkels."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Ist der Sinus des Winkels (nicht Radiant)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Ist der Tangens des Winkels (nicht Radiant)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Farbvariable erstellen …"; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Zahlenvariable erstellen …"; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Zeichenfolgenvariable erstellen …"; +Blockly.Msg["NEW_VARIABLE"] = "Variable erstellen …"; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Name der neuen Variable:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Neuer Variablentyp:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = "."; +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "Anweisungen erlauben"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "mit:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://de.wikipedia.org/wiki/Unterprogramm"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Rufe einen Funktionsblock ohne Rückgabewert auf."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://de.wikipedia.org/wiki/Unterprogramm"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Rufe einen Funktionsblock mit Rückgabewert auf."; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "mit:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "Erzeuge \"Aufruf %1\""; +Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Beschreibe diese Funktion …"; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29"; +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "etwas tun"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "nach"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Ein Funktionsblock ohne Rückgabewert."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29"; +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "gib zurück"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Ein Funktionsblock mit Rückgabewert."; +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Warnung: Dieser Funktionsblock hat zwei gleich benannte Parameter."; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Markiere Funktionsblock"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Gibt den zweiten Wert zurück und verlässt die Funktion, falls der erste Wert wahr ist."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Warnung: Dieser Block darf nur innerhalb eines Funktionsblocks genutzt werden."; +Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "Variable:"; +Blockly.Msg["PROCEDURES_MUTATORARG_TOOLTIP"] = "Eine Eingabe zur Funktion hinzufügen."; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TITLE"] = "Parameter"; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TOOLTIP"] = "Die Eingaben zu dieser Funktion hinzufügen, entfernen oder neu anordnen."; +Blockly.Msg["REDO"] = "Wiederholen"; +Blockly.Msg["REMOVE_COMMENT"] = "Kommentar entfernen"; +Blockly.Msg["RENAME_VARIABLE"] = "Variable umbenennen …"; +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Alle \"%1\" Variablen umbenennen in:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "zu %1 Text %2 anhängen"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Text an die Variable \"%1\" anhängen."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "wandel um in kleinbuchstaben"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "wandel um in Substantive"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "wandel um in GROSSBUCHSTABEN"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Wandelt Schreibweise von Texten um, in Großbuchstaben, Kleinbuchstaben oder den ersten Buchstaben jedes Wortes groß und die anderen klein."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "nimm ersten"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "nimm von hinten"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "nimm"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; +Blockly.Msg["TEXT_CHARAT_LAST"] = "nimm letzten"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "nimm zufälligen"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = "Buchstaben"; +Blockly.Msg["TEXT_CHARAT_TITLE"] = "im Text %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Extrahiert einen Buchstaben von einer bestimmten Position."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "zähle %1 in %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Zähle, wie oft ein Text innerhalb eines anderen Textes vorkommt."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Ein Element zum Text hinzufügen."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "verbinden"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Hinzufügen, entfernen und sortieren von Elementen."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "bis von hinten"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "bis"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "bis letzter"; +Blockly.Msg["TEXT_GET_SUBSTRING_HELPURL"] = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; +Blockly.Msg["TEXT_GET_SUBSTRING_INPUT_IN_TEXT"] = "im Text"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "nimm Teil ab erster"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "nimm Teil ab von hinten"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "nimm Teil ab"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = "Buchstabe"; +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_OPERATOR_FIRST"] = "suche erstes Auftreten des Begriffs"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "suche letztes Auftreten des Begriffs"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "im Text %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Findet das erste / letzte Auftreten eines Suchbegriffs in einem Text. Gibt die Position des Begriffs zurück oder %1 falls der Suchbegriff nicht gefunden wurde."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 ist leer"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Ist wahr, falls der Text keine Zeichen enthält."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = ""; +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "erstelle Text aus"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Erstellt einen Text durch das Verbinden von mehreren Textelementen."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "Länge von %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Die Anzahl von Zeichen in einem Text (inkl. Leerzeichen)."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "gib aus %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Gibt den Text aus."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Fragt den Benutzer nach einer Zahl."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Fragt den Benutzer nach einem Text."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "frage nach Zahl mit Hinweis"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "frage nach Text mit Hinweis"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "ersetze %1 durch %2 in %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Ersetze alle Vorkommen eines Textes innerhalb eines anderen Textes."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "kehre %1 um"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Kehre die Reihenfolge der Zeichen im Text um."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://de.wikipedia.org/wiki/Zeichenkette"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Ein Buchstabe, Text oder Satz."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "entferne Leerzeichen vom Anfang und vom Ende (links und rechts)"; +Blockly.Msg["TEXT_TRIM_OPERATOR_LEFT"] = "entferne Leerzeichen vom Anfang (links)"; +Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "entferne Leerzeichen vom Ende (rechts)"; +Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "Entfernt Leerzeichen vom Anfang und / oder Ende eines Textes."; +Blockly.Msg["TODAY"] = "Heute"; +Blockly.Msg["UNDO"] = "Rückgängig"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // untranslated +Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "Element"; +Blockly.Msg["VARIABLES_GET_CREATE_SET"] = "Erzeuge \"Schreibe %1\""; +Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://de.wikipedia.org/wiki/Variable_%28Programmierung%29"; +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Gibt den Wert der Variable zurück."; +Blockly.Msg["VARIABLES_SET"] = "setze %1 auf %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Erzeuge \"Lese %1\""; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://de.wikipedia.org/wiki/Variable_%28Programmierung%29"; +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Setzt den Wert einer Variable."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Eine Variable namens „%1“ ist bereits vorhanden."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Eine Variable namens „%1“ ist bereits für einen anderen Typ vorhanden: „%2“."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Teile etwas mit…"; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/diq.js b/js/msg/js/diq.js new file mode 100644 index 0000000..433e3ef --- /dev/null +++ b/js/msg/js/diq.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Tefsir cı ke"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Erci bıvurne:"; +Blockly.Msg["CLEAN_UP"] = "Blokan pak ke"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "Blokan teng ke"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Bloki teng ke"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "reng 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "reng 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "nısbet"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "tewde"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Blends two colours together with a given ratio (0.0 - 1.0)."; // untranslated +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://diq.wikipedia.org/wiki/Reng"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Şıma palet ra yew reng weçinê."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "rengo rastameye"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Tesadufi yu ren bıweçin"; +Blockly.Msg["COLOUR_RGB_BLUE"] = "kewe"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "kıho"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "sur"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "komponentên rengan"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Şıma renganê sûr, aşıl u kohoy ra rengê do spesifik vırazê. Gani ê pêro 0 u 100 miyan de bıbê."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "Çerxen ra vec"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "Gama bin da çerxeni ra dewam ke"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Öujtewada çerxeni ra bıvıci"; +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"] = "Diqat: No bloke şeno teyna yew çerxiyayış miyan de bıgırweyo."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "Lista %2 de her item %1 rê"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Yew lista de her item rê, varyansê '%1' itemi rê vırazê, u dıma tayê akerdışi (beyani) bıdê"; +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"] = "Bloq da if'i rê yu şert dekerê de."; +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"] = "eke çıniyo"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "eke nêyo"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "eke"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Eger yew vaye raşto, o taw şıma tayê akerdışi kerê."; +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"] = "bıke"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "%1 fıni tekrar ke"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Şıma tayêna reyi akerdışi kerê."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "hend tekrar ke"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "Tekrar kerdış de"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Yew erc xırabo se tay beyanati bıd"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Yew erc raşto se yu beyanat bıd."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Pêro %1 bloki besteriyê?"; +Blockly.Msg["DELETE_BLOCK"] = "Bloki bestere"; +Blockly.Msg["DELETE_VARIABLE"] = "Şıma vırnaoğê '%1'i besterê"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "%1 ke vırnayışê '%2'i gırweneno, besteriyo?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "%1 blokan bestere"; +Blockly.Msg["DISABLE_BLOCK"] = "Çengi devre ra vec"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Zewnc"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Mışewreyo zewnc"; +Blockly.Msg["ENABLE_BLOCK"] = "Bloki feal ke"; +Blockly.Msg["EXPAND_ALL"] = "Blokan hera ke"; +Blockly.Msg["EXPAND_BLOCK"] = "Bloki hera ke"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Cıkewtışê xarıciy"; +Blockly.Msg["HELP"] = "Peşti"; +Blockly.Msg["INLINE_INPUTS"] = "Cıkerdışê xomiyani"; +Blockly.Msg["IOS_CANCEL"] = "Bıtexelne"; +Blockly.Msg["IOS_ERROR"] = "Xeta"; +Blockly.Msg["IOS_OK"] = "TEMAM"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Beyan cı ke"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "İfade rê mısade bıde"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "BEYANİ"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Cı ke"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Vurnekari cı kerê"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Bestere"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Heruna nameyê curnekari veng mevıradê."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Reyna name ke"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Namê vurriyayışi"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "lista venge vıraze"; +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"] = "liste"; +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"] = "Liste ya vıraz"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Yew işaret liste ke."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Create a list with any number of items."; // untranslated +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "verên"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# peyniye ra"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_GET"] = "bıgê"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "Bıgi u wedarne"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "peyên"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "raştameye"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "wedare"; +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"] = "Returns the item at the specified position in a list."; // 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"] = "Removes and returns the item at the specified position in a list."; // 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"] = "Removes the item at the specified position in a list."; // 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"] = "Peyni # ra hetana"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "#'ya"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "Hetana pey"; +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_FROM_END_TOOLTIP"] = "%1 objeyo peyên o"; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 objeyo sıfteyên o"; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "vıraştışê işaretê verêni bıvêne"; +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"] = "vıraştışê nuşteyê verêni bıvêne"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; // untranslated +Blockly.Msg["LISTS_INLIST"] = "lista de"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 vengo"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Eger kı lista venga se raşt keno çerğ"; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "dergiya %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Derganiya yu lister dano."; +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_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "%1 dimlaşt kerê"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Yew kopyaya yew lista dimlaşt kerê."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "zey"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "De fi"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "ca ke"; +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"] = "Inserts the item at the specified position in a list."; // 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"] = "Sets the item at the specified position in a list."; // 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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "zeydıyen"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "Kemeyen"; +Blockly.Msg["LISTS_SORT_TITLE"] = "%1 %2 %3 weçine"; +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"] = "Amoriyal"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "Alfabetik"; +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"] = "Hududoxi ya"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "ğelet"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Raşt yana çep erc dano"; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "raşt"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Debiyaye dı erci zey pêyêse ercê \"True\" dane."; +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_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "%1 niyo"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Returns true if the input is false. Returns false if the input is true."; // untranslated +Blockly.Msg["LOGIC_NULL"] = "veng"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Veng çarneno ra."; +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"] = "ya zi"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Eger her dı cıkewtışi zi raştê, şıma ageyrê."; +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_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "eke ğeleto"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "eke raşto"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Şerta'test'i test keno. Eger ke şert raşta se erca 'raşt'i çarneno, çepo se erca 'çep' çarneno."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Aritmetik"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Return the sum of the two numbers."; // untranslated +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"] = "Return the product of the two numbers."; // untranslated +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Return the first number raised to the power of the second number."; // untranslated +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://diq.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2, X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "%2, keno %1 vurneno"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Add a number to variable '%1'."; // untranslated +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Sabitanê wertağan ra yew açarne: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (bêpeyniye)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // 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"] = "Leteyêno"; +Blockly.Msg["MATH_IS_EVEN"] = "zewnco"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "negatifo"; +Blockly.Msg["MATH_IS_ODD"] = "kıto"; +Blockly.Msg["MATH_IS_POSITIVE"] = "pozitifo"; +Blockly.Msg["MATH_IS_PRIME"] = "bıngehên"; +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"] = "tamo"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "%1 ÷ %2 ra menden"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Mendeyan ra teqsimkerdışê dı amaran açarne."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://diq.wikipedia.org/wiki/Numre"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Yew numre."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "Averacê lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "Tewr gırdê lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "Wertey lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "Tewr qıcê lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "listey modi"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "Raştamaye objeya lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "standard deviation of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "koma liste"; +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"] = "Return the largest number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Return the median number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Return the smallest number in the list."; // untranslated +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"] = "Liste ra yew elemento rastameye açarne."; +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"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "Raştamaye nimande amor"; +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"; +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"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "gılor ke"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "Loğê cêri ke"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "Loğê cori ke"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Yu amorer loğê cêri yana cori ke"; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "mutlaq"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "karekok"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Return the absolute value of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "E quwetê yew amar tadano."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Return the natural logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Return the base 10 logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Nêrazibiyena yew amari açarne."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Quweta yew amariya 10ıne tade."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Return the square root of a number."; // untranslated +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://diq.wikipedia.org/wiki/Fonksiyonê_trigonometriye"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Arkkosinusê yew amari açarne."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Arksinusê yew amari açarne."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Arktangensê yew amari açarne."; +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["NEW_COLOUR_VARIABLE"] = "Vurriyayoğê rengi vıraze..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Vurriyayoğê amari vıraze..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Vurriyayoğê rêze vıraze..."; +Blockly.Msg["NEW_VARIABLE"] = "Vuriyayeyo bıvıraz..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Tewrê vurriyayoğê neweyi:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Tewrê vurriyayoğê neweyi:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "ifade rê mısade bıde"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "ebe:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Run the user-defined function '%1' and use its output."; // untranslated +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "ebe:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "'%1' vıraze"; +Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Nê fonksiyoni beyan ke..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "Çıyê bık"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "rê"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Yew fonksiyono çap nêdate vırazeno"; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "peyser biya"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Yew fonksiyono çap daye vırazeno"; +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Tembe: Nê fonksiyoni de parametreyê dıleti estê."; +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"] = "namey cıkewtışi:"; +Blockly.Msg["PROCEDURES_MUTATORARG_TOOLTIP"] = "Add an input to the function."; // untranslated +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TITLE"] = "cıkewtışi"; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TOOLTIP"] = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg["REDO"] = "Newe ke"; +Blockly.Msg["REMOVE_COMMENT"] = "Tefsiri Wedare"; +Blockly.Msg["RENAME_VARIABLE"] = "Vuriyayey fına name ke..."; +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Pêro vırnayışê '%1' reyna name ke:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "rê %1 Metin dek %2"; +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"] = "Herfanê werdiyana"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "Ser herf gırd"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "HERFANÊ GIRDANA"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Return a copy of the text in a different case."; // untranslated +Blockly.Msg["TEXT_CHARAT_FIRST"] = "Herfa sıfti bıgi"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "herfa # peyêne ra bıgê"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "Herfa # bıgi"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "herfa peyêne bıgê"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "Raştamaye yu herf bıgi"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "metın de %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Şınasnaye pozisyon de yu herfer çerğ keno"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "%1 miyan de %2 bımare"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Yew işaret nuşteyi ke."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "gıre de"; +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"] = "heta herfa # peyêne"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "heta herfa #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "heta herfa peyêne"; +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"] = "metın de"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "get substring from first letter"; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "rêza bınêne herfa # peyêne ra bıgê"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "rêza bınêne herfa # ra bıgê"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Tay letey metini çerğ keno"; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "vıraştışê nuşteyê verêni bıvêne"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "vıraştışê nuşteyê verêni bıvêne"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "metın de %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 vengo"; +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"] = "ya metin vıraz"; +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"] = "dergiya %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 çap"; +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_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "karakteranê %1 weçarne"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Yu herfa, satır yana çekuya metini"; +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"] = "Ewro"; +Blockly.Msg["UNDO"] = "Peyser bıgê"; +Blockly.Msg["UNNAMED_KEY"] = "bêname"; +Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "unsur"; +Blockly.Msg["VARIABLES_GET_CREATE_SET"] = "'%1 bınuse' vıraze"; +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"] = "%1 ra %2 rê eyar kerê"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "'%1 bıwane' vıraze"; +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["VARIABLE_ALREADY_EXISTS"] = "Yew vırnayış be namey '%1' xora est."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Çiyê vace..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/dty.js b/js/msg/js/dty.js new file mode 100644 index 0000000..e175073 --- /dev/null +++ b/js/msg/js/dty.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "टिप्पणी थप्दे"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "मान बदल"; +Blockly.Msg["CLEAN_UP"] = "ब्लकनलाई हटाओ"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "अनुपात"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "मिश्रण गर"; +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"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "रातो"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "यै रङ्गको"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "रातो, हरियो और नीलोको निर्दिष्ट मात्राकी साथ एक रंग बनाओ । सबै मान ० देखि १०० का बीच हुनु पडन्छ ।"; +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"] = "%2 सूचीमी भयाः प्रत्येक आइटम %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"] = "Have the variable '%1' take on the values from the start number to the end number, counting by the specified interval, and do the specified blocks."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "यदि ब्लकमा एक शर्त जोडौं ।"; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Add a final, catch-all condition to the if block."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Add, remove, or reorder sections to reconfigure this if block."; +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"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +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_VARIABLE"] = "'%1' भेरिएबल मेट:"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "'%2' भेरिएबला %1 प्रयोग मेट्ट्या?"; +Blockly.Msg["DELETE_X_BLOCKS"] = " %1 ब्लकहरू हटाउन्या"; +Blockly.Msg["DISABLE_BLOCK"] = "ब्लकलाई निश्क्रिय पाड्डे"; +Blockly.Msg["DUPLICATE_BLOCK"] = "कपी गर"; +Blockly.Msg["DUPLICATE_COMMENT"] = "हूबहू टिप्पणी"; +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["IOS_CANCEL"] = "खारेजी"; +Blockly.Msg["IOS_ERROR"] = "गल्ती"; +Blockly.Msg["IOS_OK"] = "हुन्छ"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ इनपुट थपः"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "इनपुटन"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "जोड़ऽ"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Add Variable"; // untranslated +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "मेटः"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "तम खाली चल नाउँ प्रयोग अरीनाइसक्दाः।"; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "पुनर्नामकरण"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "चल(भेरिएबल) नाउँ"; +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"] = "list"; // untranslated +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"] = "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"] = "first"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# from end"; // untranslated +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"] = "last"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "random"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "remove"; // untranslated +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"] = "Returns the item at the specified position in a list."; // 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"] = "Removes and returns the item at the specified position in a list."; // 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"] = "Removes the item at the specified position in a list."; // 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_FROM_END_TOOLTIP"] = "%1 is the last item."; // untranslated +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 is the first item."; // 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 %1 if item is not found."; // untranslated +Blockly.Msg["LISTS_INLIST"] = "in list"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 is empty"; // untranslated +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_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "as"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "insert at"; // untranslated +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"] = "Inserts the item at the specified position in a list."; // 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"] = "Sets the item at the specified position in a list."; // 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"] = "not %1"; // untranslated +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"] = "test"; // untranslated +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "if false"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "if true"; // untranslated +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"] = "Return the sum of the two numbers."; // untranslated +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"] = "Return the product of the two numbers."; // untranslated +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Return the first number raised to the power of the second number."; // untranslated +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +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"] = "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 +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // 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"] = "is divisible by"; // untranslated +Blockly.Msg["MATH_IS_EVEN"] = "is even"; // untranslated +Blockly.Msg["MATH_IS_NEGATIVE"] = "is negative"; // untranslated +Blockly.Msg["MATH_IS_ODD"] = "is odd"; // untranslated +Blockly.Msg["MATH_IS_POSITIVE"] = "is positive"; // untranslated +Blockly.Msg["MATH_IS_PRIME"] = "is prime"; // untranslated +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"] = "is whole"; // untranslated +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"] = "A number."; // untranslated +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "average of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "max of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "median of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "min of list"; // untranslated +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"] = "Return the largest number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Return the median number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Return the smallest number in the list."; // untranslated +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/Square_root"; // untranslated +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absolute"; // untranslated +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "square root"; // untranslated +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"] = "Return the natural logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Return the base 10 logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Return the negation of a number."; // untranslated +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_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"; // untranslated +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["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "भेरिएवल बना:"; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "नयाँ भेरिबलको नाम:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // 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"] = "Create '%1'"; // untranslated +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/Subroutine"; // 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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "return"; // untranslated +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"] = "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"] = "सबै भेरिबलनका %1 नाम बदल्न्या:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "to %1 append text %2"; // 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"] = "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"] = "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_LAST"] = "get last letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "get random letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returns the letter at the specified position."; // untranslated +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Add an item to the text."; // untranslated +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"] = "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_OPERATOR_FIRST"] = "find first occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "find last occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "in text %1 %2 %3"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 is empty"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Returns true if the provided text is empty."; // untranslated +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"] = "print %1"; // untranslated +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_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // 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"] = "रद्द गर्न्या"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // 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["VARIABLE_ALREADY_EXISTS"] = "'%1' नाउँ अरियाऽ भेरिएबल पैली बठेइ छ।"; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "केयि भँण..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/ee.js b/js/msg/js/ee.js new file mode 100644 index 0000000..1782e69 --- /dev/null +++ b/js/msg/js/ee.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Ŋlɔ Numeɖeɖe"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Mate ŋu atutu teaŋutrɔna '%1' o elabe ewɔ akpa aɖe le teaŋutrɔna '%2' me."; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Trɔ nuŋlɔdzesiawo:"; +Blockly.Msg["CLEAN_UP"] = "Tutu Nuawo"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "Hatsotsoawo Me Nuwo Nebu"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Hatsotso Me Nuwo Nebu"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "amedede 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "amadede 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "agbɔsɔsɔ"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "tsaka"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Tsaka amadede eve kple agbɔsɔsɔ si nye (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://ee.wikipedia.org/wiki/Amadede"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Tia amadede ɖeka le amadedetiaƒea."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "amadede aɖe ko"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Tia amadede aɖe ko."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "blɔ"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "gbemumu"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "dzĩ"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "de amae kple"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "tsaka"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "Nedo le wɔtiaɖenua me"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "neyi edzi kple wɔtiaɖenua si kplɔe ɖo"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Nedo le wɔtiaɖenua si me wòlea me."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Neto wɔtiaɖenu sia susɔea ta wòayi bubu dzi."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Nuxlɔ̃ame: Wɔtiaɖenu me ko woate ŋu azã ƒuƒoƒo sia le."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "nu sia nu natso %2 me ayi %1 me"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Tia teaŋutrɔna '%1' na nuawo dometɔ ɖe sia ɖe si li, eye nàŋlɔ gbedeasi aɖe."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "Xlẽ %1 tso %2 yi %3 to %4 dzi"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Xexlẽdzesi tɔtrɔ '%1' nenye xexlẽdzesi si dze egɔme kple esiwo kplɔe ɖo va se ɖe mamlɛtɔ dzi, nebu dometsotso si wofia kple nyatakaka suetɔ siwo wofia asii."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Tsɔ biabia aɖe kpe ne ƒuƒoƒo la."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Tsɔ lé wo katã ƒe ne ƒe ƒuƒoƒo kpe biabia mamlɛa."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Tsɔ kpee, ɖee le eme alo gbugbɔ akpawo ɖo nàtsɔ asi le ne ƒe ƒuƒoƒoa ŋu."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "ke boŋ"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "Ke boŋ ne"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "Ne"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Ne asime aɖe le eme la, ke taɖodzinya aɖewo neva eme."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Ne asime aɖe le eme la, ke taɖodzinyawo ƒe ƒuƒoƒo gbãtɔ neva eme. Ne menye nenem o la, ke taɖodzinyawo ƒe ƒuƒoƒo evelia neva eme."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Ne asime gbãtɔe le eme la, ke taɖodzinyawo ƒe ƒuƒoƒo gbãtɔ neva eme. Gake ne asime eveliae le eme la, taɖodzinyawo ƒe ƒuƒoƒo evelia boŋ neva eme."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Ne asime gbãtɔ le eme la, ke taɖodzinyawo ƒe ƒuƒoƒo gbãtɔ neva eme. Ke ne taɖodzinyawo ƒe ƒuƒoƒo evelia boŋue le eme la, taɖodzinyawo ƒe ƒuƒoƒo evelia neva eme. Ne taɖodzinya aɖeke mele eme o la,taɖodzinyawo ƒe ƒuƒoƒo mamlɛtɔ neva eme."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://ee.wikipedia.org/wiki/Na_nogo"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "wɔ"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "Wɔe zi %1"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Gbugbɔ biabia aɖewo zi geɖe."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "gbugbɔ wɔe va se ɖe"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "gbugbɔ wɔe ne"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Ne nyatakaka dea, ke wɔ biabia aɖewo."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Ne nyatakaka dea, ke wɔ biabia aɖewo."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Èdi be netutu nu %1 katã?"; +Blockly.Msg["DELETE_BLOCK"] = "Tutu Hatsotsoa"; +Blockly.Msg["DELETE_VARIABLE"] = "Tutu teaŋutrɔna '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Netutu %1 ŋkɔ si nètsɔ na teaŋutrɔna '%2'?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Tutu Hatsotso %1"; +Blockly.Msg["DISABLE_BLOCK"] = "Tsi Hatsotsoa"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Gbugbɔe Wɔ"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Kɔpi Numeɖeɖea"; +Blockly.Msg["ENABLE_BLOCK"] = "Si Hatsotsoa"; +Blockly.Msg["EXPAND_ALL"] = "Hatsotsoawo Me Nuwo Nedze"; +Blockly.Msg["EXPAND_BLOCK"] = "Hatsotsoa Me Nuwo Nedze"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Gotakpeɖeŋunuwo"; +Blockly.Msg["HELP"] = "Kpekpeɖeŋu"; +Blockly.Msg["INLINE_INPUTS"] = "Interdzikpeɖeŋuwo"; +Blockly.Msg["IOS_CANCEL"] = "Natasii"; +Blockly.Msg["IOS_ERROR"] = "Vodada"; +Blockly.Msg["IOS_OK"] = "YOO"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Tsɔ nu kpe Nudemea"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Ɖe mɔ ɖe taɖodzinyawo ŋu"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Nudeme evee le wɔƒe sia si."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "NUDEMEWO"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Tsɔ kpee"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Tsɔ nugba kpee"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Tutui"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Màte ŋu azã nugba si mena ŋkɔe o."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Gbugbɔ na ŋkɔe"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Nugba ŋkɔ"; +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"] = "list"; // untranslated +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"] = "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"] = "gbãtɔ"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# tso nuwuwu"; +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"] = "mamlɛtɔ"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "ɖe sia ɖe ko"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "ɖee ɖa"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Aʋu nu gbãtɔ."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Aʋu nua le afi si wòle le nuwo dome."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Aʋu nu mamlɛtɔ."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Aʋu nu ɖe sia ɖe aɖe ko."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Eɖea nu gbãtɔ ɖa eye eya kee gaʋua nu gbãtɔ."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Aɖe nua ɖa eye wòaʋu nua le afi si wòle le nuawo dome."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Eɖea nu mamlɛtɔ ɖa eye eya kee gaʋua nu mamlɛtɔ."; +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"] = "Removes the item at the specified position in a list."; // 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"] = "yi # tso nuwuwu"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "yi #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "yi mamlɛtɔ"; +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_FROM_END_TOOLTIP"] = "%1 nye nu mamlɛtɔ."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 nye nu gbãtɔ."; +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 %1 if item is not found."; // untranslated +Blockly.Msg["LISTS_INLIST"] = "in list"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 le ƒuƒlu"; +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_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "as"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "insert at"; // untranslated +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"] = "Inserts the item at the specified position in a list."; // 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"] = "Sets the item at the specified position in a list."; // 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"] = "dzi yim"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "ɖiɖim"; +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"] = "mademadea"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Nefia dedia alo mademadea."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "dedia"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Masɔmasɔ_(akɔntabubu)"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Ŋuɖoɖoa nenye nyateƒe ne nudeme eveawo sɔ kple wo nɔewo."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Ŋuɖoɖoa nenye nyateƒe ne nudeme gbãtɔ lolo wu evelia."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Ŋuɖoɖoa nenye nyateƒe ne nudeme gbãtɔ lolo wu evelia alo sɔ kplii."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Ŋuɖoɖoa nenye nyateƒe ne nudeme gbãtɔ mede evelia nu o."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Ŋuɖoɖoa nenye nyateƒe ne nudeme gbãtɔ mede evelia nu o alo sɔ kplii."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Ŋuɖoɖoa nenye nyateƒe ne nudeme eveawo mesɔ kple wo nɔewo o."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "menye %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Ŋuɖoɖoa nenye nyateƒe ne nudemea menye nyateƒe o. Ŋuɖoɖoa nenye aʋatso ne nudemea nye nyateƒe."; +Blockly.Msg["LOGIC_NULL"] = "ɖeke o"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Mekpɔ ɖeke o."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "eye"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "alo"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Ŋuɖoɖoa nenye nyateƒe ne nudeme eveawo nye nyateƒe."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Ŋuɖoɖoa nenye nyateƒe ne nudeme ɖeka teti nye nyateƒe."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "dodokpɔ"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "nenye dedietɔ"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "nenye nyuitɔ"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Kpɔ nu si dze le \"dodokpɔ\" me. Ne dediae dze la, tia \"ne dedia\"; ke ne manyomanyotɔe la, tia \"ne mademadea.\""; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://ee.wikipedia.org/wiki/Xexlẽdzesibubu"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Bu xexlẽdzesi evea ƒoƒo ƒu ƒe akɔnta."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Bu xexlẽdzesi ɖeka mama ɖe xexlẽdzesi evelia me ƒe akɔnta."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Bu xexlẽdzesi ɖeka ɖeɖe le evelia me ƒe akɔnta."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Bu xexlẽdzesi gbãtɔ teƒe evelia ƒe akɔnta."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Na be xexlẽdzesi gbãtɔ nadzi eɖokui ɖe edzi zigbɔzi xexlẽdzesi evelia."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +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"] = "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 +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // 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"] = "woate ŋu amae ɖe"; +Blockly.Msg["MATH_IS_EVEN"] = "enye eve ƒomevi"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "enye xexlẽme megbeyitɔ"; +Blockly.Msg["MATH_IS_ODD"] = "enye etɔ̃ ƒomevi"; +Blockly.Msg["MATH_IS_POSITIVE"] = "enye xexlẽme ŋgɔgbeyitɔ"; +Blockly.Msg["MATH_IS_PRIME"] = " enye xexlẽme blibo"; +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"] = "enye blibo"; +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://ee.wikipedia.org/wiki/Xexlẽdzesi"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Xexlẽdzesi aɖe"; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "average of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "gãtɔ le nuwo dome"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "median of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "suetɔ le wo dome"; +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"] = "Neʋu xexlẽdzesi gãtɔ."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Return the median number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Neʋu suetɔ le nuwo dome."; +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/dzidziɖedzi_eɖokui zigbɔzi eve"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "xexlẽ blibo"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "eƒe teƒe eve"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Nena xexlẽdzesi aɖe nanye xexlẽ blibo."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Nebu e-teƒe-e zigbɔzi xexlẽdzesia."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Xexlẽdzesia nedzi ɖe edzi eɖokui zigbzi e."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Nebu zigbɔzi neni 10-teƒe-10 awɔ xexlẽdzesia."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Nena xexlẽdzesi aɖe nanye xexlẽdzesi madenanekeo."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = " Nebu ewo-teƒe-ewo zigbɔzi xexlẽdzesia."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Xexlẽdzesia nedzi ɖe edzi teƒe eɖokui"; +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"] = "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"] = "Nebu dzogɔe le digri me (menye radiã o)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Return the tangent of a degree (not radian)."; // untranslated +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Wɔ amadede teaŋutrɔna..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Wɔ xexlẽdzesi teaŋutrɔna..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Wɔ nya teaŋutrɔna..."; +Blockly.Msg["NEW_VARIABLE"] = "Wɔ teaŋutrɔna..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Nuŋlɔdzesi tɔtrɔa yeye ƒe ŋkɔ:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Teaŋutrɔna ƒomevi yeye:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "allow statements"; // untranslated +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "kple:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Run the user-defined function '%1' and use its output."; // untranslated +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "kple:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "Create '%1'"; // untranslated +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/Subroutine"; // 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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "return"; // untranslated +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"] = "inputs"; // untranslated +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TOOLTIP"] = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg["REDO"] = "Trɔ Wɔe"; +Blockly.Msg["REMOVE_COMMENT"] = "Ɖe Numeɖeɖea Ɖa"; +Blockly.Msg["RENAME_VARIABLE"] = "Na ŋkɔ bubu nuŋlɔdzesi tɔtrɔa..."; +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Na ŋkɔ bubu nuŋlɔdzesi tɔtrɔa '%1' yi:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "to %1 append text %2"; // 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"] = "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"] = "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_LAST"] = "get last letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "get random letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returns the letter at the specified position."; // untranslated +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Add an item to the text."; // untranslated +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"] = "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_OPERATOR_FIRST"] = "find first occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "find last occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "in text %1 %2 %3"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 is empty"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Returns true if the provided text is empty."; // untranslated +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"] = "print %1"; // untranslated +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_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // 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"] = "Egbe"; +Blockly.Msg["UNDO"] = "Gbugbɔe"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // untranslated +Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "nu"; +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["VARIABLE_ALREADY_EXISTS"] = "Teaŋutrɔna si ŋkɔe nye '%1' li xoxo."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Teaŋutrɔna '%1' li xoxo eye wotsɔ ŋkɔ sia xoxo na bubu si nye: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/el.js b/js/msg/js/el.js new file mode 100644 index 0000000..91587ce --- /dev/null +++ b/js/msg/js/el.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Πρόσθεσε Το Σχόλιο"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Δεν μπορώ να διαγράψω την μεταβλητή '%1' διότι είναι μέρος του ορισμού της λειτουργίας '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Άλλαξε την τιμή:"; +Blockly.Msg["CLEAN_UP"] = "Ταξινομείστε τα Μπλοκ"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Υπάρχουν προειδοποιήσεις για συμπτυγμένα μπλοκ."; +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/"; +Blockly.Msg["COLOUR_BLEND_RATIO"] = "αναλογία"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "μείγμα"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Συνδυάζει δύο χρώματα μαζί με μια δεδομένη αναλογία (0.0 - 1,0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://el.wikipedia.org/wiki/%CE%A7%CF%81%CF%8E%CE%BC%CE%B1"; +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"; +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"] = "Blockly"; +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"] = "Προσθέτει μια τελική κατάσταση/συνθήκη, που πιάνει όλες τις άλλες περιπτώσεις, στο μπλοκ «εάν»."; +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/For_loop"; +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_VARIABLE"] = "Διαγράψτε την μεταβλητή '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Θέλετε να διαγράψετε το %1 που χρησιμοποιείτε της μεταβλητής '%2'?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Διάγραψε %1 Μπλοκ"; +Blockly.Msg["DISABLE_BLOCK"] = "Απενεργοποίησε Το Μπλοκ"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Διπλότυπο"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Διπλότυπο σχόλιο"; +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["IOS_CANCEL"] = "Ακυρώστε"; +Blockly.Msg["IOS_ERROR"] = "Σφάλμα"; +Blockly.Msg["IOS_OK"] = "ΟΚ"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "Εισάγετε στοιχείο"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Να επιτρέπονται οι δηλώσεις"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Αυτή η παράμετρος απαιτεί διπλή εισαγωγή στοιχείων"; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "ΕΙΣΑΓΟΜΕΝΑ ΣΤΟΙΧΕΙΑ"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Προσθήκη"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "Προσθέσατε Μεταβλητή"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Διαγραφή"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Δεν μπορείτε να χρησιμοποιήσετε μια μεταβλητή δίχως όνομα"; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Αλλάξετε το όνομα του αρχείου"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Όνομα μεταβλητής"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +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_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"] = "δημιούργησε λίστα με"; +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"] = "# από το τέλος"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; +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"] = "Επιστρέφει το πρώτο στοιχείο σε μια λίστα."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Επιστρέφει το στοιχείο στην καθορισμένη θέση σε μια λίστα."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Επιστρέφει το τελευταίο στοιχείο σε μια λίστα."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Επιστρέφει ένα τυχαίο στοιχείο σε μια λίστα."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Καταργεί και επιστρέφει το πρώτο στοιχείο σε μια λίστα."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Καταργεί και επιστρέφει το στοιχείο στην καθορισμένη θέση σε μια λίστα."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Καταργεί και επιστρέφει το τελευταίο στοιχείο σε μια λίστα."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Καταργεί και επιστρέφει ένα τυχαίο στοιχείο σε μια λίστα."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Καταργεί το πρώτο στοιχείο σε μια λίστα."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Καταργεί το στοιχείο στην καθορισμένη θέση σε μια λίστα."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Καταργεί το τελευταίο στοιχείο σε μια λίστα."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Καταργεί ένα τυχαίο στοιχείο σε μια λίστα."; +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"] = "Blockly"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "πάρε υπολίστα από την αρχή"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "πάρε υπολίστα από # από το τέλος"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "πάρε υπολίστα από #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Δημιουργεί ένα αντίγραφο του καθορισμένου τμήματος μιας λίστας."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "Το %1 είναι το τελευταίο στοιχείο."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "Το %1 είναι το πρώτο στοιχείο."; +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"] = "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του στοιχείου στη λίστα. Επιστρέφει τιμή %1, αν το στοιχείο δεν βρεθεί."; +Blockly.Msg["LISTS_INLIST"] = "στη λίστα"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "το %1 είναι κενό"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Επιστρέφει αληθής αν η λίστα είναι κενή."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "Blockly"; +Blockly.Msg["LISTS_LENGTH_TITLE"] = "το μήκος του %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Επιστρέφει το μήκος μιας λίστας."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "Blockly"; +Blockly.Msg["LISTS_REPEAT_TITLE"] = "δημιούργησε λίστα με το στοιχείο %1 να επαναλαμβάνεται %2 φορές"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Δημιουργεί μια λίστα που αποτελείται από την δεδομένη τιμή που επαναλαμβάνεται για συγκεκριμένο αριθμό επαναλήψεων."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "ανάκληση %1"; +Blockly.Msg["LISTS_REVERSE_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_SET"] = "όρισε"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Εισάγει το στοιχείο στην αρχή μιας λίστας."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Εισάγει το στοιχείο στην καθορισμένη θέση σε μια λίστα."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Αναθέτει το στοιχείο στο τέλος μιας λίστας."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Εισάγει το στοιχείο τυχαία σε μια λίστα."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Ορίζει το πρώτο στοιχείο σε μια λίστα."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Ορίζει το στοιχείο στην καθορισμένη θέση σε μια λίστα."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "Αύξουσα"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "Φθίνουσα"; +Blockly.Msg["LISTS_SORT_TITLE"] = "επιλογή %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Επιλέξετε ένα αντίγραφο της λίστας."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "αλφαβητικά, αγνοήστε το στοιχείο"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "αριθμητικό"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "Αλφαβητικά"; +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"] = "κάνετε κείμενο από τη λίστα"; +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"] = "Επιστρέφει είτε αληθής είτε ψευδής."; +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"] = "κενό"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +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:"; +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "εάν είναι ψευδής"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "εάν είναι αληθής"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Ελέγχει την κατάσταση/συνθήκη στον «έλεγχο». Αν η κατάσταση/συνθήκη είναι αληθής, επιστρέφει την τιμή «εάν αληθής», διαφορετικά επιστρέφει την τιμή «εάν ψευδής»."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["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"; +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_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://el.wikipedia.org/wiki/%CE%A0%CF%81%CF%8C%CF%83%CE%B8%CE%B5%CF%83%CE%B7"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "άλλαξε %1 από %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Προσθέτει έναν αριθμό στη μεταβλητή «%1»."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +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_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "περιόρισε %1 χαμηλή %2 υψηλή %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Περιορίζει έναν αριθμό μεταξύ των προβλεπόμενων ορίων (χωρίς αποκλεισμούς)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +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://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "υπόλοιπο της %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Επιστρέφει το υπόλοιπο της διαίρεσης των δύο αριθμών."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://el.wikipedia.org/wiki/%CE%91%CF%81%CE%B9%CE%B8%CE%BC%CF%8C%CF%82"; +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"] = "^ ύψωση σε δύναμη"; +Blockly.Msg["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"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "τυχαίο κλάσμα"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Επιστρέψει ένα τυχαία κλάσμα μεταξύ 0,0 (κλειστό) και 1,0 (ανοικτό)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "τυχαίος ακέραιος από το %1 έως το %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Επιστρέφει έναν τυχαίο ακέραιο αριθμό μεταξύ δύο συγκεκριμένων ορίων (εντός - συμπεριλαμβανομένων και των ακραίων τιμών)."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +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://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"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "απόλυτη"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "τετραγωνική ρίζα"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Επιστρέφει την απόλυτη τιμή ενός αριθμού."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Επιστρέφει το e υψωμένο στη δύναμη ενός αριθμού."; +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"] = "Επιστρέφει το 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"] = "συν"; +Blockly.Msg["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"; +Blockly.Msg["MATH_TRIG_SIN"] = "ημ"; +Blockly.Msg["MATH_TRIG_TAN"] = "εφ"; +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["NEW_COLOUR_VARIABLE"] = "Δημιουργία μεταβλητής χρώματος..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Δημιουργία μεταβλητής αριθμού..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Δημιουργία μεταβλητή συμβολοσειράς..."; +Blockly.Msg["NEW_VARIABLE"] = "Δημιουργήστε μεταβλητή"; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Νέο όνομα μεταβλητής:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Νέος τύπος μεταβλητής:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // 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»."; +Blockly.Msg["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"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Εκτελεί την ορισμένη από τον χρήστη συνάρτηση «%1» και χρησιμοποίησε την έξοδό της."; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "με:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "Δημιούργησε «%1»"; +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"; +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "κάνε κάτι"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "στο"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Δημιουργεί μια συνάρτηση χωρίς έξοδο."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +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_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» σε:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "έως %1 ανάθεσε κείμενο %2"; +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"] = "σε Λέξεις Με Πρώτα Κεφαλαία"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "σε ΚΕΦΑΛΑΙΑ"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Επιστρέφει ένα αντίγραφο του κειμένου σε διαφορετική μορφή γραμμάτων."; +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_LAST"] = "πάρε το τελευταίο γράμμα"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "πάρε τυχαίο γράμμα"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "στο κείμενο %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Επιστρέφει το γράμμα στην καθορισμένη θέση."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "αριθμός %1 σε %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Μετρά πόσες φορές κάποιο κείμενο εμφανίζεται μέσα σε ένα άλλο κείμενο."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Προσθέτει ένα στοιχείο στο κείμενο."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "ένωσε"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Προσθέτει, αφαιρεί ή αναδιατάσσει τους τομείς για να αναδιαμορφώσει αυτό το μπλοκ κειμένου."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "μέχρι το # γράμμα από το τέλος"; +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"] = "πάρε τη δευτερεύουσα συμβολοσειρά από το πρώτο γράμμα"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "πάρε τη δευτερεύουσα συμβολοσειρά από το # γράμμα από το τέλος"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "πάρε τη δευτερεύουσα συμβολοσειρά από το # γράμμα"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Επιστρέφει ένα συγκεκριμένο τμήμα του κειμένου."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "βρες την πρώτη εμφάνιση του κειμένου"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "βρες την τελευταία εμφάνιση του κειμένου"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "στο κείμενο %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του πρώτου κειμένου στο δεύτερο κείμενο. Επιστρέφει τιμή %1, αν δε βρει το κείμενο."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "το %1 είναι κενό"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Επιστρέφει αληθής αν το παρεχόμενο κείμενο είναι κενό."; +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"] = "Εκτυπώνει το καθορισμένο κείμενο, αριθμό ή άλλη τιμή."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Δημιουργεί προτροπή για τον χρήστη για να δώσει ένα αριθμό."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Δημιουργεί προτροπή για το χρήστη για να δώσει κάποιο κείμενο."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "πρότρεψε με μήνυμα για να δοθεί αριθμός"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "πρότρεψε με μήνυμα για να δοθεί κείμενο"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "αντικαταστήσετε το %1 με %2 σε %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Αντικαταστήστε όλα τα ήδη υπάρχοντα στοιχεία μέρους του κειμένου με κάποιο άλλο κείμενο"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "ανάκληση %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Αναγραμματισμός των χαρακτήρων του κειμένου"; +Blockly.Msg["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"; +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["UNNAMED_KEY"] = "χωρίς όνομα"; +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_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["VARIABLE_ALREADY_EXISTS"] = "Η μεταβλητή με το όνομα \"%1\" υπάρχει ήδη"; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Μια μεταβλητή με όνομα '%1' υπάρχει πάντα για έναν άλλο τύπο: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Χώρος εργασίας Blockly"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Πείτε κάτι..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/en-gb.js b/js/msg/js/en-gb.js new file mode 100644 index 0000000..0bc1e67 --- /dev/null +++ b/js/msg/js/en-gb.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Add Comment"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Change value:"; +Blockly.Msg["CLEAN_UP"] = "Clean up Blocks"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "Collapse Blocks"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Collapse Block"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "colour 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "colour 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "ratio"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "blend"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Blends two colours together with a given ratio (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Colour"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Choose a colour from the palette."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "random colour"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Choose a colour at random."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "blue"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "green"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "red"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "colour with"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Create a colour with the specified amount of red, green, and blue. All values must be between 0 and 100."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "break out of loop"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "continue with next iteration of loop"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Break out of the containing loop."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Skip the rest of this loop, and continue with the next iteration."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Warning: This block may only be used within a loop."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "for each item %1 in list %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "For each item in a list, set the variable '%1' to the item, and then do some statements."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "count with %1 from %2 to %3 by %4"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Have the variable '%1' take on the values from the start number to the end number, counting by the specified interval, and do the specified blocks."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Add a condition to the if block."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Add a final, catch-all condition to the if block."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Add, remove, or reorder sections to reconfigure this if block."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "else"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "else if"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "if"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "If a value is true, then do some statements."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "If a value is true, then do the first block of statements. Otherwise, do the second block of statements."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "do"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "repeat %1 times"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Do some statements several times."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "repeat until"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "repeat while"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "While a value is false, then do some statements."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "While a value is true, then do some statements."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Delete all %1 blocks?"; +Blockly.Msg["DELETE_BLOCK"] = "Delete Block"; +Blockly.Msg["DELETE_VARIABLE"] = "Delete the '%1' variable"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Delete %1 Blocks"; +Blockly.Msg["DISABLE_BLOCK"] = "Disable Block"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Duplicate"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +Blockly.Msg["ENABLE_BLOCK"] = "Enable Block"; +Blockly.Msg["EXPAND_ALL"] = "Expand Blocks"; +Blockly.Msg["EXPAND_BLOCK"] = "Expand Block"; +Blockly.Msg["EXTERNAL_INPUTS"] = "External Inputs"; +Blockly.Msg["HELP"] = "Help"; +Blockly.Msg["INLINE_INPUTS"] = "Inline Inputs"; +Blockly.Msg["IOS_CANCEL"] = "Cancel"; +Blockly.Msg["IOS_ERROR"] = "Error"; +Blockly.Msg["IOS_OK"] = "OK"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Add Input"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INPUTS"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Add"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Add Variable"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Delete"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "You can't use an empty variable name."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Rename"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Variable name"; +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"] = "list"; // untranslated +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"] = "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"] = "first"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# from end"; // untranslated +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"] = "last"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "random"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "remove"; // untranslated +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"] = "Returns the item at the specified position in a list."; // 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"] = "Removes and returns the item at the specified position in a list."; // 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"] = "Removes the item at the specified position in a list."; // 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_FROM_END_TOOLTIP"] = "%1 is the last item."; // untranslated +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 is the first item."; // 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 %1 if item is not found."; // untranslated +Blockly.Msg["LISTS_INLIST"] = "in list"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 is empty"; // untranslated +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_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "as"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "insert at"; // untranslated +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"] = "Inserts the item at the specified position in a list."; // 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"] = "Sets the item at the specified position in a list."; // 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"] = "descendente"; +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"] = "false"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Returns either true or false."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "true"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Return true if both inputs equal each other."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Return true if the first input is greater than the second input."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Return true if the first input is greater than or equal to the second input."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Return true if the first input is smaller than the second input."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Return true if the first input is smaller than or equal to the second input."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Return true if both inputs are not equal to each other."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "not %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Returns true if the input is false. Returns false if the input is true."; +Blockly.Msg["LOGIC_NULL"] = "null"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Returns null."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "and"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "or"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Return true if both inputs are true."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Return true if at least one of the inputs is true."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "test"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "if false"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "if true"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Return the sum of the two numbers."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Return the quotient of the two numbers."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Return the difference of the two numbers."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Return the product of the two numbers."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Return the first number raised to the power of the second number."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "change %1 by %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Add a number to variable '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "constrain %1 low %2 high %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Constrain a number to be between the specified limits (inclusive)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "is divisible by"; +Blockly.Msg["MATH_IS_EVEN"] = "is even"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "is negative"; +Blockly.Msg["MATH_IS_ODD"] = "is odd"; +Blockly.Msg["MATH_IS_POSITIVE"] = "is positive"; +Blockly.Msg["MATH_IS_PRIME"] = "is prime"; +Blockly.Msg["MATH_IS_TOOLTIP"] = "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false."; +Blockly.Msg["MATH_IS_WHOLE"] = "is whole"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "remainder of %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Return the remainder from dividing the two numbers."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "A number."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "average of list"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "max of list"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "median of list"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "min of list"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "modes of list"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "random item of list"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "standard deviation of list"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "sum of list"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Return the average (arithmetic mean) of the numeric values in the list."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Return the largest number in the list."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Return the median number in the list."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Return the smallest number in the list."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Return a list of the most common item(s) in the list."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Return a random element from the list."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Return the standard deviation of the list."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Return the sum of all the numbers in the list."; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "random fraction"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "random integer from %1 to %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Return a random integer between the two specified limits, inclusive."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "round"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "round down"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "round up"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Round a number up or down."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absolute"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "square root"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Return the absolute value of a number."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Return e to the power of a number."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Return the natural logarithm of a number."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Return the base 10 logarithm of a number."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Return the negation of a number."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Return 10 to the power of a number."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Return the square root of a number."; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // 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"] = "Return the arccosine of a number."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Return the arcsine of a number."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Return the arctangent of a number."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Return the cosine of a degree (not radian)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Return the sine of a degree (not radian)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Return the tangent of a degree (not radian)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "Create variable..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "New variable name:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // 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"] = "Create '%1'"; // untranslated +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/Subroutine"; // 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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "return"; // untranslated +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"] = "inputs"; // untranslated +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TOOLTIP"] = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg["REDO"] = "Redo"; +Blockly.Msg["REMOVE_COMMENT"] = "Remove Comment"; +Blockly.Msg["RENAME_VARIABLE"] = "Rename variable..."; +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Rename all '%1' variables to:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "to %1 append text %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Append some text to variable '%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "to lower case"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "to Title Case"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "to UPPER CASE"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Return a copy of the text in a different case."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "get first letter"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "get letter # from end"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "get letter #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "get last letter"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "get random letter"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returns the letter at the specified position."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Add an item to the text."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "join"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Add, remove, or reorder sections to reconfigure this text block."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "to letter # from end"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "to letter #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "to last letter"; +Blockly.Msg["TEXT_GET_SUBSTRING_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_INPUT_IN_TEXT"] = "in text"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "get substring from first letter"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "get substring from letter # from end"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "get substring from letter #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Returns a specified portion of the text."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "find first occurrence of text"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "find last occurrence of text"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "in text %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 is empty"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Returns true if the provided text is empty."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "create text with"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Create a piece of text by joining together any number of items."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "length of %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Returns the number of letters (including spaces) in the provided text."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "print %1"; // untranslated +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_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "A letter, word, or line of text."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // 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."; +Blockly.Msg["TODAY"] = "Today"; +Blockly.Msg["UNDO"] = "Undo"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // untranslated +Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "item"; +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["VARIABLE_ALREADY_EXISTS"] = "A variable named '%1' already exists."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another variable of type '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/en.js b/js/msg/js/en.js new file mode 100644 index 0000000..307dc19 --- /dev/null +++ b/js/msg/js/en.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Add Comment"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Change value:"; +Blockly.Msg["CLEAN_UP"] = "Clean up Blocks"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; +Blockly.Msg["COLLAPSE_ALL"] = "Collapse Blocks"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Collapse Block"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "colour 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "colour 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; +Blockly.Msg["COLOUR_BLEND_RATIO"] = "ratio"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "blend"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Blends two colours together with a given ratio (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Choose a colour from the palette."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "random colour"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Choose a colour at random."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "blue"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "green"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; +Blockly.Msg["COLOUR_RGB_RED"] = "red"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "colour with"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Create a colour with the specified amount of red, green, and blue. All values must be between 0 and 100."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "break out of loop"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "continue with next iteration of loop"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Break out of the containing loop."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Skip the rest of this loop, and continue with the next iteration."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Warning: This block may only be used within a loop."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "for each item %1 in list %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "For each item in a list, set the variable '%1' to the item, and then do some statements."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; +Blockly.Msg["CONTROLS_FOR_TITLE"] = "count with %1 from %2 to %3 by %4"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Have the variable '%1' take on the values from the start number to the end number, counting by the specified interval, and do the specified blocks."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Add a condition to the if block."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Add a final, catch-all condition to the if block."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Add, remove, or reorder sections to reconfigure this if block."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "else"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "else if"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "if"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "If a value is true, then do some statements."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "If a value is true, then do the first block of statements. Otherwise, do the second block of statements."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "do"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "repeat %1 times"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Do some statements several times."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "repeat until"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "repeat while"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "While a value is false, then do some statements."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "While a value is true, then do some statements."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Delete all %1 blocks?"; +Blockly.Msg["DELETE_BLOCK"] = "Delete Block"; +Blockly.Msg["DELETE_VARIABLE"] = "Delete the '%1' variable"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Delete %1 Blocks"; +Blockly.Msg["DISABLE_BLOCK"] = "Disable Block"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Duplicate"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; +Blockly.Msg["ENABLE_BLOCK"] = "Enable Block"; +Blockly.Msg["EXPAND_ALL"] = "Expand Blocks"; +Blockly.Msg["EXPAND_BLOCK"] = "Expand Block"; +Blockly.Msg["EXTERNAL_INPUTS"] = "External Inputs"; +Blockly.Msg["HELP"] = "Help"; +Blockly.Msg["INLINE_INPUTS"] = "Inline Inputs"; +Blockly.Msg["IOS_CANCEL"] = "Cancel"; +Blockly.Msg["IOS_ERROR"] = "Error"; +Blockly.Msg["IOS_OK"] = "OK"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Add Input"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INPUTS"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Add"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Add Variable"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Delete"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "You can't use an empty variable name."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Rename"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Variable name"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "create empty list"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Returns a list, of length 0, containing no data records"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "list"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Add, remove, or reorder sections to reconfigure this list block."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "create list with"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Add an item to the list."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Create a list with any number of items."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "first"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# from end"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; +Blockly.Msg["LISTS_GET_INDEX_GET"] = "get"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "get and remove"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "last"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "random"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "remove"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Returns the first item in a list."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Returns the item at the specified position in a list."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Returns the last item in a list."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Returns a random item in a list."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Removes and returns the first item in a list."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Removes and returns the item at the specified position in a list."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Removes and returns the last item in a list."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Removes and returns a random item in a list."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Removes the first item in a list."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Removes the item at the specified position in a list."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Removes the last item in a list."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Removes a random item in a list."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "to # from end"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "to #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "to last"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "get sub-list from first"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "get sub-list from # from end"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "get sub-list from #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Creates a copy of the specified portion of a list."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 is the last item."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 is the first item."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "find first occurrence of item"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "find last occurrence of item"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; +Blockly.Msg["LISTS_INLIST"] = "in list"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 is empty"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Returns true if the list is empty."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; +Blockly.Msg["LISTS_LENGTH_TITLE"] = "length of %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Returns the length of a list."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_REPEAT_TITLE"] = "create list with item %1 repeated %2 times"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Creates a list consisting of the given value repeated the specified number of times."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "as"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "insert at"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "set"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Inserts the item at the start of a list."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Inserts the item at the specified position in a list."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Append the item to the end of a list."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Inserts the item randomly in a list."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Sets the first item in a list."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Sets the item at the specified position in a list."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Sets the last item in a list."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Sets a random item in a list."; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "ascending"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "descending"; +Blockly.Msg["LISTS_SORT_TITLE"] = "sort %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Sort a copy of a list."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alphabetic, ignore case"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numeric"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alphabetic"; +Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg["LISTS_SPLIT_LIST_FROM_TEXT"] = "make list from text"; +Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "make text from list"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Join a list of texts into one text, separated by a delimiter."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Split text into a list of texts, breaking at each delimiter."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "with delimiter"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "false"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Returns either true or false."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "true"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Return true if both inputs equal each other."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Return true if the first input is greater than the second input."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Return true if the first input is greater than or equal to the second input."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Return true if the first input is smaller than the second input."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Return true if the first input is smaller than or equal to the second input."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Return true if both inputs are not equal to each other."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "not %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Returns true if the input is false. Returns false if the input is true."; +Blockly.Msg["LOGIC_NULL"] = "null"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Returns null."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "and"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; +Blockly.Msg["LOGIC_OPERATION_OR"] = "or"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Return true if both inputs are true."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Return true if at least one of the inputs is true."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "test"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "if false"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "if true"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Return the sum of the two numbers."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Return the quotient of the two numbers."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Return the difference of the two numbers."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Return the product of the two numbers."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Return the first number raised to the power of the second number."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "change %1 by %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Add a number to variable '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "constrain %1 low %2 high %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Constrain a number to be between the specified limits (inclusive)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "is divisible by"; +Blockly.Msg["MATH_IS_EVEN"] = "is even"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "is negative"; +Blockly.Msg["MATH_IS_ODD"] = "is odd"; +Blockly.Msg["MATH_IS_POSITIVE"] = "is positive"; +Blockly.Msg["MATH_IS_PRIME"] = "is prime"; +Blockly.Msg["MATH_IS_TOOLTIP"] = "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false."; +Blockly.Msg["MATH_IS_WHOLE"] = "is whole"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "remainder of %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Return the remainder from dividing the two numbers."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "A number."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "average of list"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "max of list"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "median of list"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "min of list"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "modes of list"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "random item of list"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "standard deviation of list"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "sum of list"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Return the average (arithmetic mean) of the numeric values in the list."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Return the largest number in the list."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Return the median number in the list."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Return the smallest number in the list."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Return a list of the most common item(s) in the list."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Return a random element from the list."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Return the standard deviation of the list."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Return the sum of all the numbers in the list."; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "random fraction"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "random integer from %1 to %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Return a random integer between the two specified limits, inclusive."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "round"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "round down"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "round up"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Round a number up or down."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absolute"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "square root"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Return the absolute value of a number."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Return e to the power of a number."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Return the natural logarithm of a number."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Return the base 10 logarithm of a number."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Return the negation of a number."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Return 10 to the power of a number."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Return the square root of a number."; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; +Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; +Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; +Blockly.Msg["MATH_TRIG_COS"] = "cos"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Return the arccosine of a number."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Return the arcsine of a number."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Return the arctangent of a number."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Return the cosine of a degree (not radian)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Return the sine of a degree (not radian)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Return the tangent of a degree (not radian)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; +Blockly.Msg["NEW_VARIABLE"] = "Create variable..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "New variable name:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "allow statements"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "with:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Run the user-defined function '%1' and use its output."; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "with:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "Create '%1'"; +Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Describe this function..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "do something"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "to"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Creates a function with no output."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "return"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Creates a function with an output."; +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Warning: This function has duplicate parameters."; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Highlight function definition"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "If a value is true, then return a second value."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Warning: This block may be used only within a function definition."; +Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "input name:"; +Blockly.Msg["PROCEDURES_MUTATORARG_TOOLTIP"] = "Add an input to the function."; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TITLE"] = "inputs"; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TOOLTIP"] = "Add, remove, or reorder inputs to this function."; +Blockly.Msg["REDO"] = "Redo"; +Blockly.Msg["REMOVE_COMMENT"] = "Remove Comment"; +Blockly.Msg["RENAME_VARIABLE"] = "Rename variable..."; +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Rename all '%1' variables to:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg["TEXT_APPEND_TITLE"] = "to %1 append text %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Append some text to variable '%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "to lower case"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "to Title Case"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "to UPPER CASE"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Return a copy of the text in a different case."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "get first letter"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "get letter # from end"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "get letter #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; +Blockly.Msg["TEXT_CHARAT_LAST"] = "get last letter"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "get random letter"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returns the letter at the specified position."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Add an item to the text."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "join"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Add, remove, or reorder sections to reconfigure this text block."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "to letter # from end"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "to letter #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "to last letter"; +Blockly.Msg["TEXT_GET_SUBSTRING_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; +Blockly.Msg["TEXT_GET_SUBSTRING_INPUT_IN_TEXT"] = "in text"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "get substring from first letter"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "get substring from letter # from end"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "get substring from letter #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Returns a specified portion of the text."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "find first occurrence of text"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "find last occurrence of text"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "in text %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 is empty"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Returns true if the provided text is empty."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "create text with"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Create a piece of text by joining together any number of items."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg["TEXT_LENGTH_TITLE"] = "length of %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Returns the number of letters (including spaces) in the provided text."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; +Blockly.Msg["TEXT_PRINT_TITLE"] = "print %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Print the specified text, number or other value."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Prompt for user for a number."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Prompt for user for some text."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "prompt for number with message"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "prompt for text with message"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "A letter, word, or line of text."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "trim spaces from both sides of"; +Blockly.Msg["TEXT_TRIM_OPERATOR_LEFT"] = "trim spaces from left side of"; +Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "trim spaces from right side of"; +Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "Return a copy of the text with spaces removed from one or both ends."; +Blockly.Msg["TODAY"] = "Today"; +Blockly.Msg["UNDO"] = "Undo"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; +Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "item"; +Blockly.Msg["VARIABLES_GET_CREATE_SET"] = "Create 'set %1'"; +Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#get"; +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Returns the value of this variable."; +Blockly.Msg["VARIABLES_SET"] = "set %1 to %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Create 'get %1'"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Sets this variable to be equal to the input."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "A variable named '%1' already exists."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/eo.js b/js/msg/js/eo.js new file mode 100644 index 0000000..40c3598 --- /dev/null +++ b/js/msg/js/eo.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Aldoni komenton"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Ne povas forigi la variablon '%1' ĉar ĝi estas parto de la difino de la funkcio '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Ŝangi valoron:"; +Blockly.Msg["CLEAN_UP"] = "Purigi blokojn"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Falditaj blokoj enhavas avertojn."; +Blockly.Msg["COLLAPSE_ALL"] = "Faldi blokojn"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Faldi blokon"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "koloro 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "koloro 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "proporcio"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "miksi"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Kunmiksas du kolorojn laŭ specifita proporcio (0,0 - 1,0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://eo.wikipedia.org/wiki/Koloro"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Elekti koloron el la paletro."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "hazarda koloro"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Elekti hazardan koloron."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "blua"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "verda"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "ruĝa"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "kolorigi per"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Kreas koloron kun specifita kvanto de ruĝo, verdo, kaj bluo. Ĉiuj valoroj devas esti inter 0 kaj 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"] = "eliri el la ciklo"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "daŭrigi je la venonta ripeto de la ciklo"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Eliri el la enhava ciklo."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Pretersalti la ceteron de tiu ĉi ciklo kaj daŭrigi je la venonta ripeto."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Averto: tiu ĉi bloko uzeblas nur ene de ciklo."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "por ĉiu elemento %1 en la listo %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Pri ĉiu elemento en listo, difinas la variablon '%1' al la elemento, kaj faras kelkajn ordonojn."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "kalkuli kun variablo %1 ekde %2 ĝis %3 per diferenco %4"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Varias la variablon '%1', ekde la komenca nombro ĝis la fina nombro, laŭ la specifita diferenco; dume rulas la specifitajn blokojn."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Aldoni kondiĉon al la bloko 'se'"; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Aldoni 'aliokaze' kondiĉon al la 'se' bloko."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Aldoni, forigi aŭ reorganizi partojn por reagordi la 'se'-blokon."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "alie"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "alie se"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "se"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Plenumi ordonojn se la valoro estas vero."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Plenumi la unuan blokon de ordonoj se la valoro estas vero, se ne, la duan."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Se la unua valoro estas vero, do faras la unuan blokon de ordonoj. Alie, se la dua valoro estas vero, do faras la duan blokon de ordonoj."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Se la unua valoro estas vero, do faras la unuan blokon de ordonoj. Alie, se la dua valoro estas vero, do faras la duan blokon de ordonoj. Se neniu el la du valoroj estas vero, do faras la lastan blokon de ordonoj."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://eo.wikipedia.org/wiki/Iteracio"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "fari"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "ripeti %1 fojojn"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Plenumas kelkajn ordonojn plurfoje."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "ripeti ĝis"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "ripeti dum"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Plenumi ordonojn dum valoro egalas malvero."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Plenumi ordonojn dum la valoro egalas veron."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Ĉu forigi ĉiujn %1 blokojn?"; +Blockly.Msg["DELETE_BLOCK"] = "Forigi blokon"; +Blockly.Msg["DELETE_VARIABLE"] = "Forigi la variablon '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Ĉu forigi %1 uzojn de la variablo '%2'?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Forigi %1 blokojn"; +Blockly.Msg["DISABLE_BLOCK"] = "Malŝalti blokon"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Duobligi"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duobligi Komenton"; +Blockly.Msg["ENABLE_BLOCK"] = "Ŝalti blokon"; +Blockly.Msg["EXPAND_ALL"] = "Malfaldi blokojn"; +Blockly.Msg["EXPAND_BLOCK"] = "Malfaldi blokon"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Eksteraj eniroj"; +Blockly.Msg["HELP"] = "Helpo"; +Blockly.Msg["INLINE_INPUTS"] = "Entekstaj eniroj"; +Blockly.Msg["IOS_CANCEL"] = "Nuligi"; +Blockly.Msg["IOS_ERROR"] = "Eraro"; +Blockly.Msg["IOS_OK"] = "Bone"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Aldoni eniron"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Permesi ordonojn"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Ĉi tiu funkcio havas du samnomajn enirojn."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "ENIROJ"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Aldoni"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Aldoni Variablon"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Forigi"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "La nomo de la variablo devas esti ne malplena."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Alinomigi"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Nomo de variablo"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "krei malplenan liston"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Liveri liston, de longo 0, sen datenaj rikordoj"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "listo"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Aldoni, forigi aŭ ordigi partojn por reagordi la listan blokon."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "krei liston kun"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Aldoni elementon al la listo."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Krei liston kun ajna nombro de elementoj."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "unuan"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "#el la fino"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_GET"] = "akiri"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "akiri kaj forigi"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "lastan"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "hazardan"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "forigi"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "La unua elemento en la listo esto liverita."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Liveri la elementon ĉe la specifita pozicio en listo."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Liveri la lastan elementon en la listo."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Hazarda elemento en la listo estos liverita."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "La unua elemento en la listo estos liverita kaj forigita."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Liveri kaj forigi la elementon en la specifita pozicio de la listo."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Forigi kaj liveri la lastan elementon en listo."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Hazarda elemento en la listo estos liverita kaj forigita."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "La unua elemento en la listo estos forigita."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "La elemento en la specifita pozicio en la listo estos forigita."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "La lasta elemento en la listo estos forigita."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Hazarda elemento en la listo estos forigita."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "ĝis elemento de inversa numero"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "ĝis elemento de numero"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "ĝis la lasta elemento"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "akiri subliston ekde la unua elemento"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "akiri subliston ekde elemento de inversa numero"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "akiri subliston ekde elemento de numero"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Kreas kopion de la specifita parto de listo."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 estas la lasta elemento."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 estas la unua elemento."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "trovi la unuan aperon de elemento"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "trovi la lastan aperon de elemento"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "La indekso de la unua/lasta apero de la elemento en la listo estos liverita. %1 estos liverita se la elemento ne estas trovita."; +Blockly.Msg["LISTS_INLIST"] = "en la listo"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 malplenas"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Liveri veron, se la listo malplenas."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "longo de %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Liveri la longon de listo."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "krei liston kun elemento %1 ripetita %2 fojojn"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Listo kun la specifita nombro de elementoj, kiuj havos la donitan valoron, estos kreita."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "inversigi liston %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Inversigi kopion de listo."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "kiel"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "enmeti je"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "difini"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Antaŭaldonas la elementon ĉe la komenco de listo."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Enigas la elementon ĉe specifita pozicio en listo."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Postaldonas la elementon ĉe la fino de listo."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Enigas la elementon hazarde en listo."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Difinas la unua elementon en listo."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Difinas la elementon ĉe la specifita pozicio en listo"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Difinas la lastan elementon en listo."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Difinas hazardan elementon en listo."; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "kreskante"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "malkreskante"; +Blockly.Msg["LISTS_SORT_TITLE"] = "ordigi %1 %2 liston %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Ordigas kopion de listo."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alfabete, ignorante usklon"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "nombre"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alfabete"; +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"] = "fari liston el teksto"; +Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "fari tekston el listo"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Kunigas liston de tekstoj en unu tekston, kun apartigilo inter la elementoj."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Disdividas tekston en liston da tekstoj, laŭ apartigilo."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "kun apartigilo"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "falsa"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Liveri ĉu veron ĉu malveron."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "vera"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://eo.wikipedia.org/wiki/Neegala%C4%B5o_(pli_granda,_malpli_granda)"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Liveri veron, se la du eniroj egalas."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Liveri veron, se la unua eniro estas pli granda ol la dua."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Vero estos liverita, se la unua eniro estas pli granda aŭ egala al la dua."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Liveri veron, se la unua eniro estas pli malgranda ol la dua."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Vero estos liverita, se la unua eniro estas pli eta aŭ egala al la dua."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Liveri veron, se la du eniroj ne egalas."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "maligi %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Liveri veron, se la eniro egalas malveron. Liveri malveron, se la eniro egalas veron."; +Blockly.Msg["LOGIC_NULL"] = "senvalora"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Liveras senvaloron."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "kaj"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "aŭ"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Liveri veron, se la du eniroj egalas veron."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Liveri veron, se almenaŭ unu el la eniroj egalas veron."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "testi"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "se estas malvero"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "se estas vero"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Kontroli la kondiĉon en 'testo'. Se la kondiĉo egalas veron, liveri la valoron 'se estas vero', aliokaze liveri la valoron 'se estas malvero'."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://eo.wikipedia.org/wiki/Aritmetiko"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Liveri la sumon de la du nombroj."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Liveri la kvocienton de la du nombroj."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Liveri la diferencon inter la du nombroj."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "La produto de la du numeroj estos liverita."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Livero la tian potencon de la unua nombro, kia la dua nombro estas"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://eo.wikipedia.org/wiki/Inversa_trigonometria_funkcio#Duargumenta_varianto_de_tangentarko"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 de X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Liveras la arkotangenton de punkto (X, Y) en gradoj inter -180 kaj 180."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://eo.wikipedia.org/wiki/Kremento"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "krementi %1 per %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Aldoni nombron al variablo '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://eo.wikipedia.org/wiki/Matematika_konstanto"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Liveras unu el la ofte uzataj konstantoj: π (3,141…), e (2,718…), φ (1,618…), √2 (1,414…), √½ (0,707…), aŭ ∞ (malfinio)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "limigi %1 inter %2 kaj %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "La nombro estos limigita tiel ke ĝi egalas la limojn aŭ troviĝas inter ili."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "estas dividebla de"; +Blockly.Msg["MATH_IS_EVEN"] = "estas para"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "estas negativa"; +Blockly.Msg["MATH_IS_ODD"] = "estas nepara"; +Blockly.Msg["MATH_IS_POSITIVE"] = "estas pozitiva"; +Blockly.Msg["MATH_IS_PRIME"] = "estas primo"; +Blockly.Msg["MATH_IS_TOOLTIP"] = "Vero aŭ malvero estos liverita, depende de la rezulto de kontrolo, ĉu nombro estas para, nepara, pozitiva, negativa, aŭ dividebla de iu nombro."; +Blockly.Msg["MATH_IS_WHOLE"] = "estas entjero"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://eo.wikipedia.org/wiki/Resto"; +Blockly.Msg["MATH_MODULO_TITLE"] = "resto de %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Liveri la reston de la divido de la du nombroj."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://eo.wikipedia.org/wiki/Nombro"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Nombro."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "listmezumo"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "listmaksimumo"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "mediano de listo"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "listminimumo"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "modoj de listo"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "hazarda elemento el la listo"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "Norma devio de la listo"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "sumo de listo"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Liveri la aritmetikan meznombron de la nombroj en la listo."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Liveri la plej grandan nombron en la listo."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Liveras la medianan nombron en la listo."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Liveri la plej malgrandan nombron en la listo."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Liveras liston de la plej ofta(j) elemento(j) en la listo."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Liveri hazardan elementon el la listo."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Liveri la norman devion de la listo."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Liveri la sumon de ĉiuj nombroj en la listo."; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://eo.wikipedia.org/wiki/Hazardo"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "hazarda frakcio"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Liveras hazardan frakcion inter 0,0 (inkluzive) kaj 1,0 (ekskluzive)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "hazarda entjero inter %1 kaj %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Nombro estos hazarde liverita, tiel ke ĝi egalas la limojn aŭ troviĝas inter ili."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "rondigi"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "rondigi malsupren"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "Rondigi supren"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Rondigi nombroj, supren aŭ malsupren."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://eo.wikipedia.org/wiki/Kvadrata_radiko"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absoluta"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "kvadrata radiko"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Liveri la absolutan valoron de nombro."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Liveri potencon de e."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Liveri la naturan logaritmon de nombro."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "La dekbaza logaritmo de numero estos liverita."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "La negativigo de numero estos liverita."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Liveri tian potencon de 10, kia la eniro estas."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Liveri la kvadratan radikon de nombro."; +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://eo.wikipedia.org/wiki/Trigonometria_funkcio"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Liveras la arkokosinuson de nombro."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "La sinusarko de nombro estos liverita."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "La targentarko de nombro estos liverita."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Liveras la kosinuson de angulo en gradoj (ne radianoj)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Liveras la sinuson de angulo en gradoj (ne radianoj)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Liveras la tangenton de angulo en gradoj (ne radianoj)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Krei koloran variablon..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Krei nombran variablon..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Krei signoĉenan variablon..."; +Blockly.Msg["NEW_VARIABLE"] = "Nova variablo..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Nova nomo de variablo:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Tipo de nova variablo:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "permesi ordonojn"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "kun:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://eo.wikipedia.org/wiki/Subprogramo"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Ruli la uzanto-difinitan funkcion '%1'."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://eo.wikipedia.org/wiki/Subprogramo"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Ruli la uzanto-difinitan funkcion '%1' kaj uzi ĝian eliron."; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "kun:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "Krei '%1'"; +Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Priskribi ĉi tiun funkcion..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "fari ion"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "por"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Krei funkcion sen eliro."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "liveri"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Krei funkcion kun unu eliro."; +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Averto: la funkcio havas du parametrojn kun la sama nomo."; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Emfazi difinon de funkcio"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Se valoro estas vero, do liveras duan valoron."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Averto: Ĉi tiu bloko estas uzebla nur en difino de funkcio."; +Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "nomo de enigo:"; +Blockly.Msg["PROCEDURES_MUTATORARG_TOOLTIP"] = "Aldoni eniron al la funkcio."; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TITLE"] = "eniroj"; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TOOLTIP"] = "Aldoni, forigi, aŭ reorganizi enirojn je ĉi tiu funkcio."; +Blockly.Msg["REDO"] = "Refari"; +Blockly.Msg["REMOVE_COMMENT"] = "Forigi komenton"; +Blockly.Msg["RENAME_VARIABLE"] = "Renomi variablon..."; +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Renomi ĉiujn '%1' variablojn kiel:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "al %1 postaldoni tekston %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Postapendi iom da teksto al variablo '%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "minuskligi"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "Nomuskligi"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "MAJUSKLIGI"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Liveras kopion de la teksto je alia usklo."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "akiri unuan literon"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "akiri literon de inversa numero"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "akiri literon de numero"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "akiri lastan literon"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "akiri hazardan literon"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "en la teksto %1, %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Liveras literon ĉe specifita loko."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "kalkuli la okazojn de %1 en %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Kalkuli kiomfoje iu teksto okazas en iu alia teksto."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Aldoni eron al la teksto."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "kunigi"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Aldonu, forigu, aŭ reorganizu partojn por reagordi la tekstan blokon."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "ĝis litero de inversa numero"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "ĝis litero de numero"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "ĝis lasta litero"; +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"] = "en la teksto"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "akiri subsignoĉenon ekde la unua litero"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "akiri subsignoĉenon ekde litero de inversa numero"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "akiri subsignoĉenon ekde litero de numero"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Liveri specifitan parto de la teksto."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "trovi la unuan okazon de teksto"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "trovi la lastan okazon de teksto"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "en la teksto %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Liveras indekson de la unua/lasta okazo de la unua teksto en la dua teksto. Liveras %1 se la unua teksto ne okazas en la dua teksto."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 malplenas"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Liveras veron, se la provizita teksto estas malplena."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "krei tekston kun"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Krei pecon de teksto per kunigi ajnan nombron de eroj."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "longo de %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Liveras la nombron de literoj (inkluzive de spacetoj) en la provizita teksto."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "presi %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Presi la specifitan tekston, nombron aŭ alian valoron."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Peti nombron al uzanto."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Peti tekston al uzanto."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "ricevi nombron per mesaĝo"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "ricevi tekston per mesaĝo"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "anstataŭigi tekston %1 per %2 en %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Anstataŭigi ĉiujn okazojn de iu teksto en alia teksto."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "inversigi tekston %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Inversigi la ordon de la skribsignoj en la teksto."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://eo.wikipedia.org/wiki/Signoĉeno"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Litero, vorto, aŭ linio da teksto."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "forigi spacetojn for de ambaŭ finoj de"; +Blockly.Msg["TEXT_TRIM_OPERATOR_LEFT"] = "forigi spacetojn for de maldekstra fino de"; +Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "forigi spacetojn for de dekstra fino de"; +Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "Liveras kopion de teksto, de kies fino(j) spacetoj foriĝis."; +Blockly.Msg["TODAY"] = "Hodiaŭ"; +Blockly.Msg["UNDO"] = "Malfari"; +Blockly.Msg["UNNAMED_KEY"] = "nenomita"; +Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "elemento"; +Blockly.Msg["VARIABLES_GET_CREATE_SET"] = "Krei blokon 'difini variablon %1'"; +Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Liveras la valoron de ĉi tiu variablo."; +Blockly.Msg["VARIABLES_SET"] = "difini %1 kiel %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Krei blokon 'akiri variablon %1'"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Difinas ĉi tiun variablon kiel la eniron."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Jam ekzistas variablo kun la nomo '%1'."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Jam ekzistas variablo kun la nomo '%1' por alia tipo: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Diru ion…"; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/es.js b/js/msg/js/es.js new file mode 100644 index 0000000..258332f --- /dev/null +++ b/js/msg/js/es.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Añadir comentario"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "No se puede eliminar la variable '%1' porque es parte de la definición de la función '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Cambiar el valor:"; +Blockly.Msg["CLEAN_UP"] = "Limpiar los bloques"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Bloques colapsados contienen advertencias."; +Blockly.Msg["COLLAPSE_ALL"] = "Contraer bloques"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Contraer bloque"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "color 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "color 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "proporción"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "combinar"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Combina dos colores con una proporción determinada (0,0-1,0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://es.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Elige un color de la paleta."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "color aleatorio"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Elige un color al azar."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "azul"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "verde"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "rojo"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "colorear con"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Crea un color con cantidades específicas de rojo, verde y azul. Todos los valores deben encontrarse entre 0 y 100."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "romper el bucle"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "continuar con la siguiente iteración del bucle"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Romper el bucle que lo contiene."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Saltar el resto de este bucle, y continuar con la siguiente iteración."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Atención: este bloque puede usarse solamente dentro de un bucle."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://es.wikipedia.org/wiki/Foreach"; +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "para cada elemento %1 en la lista %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Para cada elemento en una lista, establecer la variable '%1' al elemento y luego hacer algunas declaraciones."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "contar con %1 desde %2 hasta %3 de a %4"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Hacer que la variable \"%1\" tome los valores desde el número de inicio hasta el número final, contando con el intervalo especificado, y hacer los bloques especificados."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Agregar una condición a este bloque."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Agregar una condición general final a este bloque."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Agregar, eliminar o reordenar las secciones para reconfigurar este bloque."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "sino"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "sino si"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "si"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Si un valor es verdadero, entonces hacer algunas declaraciones."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Si un valor es verdadero, entonces hacer el primer bloque de declaraciones. De lo contrario, hacer el segundo bloque de declaraciones."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Si el primer valor es verdadero, entonces hacer el primer bloque de declaraciones. De lo contrario, si el segundo valor es verdadero, hacer el segundo bloque de declaraciones."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Si el primer valor es verdadero, entonces hacer el primer bloque de declaraciones. De lo contrario, si el segundo valor es verdadero, hacer el segundo bloque de declaraciones. Si ninguno de los valores son verdaderos, hacer el último bloque de declaraciones."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "hacer"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "repetir %1 veces"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Hacer algunas declaraciones varias veces."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "repetir hasta"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "repetir mientras"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Mientras un valor sea falso, entonces hacer algunas declaraciones."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Mientras un valor sea verdadero, entonces hacer algunas declaraciones."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "¿Eliminar todos los %1 bloques?"; +Blockly.Msg["DELETE_BLOCK"] = "Eliminar bloque"; +Blockly.Msg["DELETE_VARIABLE"] = "Borrar la variable \"%1\""; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "¿Borrar %1 usos de la variable '%2'?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Eliminar %1 bloques"; +Blockly.Msg["DISABLE_BLOCK"] = "Desactivar bloque"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Duplicar"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicar comentario"; +Blockly.Msg["ENABLE_BLOCK"] = "Activar bloque"; +Blockly.Msg["EXPAND_ALL"] = "Expandir bloques"; +Blockly.Msg["EXPAND_BLOCK"] = "Expandir bloque"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Entradas externas"; +Blockly.Msg["HELP"] = "Ayuda"; +Blockly.Msg["INLINE_INPUTS"] = "Entradas en línea"; +Blockly.Msg["IOS_CANCEL"] = "Cancelar"; +Blockly.Msg["IOS_ERROR"] = "Error"; +Blockly.Msg["IOS_OK"] = "Aceptar"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Añadir entrada"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Permitir declaraciones"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Esta función tiene entradas duplicadas."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "ENTRADAS"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Añadir"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Añadir variable"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Borrar"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "No puedes usar un nombre de variable vacío."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Renombrar"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Nombre de la variable"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "crear lista vacía"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Devuelve una lista, de longitud 0, sin ningún dato"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "lista"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Agregar, eliminar o reorganizar las secciones para reconfigurar este bloque de lista."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "crear lista con"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Agregar un elemento a la lista."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Crear una lista con cualquier número de elementos."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "primero"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# del final"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_GET"] = "obtener"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "obtener y eliminar"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "último"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "aleatorio"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "eliminar"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Devuelve el primer elemento de una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Devuelve el elemento en la posición especificada en una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Devuelve el último elemento de una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Devuelve un elemento aleatorio en una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Elimina y devuelve el primer elemento de una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Elimina y devuelve el elemento en la posición especificada en una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Elimina y devuelve el último elemento de una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Elimina y devuelve un elemento aleatorio en una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Elimina el primer elemento de una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Elimina el elemento en la posición especificada en una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Elimina el último elemento de una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Elimina un elemento aleatorio en una lista."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "hasta # del final"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "hasta #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "hasta el último"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "obtener sublista desde el primero"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "obtener sublista desde # del final"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "obtener sublista desde #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Crea una copia de la parte especificada de una lista."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 es el último elemento."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 es el primer elemento."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "encontrar la primera aparición del elemento"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "encontrar la última aparición del elemento"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Devuelve el índice de la primera/última aparición del elemento en la lista. Devuelve %1 si el elemento no se encuentra."; +Blockly.Msg["LISTS_INLIST"] = "en la lista"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 está vacía"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Devuelve verdadero si la lista está vacía."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "longitud de %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Devuelve la longitud de una lista."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "crear lista con el elemento %1 repetido %2 veces"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Crea una lista que consta de un valor dado repetido el número de veces especificado."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "invertir %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Invertir una copia de una lista."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "como"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "insertar en"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "establecer"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Inserta el elemento al inicio de una lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Inserta el elemento en la posición especificada en una lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Añade el elemento al final de una lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Inserta el elemento aleatoriamente en una lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Establece el primer elemento de una lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Establece el elemento en la posición especificada en una lista."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "ascendente"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "descendente"; +Blockly.Msg["LISTS_SORT_TITLE"] = "orden %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Ordenar una copia de una lista."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alfabético, ignorar mayúscula/minúscula"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numérico"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alfabético"; +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"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Unir una lista de textos en un solo texto, separado por un delimitador."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Dividir el texto en una lista de textos, separando en cada delimitador."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "con delimitador"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "falso"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Devuelve verdadero o falso."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "verdadero"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://es.wikipedia.org/wiki/Desigualdad_matemática"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Devuelve verdadero si ambas entradas son iguales."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Devuelve verdadero si la primera entrada es mayor que la segunda entrada."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Devuelve verdadero si la primera entrada es mayor o igual a la segunda entrada."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Devuelve verdadero si la primera entrada es menor que la segunda entrada."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Devuelve verdadero si la primera entrada es menor que o igual a la segunda entrada."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Devuelve verdadero si ambas entradas son distintas."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "no %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Devuelve verdadero si la entrada es falsa. Devuelve falso si la entrada es verdadera."; +Blockly.Msg["LOGIC_NULL"] = "nulo"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Devuelve nulo."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "y"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "o"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Devuelve verdadero si ambas entradas son verdaderas."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Devuelve verdadero si al menos una de las entradas es verdadera."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "prueba"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "si es falso"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "si es verdadero"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Comprueba la condición en \"prueba\". Si la condición es verdadera, devuelve el valor \"si es verdadero\"; de lo contrario, devuelve el valor \"si es falso\"."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://es.wikipedia.org/wiki/Aritmética"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Devuelve la suma de ambos números."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Devuelve el cociente de ambos números."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Devuelve la diferencia de ambos números."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Devuelve el producto de ambos números."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Devuelve el primer número elevado a la potencia del segundo."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://es.wikipedia.org/wiki/Arcotangente_de_dos_par%C3%A1metros"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "Arcotangente de X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Regresar el arcotangente del punto (X,Y) en grados de -180 a 180."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "añadir %2 a %1"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Añadir un número a la variable «%1»."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://es.wikipedia.org/wiki/Anexo:Constantes_matemáticas"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Devuelve una de las constantes comunes: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…) o ∞ (infinito)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "limitar %1 entre %2 y %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Limitar un número entre los límites especificados (inclusive)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "es divisible por"; +Blockly.Msg["MATH_IS_EVEN"] = "es par"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "es negativo"; +Blockly.Msg["MATH_IS_ODD"] = "es impar"; +Blockly.Msg["MATH_IS_POSITIVE"] = "es positivo"; +Blockly.Msg["MATH_IS_PRIME"] = "es primo"; +Blockly.Msg["MATH_IS_TOOLTIP"] = "Comprueba si un número es par, impar, primo, entero, positivo, negativo, o si es divisible por un número determinado. Devuelve verdadero o falso."; +Blockly.Msg["MATH_IS_WHOLE"] = "es entero"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "resto de %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Devuelve el resto al dividir los dos números."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://es.wikipedia.org/wiki/Número"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Un número."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "promedio de la lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "máximo de la lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "mediana de la lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "mínimo de la lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "modas de la lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "elemento aleatorio de la lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "desviación estándar de la lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "suma de la lista"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Devuelve el promedio (media aritmética) de los valores numéricos en la lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Devuelve el número más grande en la lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Devuelve la mediana en la lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Devuelve el número más pequeño en la lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Devuelve una lista de los elementos más comunes en la lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Devuelve un elemento aleatorio de la lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Devuelve la desviación estándar de la lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Devuelve la suma de todos los números en la lista."; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://es.wikipedia.org/wiki/Generador_de_números_aleatorios"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "fracción aleatoria"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Devuelve una fracción aleatoria entre 0,0 (ambos inclusive) y 1.0 (exclusivo)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://es.wikipedia.org/wiki/Generador_de_números_aleatorios"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "entero aleatorio de %1 a %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Devuelve un entero aleatorio entre los dos límites especificados, inclusive."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://es.wikipedia.org/wiki/Redondeo"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "redondear"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "redondear a la baja"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "redondear al alza"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Redondear un número al alza o a la baja."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://es.wikipedia.org/wiki/Ra%C3%ADz_cuadrada"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absoluto"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "raíz cuadrada"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Devuelve el valor absoluto de un número."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Devuelve e a la potencia de un número."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Devuelve el logaritmo natural de un número."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Devuelve el logaritmo base 10 de un número."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Devuelve la negación de un número."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Devuelve 10 a la potencia de un número."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Devuelve la raíz cuadrada de un número."; +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://es.wikipedia.org/wiki/Función_trigonométrica"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Devuelve el arcocoseno de un número."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Devuelve el arcoseno de un número."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Devuelve el arcotangente de un número."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Devuelve el coseno de un grado (no radián)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Devuelve el seno de un grado (no radián)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Devuelve la tangente de un grado (no radián)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Crear una variable de color..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Crear una variable de número..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Crear una cadena variable..."; +Blockly.Msg["NEW_VARIABLE"] = "Crear variable…"; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Nombre de variable nueva:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Nuevo tipo de variable:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "permitir declaraciones"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "con:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://es.wikipedia.org/wiki/Subrutina"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Ejecuta la función definida por el usuario '%1'."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://es.wikipedia.org/wiki/Subrutina"; +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 esta función..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "hacer algo"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "para"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Crea una función sin salida."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "devuelve"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Crea una función con una salida."; +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Advertencia: Esta función tiene parámetros duplicados."; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Destacar definición de la función"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Si un valor es verdadero, entonces devuelve un segundo valor."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Advertencia: Este bloque solo puede ser utilizado dentro de la definición de una función."; +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"] = "Cambiar nombre de variable…"; +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Renombrar todas las variables «%1» a:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "a %1 añade el texto %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Añadir texto a la variable '%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "a minúsculas"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "a Mayúsculas Cada Palabra"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "a MAYÚSCULAS"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Devuelve una copia del texto en un tamaño diferente."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "obtener la primera letra"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "obtener la letra # del final"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "obtener la letra #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "obtener la última letra"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "obtener letra aleatoria"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "en el texto %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Devuelve la letra en la posición especificada."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "contar %1 en %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Cuantas veces aparece un texto dentro de otro texto."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Agregar un elemento al texto."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "unir"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Agregar, eliminar o reordenar las secciones para reconfigurar este bloque de texto."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "hasta la letra # del final"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "hasta la letra #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "hasta la última letra"; +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"] = "en el texto"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "obtener subcadena desde la primera letra"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "obtener subcadena desde la letra # del final"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "obtener subcadena desde la letra #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Devuelve una porción determinada del texto."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "encontrar la primera aparición del texto"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "encontrar la última aparición del texto"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "en el texto %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Devuelve el índice de la primera/última aparición del primer texto en el segundo texto. Devuelve %1 si el texto no se encuentra."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 está vacío"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Devuelve verdadero si el texto proporcionado está vacío."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "crear texto con"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Crear un fragmento de texto al unir cualquier número de elementos."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "longitud de %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Devuelve el número de letras (espacios incluidos) del texto proporcionado."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "imprimir %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Imprimir el texto, número u otro valor especificado."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Solicitar al usuario un número."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Solicitar al usuario un texto."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "solicitar número con el mensaje"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "solicitar texto con el mensaje"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "reemplazar %1 con %2 en %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Reemplazar todas las veces que un texto dentro de otro texto."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "invertir %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Invierte el orden de los caracteres en el texto."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://es.wikipedia.org/wiki/Cadena_de_caracteres"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Una letra, palabra o línea de texto."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "quitar espacios de ambos lados de"; +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["UNNAMED_KEY"] = "Sin nombre"; +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 +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Devuelve el valor de esta variable."; +Blockly.Msg["VARIABLES_SET"] = "establecer %1 a %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Crear 'obtener %1'"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Establece esta variable para que sea igual a la entrada."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Ya existe una variable llamada '%1'."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Ya existe una variable nombrada '%1' para otra variable del tipo: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Espacio de trabajo de Blockly"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Di algo…"; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/et.js b/js/msg/js/et.js new file mode 100644 index 0000000..1453c48 --- /dev/null +++ b/js/msg/js/et.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Lisa kommentaar"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Muutujat '%1' ei saa kustutada, sest see on osa funktsiooni '%2' määratlusest"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Muuda väärtust:"; +Blockly.Msg["CLEAN_UP"] = "Korista plokid kokku"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "Tõmba plokid kokku"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Tõmba plokk kokku"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "1. värvist"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "2. värvist"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "suhtega"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "segu"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Segab kaks värvi määratud suhtega (0.0 - 1.0) kokku."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Valitud värv paletist."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "juhuslik värv"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Juhuslikult valitud värv."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "sinisest"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "rohelisest"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "punasest"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "segu"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Tekitab värvi määratud hulgast punasest, rohelisest ja sinisest. Kõik väärtused peavad olema 0 ja 100 vahel."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "välju kordusest"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "katkesta see kordus ja liigu järgmisele"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Väljub kordusest ja liigub edasi korduse järel oleva koodi käivitamisele."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Katkestab korduses oleva koodi käivitamise ja käivitab järgmise korduse."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Hoiatus: Seda plokki saab kasutada ainult korduse sees."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "iga elemendiga %1 loendis %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Iga elemendiga loendis anna muutujale '%1' elemendi väärtus ja kõivita plokis olevad käsud."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "loendus muutujaga %1 alates %2 kuni %3, %4 kaupa"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Annab muutujale '%1' väärtused ühest numbrist teiseni, muutes seda intervalli kaupa ja käivitab igal muudatusel ploki sees oleva koodi."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Lisab „kui“ plokile tingimuse."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Lisab „kui“ plokile lõpliku tingimuseta koodiploki."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Selle „kui“ ploki muutmine sektsioonide lisamise, eemaldamise ja järjestamisega."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "vastasel juhul"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "vastasel juhul, kui"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "kui"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Kui avaldis on tõene, käivita ploki sees olevad käsud."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Kui avaldis on tõene, käivita käsud esimesest plokist. Vastasel juhul käivita käsud teisest plokist."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Kui esimene avaldis on tõene, käivita käsud esimesest plokist. Vastasel juhul, kui teine avaldis on tõene, käivita käsud teisest plokist."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Kui esimene avaldis on tõene, käivita käsud esimesest plokist. Vastasel juhul, kui teine avaldis on tõene, käivita käsud teisest plokist. Kui ükski avaldistest pole tõene, käivita käsud viimasest plokist."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "käivita"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "%1 korda"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Plokis olevate käskude käivitamine määratud arv kordi."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "seni kuni pole"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "seni kuni on"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Plokis olevaid käske korratakse seni kui avaldis pole tõene."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Plokis olevaid käske korratakse seni kui avaldis on tõene."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Kas kustutada kõik %1 plokki?"; +Blockly.Msg["DELETE_BLOCK"] = "Kustuta plokk"; +Blockly.Msg["DELETE_VARIABLE"] = "Kustuta muutuja '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Kas kustutada %1 kohas kasutatav muutuja '%2'?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Kustuta %1 plokki"; +Blockly.Msg["DISABLE_BLOCK"] = "Keela ploki kasutamine"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Tekita duplikaat"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Dubleeri kommentaar"; +Blockly.Msg["ENABLE_BLOCK"] = "Luba ploki kasutamine"; +Blockly.Msg["EXPAND_ALL"] = "Laota plokid laiali"; +Blockly.Msg["EXPAND_BLOCK"] = "Laota plokk laiali"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Sisendid ploki taga"; +Blockly.Msg["HELP"] = "Abi"; +Blockly.Msg["INLINE_INPUTS"] = "Sisendid ploki sees"; +Blockly.Msg["IOS_CANCEL"] = "Tühista"; +Blockly.Msg["IOS_ERROR"] = "Viga"; +Blockly.Msg["IOS_OK"] = "OK"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Lisa sisend"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "SISEND"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Lisa"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Lisa muutuja"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Kustuta"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Tühja muutuja nime ei saa kasutada."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Nimeta ümber"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Muutuja nimi"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "tühi loend"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Tagastab loendi, mille pikkus on 0 ja milles pole ühtegi elementi."; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "loend"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Loendiploki elementide lisamine, eemaldamine või järjestuse muutmine."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "uus loend"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Elemendi lisamine loendisse."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Tekitab mistahes arvust elementidest loendi."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "esimene element"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "element # (lõpust)"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "element #"; +Blockly.Msg["LISTS_GET_INDEX_GET"] = "võetud"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "võetud ja eemaldatud"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "viimane element"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "juhuslik element"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "eemalda"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Tagastab loendi esimese elemendi."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Tagastab loendis määratud asukohal oleva elemendi."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Tagastab loendi viimase elemendi."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Tagastab loendi juhusliku elemendi."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Tagastab ja eemaldab loendist esimese elemendi."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Tagastab ja eemaldab loendist määratud asukohal oleva elemendi."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Tagastab ja eemaldab loendist viimase elemendi."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Tagastab ja eemaldab loendist juhusliku elemendi."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Eemaldab loendist esimese elemendi."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Eemaldab loendist määratud asukohal oleva elemendi."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Eemaldab loendist viimase elemendi."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Eemaldab loendist juhusliku elemendi."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "elemendini # (lõpust)"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "elemendini #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "lõpuni"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "alamloend algusest"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "alamloend elemendist # (lõpust)"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "alamloend elemendist #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Tekitab loendi määratud osast koopia."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "Viimane element on %1."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "Esimene element on %1."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "esimene leitud"; +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"] = "viimase leitud"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Tagastab esimese/viimase loendist leitud objekti asukoha (objekti järjekorranumbri loendis). Kui objekti ei leita, tagastab %1."; +Blockly.Msg["LISTS_INLIST"] = "loendis"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 on tühi"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Tagastab „tõene“ kui loend on tühi."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "%1 pikkus"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Tagastab loendi pikkuse."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "loend pikkusega %2 elemendist %1"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Tekitab uue loendi, millesse lisatakse ühte elementi pikkusega määratud arv kordi."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = ", väärtus"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "lisa asukohale"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "asenda"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Lisab loendi algusesse uue elemendi."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Lisab määratud asukohale loendis uue elemendi."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Lisab loendi lõppu uue elemendi."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Lisab juhuslikule kohale loendis uue elemendi."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Asendab loendis esimese elemendi."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Asendab loendis määratud kohal oleva elemendi."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Asendab loendis viimase elemendi."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Asendab loendis juhusliku elemendi."; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "kasvavalt"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "kahanevalt"; +Blockly.Msg["LISTS_SORT_TITLE"] = "%1 %2 sorteeritud %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Loendi koopia sorteerimine."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "tähestiku järgi (tähesuurust eirates)"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "arvväärtuste järgi"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "tähestiku järgi"; +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"] = "loend, tekitatud tekstist"; +Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "tekst, tekitatud loendist"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Ühendab tekstide loendis olevad tükid üheks tekstiks, asetades tükkide vahele eraldaja."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Tükeldab teksti eraldajade kohalt ja asetab tükid tekstide loendisse."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "eraldajaga"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "väär"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Tagastab tõeväärtuse – kas „tõene“ või „väär“."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "tõene"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Tagastab „tõene“, kui avaldiste väärtused on võrdsed."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Tagastab „tõene“, kui esimese avaldise väärtus on suurem kui teise väärtus."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Tagastab „tõene“, kui esimese avaldise väärtus on suurem või võrdne teise väärtusega."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Tagastab „tõene“, kui esimese avaldise väärtus on väiksem kui teise väärtus."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Tagastab „tõene“, kui esimese avaldise väärtus on väiksem või võrdne teise väärtusega."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Tagastab „tõene“, kui avaldiste väärtused pole võrdsed."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "pole %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Tagastab „tõene“, kui avaldis on väär. Tagastab „väär“, kui avaldis on tõene."; +Blockly.Msg["LOGIC_NULL"] = "null"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Tagastab nulli."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "ja"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "või"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Tagastab „tõene“, kui mõlemad avaldised on tõesed."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Tagastab „tõene“, kui vähemalt üks avaldistest on tõene."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "tingimus"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "kui väär"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "kui tõene"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Kui tingimuse väärtus on tõene, tagastab „kui tõene“ väärtuse, vastasel juhul „kui väär“ väärtuse."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://et.wikipedia.org/wiki/Aritmeetika"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Tagastab kahe arvu summa."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Tagastab kahe arvu jagatise."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Tagastab kahe arvu vahe."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Tagastab kahe arvu korrutise."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Tagastab esimese arvu teise arvu astmes."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2(X:%1, Y:%2)"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Tagastab punkti (X, Y) arkustangentsit kraadides vahemikus -180 kuni 180."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "muuda %1 %2 võrra"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Lisab arvu muutujale '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Tagastab ühe konstantidest: π (3,141…), e (2,718…), φ (1.618…), √2) (1,414…), √½ (0,707…), või ∞ (infinity)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "%1 piirang %2 ja %3 vahele"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Piirab arvu väärtuse toodud piiridesse (piirarvud kaasa arvatud)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "jagub arvuga"; +Blockly.Msg["MATH_IS_EVEN"] = "on paarisarv"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "on negatiivne arv"; +Blockly.Msg["MATH_IS_ODD"] = "on paaritu arv"; +Blockly.Msg["MATH_IS_POSITIVE"] = "on positiivne arv"; +Blockly.Msg["MATH_IS_PRIME"] = "on algarv"; +Blockly.Msg["MATH_IS_TOOLTIP"] = "Kontrollib kas arv on paarisarv, paaritu arv, algarv, täisarv, positiivne, negatiivne või jagub kindla arvuga. Tagastab „tõene“ või „väär“."; +Blockly.Msg["MATH_IS_WHOLE"] = "on täisarv"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "%1 ÷ %2 jääk"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Tagastab esimese numbri teisega jagamisel tekkiva jäägi."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://et.wikipedia.org/wiki/Arv"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Arv."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "loendi keskmine"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "loendi maksimum"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "loendi mediaan"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "loendi miinimum"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "loendi moodid"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "juhuslik element loendist"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "loendi standardhälve"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "loendi summa"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Tagastab loendis olevate arvväärtuste aritmeetilise keskmise."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Tagastab suurima loendis oleva arvu."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Return the median number in the list."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Tagastab väikseima loendis oleva arvu."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Tagastab loendi kõige sagedamini esinevate loendi liikmetega."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Tagastab juhusliku elemendi loendist."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Tagastab loendi standardhälbe."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Tagastab kõigi loendis olevate arvude summa."; +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"] = "juhuslik murdosa"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Tagastab juhusliku murdosa 0.0 (kaasa arvatud) and 1.0 (välja arvatud) vahel."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "juhuslik täisarv %1 ja %2 vahel"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Tagastab juhusliku täisarvu toodud piiride vahel (piirarvud kaasa arvatud)."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "ümarda"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "ümarda alla"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "ümarda üles"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Ümardab arvu üles või alla."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://et.wikipedia.org/wiki/Ruutjuur"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absoluutväärtus"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "ruutjuur"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Tagastab arvu absoluutväärtuse."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Tagasta e arvu astmes."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Tagastab arvu naturaallogaritmi."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Tagastab arvu kümnendlogaritm."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Tagastab arvu vastandväärtuse."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Tagastab 10 arvu astmes."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Tagastab arvu ruutjuure."; +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://et.wikipedia.org/wiki/Trigonomeetrilised_funktsioonid"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Tagastab arvu arkuskoosiinuse."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Tagastab arvu arkussiinuse."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Tagastab arvu arkustangensi."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Tagastab arvu (kraadid) kosiinuse."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Tagastab arvu (kraadid) siinuse."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Tagastab arvu (kraadid) tangensi."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Loo muutuja värvina..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Loo muutuja arvuna..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Loo muutuja sõnena..."; +Blockly.Msg["NEW_VARIABLE"] = "Uus muutuja ..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Uue muutuja nimi:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Uue muutuja tüüp:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "kood plokis"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "sisenditega:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://et.wikipedia.org/wiki/Alamprogramm"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Käivitab kasutaja defineeritud funktsiooni '%1'."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://et.wikipedia.org/wiki/Alamprogramm"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Run the user-defined function '%1' and use its output."; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "sisenditega:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "Tekita '%1' plokk"; +Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Funktsiooni kirjeldus ..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "teeme midagi"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "funktsioon"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Tekitab funktsiooni, mis ei tagasta midagi."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "tagasta"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Tekitab funktsiooni, mis tagastab midagi."; +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Hoiatus: Sel funktsioonil on mitu sama nimega sisendit."; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Tõsta funktsiooni definitsioon esile"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Kui väärtus on tõene, tagastatakse teine väärtus."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Hoiatus: Seda plokki saab kasutada ainult funktsiooni definitsioonis."; +Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "sisend nimega:"; +Blockly.Msg["PROCEDURES_MUTATORARG_TOOLTIP"] = "Lisab funktsioonile sisendi."; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TITLE"] = "sisendid"; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TOOLTIP"] = "Funktsiooni sisendite lisamine, eemaldamine või järjestuse muutmine."; +Blockly.Msg["REDO"] = "Tee uuesti"; +Blockly.Msg["REMOVE_COMMENT"] = "Eemalda kommentaar"; +Blockly.Msg["RENAME_VARIABLE"] = "Nimeta muutuja ümber ..."; +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Muutuja „%1“ uus nimi:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "lisa muutuja %1 lõppu tekst %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Lisab teksti muutuja „%1“ väärtuse lõppu."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "väikeste tähtedega"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "Suurte Esitähtedega"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "SUURTE TÄHTEDEGA"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Tagastab muudetud tähesuurusega teksti koopia."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "esimene sümbol"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "lõpust sümbol #"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "sümbol #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "viimane sümbol"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "juhuslik sümbol"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "tekstis %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Tagastab tekstis määratud asukohal oleva sümboli."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "loenda %1 %2-ses"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Loenda, mitu korda mingi tekst esineb teise teksti sees."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Objekti lisamine tekstile."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "ühenda"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Tekstiploki muutmine sektsioonide lisamise, eemaldamise või järjestuse muutmisega."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "kuni (lõpust) sümbolini #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "kuni sümbolini #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "kuni viimase sümbolini"; +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"] = "tekstist"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "alates esimesest sümbolist"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "alates (lõpust) sümbolist #"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "alates sümbolist #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Tagastab määratud tüki tekstist."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "esimese leitud tekstitüki"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "viimase leitud tekstitüki"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "tekstist %1 %2 %3 asukoht"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Tagastab esimesest tekstist esimese/viimase leitud teise teksti asukoha (indeksi). Kui teksti ei leita, tagastab %1."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 on tühi"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Tagastab „tõene“, kui tekstis pole ühtegi sümbolit."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "tekita tekst"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Tekitab teksti ühendades mistahes arvu elemente."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "%1 pikkus"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Tagastab sümbolite aru (ka tühikud) toodud tekstis."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "trüki %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Trükib määratud teksti, numbri või mõne muu objekti väärtuse."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Küsib kasutajalt teadet näidates mingit arvu."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Küsib kasutajalt teadet näidates mingit teksti."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "kasutajalt küsitud arv teatega"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "kasutajalt küsitud tekst teatega"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "asenda %1 %2-ga %3-s"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Asenda mõne teksti esinemine mõnes muus tekstis."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "ümberpöördud %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Täht, sõna või rida teksti."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "mõlemalt poolt eemaldatud tühikutega"; +Blockly.Msg["TEXT_TRIM_OPERATOR_LEFT"] = "algusest eemaldatud tühikutega"; +Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "lõpust eemaldatud tühikutega"; +Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "Tagastab koopia tekstist, millel on tühikud ühelt või mõlemalt poolt eemaldatud."; +Blockly.Msg["TODAY"] = "Täna"; +Blockly.Msg["UNDO"] = "Võta tagasi"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // untranslated +Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "objekt"; +Blockly.Msg["VARIABLES_GET_CREATE_SET"] = "Tekita 'määra „%1“ väärtuseks' plokk"; +Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Tagastab selle muutuja väärtuse."; +Blockly.Msg["VARIABLES_SET"] = "määra %1 väärtuseks %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Tekita '„%1“ väärtus' plokk"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Määrab selle muutuja väärtuse võrdseks sisendi väärtusega."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "'%1'-nimeline muutuja on juba olemas."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Muutuja nimega '%1' juba eksisteerib teise tüübina: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/eu.js b/js/msg/js/eu.js new file mode 100644 index 0000000..a56dea9 --- /dev/null +++ b/js/msg/js/eu.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Iruzkina gehitu"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Ezin da '%1' aldagaia ezabatu '%2' funtzioaren definizioaren zati delako."; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Aldatu balioa:"; +Blockly.Msg["CLEAN_UP"] = "Blokeak garbitu"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "Blokeak kolapsatu"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Blokea kolapsatu"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "1 Kolorea"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "2 Kolorea"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "Ratioa"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "Nahastu"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Bi koloreko nahasketak erlazio jakin batekin nahasten ditu (0.0-1.0)"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://eu.wikipedia.org/wiki/Kolore"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Hautatu kolore bat paletatik."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "ausazko kolorea"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Aukeratu ausaz kolore bat."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "urdina"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "berdea"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "gorria"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "colour with"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Sortu kolorea zehaztutako gorriz, berdearekin eta urdinekin. Balio guztiak 0 eta 100 artean egon behar dira."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "begizta eten"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "jarraitu hurrengo begizta iterazioarekin"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Agertzen den begiztatik ihes egin."; +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"] = "%1 elementu bakoitzeko %2 zerrendan"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Zerrendako elementu bakoitzarentzat, ezarri %1 aldagaia elementura, eta egin adierazpen batzuk."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "%1 zenbatu %2-tik %3-ra %4-ra"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "%1 aldagaiak hasierako zenbakiaren eta amaierako zenbakirako balioak hartzen ditu, zehaztutako tartea zenbatzen du eta zehaztutako blokeak egin."; +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"] = "Gehitu, ezabatu, ala berrantolatu aukeraketak \"ba\" bloke hau berrezartzeko."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "bestela"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "bestela baldin eta"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "baldin eta"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Balorea egia den bitartean, egin adierazpen batzuk."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Balorea egia bada, orduan egin ezazu lehenengo adierazpen blokea. Bestela, egin ezazu bigarren adierazpen blokea."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Lehenengo balorea egia bada, orduan egin ezazu lehenengo adierazpen blokea. Bestela, bigarren balorea egia bada, egin ezazu bigarren adierazpen blokea."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Lehenengo balorea egia bada, orduan egin ezazu lehenengo adierazpen blokea. Bestela, bigarren balorea egia bada, egin ezazu bigarren adierazpen blokea. Baloreetako bat ere ez bada egia, egin ezazu adierazpenen azkeneko blokea."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://eu.wikipedia.org/wiki/For_begizta"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "egin"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "errepikatu %1 aldiz"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Adierazpen batzuk hainbat aldiz egin."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "arte errepikatu"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "bitartean errepikatu"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Balorea gezurra den bitartean, egin adierazpen batzuk."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Balorea egia den bitartean, egin adierazpen batzuk."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Ezabatu %1 blokeak?"; +Blockly.Msg["DELETE_BLOCK"] = "Ezabatu blokea"; +Blockly.Msg["DELETE_VARIABLE"] = "%1 parametro izena ezabatu."; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Ezabatu %2 aldagaiaren %1 erabilerak?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Ezabatu %1 bloke"; +Blockly.Msg["DISABLE_BLOCK"] = "Ezgaitu blokea"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Bikoiztu"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Iruzkina bikoiztu"; +Blockly.Msg["ENABLE_BLOCK"] = "Gaitu blokea"; +Blockly.Msg["EXPAND_ALL"] = "Blokeak Hedatu"; +Blockly.Msg["EXPAND_BLOCK"] = "Blokea Hedatu"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Kanpoko sarrerak"; +Blockly.Msg["HELP"] = "Laguntza"; +Blockly.Msg["INLINE_INPUTS"] = "Inpuntak Linean"; +Blockly.Msg["IOS_CANCEL"] = "Utzi"; +Blockly.Msg["IOS_ERROR"] = "Errorea"; +Blockly.Msg["IOS_OK"] = "Ados"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Gehitu sarrera"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Adierazpenak baimendu"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Funtzio honek errepikatutako sarrerak ditu."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "SARRERAK"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Gehitu"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Gehitu aldagaia"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Ezabatu"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Ezin duzu aldagaiaren izen huts bat erabili."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Izena aldatu"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Aldagaiaren izena"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "sortu zerrenda hutsa"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Zerrenda bat itzultzen du, 0 luzera duena, daturik gabekoa"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "zerrenda"; +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"] = "Zerrenda sortu hurrengoarekin"; +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"] = "lehena"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# from end"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_GET"] = "lortu"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "lortu eta kendu"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "azkena"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "ausazkoa"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "kendu"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Lehenengo artikulua zerrendara bueltatzen du."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Artikulua zerrendako posizio zehatz batera bueltatzen du."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Azken artikulua zerrendara bueltatzen du."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Artikulu aleatorioa zerrendara bueltatzen du."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Lehenengo artikulua zerrendako posizio zehatz batera kentzen eta bueltatzen du."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Artikulua zerrendako posizio zehatz batera kentzen eta bueltatzen du."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Zerrendako azken artikulua kentzen eta bueltatzen du."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Artikulu aleatorio bat zerrendatik kentzen eta bueltatzen du."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Lehenengo artikulua zerrendatik kentzen du."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Artikulua zerrendako posizio zehatz batetik kentzen du."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Azken artikulua zerrendatik kentzen du."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Artikulu aleatorioa zerrendatik kentzen du."; +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_FROM_END_TOOLTIP"] = "%1 azken artikulua da."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 lehenengo artikulua da."; +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 %1 if item is not found."; // untranslated +Blockly.Msg["LISTS_INLIST"] = "zerrendan"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 hutsik dago"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "egia itzultzen du zerrenda hutsik badago."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "zerrendaren luzera"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "zerrendaren luzera itzultzen du"; +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_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "honela"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "insert at"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_SET"] = "ezarri"; +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"] = "Inserts the item at the specified position in a list."; // 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"] = "Sets the item at the specified position in a list."; // 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"] = "goranzkoa"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "beheranzkoa"; +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"] = "Zenbakizkoa"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "Alfabetikoki"; +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"] = "Testuatik lista sortu"; +Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "listatik testua sortu"; +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"] = "gezurra"; +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 +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "egia"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://eu.wikipedia.org/wiki/Desberdintza"; +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_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "ez %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Returns true if the input is false. Returns false if the input is true."; // untranslated +Blockly.Msg["LOGIC_NULL"] = "nulu"; +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"] = "eta"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "edo"; +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"] = "Froga"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "gezurra bada"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "egia bada"; +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://eu.wikipedia.org/wiki/Aritmetika"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Bi zenbakien batura ematen du."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Bi zenbakien zatidura ematen du."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Bi zenbakien kendura ematen du."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Bi zenbakien biderkadura ematen du."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Return the first number raised to the power of the second number."; // untranslated +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated +Blockly.Msg["MATH_CHANGE_TITLE"] = "aldatu %1 %2(e)ra"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Gehitu zenbakia '%1' aldagaiari."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Konstante ohikoenetako bat itzultzen du: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), edo ∞ (infinitua)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // 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"] = "honakoaz zatigarria da"; +Blockly.Msg["MATH_IS_EVEN"] = "bikoitia da"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "negatiboa da"; +Blockly.Msg["MATH_IS_ODD"] = "bakoitia da"; +Blockly.Msg["MATH_IS_POSITIVE"] = "positiboa da"; +Blockly.Msg["MATH_IS_PRIME"] = "zenbaki lehena da"; +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"] = "zenbaki osoa da"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "%1 ÷ %2(r)en oroigarria"; +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://eu.wikipedia.org/wiki/Zenbaki"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Zenbaki bat."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "zerrendaren batazbestekoa"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "zerrendako maximoa"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "zerrendako mediana"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "zerrendako minimoa"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "zerrendako modak"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "zerrendako artikulu aleatorioa"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "zerrendako deribazio estandarra"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "zerrendaren batura"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Zerrendako zenbakizko balioen batazbestekoa (aritmetikoa) itzultzen du."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Eman zerrendako zenbakirik handiena."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Eman zerrendako zenbaki media."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Eman zerrendako zenbakirik txikiena."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Bueltatu artikulurik ohikoenetarikoen zerrenda."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Itzuli zerrendako elementu aleatorioa."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Return the standard deviation of the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Eman zerrendako zenbaki guztien batura."; +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"] = "zatiki aleatorioa"; +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://eu.wikipedia.org/wiki/Biribiltze"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "biribildu"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "gutxiagoz biribildu"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "gehiagoz biribildu"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Zenbaki bat gehiagoz edo gutxiagoz biribildu."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://eu.wikipedia.org/wiki/Erro_karratu"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absolutua"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "erro karratua"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Zenbaki baten balio absolutua ematen du."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Return e to the power of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Zenbaki baten logaritmo naturala ematen du."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Return the base 10 logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Return the negation of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Return 10 to the power of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Zenbaki baten erro karratua ematen du."; +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://eu.wikipedia.org/wiki/Funtzio_trigonometriko"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Zenbaki baten arku kosinua ematen du."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Zenbaki baten arku sinua ematen du."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Zenbaki baten arku tangentea ematen du."; +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["NEW_COLOUR_VARIABLE"] = "Kolore aldagaia sortu..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Zenbaki aldagaia sortu..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Kate aldakorra sortu..."; +Blockly.Msg["NEW_VARIABLE"] = "Aldagaia sortu..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Aldagai berriaren izena:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Aldagai mota berria:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "allow statements"; // untranslated +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "honekin"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Azpierrutina"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Azpierrutina"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Run the user-defined function '%1' and use its output."; // untranslated +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "honekin"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "'%1' sortu"; +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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "egin zerbait"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "honi"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Creates a function with no output."; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "itzuli"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Creates a function with an output."; // untranslated +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Abisua: Funtzio honek parametro bikoiztuak dauzka."; +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"] = "Balioa egiazkoa bada, orduan itzuli bigarren baliora."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Warning: This block may be used only within a function definition."; // untranslated +Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "sarreraren izena:"; +Blockly.Msg["PROCEDURES_MUTATORARG_TOOLTIP"] = "Add an input to the function."; // untranslated +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TITLE"] = "sarrerak"; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TOOLTIP"] = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg["REDO"] = "Berregin"; +Blockly.Msg["REMOVE_COMMENT"] = "Iruzkina ezabatu"; +Blockly.Msg["RENAME_VARIABLE"] = "Aldatu aldagaiaren izena..."; +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Aldatu '%1' aldagai guztien izenak eta izen hau eman:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "%1tik testu atxikita %2"; +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"] = "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"] = "hartu lehenengo letra"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "hartu # letra bukaeratik"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "hartu # letra"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "hartu azkenengo letra"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "letra aleatorioa lortu"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "testuan %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returns the letter at the specified position."; // untranslated +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Gehitu artikulu bat testura."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "elkartu"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Gehitu, ezabatu, ala berrantolatu aukeraketak testu bloke hau berrezartzeko."; +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"] = "testuan"; +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_OPERATOR_FIRST"] = "bilatu testuaren lehenengo agerpena"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "bilatu testuaren azkenengo agerpena"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "testuan %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 hutsik dago"; +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"] = "Testua sortu hurrengoarekin"; +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"] = "%1(r)en luzeera"; +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"] = "inprimatu %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "zehaztutako testua, zenbakia edo bestelako balioa inprimatzen du."; +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_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "%1(e)ri buelta eman"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Letra bat, hitza edo testuko lerroa."; +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"] = "Gaur"; +Blockly.Msg["UNDO"] = "Desegin"; +Blockly.Msg["UNNAMED_KEY"] = "izenik gabe"; +Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "elementua"; +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["VARIABLE_ALREADY_EXISTS"] = "%1 izeneko aldagaia dagoeneko existitzen da."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "%1 izeneko aldagaia dagoeneko existitzen da %2 motako beste aldagai batekin."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Esan zerbait..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/fa.js b/js/msg/js/fa.js new file mode 100644 index 0000000..0965dab --- /dev/null +++ b/js/msg/js/fa.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "افزودن نظر"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "متغیر '%1' را نمی‌توان پاک کرد، زیرا جزیی از تعریف تابع '%2' می‌باشد"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "تغییر مقدار:"; +Blockly.Msg["CLEAN_UP"] = "تمیز کردن بلوک‌ها"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "فروپاشی بلوک‌ها"; +Blockly.Msg["COLLAPSE_BLOCK"] = "فروپاشی بلوک"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "رنگ ۱"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "رنگ ۲"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "نسبت"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "مخلوط"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "دو رنگ را با نسبت مشخص‌شده مخلوط می‌کند (۰٫۰ - ۱٫۰)"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://fa.wikipedia.org/wiki/%D8%B1%D9%86%DA%AF"; +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"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "قرمز"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "رنگ با"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "ساخت یک رنگ با مقدار مشخص‌شده‌ای از قرمز، سبز و آبی. همهٔ مقادیر باید بین ۰ تا ۱۰۰ باشند."; +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"] = "با تعداد %1 از %2 به %3 با گام‌های %4"; +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://fa.wikipedia.org/wiki/%D8%AD%D9%84%D9%82%D9%87_%D9%81%D9%88%D8%B1"; +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_VARIABLE"] = "متغیر '%1'را پاک کنید"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "تعداد %1 استفاده از متغیر '%2' پاک شود؟"; +Blockly.Msg["DELETE_X_BLOCKS"] = "حذف بلوک‌های %1"; +Blockly.Msg["DISABLE_BLOCK"] = "غیرفعال‌سازی بلوک"; +Blockly.Msg["DUPLICATE_BLOCK"] = "تکراری"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +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["IOS_CANCEL"] = "لغو"; +Blockly.Msg["IOS_ERROR"] = "خطا"; +Blockly.Msg["IOS_OK"] = "تأیید"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ افزودن ورودی"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "اجازه اظهارات"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "این تابع دارای ورودی‌های تکراری است."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "ورودی‌ها"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "افزودن"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ افزودن متغیر"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "حذف"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "نام متغیر نمی‌تواند خالی باشد"; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "تغییر نام"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "نام متغیر"; +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"] = "فهرستی با طول صفر شامل هیچ رکورد داده‌ای بر می‌گرداند."; +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"] = "ایجاد فهرست با"; +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"] = "# از انتها"; +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"] = "اولین مورد یک فهرست را بر می‌گرداند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "موردی در محل مشخص‌شده بر می‌گرداند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "آخرین مورد در یک فهرست را بر می‌گرداند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "یک مورد تصادفی در یک فهرست بر می‌گرداند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "اولین مورد مشخص‌شده در فهرست را حذف و بر می‌گرداند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "مورد در محل مشخص‌شده در فهرست را حذف و بر می‌گرداند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "آخرین مورد مشخص‌شده در فهرست را حذف و بر می‌گرداند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "مورد تصادفی‌ای را در فهرست حذف و بر می‌گرداند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "اولین مورد را در یک فهرست حذف می‌کند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "مورد مشخص‌شده در موقعیت مشخص در یک فهرست را حذف و بر می‌گرداند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "آخرین مورد را در یک فهرست حذف می‌کند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "یک مورد تصادفی را یک فهرست حذف می‌کند."; +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"] = "گرفتن زیرمجموعه‌ای از ابتدا"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "گرفتن زیرمجموعه‌ای از # از انتها"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "گرفتن زیرمجموعه‌ای از #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "کپی از قسمت مشخص‌شدهٔ لیست درست می‌کند."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 آخرین مورد است."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 اولین مورد است."; +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"] = "شاخصی از اولین/آخرین رخ‌داد مورد در فهرست را بر می‌گرداند. %1 بر می‌گرداند اگر آیتم موجود نبود."; +Blockly.Msg["LISTS_INLIST"] = "در فهرست"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 خالی است"; +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"] = "طول یک فهرست را برمی‌گرداند."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "فهرستی با %1 تکرارشده به اندازهٔ %2 می‌سازد"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "فهرستی شامل مقادیر داده‌شدهٔ تکرار شده عدد مشخص‌شده می‌سازد."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "معکوس %1"; +Blockly.Msg["LISTS_REVERSE_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_SET"] = "اعمال"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "موردی به ته فهرست اضافه می‌کند."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "موردی در موقعیت مشخص‌شده در یک فهرست اضافه می‌کند."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "موردی به ته فهرست الحاق می‌کند."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "مورد را به صورت تصادفی در یک فهرست می‌افزاید."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "اولین مورد در یک فهرست را تعیین می‌کند."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "مورد مشخص‌شده در یک فهرست را قرار می‌دهد."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "صعودی"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "نزولی"; +Blockly.Msg["LISTS_SORT_TITLE"] = "مرتب‌سازی%1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "یک کپی از لیست را مرتب کنید."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "حروفی ، رد کردن مورد"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "عددی"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "حروفی ، الفبایی"; +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"] = "ایجاد متن از فهرست"; +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"] = "بازگرداندن یکی از صحیح یا ناصحیح."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "صحیح"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://fa.wikipedia.org/wiki/%D9%86%D8%A7%D8%A8%D8%B1%D8%A7%D8%A8%D8%B1%DB%8C"; +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://fa.wikipedia.org/wiki/%D8%AD%D8%B3%D8%A7%D8%A8"; +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_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["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"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "تغییر %1 با %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "افزودن یک عدد به متغیر '%1'."; +Blockly.Msg["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"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "یکی از مقادیر ثابت جهانی را برمی‌گرداند: π (۳٫۱۴۱…)، e (۲٫۷۱۸...)، φ (۱٫۶۱۸)، sqrt(۲) (۱٫۴۱۴)، sqrt(۱/۲) (۰٫۷۰۷...) و یا ∞ (بی‌نهایت)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // 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://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"; +Blockly.Msg["MATH_MODULO_TITLE"] = "باقی‌ماندهٔ %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "باقی‌ماندهٔ تقسیم دو عدد را بر می‌گرداند."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://fa.wikipedia.org/wiki/%D8%B9%D8%AF%D8%AF"; +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://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"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "کسر تصادفی"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "بازگرداندن کسری تصادفی بین ۰٫۰ (بسته) تا ۱٫۰ (باز)."; +Blockly.Msg["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"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "عدد صحیح تصادفی بین %1 تا %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "یک عدد تصادفی بین دو مقدار مشخص‌شده به صورت بسته باز می‌گرداند."; +Blockly.Msg["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"; +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://fa.wikipedia.org/wiki/%D8%B1%DB%8C%D8%B4%D9%87_%D8%AF%D9%88%D9%85"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "مطلق"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "ریشهٔ دوم"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "قدر مطلق یک عدد را بازمی‌گرداند."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "بازگرداندن توان e یک عدد."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "لوگاریتم طبیعی یک عدد را باز می‌گرداند."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "بازگرداندن لگاریتم بر پایهٔ ۱۰ یک عدد."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "منفی‌شدهٔ یک عدد را باز می‌گرداند."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "بازگرداندن توان ۱۰ یک عدد."; +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://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"; +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["NEW_COLOUR_VARIABLE"] = "ساخت متغیر رنگ..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "ساخت متغیر عددی..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "ساخت متغیر رشته..."; +Blockly.Msg["NEW_VARIABLE"] = "ایجاد متغیر..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "نام متغیر تازه:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "نوع متغیر جدید:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "اجازه اظهارات"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "با:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://fa.wikipedia.org/wiki/%D8%B1%D9%88%DB%8C%D9%87_(%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87)"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "اجرای تابع تعریف‌شده توسط کاربر «%1»."; +Blockly.Msg["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"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "اجرای تابع تعریف‌شده توسط کاربر «%1» و استفاده از خروجی آن."; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "با:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "ساختن «%1»"; +Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "توصیف این عملکرد..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "انجام چیزی"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "به"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "تابعی می‌سازد بدون هیچ خروجی."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +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_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» به:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "به %1 الحاق متن %2"; +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"] = "به حروف بزرگ عنوان"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "به حروف بزرگ"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "بازگرداندن کپی متن در حالتی متفاوت."; +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_LAST"] = "گرفتن آخرین حرف"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "گرفتن حرف تصادفی"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "در متن %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "حرفی در موقعیت مشخص‌شده بر می‌گرداند."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "تعداد %1 را در %2 بشمار"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "تعداد دفعاتی که یک متن درون یک متن دیگر تکرار شده است را برمی‌گرداند"; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "افزودن یک مورد به متن."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "عضویت"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "اضافه کردن، حذف یا مرتب‌سازی بحش‌ها برای تنظیم مجدد این بلوک متنی."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "به حرف # از انتها"; +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"] = "گرفتن زیرمتن از اولین حرف"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "گرفتن زیرمتن از حرف # به انتها"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "گرفتن زیرمتن از حرف #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "قسمت مشخصی‌شده‌ای از متن را بر می‌گرداند."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "اولین رخداد متن را بیاب"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "آخرین رخداد متن را بیاب"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "در متن %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "شاخصی از اولین آخرین رخ‌داد متن اول در متن دوم بر می‌گرداند. اگر متن یافت نشد %1 باز می‌گرداند."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 خالی است"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "اضافه کردن صحیح اگر متن فراهم‌شده خالی است."; +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"] = "چاپ متن، عدد یا هر مقدار دیگر مشخص‌شده."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "اعلان برای کاربر با یک عدد."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "اعلان برای کاربر برای یک متن."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "اعلان برای عدد با پیام"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "اعلان برای متن با پیام"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "درون %3، متن %1 را با %2 جایگزین کن"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "جایگزین کردن تمام مواردی که از متنی درون متن دیگر وجود دارد"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "معکوس %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "چینش کاراکترها درون متن را برعکس می‌کند"; +Blockly.Msg["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"; +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["UNNAMED_KEY"] = "unnamed"; // 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 +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["VARIABLE_ALREADY_EXISTS"] = "متغیری با نام '%1' هم اکنون وجود دارد"; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "در حال حاضر یک متغیر با نام '%1' برای متغیر دیگری از نوع '%2' وجود دارد."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "یک چیزی بگو..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/fi.js b/js/msg/js/fi.js new file mode 100644 index 0000000..ab65baa --- /dev/null +++ b/js/msg/js/fi.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Lisää kommentti"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Ei voida poistaa muuttujaa '%1' koska se on osa funktion määritelmää '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Muuta arvoa:"; +Blockly.Msg["CLEAN_UP"] = "Siivoa lohkot"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Supistetut lohkot sisältävät varoituksia."; +Blockly.Msg["COLLAPSE_ALL"] = "Sulje lohkot"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Sulje lohko"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "väri 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "väri 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "suhde"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "sekoitus"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Sekoittaa kaksi väriä keskenään annetussa suhteessa (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://fi.wikipedia.org/wiki/V%C3%A4ri"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Valitse väri paletista."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "satunnainen väri"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Valitse väri sattumanvaraisesti."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "sininen"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "vihreä"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg["COLOUR_RGB_RED"] = "punainen"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "väri, jossa on"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Luo väri, jossa on tietty määrä punaista, vihreää ja sinistä. Kaikkien arvojen tulee olla välillä 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"] = "poistu silmukasta"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "jatka silmukan seuraavaan toistoon"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Poistu sisemmästä silmukasta."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Ohita loput tästä silmukasta ja siirry seuraavaan toistoon."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Varoitus: Tätä lohkoa voi käyttää vain silmukan sisällä."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "kullekin kohteelle %1 listassa %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Aseta muuttujan %1 arvoksi kukin listan kohde vuorollaan ja suorita joukko lausekkeita."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "laske %1 Väli %2-%3 %4:n välein"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Aseta muuttujaan \"%1\" arvot alkuarvosta loppuarvoon annetun askeleen välein ja suorita joka askeleella annettu koodilohko."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Lisää ehto \"jos\" lohkoon."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Lisää lopullinen \"muuten\" lohko \"jos\" lohkoon."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Lisää, poista tai järjestele osioita tässä \"jos\" lohkossa."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "muuten"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "muuten jos"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "jos"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Jos arvo on tosi, suorita lauseke."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Jos arvo on tosi, suorita ensimmäinen lohko lausekkeita. Muuten suorita toinen lohko lausekkeita."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "tee"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "toista %1 kertaa"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Suorita joukko lausekkeita useampi kertaa."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +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"] = "Poistetaanko kaikki %1 lohkoa?"; +Blockly.Msg["DELETE_BLOCK"] = "Poista lohko"; +Blockly.Msg["DELETE_VARIABLE"] = "Poista muuttuja '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Poistetaanko %1 käyttöä muuttujalta '%2'?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Poista %1 lohkoa"; +Blockly.Msg["DISABLE_BLOCK"] = "Passivoi lohko"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Kaksoiskappale"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Kahdenna kommentti"; +Blockly.Msg["ENABLE_BLOCK"] = "Aktivoi lohko"; +Blockly.Msg["EXPAND_ALL"] = "Laajenna lohkot"; +Blockly.Msg["EXPAND_BLOCK"] = "Laajenna lohko"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Ulkoiset syötteet"; +Blockly.Msg["HELP"] = "Apua"; +Blockly.Msg["INLINE_INPUTS"] = "Tuo syötteet"; +Blockly.Msg["IOS_CANCEL"] = "Peruuta"; +Blockly.Msg["IOS_ERROR"] = "Virhe"; +Blockly.Msg["IOS_OK"] = "OK"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Lisää syöte"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Salli lausekkeet"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Tällä toiminnolla on päällekkäisiä syötteitä."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "SYÖTTEET"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Lisää"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Lisää muuttuja"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Poista"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Et voi käyttää tyhjää muuttujan nimeä."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Nimeä uudelleen"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Muuttujan nimi"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "Luo tyhjä lista"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Palauta tyhjä lista, pituus 0"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "lista"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Listää, poista tai järjestele uudestaan osioita tässä lohkossa."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "luo lista"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Lisää kohde listaan."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Luo lista, jossa on mikä tahansa määrä kohteita."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "ensimmäinen"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "nro (lopusta laskien)"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "nro"; +Blockly.Msg["LISTS_GET_INDEX_GET"] = "hae"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "hae ja poista"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "viimeinen"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "satunnainen"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "poista"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Palauta ensimmäinen kohde listalta."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Palauta kohde annetusta kohdasta listaa."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Palauttaa listan viimeisen kohteen."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Palauttaa satunnaisen kohteen listalta."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Poistaa ja palauttaa ensimmäisen kohteen listalta."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Poistaa ja palauttaa kohteen listan annetusta kohdasta."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Poistaa ja palauttaa viimeisen kohteen listalta."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Poistaa ja palauttaa satunnaisen kohteen listalta."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Poistaa ensimmäisen kohteen listalta."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Poistaa kohteen listalta annetusta kohtaa."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Poistaa viimeisen kohteen listalta."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Poistaa satunnaisen kohteen listalta."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "päättyen kohtaan (lopusta laskien)"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "päättyen kohtaan"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "viimeinen"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "hae osalista alkaen alusta"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "hae osalista alkaen kohdasta (lopusta laskien)"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "hae osalista alkaen kohdasta"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Luo kopio määrätystä kohden listaa."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "Numero %1 tarkoittaa listan viimeistä kohdetta."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "Numero %1 tarkoittaa listan ensimmäistä kohdetta."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "etsi ensimmäinen esiintymä kohteelle"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "etsi viimeinen esiintymä kohteelle"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Palauttaa kohteen ensimmäisen/viimeisen esiintymän kohdan listassa. Palauttaa %1 jos kohdetta ei löydy."; +Blockly.Msg["LISTS_INLIST"] = "listassa"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 on tyhjä"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Palauttaa tosi, jos lista on tyhjä."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "%1:n pituus"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Palauttaa listan pituuden."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "luo lista, jossa kohde %1 toistuu %2 kertaa"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Luo listan, jossa annettu arvo toistuu määrätyn monta kertaa."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "%1 takaperin"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Palauta käännetty kopio listasta."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "kohteeksi"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "lisää kohtaan"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "aseta"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Lisää kohteen listan kärkeen."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Lisää kohteen annettuun kohtaan listassa."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Lisää kohteen listan loppuun."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Lisää kohteen satunnaiseen kohtaan listassa."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Asettaa listan ensimmäisen kohteen."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Asettaa kohteen annettuun kohtaan listassa."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Asettaa listan viimeisen kohteen."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Asettaa satunnaisen kohteen listassa."; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "nouseva"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "laskeva"; +Blockly.Msg["LISTS_SORT_TITLE"] = "lajittele %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Lajittele kopio luettelosta."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "aakkosjärjestyksessä, välittämättä kirjainkoosta"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numeerinen"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "aakkosjärjestys"; +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 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"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Palauttaa joko tosi tai epätosi."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "tosi"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://fi.wikipedia.org/wiki/Ep%C3%A4yht%C3%A4l%C3%B6"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Palauta tosi, jos syötteet ovat keskenään samat."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Palauttaa tosi, jos ensimmäinen syöte on suurempi, kuin toinen."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Palauttaa tosi, jos ensimmäinen syöte on suurempi tai yhtä suuri, kuin toinen."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Palauttaa tosi, jos ensimmäinen syöte on pienempi, kuin toinen."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Palauttaa tosi, jos ensimmäinen syöte on pienempi tai yhtä suuri, kuin toinen."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Palauttaa tosi, jos syötteet eivät ole keskenään samoja."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "ei %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Palauttaa tosi, jos syöte on epätosi. Palauttaa epätosi, jos syöte on tosi."; +Blockly.Msg["LOGIC_NULL"] = "ei mitään"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Palauttaa \"ei mitään\"-arvon."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "ja"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +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"] = "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"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Tarkistaa testin ehdon. Jos ehto on tosi, palauttaa \"jos tosi\" arvon, muuten palauttaa \"jos epätosi\" arvon."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "http://fi.wikipedia.org/wiki/Aritmetiikka"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Palauttaa kahden luvun summan."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Palauttaa jakolaskun osamäärän."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Palauttaa kahden luvun erotuksen."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Palauttaa kertolaskun tulon."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Palauttaa ensimmäisen luvun korotettuna toisen luvun potenssiin."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan(X:%1,Y:%2)"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Palauta pisteen (X,Y) arkustangentti välillä -180–180."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://fi.wikipedia.org/wiki/Yhteenlasku"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "muuta %1 arvolla %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Lisää arvo muuttujaan '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["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)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "rajoita %1 vähintään %2 enintään %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Rajoittaa arvon annetulle suljetulle välille."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "on jaollinen luvulla"; +Blockly.Msg["MATH_IS_EVEN"] = "on parillinen"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "on negatiivinen"; +Blockly.Msg["MATH_IS_ODD"] = "on pariton"; +Blockly.Msg["MATH_IS_POSITIVE"] = "on positiivinen"; +Blockly.Msg["MATH_IS_PRIME"] = "on alkuluku"; +Blockly.Msg["MATH_IS_TOOLTIP"] = "Tarkistaa onko numero parillinen, pariton, alkuluku, kokonaisluku, positiivinen, negatiivinen, tai jos se on jaollinen toisella luvulla. Palauttaa tosi tai epätosi."; +Blockly.Msg["MATH_IS_WHOLE"] = "on kokonaisluku"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "%1 ÷ %2 jakojäännös"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Palauttaa jakolaskun jakojäännöksen."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "⋅"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://fi.wikipedia.org/wiki/Luku"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Luku."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "keskiarvo luvuista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "suurin luvuista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "keskiluku luvuista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "pienin luvuista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "tyyppiarvo luvuista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "satunnainen valinta luvuista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "keskihajonta luvuista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "summa luvuista"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Palauttaa aritmeettisen keskiarvon annetuista luvuista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Palauttaa suurimman annetuista luvuista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Palauttaa annettujen lukujen keskiluvun."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Palauttaa pienimmän annetuista luvuista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Palauttaa luettelon yleisimmistä luvuista annetussa listassa."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Palauttaa satunnaisesti valitun luvun annetuista luvuista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Palauttaa annettujen lukujen keskihajonnan."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Palauttaa kaikkien annettujen lukujen summan."; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://fi.wikipedia.org/wiki/Satunnaisluku"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "satunnainen murtoluku"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Palauttaa satunnaisen luvun oikealta puoliavoimesta välistä [0.0, 1.0)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://fi.wikipedia.org/wiki/Satunnaisluku"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "Palauttaa satunnaisen kokonaisluvun väliltä %1-%2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Palauttaa satunnaisen kokonaisluvun kahden annetun arvon suljetulta väliltä."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://fi.wikipedia.org/wiki/Py%C3%B6rist%C3%A4minen"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "pyöristä"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "pyöristä alaspäin"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "pyöristä ylöspäin"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Pyöristää luvun ylös- tai alaspäin."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://fi.wikipedia.org/wiki/Neli%C3%B6juuri"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "itseisarvo"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "neliöjuuri"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Palauttaa luvun itseisarvon."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Palauttaa e potenssiin luku."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Palauttaa luvun luonnollisen logaritmin."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Palauttaa luvun kymmenkantaisen logaritmin."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Palauttaa numeron vastaluvun."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Palauttaa 10 potenssiin luku."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Palauttaa luvun neliöjuuren."; +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://fi.wikipedia.org/wiki/Trigonometrinen_funktio"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Palauttaa luvun arkuskosinin."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Palauttaa luvun arkussinin."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Palauttaa luvun arkustangentin."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Palauttaa asteluvun (ei radiaanin) kosinin."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Palauttaa asteluvun (ei radiaanin) sinin."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Palauttaa asteluvun (ei radiaanin) tangentin."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Luo värimuuttuja..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Luo numeromuuttuja..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Luo merkkijonomuuttuja..."; +Blockly.Msg["NEW_VARIABLE"] = "Luo muuttuja..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Uuden muuttujan nimi:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Uuden muuttujan tyyppi:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "salli kommentit"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "parametrit:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://fi.wikipedia.org/wiki/Aliohjelma"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Suorittaa käyttäjän määrittelemä funktio '%1'."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://fi.wikipedia.org/wiki/Aliohjelma"; +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"] = "Kuvaile tämä funktio..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "tee jotain"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "tehdäksesi"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Luo funktio, jolla ei ole tuotosta."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +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"; +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:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "muuttujaan %1 lisää teksti %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Lisää tekstiä muuttujaan '%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "pienet kirjaimet"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "isot alkukirjaimet"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "isot kirjaimet"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Palauttaa kopion tekstistä eri kirjainkoossa."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "hae ensimmäinen kirjain"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "Hae kirjain nro (lopusta laskien)"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "Hae kirjain nro"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "hae viimeinen kirjain"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "hae satunnainen kirjain"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "tekstissä %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Palauttaa annetussa kohdassa olevan kirjaimen."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "laske määrä '%1' '%2' sisällä"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Laske kuinka monta kertaa jokin teksti esiintyy jossakin toisessa tekstissä."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Lisää kohteen tekstiin."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "liitä"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Lisää, poista tai uudelleen järjestä osioita tässä lohkossa."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "kirjaimeen nro (lopusta laskien)"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "kirjaimeen nro"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "viimeiseen kirjaimeen"; +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"] = "merkkijonosta"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "hae osa alkaen ensimmäisestä kirjaimesta"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "hae osa alkaen kirjaimesta nro (lopusta laskien)"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "hae osa alkaen kirjaimesta nro"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Palauttaa määrätyn osan tekstistä."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "etsi ensimmäinen esiintymä merkkijonolle"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "etsi viimeinen esiintymä merkkijonolle"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "tekstissä %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Palauttaa ensin annetun tekstin ensimmäisen/viimeisen esiintymän osoitteen toisessa tekstissä. Palauttaa osoitteen %1 jos tekstiä ei löytynyt."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 on tyhjä"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Palauttaa tosi, jos annettu teksti on tyhjä."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "luo teksti"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Luo merkkijonon liittämällä yhteen minkä tahansa määrän kohteita."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +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 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ä."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "käyttäen annettua viestiä, kehottaa syöttämään numeron"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "käyttäen annettua viestiä, kehottaa syöttämään tekstiä"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "Korvaa teksti %1 tekstillä %2 tekstissä %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Korvaa tietyn tekstin ilmentymät tekstin sisällä."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "%1 takaperin"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Muuttaa tekstin kirjainten järjestyksen toisin päin."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://fi.wikipedia.org/wiki/Merkkijono"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Kirjain, sana tai rivi tekstiä."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "poistaa välilyönnit kummaltakin puolelta"; +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["UNNAMED_KEY"] = "nimetön"; +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 +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Palauttaa muuttujan arvon."; +Blockly.Msg["VARIABLES_SET"] = "aseta %1 arvoksi %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Luo 'hae %1'"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Asettaa muutujan arvoksi annetun syötteen."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Muuttuja nimeltään '%1' on jo olemassa."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Muuttuja nimeltä '%1' on jo olemassa toiselle tyypille: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Sano jotakin..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/fr.js b/js/msg/js/fr.js new file mode 100644 index 0000000..1303ff9 --- /dev/null +++ b/js/msg/js/fr.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Ajouter un commentaire"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Impossible de supprimer la variable « %1 » parce qu’elle fait partie de la définition de la fonction « %2 »"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Modifier la valeur :"; +Blockly.Msg["CLEAN_UP"] = "Nettoyer les blocs"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Les blocs repliés contiennent des avertissements."; +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"] = "taux"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "mélanger"; +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_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "couleur aléatoire"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Choisir une couleur au hasard."; +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"] = "colorier en"; +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"] = "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 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 prendre successivement à la variable « %1 » les valeurs entre deux nombres de début et de fin par incrément du pas spécifié et exécuter les instructions spécifiées."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Ajouter une condition au bloc conditionnel."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Ajouter une condition finale déclenchée dans tous les autres cas au bloc conditionnel."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Ajouter, supprimer ou réordonner les sections pour reconfigurer ce bloc conditionnel."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "sinon"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "sinon si"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "si"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Si une valeur est vraie, alors exécuter certaines instructions."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Si une valeur est vraie, alors exécuter le premier bloc d’instructions. Sinon, exécuter le second bloc d’instructions."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Si la première valeur est vraie, alors exécuter le premier bloc d’instructions. Sinon, si la seconde valeur est vraie, exécuter le second bloc d’instructions."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Si la première valeur est vraie, alors exécuter le premier bloc d’instructions. Sinon, si la seconde valeur est vraie, exécuter le second bloc d’instruction. Si aucune des valeurs n’est vraie, exécuter le dernier bloc d’instruction."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://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 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 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_VARIABLE"] = "Supprimer la variable « %1 »"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Supprimer %1 utilisations de la variable « %2 » ?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Supprimer %1 blocs"; +Blockly.Msg["DISABLE_BLOCK"] = "Désactiver le bloc"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Dupliquer"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Dupliquer le commentaire"; +Blockly.Msg["ENABLE_BLOCK"] = "Activer le bloc"; +Blockly.Msg["EXPAND_ALL"] = "Développer les blocs"; +Blockly.Msg["EXPAND_BLOCK"] = "Développer le bloc"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Entrées externes"; +Blockly.Msg["HELP"] = "Aide"; +Blockly.Msg["INLINE_INPUTS"] = "Entrées en ligne"; +Blockly.Msg["IOS_CANCEL"] = "Annuler"; +Blockly.Msg["IOS_ERROR"] = "Erreur"; +Blockly.Msg["IOS_OK"] = "OK"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Ajouter une entrée"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Instructions autorisées"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Cette fonction a des entrées dupliquées."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "ENTRÉES"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Ajouter"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Ajouter une variable"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Supprimer"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Vous ne pouvez pas utiliser un nom de variable vide."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Renommer"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Nom de la variable"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "créer une liste vide"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Renvoyer une liste, de longueur 0, ne contenant aucun enregistrement de données"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "liste"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Ajouter, supprimer, ou réordonner les sections pour reconfigurer ce bloc de liste."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "créer une liste avec"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Ajouter un élément à la liste."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Créer une liste avec un nombre quelconque d’éléments."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "premier"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "n° depuis la fin"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_GET"] = "obtenir"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "obtenir et supprimer"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "dernier"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "aléatoire"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "supprimer"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Renvoie le premier élément dans une liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Renvoie l’élément à la position indiquée dans une liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Renvoie le dernier élément dans une liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Renvoie un élément au hasard dans une liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Supprime et renvoie le premier élément dans une liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Supprime et renvoie l’élément à la position indiquée dans une liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Supprime et renvoie le dernier élément dans une liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Supprime et renvoie un élément au hasard dans une liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Supprime le premier élément dans une liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Supprime l’élément à la position indiquée dans une liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Supprime le dernier élément dans une liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Supprime un élément au hasard dans une liste."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "jusqu’au n° depuis la fin"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "jusqu’au n°"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "jusqu’à la fin"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "obtenir la sous-liste depuis le début"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "obtenir la sous-liste depuis le n° depuis la fin"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "obtenir la sous-liste depuis le n°"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Crée une copie de la partie spécifiée d’une liste."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 est le dernier élément."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 est le premier élément."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "trouver la première occurrence de l’élément"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "trouver la dernière occurrence de l’élément"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Renvoie l’index de la première/dernière occurrence de l’élément dans la liste. Renvoie %1 si l’élément n’est pas trouvé."; +Blockly.Msg["LISTS_INLIST"] = "dans la liste"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 est vide"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Renvoie vrai si la liste est vide."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "longueur de %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Renvoie la longueur d’une liste."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "créer une liste avec l’élément %1 répété %2 fois"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Crée une liste consistant en la valeur fournie répétée le nombre de fois indiqué."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "inverser %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Inverser la copie d’une liste."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "comme"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "insérer en"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "mettre"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Insère l’élément au début d’une liste."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Insère l’élément à la position indiquée dans une liste."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Ajoute l’élément à la fin d’une liste."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Insère l’élément au hasard dans une liste."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Définit le premier élément dans une liste."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Définit l’élément à la position indiquée dans une liste."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Définit le dernier élément dans une liste."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Définit un élément au hasard dans une liste."; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "croissant"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "décroissant"; +Blockly.Msg["LISTS_SORT_TITLE"] = "trier %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Trier une copie d’une liste."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alphabétique, en ignorant la casse"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numérique"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alphabétique"; +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"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Réunir une liste de textes en un seul, en les joignant par un séparateur."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Couper un texte en une liste de textes, en coupant à chaque séparateur."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "avec séparateur"; +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://fr.wikipedia.org/wiki/In%C3%A9galit%C3%A9_(math%C3%A9matiques)"; +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 true si la première entrée est supérieure 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 sont différentes."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "non %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Renvoie vrai si l’entrée est fausse. Renvoie faux si l’entrée est vraie."; +Blockly.Msg["LOGIC_NULL"] = "nul"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Renvoie nul."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "et"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "ou"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Renvoyer vrai si les deux entrées sont vraies."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Renvoyer vrai si au moins une des entrées est vraie."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "test"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; +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 indiquée 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://fr.wikipedia.org/wiki/Arithm%C3%A9tique"; +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."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Renvoie le produit des deux nombres."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Renvoie le premier nombre élevé à la puissance du second."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://fr.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 de (X : %1 ; Y : %2)"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Renvoie l’arc-tangente du point (X, Y) en degrés entre -180 et 180."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://fr.wikipedia.org/wiki/Idiome_de_programmation"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "incrémenter %1 de %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Ajouter un nombre à la variable « %1 »."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://fr.wikipedia.org/wiki/Table_de_constantes_math%C3%A9matiques"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Renvoie une des constantes courantes : π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), ou ∞ (infini)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "contraindre %1 entre %2 et %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Contraindre un nombre à rester entre les limites spécifiées (incluses)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "est divisible par"; +Blockly.Msg["MATH_IS_EVEN"] = "est pair"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "est négatif"; +Blockly.Msg["MATH_IS_ODD"] = "est impair"; +Blockly.Msg["MATH_IS_POSITIVE"] = "est positif"; +Blockly.Msg["MATH_IS_PRIME"] = "est premier"; +Blockly.Msg["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."; +Blockly.Msg["MATH_IS_WHOLE"] = "est entier"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://fr.wikipedia.org/wiki/Modulo_(op%C3%A9ration)"; +Blockly.Msg["MATH_MODULO_TITLE"] = "reste de %1 ÷ %2"; +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://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"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "maximum de la liste"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "médiane de la liste"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "minimum de la liste"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "majoritaires de la liste"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "élément aléatoire de la liste"; +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 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 d’un ou plusieurs éléments les plus fréquents dans la liste."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Renvoyer un élément au hasard dans la liste."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Renvoyer l’écart type de la liste."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Renvoyer la somme de tous les nombres dans la liste."; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://fr.wikipedia.org/wiki/G%C3%A9n%C3%A9rateur_de_nombres_al%C3%A9atoires"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "fraction aléatoire"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Renvoyer une fraction aléatoire entre 0,0 (inclus) et 1,0 (exclus)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://fr.wikipedia.org/wiki/G%C3%A9n%C3%A9rateur_de_nombres_al%C3%A9atoires"; +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://fr.wikipedia.org/wiki/Arrondi_(math%C3%A9matiques)"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "arrondir"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "arrondir par défaut (à l’entier inférieur le plus proche)"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "arrondir par excès (à l’entier supérieur le plus proche)"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Arrondir un nombre au-dessus ou au-dessous."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://fr.wikipedia.org/wiki/Racine_carr%C3%A9e"; +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."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Renvoie le logarithme naturel d’un nombre."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Renvoie le logarithme décimal d’un nombre."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Renvoie l’opposé d’un nombre"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Renvoie 10 à la puissance d’un nombre."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Renvoie la racine carrée d’un nombre."; +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://fr.wikipedia.org/wiki/Fonction_trigonom%C3%A9trique"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Renvoie l’arccosinus d’un nombre."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Renvoie l’arcsinus d’un nombre."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Renvoie l’arctangente d’un nombre."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Renvoie le cosinus d’un angle en degrés (pas en radians)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Renvoie le sinus d’un angle en degrés (pas en radians)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Renvoie la tangente d’un angle en degrés (pas en radians)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Créer une variable de couleur..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Créer une variable numérique..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Créer une variable de chaîne..."; +Blockly.Msg["NEW_VARIABLE"] = "Créer une variable..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Nom de la nouvelle variable :"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Nouveau type de variable :"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "autoriser les ordres"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "avec :"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://fr.wikipedia.org/wiki/Sous-programme"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Exécuter la fonction « %1 » définie par l’utilisateur."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://fr.wikipedia.org/wiki/Sous-programme"; +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"] = "Décrivez cette fonction..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "faire quelque chose"; +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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "retourner"; +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"; +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["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "ajouter le texte %2 à %1"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Ajouter du texte à la variable « %1 »."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "en minuscules"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "en Capitale Initiale Pour Chaque Mot"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "en MAJUSCULES"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Renvoyer une copie du texte dans une autre casse."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "obtenir la première lettre"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "obtenir la lettre nº (depuis la fin)"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "obtenir la lettre nº"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "obtenir la dernière lettre"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "obtenir une lettre au hasard"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "%2 dans le texte %1"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Renvoie la lettre à la position indiquée."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "nombre %1 sur %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Compter combien de fois un texte donné apparaît dans un autre."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Ajouter un élément au texte."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "joindre"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Ajouter, supprimer, ou réordonner des sections pour reconfigurer ce bloc de texte."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "jusqu’à la lettre nº (depuis la fin)"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "jusqu’à la lettre nº"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "jusqu’à la dernière lettre"; +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"] = "dans le texte"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "obtenir la sous-chaîne depuis la première lettre"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "obtenir la sous-chaîne depuis la lettre nº (depuis la fin)"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "obtenir la sous-chaîne depuis la lettre nº"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Renvoie une partie indiquée du texte."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "trouver la première occurrence de la chaîne"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "trouver la dernière occurrence du texte"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "%2 %3 dans le texte %1"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Renvoie l’index de la première/dernière occurrence de la première chaîne dans la seconde. Renvoie %1 si la chaîne n’est pas trouvée."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 est vide"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Renvoie vrai si le texte fourni est vide."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "créer un texte avec"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Créer un morceau de texte en joignant bout à bout et successivement un nombre quelconque d’éléments dans le même ordre."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "longueur de %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Renvoie le nombre de lettres (chiffres, ponctuations, symboles et espaces compris) dans le texte fourni."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "afficher %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Afficher le texte, le nombre ou une autre valeur spécifiée."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Demander un nombre à l’utilisateur."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Demander un texte à l’utilisateur."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "demander un nombre avec un message"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "demander un texte avec un message"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "remplacer %1 par %2 dans %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Remplacer toutes les occurrences d’un texte par un autre."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "renverser %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Renverse l’ordre des caractères dans le texte."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://fr.wikipedia.org/wiki/Cha%C3%AEne_de_caract%C3%A8res"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Une lettre, un mot ou une ligne de texte."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "supprimer les espaces des deux côtés de"; +Blockly.Msg["TEXT_TRIM_OPERATOR_LEFT"] = "supprimer les espaces du côté gauche de"; +Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "supprimer les espaces du côté droit de"; +Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "Renvoyer une copie du texte avec les espaces supprimés d’un ou des deux bouts."; +Blockly.Msg["TODAY"] = "Aujourd'hui"; +Blockly.Msg["UNDO"] = "Annuler"; +Blockly.Msg["UNNAMED_KEY"] = "non nommé"; +Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "élément"; +Blockly.Msg["VARIABLES_GET_CREATE_SET"] = "Créer « définir %1 »"; +Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Renvoie la valeur de cette variable."; +Blockly.Msg["VARIABLES_SET"] = "définir %1 à %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Créer « obtenir %1 »"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Définit cette variable pour qu’elle soit égale à la valeur de l’entrée."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Une variable nommée « %1 » existe déjà."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Une variable nommée « %1 » existe déjà pour un autre type : « %2 »."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Espace de travail de Blocky"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Expliquez quelque chose..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/gl.js b/js/msg/js/gl.js new file mode 100644 index 0000000..1685bd4 --- /dev/null +++ b/js/msg/js/gl.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Engadir un comentario"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Cambiar o valor:"; +Blockly.Msg["CLEAN_UP"] = "Limpar os bloques"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "Contraer os bloques"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Contraer o bloque"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "cor 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "cor 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "proporción"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "mesturar"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Mestura dúas cores ca proporción indicada (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://gl.wikipedia.org/wiki/Cor"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Escolle unha cor da paleta."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "cor ó chou"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Escolle unha cor ao chou."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "azul"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "verde"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "vermello"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "colorar con"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Create a colour with the specified amount of red, green, and blue. All values must be between 0 and 100."; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "break out of loop"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "continue with next iteration of loop"; // untranslated +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"] = "senón"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "mais se"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "se"; +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"; // untranslated +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "facer"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "repeat %1 times"; // untranslated +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Faga algunhas instrucións varias veces."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "repetir ata"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "repetir mentres"; +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"] = "Queres eliminar os %1 bloques?"; +Blockly.Msg["DELETE_BLOCK"] = "Borrar o bloque"; +Blockly.Msg["DELETE_VARIABLE"] = "Delete the '%1' variable"; // untranslated +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg["DELETE_X_BLOCKS"] = "Borrar %1 bloques"; +Blockly.Msg["DISABLE_BLOCK"] = "Desactivar o bloque"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Duplicar"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +Blockly.Msg["ENABLE_BLOCK"] = "Activar o bloque"; +Blockly.Msg["EXPAND_ALL"] = "Expandir os bloques"; +Blockly.Msg["EXPAND_BLOCK"] = "Expandir o bloque"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Entradas externas"; +Blockly.Msg["HELP"] = "Axuda"; +Blockly.Msg["INLINE_INPUTS"] = "Entradas en liña"; +Blockly.Msg["IOS_CANCEL"] = "Cancelar"; +Blockly.Msg["IOS_ERROR"] = "Erro"; +Blockly.Msg["IOS_OK"] = "Feito"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Engadir entrada"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Permitir declaracións"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Esta función ten entradas duplicadas."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "ENTRADAS"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Engadir"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Engadir variábel"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Eliminar"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "You can't use an empty variable name."; // untranslated +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Renomear"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Nome da variábel"; +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"] = "listaxe"; +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"] = "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"] = "primeiro"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# from end"; // untranslated +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"] = "derradeiro"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "ó chou"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "remove"; // untranslated +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"] = "Returns the item at the specified position in a list."; // 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"] = "Removes and returns the item at the specified position in a list."; // 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"] = "Removes the item at the specified position in a list."; // 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_FROM_END_TOOLTIP"] = "%1 é o derradeiro elemento."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 é o primeiro elemento."; +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 %1 if item is not found."; // untranslated +Blockly.Msg["LISTS_INLIST"] = "na listaxe"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 atópase baleira"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Retona verdadeiro se a listaxe atópase baleira."; +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_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "como"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "inserir en"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "definir"; +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"] = "Inserts the item at the specified position in a list."; // 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"] = "Sets the item at the specified position in a list."; // 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"] = "ascendente"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "descendente"; +Blockly.Msg["LISTS_SORT_TITLE"] = "sort %1 %2 %3"; // untranslated +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Ordear unha copia dunha listaxe."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alfabética, iñorar maiúsculas/minúsculas"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numérica"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alfabética"; +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"] = "falso"; +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 +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "verdadeiro"; +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_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "non %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Returns true if the input is false. Returns false if the input is true."; // untranslated +Blockly.Msg["LOGIC_NULL"] = "nulo"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Retornar nulo."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "e"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "ou"; +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"] = "proba"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "se falso"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "se verdadeiro"; +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://gl.wikipedia.org/wiki/Aritmética"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Retorna a suma de dous números."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Retorna o cociente da división de dous números."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Retorna a diferenza de dous números."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Retorna o produto de dous números."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Retorna o primeiro número elevado á potencia do segundo número."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated +Blockly.Msg["MATH_CHANGE_TITLE"] = "mudar %1 por %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Suma un número á variábel '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://gl.wikipedia.org/wiki/Constante_matemática"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Retorna unha das constantes comúns: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), ou ∞ (infinito)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // 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"] = "é divisíbel por"; +Blockly.Msg["MATH_IS_EVEN"] = "é par"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "é negativo"; +Blockly.Msg["MATH_IS_ODD"] = "é impar"; +Blockly.Msg["MATH_IS_POSITIVE"] = "é positivo"; +Blockly.Msg["MATH_IS_PRIME"] = "é primo"; +Blockly.Msg["MATH_IS_TOOLTIP"] = "Verifica se un número é par, impar, primo, enteiro, positivo, negativo, ou se é divisíbel por outro número. Retorna verdadeiro ou falso."; +Blockly.Msg["MATH_IS_WHOLE"] = "é enteiro"; +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"] = "Un número."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "media dunha listaxe"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "maior dunha listaxe"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "median of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "menor dunha listaxe"; +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"] = "suma da listaxe"; +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"] = "Retorna o maior número da listaxe"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Return the median number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Retorna o menor número da listaxe."; +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"] = "Retorna a suma de tódolos números da listaxe."; +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://gl.wikipedia.org/wiki/Arredondamento"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "arredonda"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "arredonda cara abaixo"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "arredonda cara arriba"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Arredonda un número cara enriba ou cara abaixo."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://gl.wikipedia.org/wiki/Raíz_cadrada"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absoluto"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "raíz cadrada"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Retorna o valor absoluto dun número."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Retorna o número e elevado á potencia dun número."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Retorna o logarítmo natural dun número."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Retorna o logarítmo en base 10 dun número."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Retorna o oposto dun número."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Retorna 10 elevado á potencia dun número."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Retorna a raíz cadrada dun número."; +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://gl.m.wikipedia.org/wiki/Función_trigonométrica"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Retorna o arco coseno dun número."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Retorna o arco seno dum número."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Retorna o arco tanxente dun número."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Retorna o coseno dun grao (non radiano)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Retorna o seno dun grao (non radiano)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Retorna a tanxente dun grao (non radiano)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "Crear a variable..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Nome da nova variable:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "allow statements"; // untranslated +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "con:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Run the user-defined function '%1' and use its output."; // untranslated +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "con:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "Create '%1'"; // untranslated +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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "facer algo"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "cara"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Creates a function with no output."; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "retornar"; +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"] = "entradas"; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TOOLTIP"] = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg["REDO"] = "Refacer"; +Blockly.Msg["REMOVE_COMMENT"] = "Eliminar o comentario"; +Blockly.Msg["RENAME_VARIABLE"] = "Renomear a variable..."; +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Renomear todas as variables \"%1\" a:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "to %1 append text %2"; // 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"] = "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"] = "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_LAST"] = "get last letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "get random letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returns the letter at the specified position."; // untranslated +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Add an item to the text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "unir"; +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"] = "no texto"; +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_OPERATOR_FIRST"] = "find first occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "find last occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "in text %1 %2 %3"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 is empty"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Returns true if the provided text is empty."; // untranslated +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"] = "imprime %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_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // 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"] = "Hoxe"; +Blockly.Msg["UNDO"] = "Desfacer"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // untranslated +Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "elemento"; +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["VARIABLE_ALREADY_EXISTS"] = "A variable named '%1' already exists."; // untranslated +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/gor.js b/js/msg/js/gor.js new file mode 100644 index 0000000..1336541 --- /dev/null +++ b/js/msg/js/gor.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Moduhenga tuladu"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Ubawa nilai"; +Blockly.Msg["CLEAN_UP"] = "Clean up Blocks"; // untranslated +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "Mohe'uto Blok"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Mohe'uto Blok"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "laku 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "laku 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "rasio"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "Ulawuwa"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Mongulawu dulo laku pe'eenta wolo rasio (0.0-1.0)"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Laku"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Piliya laku lonto daputari lo laku"; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "Laku acak"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Piliya laku acak"; +Blockly.Msg["COLOUR_RGB_BLUE"] = "wahu'ente"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "moyidu"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "meela"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "wolo laku"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Pohutuwa laku wolo jumula u tilantu monto u meela, moyidu wawu wahu'ente. Nga'amila musi o woolota 0 wawu 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"] = "Mokaluwari lonto u'uulangiya"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "continue with next iteration of loop"; // untranslated +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"] = "uweewo"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "wonu uweewo"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "wonu"; +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"] = "pohutuwa"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "ulangiya %1 kali"; +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"] = "ulangiya sambe"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "Ulangiya wonu"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Wonu nilai diya banari, pohutuwa parenta"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Wonu nilai banari, pohutuwa po'ongoolo"; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Luluta nga'amila %1 blocks?"; +Blockly.Msg["DELETE_BLOCK"] = "Moluluto Blok"; +Blockly.Msg["DELETE_VARIABLE"] = "Delete the '%1' variable"; // untranslated +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg["DELETE_X_BLOCKS"] = "Moluluto %1 Blok"; +Blockly.Msg["DISABLE_BLOCK"] = "Moberenti Blok"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Duplikat"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +Blockly.Msg["ENABLE_BLOCK"] = "Momulayi Blok"; +Blockly.Msg["EXPAND_ALL"] = "Lolade Blok"; +Blockly.Msg["EXPAND_BLOCK"] = "Lolade Blok"; +Blockly.Msg["EXTERNAL_INPUTS"] = "tuwanga lonto eksternal"; +Blockly.Msg["HELP"] = "Tuulungi"; +Blockly.Msg["INLINE_INPUTS"] = "tuwanga lo inline"; +Blockly.Msg["IOS_CANCEL"] = "Cancel"; // untranslated +Blockly.Msg["IOS_ERROR"] = "Error"; // untranslated +Blockly.Msg["IOS_OK"] = "OK"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Add Input"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INPUTS"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Add"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Add Variable"; // untranslated +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Delete"; // untranslated +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "You can't use an empty variable name."; // untranslated +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Rename"; // untranslated +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Variable name"; // untranslated +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"] = "list"; // untranslated +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"] = "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"] = "first"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# from end"; // untranslated +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"] = "last"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "random"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "remove"; // untranslated +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"] = "Returns the item at the specified position in a list."; // 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"] = "Removes and returns the item at the specified position in a list."; // 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"] = "Removes the item at the specified position in a list."; // 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_FROM_END_TOOLTIP"] = "%1 is the last item."; // untranslated +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 is the first item."; // 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 %1 if item is not found."; // untranslated +Blockly.Msg["LISTS_INLIST"] = "in list"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 is empty"; // untranslated +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_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "as"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "insert at"; // untranslated +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"] = "Inserts the item at the specified position in a list."; // 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"] = "Sets the item at the specified position in a list."; // 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"] = "tala"; +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 +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "banari"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Return true if both inputs equal each other."; // 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_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "diila %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Returns true if the input is false. Returns false if the input is true."; // untranslated +Blockly.Msg["LOGIC_NULL"] = "noolo"; +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"] = "wawu"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "meyalo"; +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"] = "yimontalo"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "wonu tala"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "wonu banari"; +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"] = "Return the sum of the two numbers."; // untranslated +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"] = "Return the product of the two numbers."; // untranslated +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Return the first number raised to the power of the second number."; // untranslated +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +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"] = "Add a number to variable '%1'."; // untranslated +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // 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"] = "is divisible by"; // untranslated +Blockly.Msg["MATH_IS_EVEN"] = "is even"; // untranslated +Blockly.Msg["MATH_IS_NEGATIVE"] = "is negative"; // untranslated +Blockly.Msg["MATH_IS_ODD"] = "is odd"; // untranslated +Blockly.Msg["MATH_IS_POSITIVE"] = "is positive"; // untranslated +Blockly.Msg["MATH_IS_PRIME"] = "is prime"; // untranslated +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"] = "is whole"; // untranslated +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"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Noomoro"; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "average of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "max of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "median of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "min of list"; // untranslated +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"] = "Return the largest number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Return the median number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Return the smallest number in the list."; // untranslated +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/Square_root"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absolute"; // untranslated +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "akar pangkat dua"; +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"] = "Return the natural logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Return the base 10 logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Return the negation of a number."; // untranslated +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_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"] = "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["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "Variabel bohu..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Tanggulo Variabel bohu"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // 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"] = "Pohutu '%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/Subroutine"; // 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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "return"; // untranslated +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"] = "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"] = "Mohinggi tuladu"; +Blockly.Msg["RENAME_VARIABLE"] = "Tangguli uulangi variabel"; +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Tangguli uulangi nga'amila % variabel ode:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "to %1 append text %2"; // 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"] = "mowali hurupu kiki'o"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "to Title Case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "mowali HURUPU DAMANGO"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Return a copy of the text in a different case."; // untranslated +Blockly.Msg["TEXT_CHARAT_FIRST"] = "hama tulade bungaliyo"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "hama hurupu # monto wuleya"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "hama hurupu #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "hama tulade pulitiyo"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "hama tulade ambulati"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returns the letter at the specified position."; // untranslated +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Add an item to the text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "wayito"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Duhengi, yinggila, meyalo susungiya ulangi tuladu blok."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "ode tuladu # monto wuleya"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "ode hurupu"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "to tulade pulitiyo"; +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"] = "to delomo tuladu"; +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_OPERATOR_FIRST"] = "lolohe u yilowali bohuliyo to delomo tuladu"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "lolohe u yilowali pulitiyo to delomo tuladu"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "in text %1 %2 %3"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 koosongi"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Pohalinga banari wonu tuladu u sadi-sadia koosongi."; +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"] = "haya'o lo %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"] = "print %1"; // untranslated +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_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // 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"] = "Engontiye"; +Blockly.Msg["UNDO"] = "Undo"; // untranslated +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // untranslated +Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "item"; +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["VARIABLE_ALREADY_EXISTS"] = "A variable named '%1' already exists."; // untranslated +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/ha.js b/js/msg/js/ha.js new file mode 100644 index 0000000..f4da57b --- /dev/null +++ b/js/msg/js/ha.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Daɗa Sharhi"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "An kasa goge siffa '%1' sabo da tana daga sashi na bayanin aikin '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Canza kima:"; +Blockly.Msg["CLEAN_UP"] = "A share Bululluka"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "Rusa Bululluka"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Rusa Bulo"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "launi na 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "launi na 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "lissafi"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "gauraya"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Ana gauraya launuka biyu tare da wani lissafi da aka bayar (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Zaɓi launi daga faifan launuka."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "launuka da aka hargitsa"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Zaɓi launi daga wanɗanda aka hargitsa."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "shuɗi"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "kore"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "ja"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "launi tare da"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Ƙirƙiri launi tare da wani yawa da aka fayyace na ja, kore, da shuɗi. Duk kimomin dole su zamo tsakanin 0 da 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"] = "ɓalle daga cikin kewaye"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "fara da maimaitawa ta gaba ta kewaye"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "ɓalle daga kewaye wanda ya ƙunsa."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Tsallake sauran wannan kewaye, sannan kuma a ci gaba da maimaitawa ta gaba ta kewaye."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Gargaɗi: Wannan bulon za a iya amfani da shi ne kawai a wajen kewaye."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "ga kowane abu %1 a cikin jeri %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Ga kowane abu a jeri, saka siffar '%1' zuwa ga abin, sannan a maimaita wasu lambobin."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "Ƙirga da %1 daga %2 zuwa %3 ƙara %4"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Sami siffar '%1' ta ɗauki kowa ce kima daga lambar da aka fara da ita zuwa lambar da aka ƙare da ita, ana ƙirgawa daga wata tazara da aka fayyace. Maimaita wannan lamba a kowane lokaci:"; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Daɗa sharaɗi zuwa idan bulo."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Daɗa na ƙarshe, sharaɗin kama-duk zuwa idan bulo."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Daɗa, cire, ko sake tsarin ɓangarori domin sake fasalin wannan idan bulo."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "wani"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "wani idan"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "idan"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Idan kima gaskiya ce, to a yi wasu maganganu."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Idan kimar gaskiya ce, to a yi bulo na farko na maganganu. Idan ba haka ba, yi bulo na biyu na maganganu."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Idan kimar farko gaskiya ce, to yi bulon farko na maganganun. In ba haka ba, idan kima ta biyu ce gaskiya, yi bolu na biyu na maganganun."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Idan kimar farko gaskiya ce, to yi bulon farko na maganganun. In ba haka ba, idan kima ta biyu ce gaskiya, yi bolu na biyu na maganganun. Idan babu kimar da take gaskiya, yi bulo na ƙarshe na maganganun."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "yi"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "maimaita sau %1"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Yi wasu bayanai sau da dama."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "maimaita har sai"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "maimaita yayin da"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Yayin da wata kima ta zama ƙarya, maimaita wasu lambobi."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Yayin da wata kima ta zama gaskiya, maimaita wasu lambobi."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "A goge duk bululluka %1?"; +Blockly.Msg["DELETE_BLOCK"] = "Goge Bulo"; +Blockly.Msg["DELETE_VARIABLE"] = "A goge siffar '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "A goge amfanunnukan %1 na siffar '%2'?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Goge Bulo %1"; +Blockly.Msg["DISABLE_BLOCK"] = "Kashe Bulo"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Yi kwafi"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Kwafi Sharhi"; +Blockly.Msg["ENABLE_BLOCK"] = "Kunna Bulo"; +Blockly.Msg["EXPAND_ALL"] = "Faɗaɗa Bulullaka"; +Blockly.Msg["EXPAND_BLOCK"] = "Faɗaɗa Bulo"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Bayanan Waje"; +Blockly.Msg["HELP"] = "Taimako"; +Blockly.Msg["INLINE_INPUTS"] = "Bayanai na Cikin layi"; +Blockly.Msg["IOS_CANCEL"] = "Soke"; +Blockly.Msg["IOS_ERROR"] = "Kuskure"; +Blockly.Msg["IOS_OK"] = "TO"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Daɗa Bayani"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Bar lamba"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Wannan aikin yana da kwafin bayanai."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "BAYANAI"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Daɗa"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Daɗa Siffa"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Goge"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Ba za ka iya amfani da sunann siffa wanda ba komai ba."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Sake suna"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Sunan siffa"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "ƙirƙiri jeri wanda babu komai"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Ya dawo da jeri, na tsawon 0, wanda bai ƙunshi ajiye bayanai ba"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "jeri"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Daɗa, cire, ko sake tsarin ɓangarori domin sake fasalin wannan bulo."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "ƙirƙiri jeri"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Daɗa wani kaya zuwa jerin."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Ƙiƙiri jeri tare da kowace lamba na kayayyaki."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "farko"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# daga ƙarshe"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_GET"] = "samowa"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "samowa da cirewa"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "ƙarshe"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "bazuwa"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "cire"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Ya dawo da wani abu na farko a cikin jeri."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Ya dawo da abin a wani gurbi da aka fayyace a cikin jeri."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Ya dawo da wani abu na ƙarshe a cikin jeri."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Ya dawo da wani abu a cikin jeri."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Ya cire kuma ya dawo da abin farko a cikin jeri."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Ya cire kuma ya dawo da abin a gurbin da aka fayyace a cikin jeri."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Ya cire kuma ya dawo da abin ƙarshe a cikin jeri."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Ya cire kuma ya dawo abu mai bazuwa a cikin jeri."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Ya cire abin farko a cikin jeri."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Ya cire wani abin a wani gurbi da aka fayyace a cikin jeri."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Ya cire abin ƙarshe a cikin jeri."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Ya cire abu mai bazuwa a cikin jeri."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "zuwa # daga ƙarshe"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "zuwa #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "zuwa ƙarshe"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "sami sashin jeri daga farko"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "sami sashin jeri daga # daga ƙarshe"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "sami sashin jeri daga #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Ƙirƙiri kwafi na ɓangaren da aka fayyace daga wani jeri."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 shine wani abu na ƙarshe."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 shine wani abu na farko."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "nemo afkuwar farko daga wani abu"; +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"] = "nemo afkuwar ƙarshe daga wani abu"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Ya dawo da jeri na farkon/ƙarshen afkuwa na wani abu a cikin jerin. Ya dawo da %1 idan ba a sami wani abin ba."; +Blockly.Msg["LISTS_INLIST"] = "a jeri"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 babu komai"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Ya dawo gaskiya idan jerin babu komai."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "tsawo na %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Ya dawo da tsawon wani jeri."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "ƙirƙiri jeri tare da wani abu %1 da aka maimaita sau %2"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Ya ƙirƙiri jeri da ya ƙunshi wata kima da aka bayar da aka maimaita yawan lambar da aka fayyace."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "juya %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Sauya tsarin kwafi daga jeri."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "a matsayin"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "cusa a"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "shirya"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Ya cusa wani abin a farko na jeri."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Ya cusa wani abin a wani gurbi da aka fayyace a cikin jeri."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Ya maƙala wani abin a ƙarshe na jeri."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Cusa wani abu ta hanyar bazawa a cikin jeri."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Ya shirya abin farko a cikin jeri."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Ya shirya wani abin a wani gurbi da aka fayyace a cikin jeri."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Ya shirya abin ƙarshe a cikin jeri."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Ya shirya abu mai bazuwa a cikin jeri."; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "hawa"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "sauka"; +Blockly.Msg["LISTS_SORT_TITLE"] = "ware %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Ware kwafi na jeri."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "na haruffa, a=A"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "na lamba"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "na haruffa"; +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"] = "yi jeri daga rubutu"; +Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "yi rubutu daga jeri"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Haɗa jerin rubututtuka zuwa rubutu guda ɗaya, a raba tare da mai raba rubutu."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Tsaga rubutu zuwa jerin rubututtuka, a karya a kowane mai raba kalmomi."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "tare da mai raba kalmomi"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "ƙarya"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Ya koma kodai gaskiya ko ƙarya."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "gaskiya"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Koma gaskiya idan duk bayanan sun yi dai dai da juna."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Koma gaskiya idan bayanin farko ya fi bayani na biyu yawa."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Koma gaskiya idan bayanin farko ya fi ko ya yi dai dai da bayani na biyu."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Koma gaskiya idan bayanin farko ya fi na biyu ƙanƙanta."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Koma gaskiya idan bayanin farko ya fi ƙanƙanta ko dai dai da bayani na biyu."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Koma gaskiya idan duk bayanan ba su yi dai dai da juna ba."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "ba %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Koma gaskiya idan bayanin ƙarya ne. Koma ƙarya idan bayanin gaskiya ne."; +Blockly.Msg["LOGIC_NULL"] = "maras amfani"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Ya koma maras amfani."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "kuma"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "ko"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Koma gaskiya idan duk bayanan gaskiya ne."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Koma gaskiya idan a ƙalla ɗayan bayanan gaskiya ne."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "gwaji"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "idan ƙarya ne"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "idan gaskiya ne"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Duba sharaɗin a cikin 'gwaji'. Idan sharaɗin gaskiya ne, mayar da kimar 'idan gaskiya ne'; idan ba haka ba mayar da kimar 'idan ƙarya ne'."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Dawo da jumlar lambobin guda biyu."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Dawo da sakamakon lambobin guda biyu bayan an raba su da juna."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Dawo da bambancin lambobin guda biyu."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Dawo da ruɓin lambobin guda biyu."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Dawo da lambar farko wadda aka ɗaga ta zuwa ƙarfin lamba ta biyu."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 na X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Dawo da arctangent na tsinin (X, Y) a gwargwado daga -180 zuwa 180."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "canza %1 da %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Daɗa wata lamba zuwa siffa '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Dawo da ɗaya daga cikin sanannen zaunannen lissafi: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), ko ∞ (maras iyaka)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "ƙarfi %1 ƙasa %2 sama %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Tsare lamba tsakanin lambobi da aka fayyace masu ƙarama da babbar kima (haɗawa)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "lamba ce da za a iya rabawa da"; +Blockly.Msg["MATH_IS_EVEN"] = "lamba da za a iya rabawa da biyu"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "lamba ce da bata kai sufuli ba"; +Blockly.Msg["MATH_IS_ODD"] = "lamba ce da ba za a iya rabawa da biyu ba"; +Blockly.Msg["MATH_IS_POSITIVE"] = "lamba ce da tafi sufuli"; +Blockly.Msg["MATH_IS_PRIME"] = "lamba ce da kawai za a iya rabawa da kanta"; +Blockly.Msg["MATH_IS_TOOLTIP"] = "Duba idan lamba ce da za a iya rabawa da biyu, lamba wadda ba za a iya rabawa da biyu ba, lamba ce kawai da za a iya rabawa da kanta, lamba ce cikakkiya,lamba ce da tafi sufuli, lamba ce da bata kai sufuli ba, lamba ce da za a iya rabawa da wata lamba. Ta dawo da gaskiya ko ƙarya."; +Blockly.Msg["MATH_IS_WHOLE"] = "lamba ce cikakkiya"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "saura daga raba %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Dawo da saura daga raba lambobin guda biyu."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Lambda."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "Tsaka-tsaki na jeri"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "cikakke na jeri"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "tsakiyar jeri"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "Taƙaicewa na jeri"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "mai yawan bayyana na jeri"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "bazuwar kaya na jeri"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "matakan bambance-bambance na jeri"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "jumlar jeri"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Dawo da tsaka-tsaki (matsakaicin lissafi) na kimar lambobi dake cikin jerin."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Dawo da babbar lamba dake cikin jerin."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Dawo da lambar tsakiya ta cikin jeri."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Dawo da lambobi ƙanana a cikin jerin."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Dawo da jeri na abubuwan da suka fi bayyana a cikin jeri."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Dawo da bazuwar kaya daga jerin."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Dawo da matakan bambance-bambance na jeri."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Dawo da jumlar duk lambobi na cikin jerin."; +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"] = "ɓangare mai buzuwa"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Dawo da ɓangare mai bazuwa tsakanin 0.0 (haɗawa) da 1.0 (rabewa)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "bazuwar cikakkiyar lamba daga %1 zuwa %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Dawo da bazuwar cikakkiyar lamba tsakanin wani gwargwado da aka fayyace, haɗawa."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "cika"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "cika ƙasa"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "cika sama"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Cika lamba sama ko ƙasa."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "cikakkiya"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "lamba da ta ruɓanya kanta"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Dawo da cikakkiyar kima na wata lamba."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Dawo da e zuwa ƙarfin wata lamba."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Dawo da jerin lambobi da aka tara ko aka ɗebe."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Dawo da tushe 10 na jerin lambobi da aka tara ko aka ɗebe na wata lamba."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Dawo da kishiya na wata lamba."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Dawo da 10 zuwa ƙarfin wata lamba."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Dawo da wata lamba da ta ruɓanya kanta."; +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"] = "Dawo da arccosine na wata lamba."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Dawo da arcsine na wata lamba."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Dawo da arctangent na wata lamba."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Dawo da cosine na wani gwargwado (banda layin kusurwar waje)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Dawo da sine na wani gwargwado (banda layin kusurwar waje)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Dawo da tangent na wani gwargwado (banda layin kusurwar waje)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Ƙirƙiri siffa ta launi..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Ƙirƙiri siffa ta lamba..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Ƙiriƙiri kalmar siffa..."; +Blockly.Msg["NEW_VARIABLE"] = "Ƙirƙiri siffofi..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Sunan sabuwar siffa:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Irin sabuwar siffa:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "ƙyale bayanai"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "tare da:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Gudanar da aiki '%1' wanda mai amfani ya ayyana."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Gudanar da aiki '%1' kuma a yi amfani da sakamakon sa."; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "tare da:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "Ƙirƙiri '%1'"; +Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Kwatanta wannan aiki..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "yi"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "da"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Ya ƙirƙiri wani aiki ba tare da sakamako ba."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "mayar"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Ya ƙirƙiri wani aiki ba tare da wani sakamako ba."; +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Gardaɗi: Wannan aikin yana da ruɓi na gazawa."; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Bayar da haske na bayanin aiki"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Idan wata kima gaskiya ce, to dawo da kima ta biyu."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Gargaɗi: Za a iya amfani da wannan bulo ne kawai a cikin bayani na wani aiki."; +Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "saka suna:"; +Blockly.Msg["PROCEDURES_MUTATORARG_TOOLTIP"] = "Daɗa wani bayani ga aikin."; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TITLE"] = "bayani"; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TOOLTIP"] = "Daɗa, cire, ko sake tsarin bayani na wannan aiki."; +Blockly.Msg["REDO"] = "Sake"; +Blockly.Msg["REMOVE_COMMENT"] = "Cire Sharhi"; +Blockly.Msg["RENAME_VARIABLE"] = "Sake sunan siffa..."; +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Sake sunnan duk siffofi '%1' zuwa:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "zuwa %1 daɗa rubutu %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Daɗa wani rubutu zuwa siffa ta '%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "zuwa ƙananan baƙaƙe"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "zuwa Baƙaƙe Dake nuna Suna"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "zuwa MANYAN BAƘAƘE"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Return a copy of the text in a different case."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "sami harafin farko"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "sami harafin # daga ƙarshe"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "sami harafin #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "sami harafin ƙarshe"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "sami harafi mai bazuwa"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "ta rubutu %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Ya dawo da harafi a gurbi da aka fayyace."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "ƙirga %1 a cikin %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Ƙirga sau nawa wani rubutu ya afku a cikin sauran wasu rubutu."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Daɗa wani kaya zuwa ga rubutun."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "haɗa"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Daɗa, cire, ko sake tsarin ɓangarori domin sake fasalin wannan bulo na rubutu."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "zuwa harafin # daga ƙarshe"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "zuwa harafin #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "zuwa harafi na ƙarshe"; +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"] = "ta rubutu"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "sami sashin jumla daga harafin farko"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "sami sashin jumla daga harafin # daga ƙarshe"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "sami sashin jumla daga harafin #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Ya dawo da ɓangaren rubutu da aka fayyace."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "nemo afkuwar farko ta rubutu"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "nemo afkuwar ƙarshe ta rubutu"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "ta rubutu %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "nemo a cikin rubutu. Returns %1 if text is not found."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 babu komai"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Ya dawo gaskiya idan rubutun da aka bayar babu komai."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "ƙirƙiri rubutu da"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Ƙirƙiri guntun rubutu ta haɗa kowace lamba ta kayayyaki."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "tsawon %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Ya dawo lamba ta haruffa (da ya haɗa da sarari) a cikin rubutun da aka bayar."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "buga %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Buga rubutun da aka fayyace, lamba ko wata kima."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Samo wani mai amfani domin wata lamba."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Samo wani mai amfani domin wani rubutu."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "samo lamba tare da saƙo"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "samo rubutu tare da saƙo"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "maye gurbin %1 da %2 a cikin %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Maye gurbin duk afkuwa na wani rubutu a cikin wasu rubutu."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "juya %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Ya juya tsari na haruffa a cikin rubutu."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Harafi, kalma, ko layi na rubutu."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "datse sarari daga ɓangarori guda biyu na"; +Blockly.Msg["TEXT_TRIM_OPERATOR_LEFT"] = "datse sarari daga ɓangaren hagu na"; +Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "datse sarari daga ɓangaren dama na"; +Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "Dawo da kwafin rubutu tare da sauran sarari da aka cire daga ƙarshe ɗaya ko biyu."; +Blockly.Msg["TODAY"] = "Yau"; +Blockly.Msg["UNDO"] = "Fasa"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // untranslated +Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "waniabu"; +Blockly.Msg["VARIABLES_GET_CREATE_SET"] = "Ƙirƙiri 'set %1'"; +Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Ya dawo da kima na wannan siffa."; +Blockly.Msg["VARIABLES_SET"] = "saita %1 zuwa %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Ƙirƙiri 'get %1'"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Ya saita wannan siffa ta zama dai dai da bayanin."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Tuni akwai sunnan siffa da aka kira '%1'."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Tuni akwai sunan siffa da aka kira '%1' domin wata iri ta: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Faɗi wani abu..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/he.js b/js/msg/js/he.js new file mode 100644 index 0000000..3319608 --- /dev/null +++ b/js/msg/js/he.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "הוסף תגובה"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "אי אפשר למחוק את המשתנה \"%1\", מכיוון שהגדרת הפונקציה \"%2\" משתמשת בו."; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "שנה ערך:"; +Blockly.Msg["CLEAN_UP"] = "סידור בלוקים"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "יחס"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "ערבב"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "מערבב שני צבעים יחד עם יחס נתון(0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "http://he.wikipedia.org/wiki/%D7%A6%D7%91%D7%A2"; +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"] = "https://www.december.com/html/spec/colorpercompact.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"] = "תספור עם %1 מ- %2 ל- %3 עד- %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"] = "תוסיף תנאי לבלוק If."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "לסיום, כל התנאים תקפים לגבי בלוק If."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "תוסיף, תמחק, או תסדר מחדש כדי להגדיר מחדש את הבלוק If."; +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"] = "http://he.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_VARIABLE"] = "מחק את משתנה ה'%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "למחוק %1 שימושים במשתנה ‚%2’?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "מחק %1 קטעי קוד"; +Blockly.Msg["DISABLE_BLOCK"] = "נטרל קטע קוד"; +Blockly.Msg["DUPLICATE_BLOCK"] = "שכפל"; +Blockly.Msg["DUPLICATE_COMMENT"] = "שכפול ההערה"; +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["IOS_CANCEL"] = "ביטול"; +Blockly.Msg["IOS_ERROR"] = "שגיאה"; +Blockly.Msg["IOS_OK"] = "אישור"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ הוספת קלט"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INPUTS"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "הוספה"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ הוספת משתנה"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "מחיקה"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "לא ניתן להזין שם ריק למשתנה."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "שינוי שם"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "שם המשתנה"; +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_TOOLTIP"] = "תוסיף, תמחק, או תסדר מחדש כדי להגדיר מחדש את הבלוק If."; +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"] = "הוסף פריט לרשימה."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "צור רשימה עם כל מספר של פריטים."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "ראשון"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# מהסוף"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; +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"] = "מחזיר את הפריט הראשון ברשימה."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "מחזיר פריט במיקום שצוין ברשימה."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "מחזיר את הפריט האחרון ברשימה."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "מחזיר פריט אקראי מהרשימה."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "מסיר ומחזיר את הפריט הראשון ברשימה."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "מסיר ומחזיר את הפריט במיקום שצוין ברשימה."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "מסיר ומחזיר את הפריט האחרון ברשימה."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "מחק והחזר פריט אקראי מהרשימה."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "הסר את הפריט הראשון ברשימה."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "מחזיר פריט במיקום שצוין ברשימה."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "הסר את הפריט הראשון ברשימה."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "הסר פריט אקראי ברשימה."; +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"] = "לקבל חלק מהרשימה החל מהתחלה"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "לקבל חלק מהרשימה החל מ-# עד הסוף"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "לקבל חלק מהרשימה החל מ-#"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "יוצרת עותק של חלק מסוים מהרשימה."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 הוא הפריט האחרון."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 הוא הפריט הראשון."; +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"] = "מחזירה את האינדקס של המופע הראשון/האחרון של הפריט ברשימה. מחזירה %1 אם הפריט אינו נמצא."; +Blockly.Msg["LISTS_INLIST"] = "ברשימה"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 הוא ריק"; +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"] = "מחזירה את האורך של רשימה."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "ליצור רשימה עם הפריט %1 %2 פעמים"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "יוצר רשימה המורכבת מהערך נתון חוזר מספר פעמים שצוין."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "מכניס את הפריט בתחילת רשימה."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "מכניס את הפריט במיקום שצוין ברשימה."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "מוסיף את הפריט בסוף רשימה."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "הוסף פריט באופן אקראי ברשימה."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "מגדיר את הפריט הראשון ברשימה."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "מגדיר את הפריט במיקום שצוין ברשימה."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "סדר עולה"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "סדר יורד"; +Blockly.Msg["LISTS_SORT_TITLE"] = "sort %1 %2 %3"; // untranslated +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "מיון עותק של הרשימה."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "סדר אלפביתי, לא תלוי רישיות"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "נומרי"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "סדר אלפביתי"; +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"] = "יצירת טקסט מרשימה"; +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)"; // 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"] = "תחזיר אמת (true) אם הקלט הראשון הוא קטן יותר מאשר הקלט השני."; +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"; +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"] = "+"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://he.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_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // 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"] = "הוסף מספר למשתנה '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://he.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_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "הגבל %1 בין %2 ל %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Constrain a number to be between the specified limits (inclusive)."; // untranslated +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +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"] = "שארית החילוק %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "החזרת השארית מחלוקת שני המספרים."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +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"] = "ממוצע של רשימה"; +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"] = "standard deviation of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "סכום של רשימה"; +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"] = "החזרת רשימה של הפריטים הנפוצים ביותר ברשימה"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "תחזיר רכיב אקראי מרשימה."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "מחזיר את סטיית התקן של הרשימה."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "החזרת הסכום של המספרים ברשימה."; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "שבר אקראי"; +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"] = "מספר שלם אקראי בין %1 ל-%2 (כולל)"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Return a random integer between the two specified limits, inclusive."; // untranslated +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://he.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://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"] = "החזרת e בחזקת מספר."; +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"] = "-"; +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://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"] = "החזרת הקוסינוס של מעלה (לא רדיאן)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "החזרת הסינוס של מעלה (לא רדיאן)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "החזרת הטנגס של מעלה (לא רדיאן)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "יצירת משתנה צבע..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "צור משתנה מחרוזת"; +Blockly.Msg["NEW_STRING_VARIABLE"] = "צור משתנה מחרוזת"; +Blockly.Msg["NEW_VARIABLE"] = "צור משתנה..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "שם המשתנה החדש:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "סוג המשתנה החדש:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "לאפשר פעולות"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "עם:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://he.wikipedia.org/wiki/שגרה_(תכנות)"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "להפעיל את הפונקציה המוגדרת על-ידי המשתמש '%1'."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://he.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"] = "תאר את הפונקציה הזו..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "לעשות משהו"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "לביצוע:"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "יצירת פונקציה ללא פלט."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +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_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' המשתנים ל:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "אל %1 הוספת טקסט %2"; +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"] = "לאותיות גדולות בתחילת כל מילה (עבור טקסט באנגלית)"; +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"] = "לקבל את האות הראשונה"; +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_LAST"] = "לקבל את האות האחרונה"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "לקבל אות אקראית"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "מחזיר את האות במיקום שהוגדר."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // 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"] = "לאות # מהסוף"; +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"] = "בתוך הטקסט"; +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_OPERATOR_FIRST"] = "find first occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "find last occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "in text %1 %2 %3"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "מחזירה את האינדקס של המופע הראשון/האחרון בטקסט הראשון לתוך הטקסט השני. מחזירה %1 אם הטקסט אינו נמצא."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 הוא ריק"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "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"] = "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"] = "אורכו של %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"] = "להדפיס טקסט, מספר או ערך אחר שצוין"; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "בקש מהמשתמש מספר."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "בקשה למשתמש להזין טקסט כלשהו."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "בקשה למספר עם הודעה"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "בקשה להזנת טקסט עם הודעה"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://he.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_LEFT"] = "למחוק רווחים מימין"; +Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "למחוק רווחים משמאל"; +Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "להחזיר עותק של הטקסט לאחר מחיקת רווחים מאחד או משני הקצוות."; +Blockly.Msg["TODAY"] = "היום"; +Blockly.Msg["UNDO"] = "ביטול"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // 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 +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["VARIABLE_ALREADY_EXISTS"] = "קיים כבר משתנה בשם \"%1\"."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "קיים כבר משתנה בשם \"%1\" מסוג אחר: \"%2\""; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "סביבת העבודה חסומה"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "נא להזין הערה..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/hi.js b/js/msg/js/hi.js new file mode 100644 index 0000000..4d02ef4 --- /dev/null +++ b/js/msg/js/hi.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "टिप्पणी छोड़ें"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "चर '%1' को नहीं हटा सकता क्योंकि यह फ़ंक्शन '%2' की परिभाषा का हिस्सा है"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "मान परिवर्तित करें:"; +Blockly.Msg["CLEAN_UP"] = "खानों को साफ करें"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "अनुपात"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "मिश्रण करें"; +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"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "लाल"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "इसके साथ रंग करें"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "लाल, हरा और नीले की निर्दिष्ट मात्रा के साथ एक रंग बनायें। सभी मान ० से १०० के बीच होने चाहिए।"; +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"] = "%1 से %2 से %3 तक %4 के साथ गिनती करें"; +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/For_loop"; +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_VARIABLE"] = "'%1' चर को हटाएँ"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "'%2' चर के %1 उपयोग को हटाएँ?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "%1 ब्लॉक हटाएँ"; +Blockly.Msg["DISABLE_BLOCK"] = "ब्लॉक को अक्षम करें"; +Blockly.Msg["DUPLICATE_BLOCK"] = "कॉपी करें"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +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["IOS_CANCEL"] = "रद्द करें"; +Blockly.Msg["IOS_ERROR"] = "त्रुटि"; +Blockly.Msg["IOS_OK"] = "ठीक है"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ इनपुट जोड़ें"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "बयानों की अनुमति दें"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "इस फंक्शन में नकली निवेश हैं।"; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "इनपुट"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "जोड़ें"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ चर जोड़ें"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "हटाएँ"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "आप रिक्त चर नाम उपयोग नहीं कर सकते"; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "नाम बदलें"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "चर का नाम"; +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_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"] = "इसके सूची बनाएँ"; +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"] = "अंत से #"; +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"] = "सूची का पहला आइटम रिटर्न करता है।"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "एक सूची में निर्दिष्ट स्थान पर वस्तु को लौटाता है।"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "सूची का आखरी आइटम रिटर्न करता है।"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "सूची से रैन्डम आइटम रिटर्न करता है।"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "सूची का पहला आइटम निकालता है और रिटर्न करता है।"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "एक सूची में निर्दिष्ट स्थिति में आइटम निकालता है और लौटाता है।"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "सूची का आखरी आइटम निकालता है और रिटर्न करता है।"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "सूची से रैन्डम आइटम निकालता है और रिटर्न करता है।"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "सूची का पहला आइटम निकालता है।"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "एक सूची में निर्दिष्ट स्थान पर आइटम निकाल देता है।"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "सूची का आखरी आइटम निकालता है।"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "सूची से रैन्डम आइटम निकालता है।"; +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"] = "प्रथम से उप-सूची प्राप्त करें"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "अंत से # से उप-सूची प्राप्त करें"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "# से उप-सूची प्राप्त करें"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "सूची के बताए गये भाग की कॉपी बनता है।"; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 आखिरी वस्तु है।"; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 पहली वस्तु है।"; +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"] = "सूची में आइटम की पहली/अंतिम घटना का सूचक देता है। यदि आइटम नहीं मिला है तो %1 रिटर्न होता है।"; +Blockly.Msg["LISTS_INLIST"] = "सूची में"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 खाली है"; +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"] = "सूची की लंबाई रिटर्न करता है।"; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "वस्तु %1 के साथ %2 बार दोहराई गयी सूची बनाएं"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "निर्धारित मान की बार-बार दोहराई गई एक सूची बनाता है।"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "%1 को बदल दें"; +Blockly.Msg["LISTS_REVERSE_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_SET"] = "सैट करें"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "आइटम को सूची के शुरू में इनसर्ट करता है।"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "सूची मे बताए गये स्थान में आइटम इनसर्ट करता है।"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "आइटम को सूची के अंत में जोड़ता है।"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "आइटम को सूची में रैन्डम्ली इनसर्ट करता है।"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "सूची में पहला आइटम सैट करता है।"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "सूची मे बताए गये स्थान में आइटम सैट करता है।"; +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/Text#reversing-text"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "बढ़ते क्रम"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "बढ़ते क्रम में"; +Blockly.Msg["LISTS_SORT_TITLE"] = "%1 %2 %3 को छांटे"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "एक सूची की एक प्रति को छांटे।"; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "वर्णक्रमानुसार, मामले की अनदेखी करें"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "अंकीय"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "वर्णक्रमानुसार"; +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"] = "सूची से एक पाठ बनाएं"; +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"] = "ट्रू या फॉल्स रिटर्न करता है।"; +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"] = "NOT (पूरक) %1"; +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"] = "null (अमान्य) रिटर्न करता है।"; +Blockly.Msg["LOGIC_OPERATION_AND"] = "AND (तथा)"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "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://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"] = "दूसरे नंबर की शक्ति को उठाए गए पहले नंबर पर लौटें"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.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://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "सामान्य स्थिरांक में से एक को वापस लौटें:π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)।"; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // 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://en.wikipedia.org/wiki/Modulo_operation"; +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_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"] = "सूची मे सबसे आम आइटम(s) की सूची रिटर्न करें।"; +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://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "रैन्डम अंश"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "0.0 (समावेशी) और 1.0 (विशिष्ट) के बीच एक यादृच्छिक अंश पर लौटें।"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "%1 से %2 तक रैन्डम पूर्णांक"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "दो निर्दिष्ट सीमाओं, समावेशी के बीच एक यादृच्छिक पूर्णांक लौटें।"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +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"; +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"] = "संख्या का मूल 10 लघुगणक रिटर्न करें।"; +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://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"] = "संख्या का आर्ककोसाइन रिटर्न करें।"; +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["NEW_COLOUR_VARIABLE"] = "रंग चर बनाएँ..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "संख्या चर बनायें..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "लड़ी चर बनायें..."; +Blockly.Msg["NEW_VARIABLE"] = "चर बनाएँ..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "नए चर का नाम:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "नए चर का नाम:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "बयानों की अनुमति दें"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = ": के साथ"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "यूज़र द्वारा वर्णन किया गया फ़ंक्शन '%1' चलाएँ।"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "यूज़र द्वारा वर्णन किया गया फ़ंक्शन '%1' चलाएँ और उसका आउटपुट इस्तेमाल करें।"; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = ": के साथ"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "'%1' बनाएँ"; +Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "इस फंकशन को समझाएँ..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "कुछ करें"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "को"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "बिना आउटपुट वाला एक फ़ंक्शन बनाता है।"; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +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_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' चरों के नाम बदलें:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "%1 में पाठ %2 को जोड़ें"; +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"] = "टाइटल केस मे"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "बड़े अक्षर मे"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "टेक्स्ट की कॉपी भिन्न केस (अक्षर से संबंधित) मे रिटर्न करें।"; +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_LAST"] = "आखरी अक्षर पाएँ"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "रैन्डम अक्षर पाएँ"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "पाठ %1 %2 में"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "बताई गयी जगह से अक्षर रिटर्न करता है"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "%1 को %2 में गिने"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "गिने, कितनी बार कुछ पाठ कुछ अन्य पाठ के अंदर समाहित होता है।"; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "सूची मे एक आइटम जोड़ें।"; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "जोड़"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "भाग को समनरूप बनाने के लिए जोङें, हटाएं, या पुनः व्यवस्थित करें यदि यह बंद है।"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "आखिर से यहाँ तक अक्षर #"; +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"] = "पहले अक्षर से सबस्ट्रिंग पाएँ"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "आखरी अक्षर # से सबस्ट्रिंग पाएँ"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "अक्षर # से सबस्ट्रिंग पाएँ"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "टेक्स्ट का बताया गया अंश रिटर्न करता है"; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "टेक्स्ट पहली बार जहाँ आया है उसे ढूढ़े"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "टेक्स्ट आखरी बार जहाँ आया है उसे ढूढ़े"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "पाठ %1 %2 %3 में"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "दूसरे पाठ में पहले पाठ की पहली/अंतिम घटना का सूचक देता है। यदि पाठ नहीं मिला है तो %1 रिटर्न होता है।"; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 खाली है"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "ट्रू रिटर्न करता है यदि दिया गया टेक्स्ट खाली है।"; +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"] = "दिया गया टेक्स्ट प्रिंट करें, संख्या या अन्य मान।"; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "यूज़र से संख्या के लिए प्रॉम्प्ट करें।"; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "यूज़र से कुछ टेक्स्ट के लिए प्रॉम्प्ट करें।"; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "सूचना के साथ संख्या के लिए प्रॉम्प्ट करें"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "सूचना के साथ टेक्स्ट के लिए प्रॉम्प्ट करें"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "%1 को %2 के साथ %3 में बदलें"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "कुछ अन्य पाठ के अंदर कुछ पाठ की सभी जगहों को बदलें।"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "%1 को बदल दें"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "पाठ में वर्णों के क्रम को उलट देता है।"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +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["UNNAMED_KEY"] = "अज्ञात"; +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_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["VARIABLE_ALREADY_EXISTS"] = "प्राचल नाम '%1' पहले से मौजूद है।"; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "'%1' नाम का एक चर पहले से '%2' प्रकार के अन्य चर के लिए मौजूद है।"; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/hrx.js b/js/msg/js/hrx.js new file mode 100644 index 0000000..0c71bab --- /dev/null +++ b/js/msg/js/hrx.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Kommentar hinzufüche"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Neie Variable..."; +Blockly.Msg["CLEAN_UP"] = "Clean up Blocks"; // untranslated +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "Blocke zusammerfalte"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Block zusammerfalte"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "Farreb 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "mit Farreb 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "im Verhältniss"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "misch"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Vermischt 2 Farwe mit konfigurierbare Farrebverhältniss (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://hrx.wikipedia.org/wiki/Farreb"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Wähl en Farreb von der Palett."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "zufälliche Farwe"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Wähl en Farreb noh dem Zufallsprinzip."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "blau"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "grün"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "rot"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "Färreb mit"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Kreiere ene Farreb mit sellrbst definierte rot, grün und blau Wearte. All Wearte müsse zwischich 0 und 100 liehe."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "ausbreche aus der Schleif"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "mit der nächste Iteration fortfoohre aus der Schleifa"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Die umgebne Schleif beenne."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Die Oonweisung abbreche und mit der nächste Schleifiteration fortfoohre."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Warnung: Die block sollt nuar in en Schleif verwennet sin."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "Für Weart %1 aus der List %2"; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "Zähl %1 von %2 bis %3 mit %4"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Zähl die Variable \"%1\" von enem Startweart bis zu enem Zielweart und füahrefür jede Weart en Oonweisung aus."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "En weitre Bedingung hinzufüche."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "En orrer Bedingung hinzufüche, füahrt en Oonweisung aus falls ken Bedingung zutrifft."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Hinzufüche, entferne orrer sortiere von Sektione"; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "orrer"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "orrer wenn"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "wenn"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Wenn en Bedingung woahr (true) ist, dann füahr en Oonweisung aus."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Wenn en Bedingung woahr (true) ist, dann füahr die earscht Oonweisung aus. Ansonscht füahr die zwooite Oonweisung aus."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://hrx.wikipedia.org/wiki/For-Schleif"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "mach"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "wiederhol %1 mol"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "En Oonweisung meahrfach ausführe."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "Repetiere bis"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "Repetier solang"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Füahr die Oonweisung solang aus wie die Bedingung falsch (false) ist."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Füahr die Oonweisung solang aus wie die Bedingung woahr (true) ist."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "All %1 Bausten lösche?"; +Blockly.Msg["DELETE_BLOCK"] = "Block lösche"; +Blockly.Msg["DELETE_VARIABLE"] = "Delete the '%1' variable"; // untranslated +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg["DELETE_X_BLOCKS"] = "Block %1 lösche"; +Blockly.Msg["DISABLE_BLOCK"] = "Block deaktivieren"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Kopieren"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +Blockly.Msg["ENABLE_BLOCK"] = "Block aktivieren"; +Blockly.Msg["EXPAND_ALL"] = "Blocke expandiere"; +Blockly.Msg["EXPAND_BLOCK"] = "Block entfalte"; +Blockly.Msg["EXTERNAL_INPUTS"] = "External Inputsexterne Ingänge"; +Blockly.Msg["HELP"] = "Hellef"; +Blockly.Msg["INLINE_INPUTS"] = "interne Ingänge"; +Blockly.Msg["IOS_CANCEL"] = "Cancel"; // untranslated +Blockly.Msg["IOS_ERROR"] = "Error"; // untranslated +Blockly.Msg["IOS_OK"] = "OK"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Add Input"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INPUTS"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Add"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Add Variable"; // untranslated +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Delete"; // untranslated +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "You can't use an empty variable name."; // untranslated +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Rename"; // untranslated +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Variable name"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "Generier/erzeich en leear List"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Generier/erzeich en leear List ohne Inhalt."; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "List"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Hinzufüche, entferne und sortiere von Elemente."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "Erzeich List mit"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "En Element zur List hinzufüche."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Generier/erzeich en List mit konfigurierte Elemente."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "earste"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "#te von hinne"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_GET"] = "Nehm"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "Nehm und entfern"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "letzte"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "zufälliches"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "Entfern"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Extrahiert das earste Element von der List."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Extrahiert das Element zu en definierte Stell von der List."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Extrahiert das letzte Element von der List."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Extrahiert en zufälliches Element von der List."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Extrahiert und entfernt das earste Element von der List."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Extrahiert und entfernt das Element zu en definierte Stell von der List."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Extrahiert und entfernt das letzte Element von der List."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Extrahiert und entfernt en zufälliches Element von der List."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Entfernt das earste Element von der List."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Entfernt das Element zu en definierte Stell von der List."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Entfernt das letzte Element von der List."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Entfernt en zufälliches Element von der List."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "zu # vom End"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "zu #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "zum Letzte"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "hol Unnerliste vom Earste"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "hol Unnerliste von # vom End"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "hol Unnerlist von #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Generiert en Kopie von en definierte Tel von en List."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 ist das letzte Element."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 ist das earschte Element."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "Such earstes Voarkommniss"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "Such letztes Voarkommniss"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Sucht die Position (index) von en Element in der List Gebt %1 zurück wenn nixs gefunn woard."; +Blockly.Msg["LISTS_INLIST"] = "in der List"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 ist leear?"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Ist woahr (true), wenn die List leear ist."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "länge %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Die Oonzoohl von Elemente in der List."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "Erzich List mit Element %1 wiederhol das %2 mol"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Erzeicht en List mit en variable Oonzoohl von Elemente"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "uff"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "tue ren setz an"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "setz"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Tut das Element an en Oonfang von en List ren setze."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Tut das Element ren setze an en definierte Stell an en List."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Oonhängt das Element zu en List sei End."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Tut das Element zufällich an en List ren setze."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Sets the first item in a list.Setzt das earschte Element an en list."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Setzt das Element zu en definierte Stell in en List."; +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 +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"] = "falsch"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Ist entweder woahr (true) orrer falsch (false)"; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "woahr"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://hrx.wikipedia.org/wiki/Vergleich_%28Zahlen%29"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Ist woahr (true) wenn beide Wearte identisch sind."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Ist woahr (true) wenn der erschte Weart grösser als der zwooite Weart ist."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Ist woahr (true) wenn der erschte Weart grösser als orrer gleich gross wie zwooite Weart ist."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Ist woahr (true) wenn der earschte Weart klener als der zwooite Weart ist."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Ist woahr (true) wenn der earscht Weart klener als orrer gleich gross wie zwooite Weart ist."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Ist woahr (true) wenn beide Wearte unnerschiedlich sind."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "net %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Ist woahr (true) wenn der Ingäweweart falsch (false) ist. Ist falsch (false) wenn der Ingäweweart woahr (true) ist."; +Blockly.Msg["LOGIC_NULL"] = "null"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Is 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"] = "orrer"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Ist woahr (true) wenn beide Wearte woahr (true) sind."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Ist woahr (true) wenn en von der beide Wearte woahr (true) ist."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "test"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "wenn falsch"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "wenn woahr"; +Blockly.Msg["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"; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://hrx.wikipedia.org/wiki/Grundrechenoort"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Ist die Summe zwooier Wearte."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Ist der Quotient zwooier Wearte."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Ist die Differenz zwooier Wearte."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Ist das Produkt zwooier Wearte."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Ist der earschte Weart potenziert mit dem zoiten Weart."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://hrx.wikipedia.org/wiki/Inkrement_und_Dekrement"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "mach höcher / erhöhe %1 um %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Addiert en Weart zur Variable \"%1\" hinzu."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://hrx.wikipedia.org/wiki/Mathematische_Konstante"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Mathematische Konstante wie: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…) oder ∞ (unendlich)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "begrenze %1 von %2 bis %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Begrenzt den Weartebereich mittels von / bis Wearte. (inklusiv)"; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "ist telbar/kann getelt sin doorrich"; +Blockly.Msg["MATH_IS_EVEN"] = "ist grood"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "ist negativ"; +Blockly.Msg["MATH_IS_ODD"] = "ist ungrood"; +Blockly.Msg["MATH_IS_POSITIVE"] = "ist positiv"; +Blockly.Msg["MATH_IS_PRIME"] = "ist en Primenzoohl"; +Blockly.Msg["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."; +Blockly.Msg["MATH_IS_WHOLE"] = "ganze Zoohl"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://hrx.wikipedia.org/wiki/Modulo"; +Blockly.Msg["MATH_MODULO_TITLE"] = "Rest von %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Der Rest noh en Division."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://hrx.wikipedia.org/wiki/Zoohl"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "En Zoohl."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "Mittelweart en List"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "Maximalweart en List"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "Median von en List"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "Minimalweart von en List"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "Restweart von en List"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "Zufallsweart von en List"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "Standart/Padrong Abweichung von en List"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "Summe von en List"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Ist der Doorrichschnittsweart von aller Wearte in en List."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Ist der grösste Weart in en List."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Ist der Zentralweart von aller Wearte in en List."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Ist der klenste Weart in en List."; +Blockly.Msg["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"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Geb en Zufallsweart aus der List zurück."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Ist die standartiesierte/padronisierte Standartabweichung/Padrongabweichung von aller Wearte in der List"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Ist die Summ aller Wearte in en List."; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://hex.wikipedia.org/wiki/Zufallszoohle"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "Zufallszoohl (0.0 -1.0)"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Generier/erzeich en Zufallszoohl zwischich 0.0 (inklusiv) und 1.0 (exklusiv)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://hrx.wikipedia.org/wiki/Zufallszahlen"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "ganzoohlicher Zufallswearte zwischich %1 bis %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Generier/erzeich en ganzähliche Zufallsweart zwischich zwooi Wearte (inklusiv)."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://hrx.wikipedia.org/wiki/Runden"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "runde"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "ab runde"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "uff runde"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "En Zoohl uff orrer ab runde."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://hrx.wikipedia.org/wiki/Quadratwoorzel"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "Absolutweart"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "Quadratwoorzel"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Ist der Absolutweart von en Weart."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Ist Weart von der Exponentialfunktion von en Weart."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Ist der natüarliche Logarithmus von en Weart."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Ist der dekoodische Logarithmus von en Weart."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Negiert en Weart."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Rechnet 10 hoch Ingäbweart."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Ist die Qudratwoorzel von en Weart."; +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://hrx.wikipedia.org/wiki/Trigonometrie"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Ist der Arcuscosinus von en Ingabweart."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Ist der Arcussinus von en Ingäbweart."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Ist der Arcustangens von en Ingäbweart."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Ist der Cosinus von en Winkel."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Ist der Sinus von en Winkel."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Ist der Tangens von en Winkel."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "Neie Variable..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Die neie Variable sei Noome:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "allow statements"; // untranslated +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "mit:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://hrx.wikipedia.org/wiki/Prozedur_%28Programmierung%29"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Ruf en Funktionsblock ohne Rückgäweart uff."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://hrx.wikipedia.org/wiki/Prozedur_%28Programmierung%29"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Ruf en Funktionsblock mit Rückgäbweart uff."; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "mit:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "Generier/erzeich \"Uffruf %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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "Funktionsblock"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "zu"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "En Funktionsblock ohne Rückgäbweart."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "geb zurück"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "En Funktionsblock mit Rückgäbweart."; +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Warnung: die Funktionsblock hot doppelt Parameter."; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Markiear Funktionsblock"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Wenn der earste Weart woahr (true) ist, Geb den zwooite Weart zurück."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Warnung: Der Block därref nuar innich en Funktionsblock genutzt sin."; +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:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "An %1 Text oonhänge %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Text an die Variable \"%1\" oonhänge."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "umwandle in klenbuchstoobe"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "umwandle in Wörter"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "umwandle in GROSSBUCHSTOOBE"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Wandelt Schreibweise von Texte um, in Grossbuchstoobe, Klenbuchstoobe orrer den earste Buchstoob von jedes Wort gross und die annre klen."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "hol earschte Buchstoob"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "hol Buchstoob # von End"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "hol Buchstoob #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "hol letztes Wort"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "hol zufälliches Buchstoob"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Extrahiear en Buchstoob von en spezifizierte Position."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "En Element zum Text hinzufüche."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "verbinne"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Hinzufüche, entfernne und sortiere von Elemente."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "bis #te Buchstoob von hinne"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "bis Buchstoob #te"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "bis letzte Buchstoob"; +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"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "earschte Buchstoob"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "hol #te Buchstoob von hinne"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "hol substring Buchstoob #te"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Schickt en bestimmstes Tel von dem Text retuar."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "Such der Begriff sein earstes Voarkommniss"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "Suche der Begriff sein letztes Vorkommniss."; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "im Text %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Findt das earste / letzte Voarkommniss von en Suchbegriffes in enem Text. Gebt die Position von dem Begriff orrer %1 zurück."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 ist leer?"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Ist woahr (true), wenn der Text leer ist."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "Erstell Text aus"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Erstellt en Text doorrich das verbinne von mehre Textelemente."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "läng %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Die Oonzoohl von Zeiche in enem Text. (inkl. Leerzeiche)"; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "Ausgäb %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Geb den Inhalt von en Variable aus."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Frocht den Benutzer noh en Zoohl."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Frocht den Benutzer noh enem Text."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "Frächt noh Zoohl mit Hinweis"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "Frocht noh Text mit Hinweis"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)https://hrx.wikipedia.org/wiki/Zeichenkette"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "En Buchstoob, Text orrer Satz."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "entfern Leerzeiche von Oonfang und End Seite"; +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["UNNAMED_KEY"] = "unnamed"; // 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 +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Gebt der Variable sein Weart zurück."; +Blockly.Msg["VARIABLES_SET"] = "Schreib %1 zu %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Generier/erzeich \"Lese %1\""; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Setzt en Variable sei Weart."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "A variable named '%1' already exists."; // untranslated +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/hu.js b/js/msg/js/hu.js new file mode 100644 index 0000000..b504889 --- /dev/null +++ b/js/msg/js/hu.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Megjegyzés hozzáadása"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "A(z) „%1” változó nem törölhető, mert része a(z) „%2” függvény definíciójának."; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Érték módosítása:"; +Blockly.Msg["CLEAN_UP"] = "Blokkok kiürítése"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "Blokkok összecsukása"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Blokk összecsukása"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "szín 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "szín 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "arány"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "színkeverés"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Két színt kever össze a megadott arányban (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://hu.wikipedia.org/wiki/Szín"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Válassz színt a palettáról."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "véletlen szín"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Véletlenszerűen kiválasztott szín."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "kék"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "zöld"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "vörös"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "Szín"; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "befejezi az ismétlést"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "folytatja a következővel"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Megszakítja az utasítást tartalmazó ciklust."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Kihagyja a ciklus további részét, és elölről kezdi a következő elemmel."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Figyelem: Ez a blokk csak cikluson belül használható."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "minden %1 elemre a %2 listában"; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "számolj %1 értékével %2 és %3 között %4 lépésközzel"; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Feltétel hozzáadása a ha blokkhoz."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Végső feltétel hozzáadása a ha blokkhoz."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "A ha blokk testreszabásához bővítsd, töröld vagy rendezd át a részeit."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "különben"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "különben ha"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "ha"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Ha a kifejezés igaz, akkor végrehajtja az utasításokat."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://hu.wikipedia.org/wiki/Ciklus_(programoz%C3%A1s)#Sz.C3.A1ml.C3.A1l.C3.B3s_.28FOR.29_ciklus"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = ""; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "ismételd %1 alkalommal"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Megadott kódrészlet ismételt végrehajtása."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "ismételd amíg"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "ismételd amíg"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Amíg a feltétel hamis, végrehajtja az utasításokat."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Amíg a feltétel igaz, végrehajtja az utasításokat."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Az összes %1 blokk törlése?"; +Blockly.Msg["DELETE_BLOCK"] = "Blokk törlése"; +Blockly.Msg["DELETE_VARIABLE"] = "A(z) „%1” változó törlése"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "A(z) „%2” változó %1 használatának törlése?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "%1 blokk törlése"; +Blockly.Msg["DISABLE_BLOCK"] = "Blokk letiltása"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Másolat"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +Blockly.Msg["ENABLE_BLOCK"] = "Blokk engedélyezése"; +Blockly.Msg["EXPAND_ALL"] = "Blokkok kinyitása"; +Blockly.Msg["EXPAND_BLOCK"] = "Blokk kinyitása"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Külső kapcsolatok"; +Blockly.Msg["HELP"] = "Súgó"; +Blockly.Msg["INLINE_INPUTS"] = "Belső kapcsolatok"; +Blockly.Msg["IOS_CANCEL"] = "Mégse"; +Blockly.Msg["IOS_ERROR"] = "Hiba"; +Blockly.Msg["IOS_OK"] = "OK"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Bemenet hozzáadása"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Utasítások engedélyezése"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Ennek a függvénynek kettőzött bemenete van."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "BEMENETEK"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Hozzáadás"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Változó hozzáadása"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Törlés"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Nem használhat üres változónevet."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Átnevezés"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Változó neve"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "üres lista"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Elemeket nem tartalmazó üres listát ad eredményül"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "lista"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Add, remove, or reorder sections to reconfigure this list block."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "Lista készítés, elemek:"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Elem hozzáadása listához."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Listát készít a megadott elemekből."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "az első"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "a végétől számított"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "az elejétől számított"; +Blockly.Msg["LISTS_GET_INDEX_GET"] = "listából értéke"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "listából kivétele"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "az utolsó"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "bármely"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "listából törlése"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = "elemnek"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "A lista első elemét adja eredményül."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "A lista megadott sorszámú elemét adja eredményül."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "A lista utolsó elemét adja eredményül."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "A lista véletlenszerűen választott elemét adja eredményül."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Az első elem kivétele a listából."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "A megadott sorszámú elem kivétele a listából."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Az utolsó elem kivétele a listából."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Véletlenszerűen választott elem kivétele a listából."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Az első elem törlése a listából."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "A megadott sorszámú elem törlése a listából."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Az utolsó elem törlése a listából."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Véletlenszerűen választott elem törlése a listából."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "és a végétől számított"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "és az elejétől számított"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "és az utolsó"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "részlistája az első"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "részlistája a végétől számított"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "részlistája az elejétől számított"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = "elem között"; +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "A lista adott részéről másolat."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 az utolsó elemet jelenti."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 az első elemet jelenti."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "listában első előfordulásaː"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "listában utolsó előfordulásaː"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "A megadott elem első vagy utolsó előfordulásával tér vissza. Ha nem talál ilyen elemet, akkor %1 a visszatérési érték."; +Blockly.Msg["LISTS_INLIST"] = "A(z)"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 üres lista?"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Az eredmény igaz, ha a lista nem tartalmaz elemeket."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "%1 lista hossza"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "A lista elemszámát adja eredményül."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "Lista készítése %1 elemet %2 alkalommal hozzáadva"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "A megadtott elem felhasználásával n elemű listát készít"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "%1 megfordítása"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Megfordítja a lista másolatát."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "elemkéntː"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "listába szúrd be"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "listába állítsd be"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Beszúrás a lista elejére."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Beszúrás a megadott sorszámú elem elé a listában."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Beszúrás a lista végére."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Beszúrás véletlenszerűen választott elem elé a listában."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Az első elem cseréje a listában."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "A megadott sorszámú elem cseréje a listában."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "növekvő"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "csökkenő"; +Blockly.Msg["LISTS_SORT_TITLE"] = "%1 %2 %3 rendezés"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Egy lista egy másolatának rendezése."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "betűrendben nagybetű figyelmen kívül hagyásával"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numerikus"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "betűrendben"; +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"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "A lista elemeit összefűzi szöveggé a határoló karaktereket is felhasználva."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Listát készít a határoló karaktereknél törve a szöveget."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "határoló karakter"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "hamis"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Igaz, vagy hamis érték"; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "igaz"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://hu.wikipedia.org/wiki/Egyenl%C5%91tlens%C3%A9g"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Igaz, ha a kifejezés két oldala egyenlő."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Igaz, ha a bal oldali kifejezés nagyobb, mint a jobb oldali."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Igaz, ha a bal oldali kifejezés nagyobb vagy egyenlő, mint a jobb oldali."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Igaz, ha a bal oldali kifejezés kisebb, mint a jobb oldali."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Igaz, ha a bal oldali kifejezés kisebb vagy egyenlő, mint a jobb oldali."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Igaz, ha a kifejezés két oldala nem egyenlő.."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "nem %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Igaz, ha a kifejezés hamis. Hamis, ha a kifejezés igaz."; +Blockly.Msg["LOGIC_NULL"] = "null"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "null érték."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "és"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "vagy"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Igaz, ha mindkét kifejezés igaz."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Igaz, ha legalább az egyik kifejezés igaz."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "vizsgáld meg:"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "érték, ha hamis:"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "érték, ha igaz:"; +Blockly.Msg["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."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://hu.wikipedia.org/wiki/Matematikai_m%C5%B1velet"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Két szám összege."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Két szám hányadosa."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Két szám különbsége."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Két szám szorzata."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Az első számnak a második számmal megegyező hatványa."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://hu.wikipedia.org/wiki/JavaScript#Aritmetikai_oper.C3.A1torok"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "növeld %1 értékét %2 -vel"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "A \"%1\" változó értékének növelése egy számmal."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://hu.wikipedia.org/wiki/Matematikai_konstans"; +Blockly.Msg["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)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "korlátozd %1-t %2 és %3 közé"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Egy változó értékének korlátozása a megadott zárt intervallumra."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "-nek osztója"; +Blockly.Msg["MATH_IS_EVEN"] = "páros"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "negatív"; +Blockly.Msg["MATH_IS_ODD"] = "páratlan"; +Blockly.Msg["MATH_IS_POSITIVE"] = "pozitív"; +Blockly.Msg["MATH_IS_PRIME"] = "prím"; +Blockly.Msg["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."; +Blockly.Msg["MATH_IS_WHOLE"] = "egész"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://hu.wikipedia.org/wiki/Eg%C3%A9szr%C3%A9sz#Als.C3.B3_eg.C3.A9szr.C3.A9sz"; +Blockly.Msg["MATH_MODULO_TITLE"] = "%1 ÷ %2 maradéka"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Az egész osztás maradékát adja eredméynül."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://hu.wikipedia.org/wiki/Sz%C3%A1m"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Egy szám."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "lista elemeinek átlaga"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "lista legnagyobb eleme"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "lista mediánja"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "lista legkisebb eleme"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "lista módusza"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "lista véletlen eleme"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "lista elemeinek szórása"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "lista elemeinek összege"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "A lista elemeinek átlagát adja eredményül."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "A lista legnagyobb elemét adja vissza."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "A lista elemeinek mediánját adja eredményül."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "A lista legkisebb elemét adja vissza."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "A lista elemeinek móduszát adja eredményül."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "A lista egy véletlen elemét adja eredményül."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "A lista elemeinek szórását adja eredményül."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "A lista elemeinek összegét adja eredményül."; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://hu.wikipedia.org/wiki/V%C3%A9letlen"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "véletlen tört"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Véletlen tört érték 0.0 és 1.0 között."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://hu.wikipedia.org/wiki/V%C3%A9letlen"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "véletlen egész szám %1 között %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Véletlen egész szám a megadott zárt intervallumon belül."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://hu.wikipedia.org/wiki/Eg%C3%A9szr%C3%A9sz#Kerek.C3.ADt.C3.A9s"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "kerekítsd"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "kerekítsd lefelé"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "kerekítsd felfelé"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Egy szám kerekítése felfelé vagy lefelé."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://hu.wikipedia.org/wiki/Gy%C3%B6kvon%C3%A1s"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "abszolútérték"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "négyzetgyök"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "A szám abszolútértéke."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Az e megadott számú hatványa."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "A szám természetes alapú logaritmusa."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "A szám 10-es alapú logaritmusa."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "A szám -1 szerese."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "A 10 megadott számú hatványa."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "A szám négyzetgyöke."; +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://hu.wikipedia.org/wiki/Sz%C3%B6gf%C3%BCggv%C3%A9nyek"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "A fokban megadott szög arkusz koszinusz értéke."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "A fokban megadott szög arkusz szinusz értéke."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "A fokban megadott szög arkusz tangens értéke."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "A fokban megadott szög koszinusz értéke."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "A fokban megadott szög szinusz értéke."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "A fokban megadott szög tangens értéke."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "Változó létrehozása…"; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Az új változó neve:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = "."; +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "utasítások engedélyezése"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "paraméterlistaː"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://hu.wikipedia.org/wiki/F%C3%BCggv%C3%A9ny_(programoz%C3%A1s)"; +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"] = "„%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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "név"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "Eljárás"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Eljárás (nem ad vissza eredményt)."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +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"; +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 eltávolítása"; +Blockly.Msg["RENAME_VARIABLE"] = "Változó átnevezése…"; +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Minden „%1” változó átnevezése erre:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "A %1 szövegéhez fűzd hozzá %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Szöveget fűz a \"%1\" változó értékéhez."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "kisbetűs"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "Címként Formázott"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "NAGYBETŰS"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Return a copy of the text in a different case."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "első"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "hátulról"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "elölről"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "utolsó"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "véletlen"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = "karaktere"; +Blockly.Msg["TEXT_CHARAT_TITLE"] = "a szövegben: %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "A szöveg egy megadott karakterét adja eredményül."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "%1 száma ebben: %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "A szöveg előfordulásainak megszámolása egy másik szövegben."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Elem hozzáfűzése a szöveghez."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "fűzd össze"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Összefűzéssel, törléssel vagy rendezéssel kapcsolato sblokkok szöveg szerkesztéséhez."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "betűtől a hátulról számított"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "betűtől a(z)"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "betűtől az utolsó"; +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"] = "a"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "szövegben válaszd ki az első"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "szövegben válaszd ki a hátulról a(z)"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "szövegben válaszd ki a(z)"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = "betűig tartó betűsort"; +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "A megadott szövegrészletet adja eredményül."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "szövegben az első előfordulásának helye"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "szövegben az utolsó előfordulásának helye"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "A(z) %1 %2 %3 szövegnek"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "A keresett szöveg első vagy utolsó előfordulásával tér vissza. %1 esetén a szövegrészlet nem található."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 üres"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Igaz, ha a vizsgált szöveg hossza 0."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "fűzd össze"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Tetszőleges számú szövegrészletet fűz össze egybefüggő szöveggé."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "%1 hossza"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "A megadott szöveg karaktereinek számát adja eredményül (beleértve a szóközöket)."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "Üzenet %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Megejelníti a megadott kaakterláncot üzenetként a képernyőn."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Számot kér be a felhasználótól."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Szöveget kér be a felhasználótól."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "Kérj be számot"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "Kérj be szöveget"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "%1 cseréje %2-vel %3-ban"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "A szöveg összes előfordulásának cseréje egy másik szöveggel."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "%1 megfordítása"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Megfordítja a karakterek sorrendjét a szövegben."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://hu.wikipedia.org/wiki/String"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Egy betű, szó vagy szöveg egy sora."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "szóközök levágása mindkét végéről"; +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["UNNAMED_KEY"] = "unnamed"; // untranslated +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 +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "A változó értékét adja eredményül."; +Blockly.Msg["VARIABLES_SET"] = "%1 %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Készíts \"%1\""; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "A változónak adhatunk értéket."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "A(z) „%1” nevű változó már létezik."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Egy „%1” nevű változó már létezik egy másik típussal: „%2”."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/hy.js b/js/msg/js/hy.js new file mode 100644 index 0000000..c45fa87 --- /dev/null +++ b/js/msg/js/hy.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Ավելացնել մեկնաբանություն"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Հնարավոր չի ջնջել %1 փոփոխականը, որովհետև այն '%2' ֆունկցիայի հայտարարման մասն է"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Փոխել նշանակություն:"; +Blockly.Msg["CLEAN_UP"] = "Մաքրել բլոկները"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "հարաբերակցություն"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "խառնել"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Խառնում է երկու գույները միմյանց հետ տրված հարաբերակցությամբ (0.0 - 1.0):"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://hy.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"] = "https://www.december.com/html/spec/colorpercompact.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"] = "հաշվել %1-ը, %2֊ից մինչև %3, քայլը %4"; +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/For_loop"; // untranslated +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_VARIABLE"] = "Հեռացնել '%1' փոփոխականը"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Ջնջե՞լ '%2' փոփոխականի %1 կիրառությունները"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Ջնջել %1 բլոկ"; +Blockly.Msg["DISABLE_BLOCK"] = "Անջատել բլոկը"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Պատճենել"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Կրկնօրինակել մեկնաբանությունը"; +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["IOS_CANCEL"] = "Չեղարկել"; +Blockly.Msg["IOS_ERROR"] = "Սխալ"; +Blockly.Msg["IOS_OK"] = "Լավ"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Ավելացնել մուտքային փոփոխական"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Թույլատրել արտահայտությունները"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Այս ֆունկցիան կրկնօրինակում է մուտքային փոփոխականները:"; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "ՆԵՐՄՈՒԾՈՒՄ"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Ավելացնել"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Ավելացնել փոփոխական"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Ջնջել"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Չես կարող օգտագործել փոփոխականի «դատարկ» անուն"; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Վերանվանել"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Փոփախականի անունը"; +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_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"] = "ստեղծել ցանկ"; +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"] = "№ վերջից"; +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"] = "Վերադարձնում է ցանկի առաջին տարրը:"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Վերադարձնում է նշված դիրքում գտնվող անդամը ցանկից։"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Վերադարձնում է ցանկի վերջին տարրը:"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Վերադարձնում է ցանկի պատահական տարր:"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Հեռացնում և վերադարձնում է ցանկի առաջին տարրը:"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Հեռացնում և վերադարձնում է նշված դիրքում գտնվող անդամը ցանկից։"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Հեռացնում և վերադարձնում է ցանկի վերջին տարրը:"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Հեռացնում և վերադարձնում է ցանկի պատահական տարր:"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Հեռացնում է ցանկի առաջին տարրը:"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Ցանկից հեռացնում է նշված դիրքում գտնվող անդամը։"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Հեռացնում է ցանկի վերջին տարրը:"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Հեռացնում է ցանկից պատահական տարր:"; +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"] = "վերցնել ենթա֊ցանկ սկզբից"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "վերցնել ենթացանկ, սկսած # վերջից"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "վերցնել ենթացանկ, սկսած #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Ստեղծում է ցանկի նշված մասի պատճենը։"; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 վերջին տարրն է:"; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 առաջին տարրն է:"; +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"] = "Վերադարձնում է ցանկում անդամի առաջին/վերջին հանդիպման դիրքը։ Վերադարձնում է %1, եթե անդամը չի գտնվել։"; +Blockly.Msg["LISTS_INLIST"] = "ցանկում"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 դատարկ է"; +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"] = "Վերադարձնում է ցանկի երկարությունը:"; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "ստեղծել ցանկ, %1 արժեքը կրկնելով %2 անգամ"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Տրված արժեքը նշված քանակով կրկնելու միջոցով, ստեղծում է ցանկ։"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "շրջել %1"; +Blockly.Msg["LISTS_REVERSE_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_SET"] = "դնել"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Ներմուծում է անդամը ցանկի սկզբում։"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Ներմուծում է անդամը ցանկի նշված դիրքում։"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Ավելացնում է անդամ ցանկի վերջում։"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Ներմուծում է անդամը ցանկի պատահական դիրքում։"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Սահմանում է ցանկի առաջին տարրը:"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Տեղադրում է անդամը ցանկի նշված դիրքում։"; +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"] = "աճման կարգ"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "նվազման կարգ"; +Blockly.Msg["LISTS_SORT_TITLE"] = "դասավորել %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Դասավորում է ցանկի պատճենը"; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "այբենական, անտեսել ռեգիստրը"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "թվային կարգ"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "այբբենական կարգ"; +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"] = "ստեղծել տեքստ ցանկից"; +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"] = "Վերադարձնում է ճշմարիտ կամ կեղծ արժեք:"; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "ճշմարիտ"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://hy.wikipedia.org/wiki/Անհավասարություն"; +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"] = "Վերադարձնում է null (ոչինչ)"; +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://hy.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_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "X:%1 Y:%2 ֊ի atan2֊ը"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Վերադարձնում է (X, Y) կետի արկտանգենսը աստիճաններով -180-ից մինչև 180:"; +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"] = "Ավելացնում է թիվ %1 փոփոխականին:"; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://hy.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_(graphics)"; // 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://en.wikipedia.org/wiki/Modulo_operation"; // untranslated +Blockly.Msg["MATH_MODULO_TITLE"] = "%1֊ի և %2֊ի բաժանման մնացորդը"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Վերադարձնում է երկու թվերի բաժանման մնացորդը:"; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://hy.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://en.wikipedia.org/wiki/Պատահական_թվերի_գեներատոր"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "պատահական կոտորակ"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Վերադարձնում է պատահական թիվ 0.0-ից (ներառյալ) 1.0 միջակայքից:"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "պատահական ամբողջ թիվ %1 -ից %2 -ը"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Վերադարձնում է պատահական ամբողջ թիվ տրված երկու թվերի միջև (ներառյալ):"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.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://en.wikipedia.org/wiki/Square_root"; +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"] = "Վերադարձնում է թվի 10 հիմքով լոգարիթմը:"; +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://hy.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["NEW_COLOUR_VARIABLE"] = "Ստեղծել գույնի փոփոխական"; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Ստեղծել թվային փոփոխական"; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Ստեղծել տեքստային փոփոխական"; +Blockly.Msg["NEW_VARIABLE"] = "Ստեղծել փոփոխական..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Նոր փոփոխականի անունը՝"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Փոփոխականի նոր տիպ"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "թույլատրել արտահայտությունները"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "պարամետրերի ցանկ՝"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Կատարում է %1 ֆունկցիան"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Կատարում է '%1' ֆունկցիան և օգտագործում դրա արդյունքը։"; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "պարամետրերի ցանկ՝"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "Ստեղծել '%1'"; +Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Նկարագրիր այս ֆունկցիան..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "կատարել որևէ բան"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "ֆունկցիա"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Ստեղծում է ֆունկցիա, որը արժեք չի վերադարձնում:"; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +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_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"] = "Rename all '%1' variables to:"; // untranslated +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "%1֊ին կցել %2 տեքստը"; +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"] = "բերել Սկզբնա Մեծատառերի"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "բերել ՄԵԾԱՏԱՌԵՐԻ"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Վերադարձնում է տեքստի կրկնօրինակը, ՄԵԾԱՏԱՌԵՐՈՎ կամ փոքրատառերով"; +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_LAST"] = "վերցնել վերջին տառ"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "վերցնել պատահական տառ"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "տեքստում %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Վերադարձնում է նշված դիրքի տառը"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "հաշվել %1 %2֊ում"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Հաշվել, թե քանի անգամ է տեքստը հանդիպում մեկ այլ տեքստի մեջ։"; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Ավելացնել էլեմենտ տեքստին:"; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "կցել"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Այս տեքստային բլոկը վերակառուցելու համար ավելացրու, հեռացրու կամ փոխիր բաժինների հերթականությունը"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "մինչև # տառը, վերջից"; +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"] = "տալիս է ենթատող առաջին տառից"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "տալիս է ենթատող # տառից սկսած, վերջից"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "տալիս է ենթատող սկսելով # տառից"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Վերադարձնում է տեքստի նշված մասը։"; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "գտնել տեքստի առաջին հանդիպումը"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "գտնել տեքստի վերջին հանդիպումը"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "Տեքստում %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Վերադարձնում է առաջին տեքստի հանդիպման առաջին(կամ վերջին) դիրքը երկրորդ տեքստում։ Վերադարձնում %1 եթե տեքստը չի գտնվել։"; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 -ը դատարկ է"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Վերադարձնում է ճշմարիտ արժեք, եթե տրամադրված տեքստը դատարկ է:"; +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"] = "Տպում է նշված տեքստը, թիվը կամ այլ արժեք․"; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Հարցնել թիվ օգտատիրոջից։"; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Հարցնել տեքստ օգտատիրոջից։"; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "հացնել թիվ, հուշումով"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "հարցնել տեքստ, հուշումով"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "փոխարինել %1֊ը %2֊ով %3֊ում"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Փոխարինել տեքստի բոլոր գտնված տարբերակները մեկ այլ տեսքով։"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "շրջել %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Փոխում է տեքստում տառերի հաջորդականությունը։"; +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"] = "կտրում է բացատները երկու կողմերից"; +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["UNNAMED_KEY"] = "unnamed"; // 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 +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["VARIABLE_ALREADY_EXISTS"] = "'%1' անունով փոփոխական արդեն գոյություն ունի"; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "'%1' անունով փոփոխական արդեն գոյություն ունի այլ տիպի համար: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Մի բան ասա ․․․"; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/ia.js b/js/msg/js/ia.js new file mode 100644 index 0000000..27dab16 --- /dev/null +++ b/js/msg/js/ia.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Adder commento"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Impossibile deler le variabile '%1' perque illo face parte del definition del function '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Cambiar valor:"; +Blockly.Msg["CLEAN_UP"] = "Rangiar le blocos"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Blocos plicate contine advertimentos."; +Blockly.Msg["COLLAPSE_ALL"] = "Plicar blocos"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Plicar bloco"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "color 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "color 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "ration"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "miscer"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Misce duo colores con un ration specificate (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://ia.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Elige un color del paletta."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "color aleatori"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Eliger un color al hasardo."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "blau"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "verde"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "rubie"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "colorar con"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Crear un color con le quantitate specificate de rubie, verde e blau. Tote le valores debe esser inter 0 e 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"] = "escappar del bucla"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "continuar con le proxime iteration del bucla"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Escappar del bucla continente."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Saltar le resto de iste bucla e continuar con le proxime iteration."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Attention: Iste bloco pote solmente esser usate in un bucla."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "pro cata elemento %1 in lista %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Pro cata elemento in un lista, mitter lo in le variabile '%1' e exequer certe instructiones."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "contar con %1 de %2 a %3 per %4"; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Adder un condition al bloco \"si\"."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Adder un condition final de reserva al bloco \"si\"."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Adde, remove o reordina sectiones pro reconfigurar iste bloco \"si\"."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "si non"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "si non si"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "si"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Si un valor es ver, exequer certe instructiones."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Si un valor es ver, exequer le prime bloco de instructiones. Si non, exequer le secunde bloco de instructiones."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "face"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "repeter %1 vices"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Exequer certe instructiones plure vices."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "repeter usque a"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "repeter durante que"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Durante que un valor es false, exequer certe instructiones."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Durante que un valor es ver, exequer certe instructiones."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Deler tote le %1 blocos?"; +Blockly.Msg["DELETE_BLOCK"] = "Deler bloco"; +Blockly.Msg["DELETE_VARIABLE"] = "Deler le variabile '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Deler %1 usos del variabile '%2'?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Deler %1 blocos"; +Blockly.Msg["DISABLE_BLOCK"] = "Disactivar bloco"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Duplicar"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicar commento"; +Blockly.Msg["ENABLE_BLOCK"] = "Activar bloco"; +Blockly.Msg["EXPAND_ALL"] = "Displicar blocos"; +Blockly.Msg["EXPAND_BLOCK"] = "Displicar bloco"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Entrata externe"; +Blockly.Msg["HELP"] = "Adjuta"; +Blockly.Msg["INLINE_INPUTS"] = "Entrata interne"; +Blockly.Msg["IOS_CANCEL"] = "Cancellar"; +Blockly.Msg["IOS_ERROR"] = "Error"; +Blockly.Msg["IOS_OK"] = "OK"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Adder entrata"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Permitter declarationes"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Iste function ha entratas duplicate."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "ENTRATAS"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Adder"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Adder variabile"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Deler"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Non es possibile usar un nomine de variabile vacue."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Renominar"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Nomine del variabile"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "crear un lista vacue"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Retorna un lista, de longitude 0, sin datos."; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "lista"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Adde, remove o reordina sectiones pro reconfigurar iste bloco de listas."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "crear lista con"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Adder un elemento al lista."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Crear un lista con un numero qualcunque de elementos."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "prime"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "№ ab fin"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_GET"] = "prender"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "prender e remover"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "ultime"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "aleatori"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "remover"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Retorna le prime elemento in un lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Retorna le elemento presente al position specificate in un lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Retorna le ultime elemento in un lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Retorna un elemento aleatori in un lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Remove e retorna le prime elemento in un lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Remove e retorna le elemento presente al position specificate in un lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Remove e retorna le ultime elemento in un lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Remove e retorna un elemento aleatori in un lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Remove le prime elemento in un lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Remove le elemento presente al position specificate in un lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Remove le ultime elemento in un lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Remove un elemento aleatori in un lista."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "usque al № ab fin"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "usque al №"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "usque al ultime"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "prender sublista ab initio"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "prender sublista ab le fin ab №"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "prender sublista ab №"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Crea un copia del parte specificate de un lista."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 es le ultime elemento."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 es le prime elemento."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "cercar le prime occurrentia del elemento"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "cercar le ultime occurrentia del elemento"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Retorna le indice del prime/ultime occurrentia del elemento in le lista. Retorna %1 si le elemento non es trovate."; +Blockly.Msg["LISTS_INLIST"] = "in lista"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 es vacue"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Retorna ver si le lista es vacue."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "longitude de %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Retorna le longitude de un lista."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "crear lista con elemento %1 repetite %2 vices"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Crea un lista que contine le valor fornite, repetite le numero specificate de vices."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "inverter %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Inverter un copia de un lista."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "a"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "inserer in"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "mitter"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Insere le elemento al initio de un lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Insere le elemento al position specificate in un lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Adjunge le elemento al fin de un lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Insere le elemento a un position aleatori in un lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Defini le valor del prime elemento in un lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Defini le valor del elemento al position specificate in un lista."; +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"] = "ascendente"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "descendente"; +Blockly.Msg["LISTS_SORT_TITLE"] = "ordinamento %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Ordinar un copia de un lista."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alphabetic, ignorar majuscula/minuscula"; +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"; // untranslated +Blockly.Msg["LISTS_SPLIT_LIST_FROM_TEXT"] = "crear lista ab texto"; +Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "crear texto ab lista"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Unir un lista de textos, separate per un delimitator, in un sol texto."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Divider texto in un lista de textos, separante lo a cata delimitator."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "con delimitator"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "false"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Retorna o ver o false."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "ver"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://ia.wikipedia.org/wiki/Inequalitate_(mathematica)"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Retornar ver si le duo entratas es equal."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Retornar ver si le prime entrata es major que le secunde."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Retornar ver si le prime entrata es major que o equal al secunde."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Retornar ver si le prime entrata es minor que le secunde."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Retornar ver si le prime entrata es minor que o equal al secunde."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Retornar ver si le duo entratas non es equal."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "non %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Retornar ver si le entrata es false. Retornar false si le entrata es ver."; +Blockly.Msg["LOGIC_NULL"] = "nulle"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Retorna nulle."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "e"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "o"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Retornar ver si ambe entratas es ver."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Retornar ver si al minus un del entratas es ver."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "test"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "si false"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "si ver"; +Blockly.Msg["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'."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://ia.wikipedia.org/wiki/Arithmetica"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Retornar le summa del duo numeros."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Retornar le quotiente del duo numeros."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Retornar le differentia del duo numeros."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Retornar le producto del duo numeros."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Retornar le prime numero elevate al potentia del secunde numero."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 de X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Retornar le arco tangente del puncto (X, Y) in grados de -180 a 180."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated +Blockly.Msg["MATH_CHANGE_TITLE"] = "cambiar %1 per %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Adder un numero al variabile '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://ia.wikipedia.org/wiki/Constante_mathematic"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Retornar un del constantes commun: π (3,141…), e (2,718…), φ (1,618…), sqrt(2) (1,414…), sqrt(½) (0,707…) o ∞ (infinite)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "limitar %1 inter %2 e %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Limitar un numero a esser inter le limites specificate (incluse)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "es divisibile per"; +Blockly.Msg["MATH_IS_EVEN"] = "es par"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "es negative"; +Blockly.Msg["MATH_IS_ODD"] = "es impare"; +Blockly.Msg["MATH_IS_POSITIVE"] = "es positive"; +Blockly.Msg["MATH_IS_PRIME"] = "es prime"; +Blockly.Msg["MATH_IS_TOOLTIP"] = "Verificar si un numero es par, impare, prime, integre, positive, negative, o divisibile per un certe numero. Retorna ver o false."; +Blockly.Msg["MATH_IS_WHOLE"] = "es integre"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated +Blockly.Msg["MATH_MODULO_TITLE"] = "resto de %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Retornar le resto del division del duo numeros."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://ia.wikipedia.org/wiki/Numero"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Un numero."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "media del lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "maximo del lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "mediana del lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "minimo del lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "modas del lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "elemento aleatori del lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "deviation standard del lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "summa del lista"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Retornar le media arithmetic del valores numeric in le lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Retornar le numero le plus grande in le lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Retornar le numero median del lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Retornar le numero le plus parve in le lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Retornar un lista del elemento(s) le plus commun in le lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Retornar un elemento aleatori del lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Retornar le deviation standard del lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Retornar le summa de tote le numeros in le lista."; +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"] = "fraction aleatori"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Retornar un fraction aleatori inter 0.0 (incluse) e 1.0 (excluse)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "numero integre aleatori inter %1 e %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Retornar un numero integre aleatori inter le duo limites specificate, incluse."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://ia.wikipedia.org/wiki/Rotundamento"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "arrotundar"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "arrotundar a infra"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "arrotundar a supra"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Arrotundar un numero a supra o a infra."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://ia.wikipedia.org/wiki/Radice_quadrate"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absolute"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "radice quadrate"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Retornar le valor absolute de un numero."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Retornar e elevate al potentia del numero."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Retornar le logarithmo natural de un numero."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Retornar le logarithmo in base 10 del numero."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Retornar le negation de un numero."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Retornar 10 elevate al potentia de un numero."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Retornar le radice quadrate de un numero."; +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"; // untranslated +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Retornar le arcocosino de un numero."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Retornar le arcosino de un numero."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Retornar le arcotangente de un numero."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Retornar le cosino de un grado (non radiano)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Retornar le sino de un grado (non radiano)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Retornar le tangente de un grado (non radiano)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Crear variabile de color..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Crear variabile numeric..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Crear variabile textual..."; +Blockly.Msg["NEW_VARIABLE"] = "Crear variabile..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Nomine del nove variabile:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Nove typo de variabile:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "permitter declarationes"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "con:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Executar le function '%1' definite per le usator."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Executar le function '%1' definite per le usator e usar su resultato."; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "con:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "Crear '%1'"; +Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Describe iste function..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "facer qualcosa"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "pro"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Crea un function que non retorna un valor."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "retornar"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Crea un function que retorna un valor."; +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Attention: Iste function ha parametros duplicate."; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Accentuar le definition del function"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Si un valor es ver, alora retornar un secunde valor."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Attention: Iste bloco pote solmente esser usate in le definition de un function."; +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:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "a %1 adjunger texto %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Adjunger un texto al variabile '%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "in minusculas"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "con Initiales Majuscule"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "in MAJUSCULAS"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Retornar un copia del texto con differente majusculas/minusculas."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "prender le prime littera"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "prender ab le fin le littera №"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "prender le littera №"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "prender le ultime littera"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "prender un littera aleatori"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in le texto %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Retorna le littera presente al position specificate."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "contar %1 in %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Contar quante vices un texto occurre intra un altere texto."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Adder un elemento al texto."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "unir"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Adde, remove o reordina sectiones pro reconfigurar iste bloco de texto."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "ab le fin usque al littera №"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "usque al littera №"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "usque al ultime littera"; +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 le texto"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "prender subcatena ab le prime littera"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "prender subcatena ab le fin ab le littera №"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "prender subcatena ab le littera №"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Retorna le parte specificate del texto."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "cercar le prime occurrentia del texto"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "cercar le ultime occurrentia del texto"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "in le texto %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Retorna le indice del prime/ultime occurrentia del prime texto in le secunde texto. Retorna %1 si le texto non es trovate."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 es vacue"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Retorna ver si le texto fornite es vacue."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "crear texto con"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Crear un pecia de texto uniente un certe numero de elementos."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "longitude de %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Retorna le numero de litteras (incluse spatios) in le texto fornite."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "scriber %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Scriber le texto, numero o altere valor specificate."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Peter un numero al usator."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Peter un texto al usator."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "peter un numero con le message"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "peter un texto con le message"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "reimplaciar %1 per %2 in %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Reimplaciar tote le occurrentias de un texto intra un altere texto."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "inverter %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Inverte le ordine del characteres in le texto."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Un littera, parola o linea de texto."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "remover spatios de ambe lateres de"; +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["UNNAMED_KEY"] = "unnamed"; // untranslated +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 +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Retorna le valor de iste variabile."; +Blockly.Msg["VARIABLES_SET"] = "mitter %1 a %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Crear 'prender %1'"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Mitte iste variabile al valor del entrata."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Un variabile con le nomine '%1' jam existe."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Un variabile con le nomine '%1' jam existe pro un altere typo: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Spatio de travalio de Blockly"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Dice qualcosa..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/id.js b/js/msg/js/id.js new file mode 100644 index 0000000..a31db01 --- /dev/null +++ b/js/msg/js/id.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Tambahkan Komentar"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Ubah nilai:"; +Blockly.Msg["CLEAN_UP"] = "Bersihkan Blok"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +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_HELPURL"] = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg["COLOUR_BLEND_RATIO"] = "rasio"; +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 +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "Warna acak"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Pilih warna secara acak."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "biru"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "hijau"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "http://www.december.com/html/spec/colorper.html"; +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 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 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"] = "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"] = "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_VARIABLE"] = "Hapus variabel '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Hapus %1 yang digunakan pada variabel '%2'?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Hapus %1 Blok"; +Blockly.Msg["DISABLE_BLOCK"] = "Nonaktifkan Blok"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Duplikat"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +Blockly.Msg["ENABLE_BLOCK"] = "Aktifkan Blok"; +Blockly.Msg["EXPAND_ALL"] = "Kembangkan Blok"; +Blockly.Msg["EXPAND_BLOCK"] = "Kembangkan Blok"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Input Eksternal"; +Blockly.Msg["HELP"] = "Bantuan"; +Blockly.Msg["INLINE_INPUTS"] = "Input Inline"; +Blockly.Msg["IOS_CANCEL"] = "Cancel"; // untranslated +Blockly.Msg["IOS_ERROR"] = "Error"; // untranslated +Blockly.Msg["IOS_OK"] = "OK"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Add Input"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INPUTS"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Add"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Add Variable"; // untranslated +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Delete"; // untranslated +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "You can't use an empty variable name."; // untranslated +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Rename"; // untranslated +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Variable name"; // untranslated +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"] = "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 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 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"] = "#"; +Blockly.Msg["LISTS_GET_INDEX_GET"] = "dapatkan"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "dapatkan dan hapus"; +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 list."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Kembalikan item di posisi tertentu dalam list."; +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"] = "Hapus dan kembalikan item di posisi tertentu dalam list."; +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"] = "Hapus item di posisi tertentu dalam list."; +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 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"] = "Buat salinan bagian tertentu dari list."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 adalah item terakhir."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 adalah item pertama."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "cari kejadian pertama item"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "cari kejadian terakhir item"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Kembalikan indeks dari item pertama/terakhir kali muncul dalam list. Kembalikan %1 jika item tidak ditemukan."; +Blockly.Msg["LISTS_INLIST"] = "dalam list"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 kosong"; +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"] = "Kembalikan panjang list."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +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_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "sebagai"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "sisipkan di"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "tetapkan"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Sisipkan item di bagian awal dari list."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Sisipkan item ke dalam posisi yang telah ditentukan di dalam list."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Tambahkan item ke bagian akhir list."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Sisipkan item secara acak ke dalam list."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Tetapkan item pertama di dalam list."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Tetapkan item ke dalam posisi yang telah ditentukan di dalam list."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "menaik"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "menurun"; +Blockly.Msg["LISTS_SORT_TITLE"] = "urutkan %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Urutkan salinan dari daftar"; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "sesuai abjad, abaikan kasus"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "sesuai nomor"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "sesuai abjad"; +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"] = "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_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +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"] = "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"] = "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"] = "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 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 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."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Kembalikan hasil bagi dari kedua angka."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Kembalikan selisih dari kedua angka."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Kembalikan perkalian dari kedua angka."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Kembalikan angka pertama pangkat angka kedua."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "ubah %1 oleh %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Tambahkan angka kedalam variabel '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Kembalikan salah satu konstanta: π (3,141…), e (2,718…), φ (1,618…), akar(2) (1,414…), akar(½) (0.707…), atau ∞ (tak terhingga)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +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"] = "dapat dibagi oleh"; +Blockly.Msg["MATH_IS_EVEN"] = "adalah bilangan genap"; +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_PRIME"] = "adalah bilangan pokok"; +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 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"; +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 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"] = "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"] = "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"] = "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"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "akar"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Kembalikan nilai absolut angka."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Kembalikan 10 pangkat angka."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Kembalikan logaritma natural dari angka."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Kembalikan dasar logaritma 10 dari angka."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Kembalikan penyangkalan terhadap angka."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Kembalikan 10 pangkat angka."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Kembalikan akar dari angka."; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; +Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; +Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; +Blockly.Msg["MATH_TRIG_COS"] = "cos"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "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 cosinus dari derajat (bukan radian)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Kembalikan sinus dari derajat (bukan radian)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Kembalikan tangen dari derajat (bukan radian)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "Buat variabel..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Nama variabel baru:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "memungkinkan pernyataan"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "dengan:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Menjalankan fungsi '%1' yang ditetapkan pengguna."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +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"] = "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"] = "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"] = "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 +Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Jika nilai yang benar, kemudian kembalikan nilai kedua."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Peringatan: Blok ini dapat digunakan hanya dalam definisi fungsi."; +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["REDO"] = "Lakukan ulang"; +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_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "untuk %1 tambahkan teks %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Tambahkan beberapa teks ke variabel '%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "menjadi huruf kecil"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "menjadi huruf pertama kapital"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "menjadi huruf kapital"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Kembalikan kopi dari text dengan kapitalisasi yang berbeda."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "ambil huruf pertama"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "ambil huruf nomor # dari belakang"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "ambil huruf ke #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "ambil huruf terakhir"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "ambil huruf secara acak"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Kembalikan karakter dari posisi tertentu."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Tambahkan suatu item ke dalam teks."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "join"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Tambah, ambil, atau susun ulang teks blok."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "pada huruf nomer # dari terakhir"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "pada huruf #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "pada huruf terakhir"; +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 teks"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "ambil bagian teks (substring) dari huruf pertama"; +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"] = "Kembalikan spesifik bagian dari teks."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "temukan kejadian pertama dalam teks"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "temukan kejadian terakhir dalam teks"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "dalam teks %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Kembalikan indeks pertama dan terakhir dari kejadian pertama/terakhir dari teks pertama dalam teks kedua. Kembalikan %1 jika teks tidak ditemukan."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 kosong"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Kembalikan benar jika teks yang disediakan kosong."; +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_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"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Kembalikan sejumlah huruf (termasuk spasi) dari teks yang disediakan."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "cetak %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Cetak teks yant ditentukan, angka atau ninlai lainnya."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Meminta pengguna untuk memberi sebuah angka."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Meminta pengguna untuk memberi beberapa teks."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "Meminta angka dengan pesan"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "meminta teks dengan pesan"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Huruf, kata atau baris teks."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "pangkas ruang dari kedua belah sisi"; +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"] = "Urungkan"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // untranslated +Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "item"; +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"] = "Kembalikan nilai variabel ini."; +Blockly.Msg["VARIABLES_SET"] = "tetapkan %1 untuk %2"; +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["VARIABLE_ALREADY_EXISTS"] = "Sebuah variabel dengan nama '%1' sudah ada."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/ig.js b/js/msg/js/ig.js new file mode 100644 index 0000000..0719e75 --- /dev/null +++ b/js/msg/js/ig.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Tịnye okwu"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Agaghị ekpochapụlị agbanwe '%1' maka nsonye ya na nkọwa nke ọrụ ahụ '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Gbanwee akara:"; +Blockly.Msg["CLEAN_UP"] = "Hichapụ ngọngọ"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "Kwada Ngọngọ"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Kwada Ngọngọ"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "agba 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "agba 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "oke"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "ngwakọta"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Na ngwakọta agba abụọ ọnụ na na oke enyere (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Họrọ agba site na palette."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "agba ọbụla"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Họrọ agba na-nke ọbụla."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "bluu"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "akwụkwọ ndụ"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "uhie"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "agba ya na"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Mepụta agba nwere ọnụ ọgụgụ kpọmkwem nke agba uhie, akwụkwọ ndụ, na akara niile ga-adịrịrị n'etiti 0 rụọ 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"] = "gbapuo na meghachi a"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "malite na nsoghari nke meghachi ozo"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Gba puo na gburugburu nke ọdị n’ime ya."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Wụọ mkpụchị meghachi ndị a fọdụrụ, ma gaa n'ihu na nsoghari nke aka."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Ịdọ aka ná ntị: Enwere ike iji ngọngọ a naanị n'ime meghachi."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "maka ihe ọ bụla %1 n'ime ndepụta %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Maka ihe ọ bụla n'ime ndepụta, debe agbanwe '%1' na ihe ahụ, wee degharịa ụfọdụ koodu."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "gụọ na %1 site na %2 rụọ %3 tupu %4"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Nwere ngwakọta '%1' na akara ọbụla sịte na mbịdo ọnụọgụgụ rụọ na ngwụcha ọnụọgụgụ, na-ngụta sịtere na nkeji oge kpọmkwem. megharịa koodu oge ọbụla:"; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Tinye ọnọdụ na ngọngọ ma ọ bụrụ."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Tinye ngwucha, ọnọdụ jide-niile na ngọngọ ma ọ bụrụ."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Tinye, wepu, ma ọ bụ megharia ngalaba iji haziearịa nke a ma ọ bụrụ na ngọngọ."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "ọzọ"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "ọzọ ma ọ bụrụ"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "ọ bụrụ"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Ọ bụrụ na akara bụ ezịọkwụ, mezie ụfọdụ okwu."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Ọ bụrụ na akara bụ ezịọkwụ, mezie ngọngọ mbụ nke okwu. Ma ọ bụghị ya, mezie ngọngọ nke abụọ nke okwu."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Ọ bụrụ na akara mbụ bụ ezịọkwụ, mezie ngọngọ mbụ nke okwu. Ma ọ bụghị ya, ọ bụrụ na akara nke abụọ bụ ezịọkwụ, mee ngọngọ nke abụọ nke okwu."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Ọ bụrụ na akara mbụ bụ ezịọkwụ, mezie ngọngọ mbụ nke okwu. Ma ọ bụghị ya, ọ bụrụ na akara nke abụọ bụ ezịọkwụ, mee ngọngọ nke abụọ nke okwu. Ọ bụrụ na onweghị akara bụ ezịọkwụ, mee ngọngọ okwu ikpeazụ."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "mee"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "meghachi ụgbọ %1"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Mee ụfọdụ okwu ọtụtụ ugboro."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "megharịa tụpụ"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "megharịa mgbe"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Ọ bụ ebe akara bụ ụgha, megharịa ụfọdụ koodu."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Ọ bụ ebe akara bụ ezịọkwụ, megharịa ụfọdụ koodu."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Mkpọchi %1 ngọngọ niile?"; +Blockly.Msg["DELETE_BLOCK"] = "Kpochapụ Ngọngọ"; +Blockly.Msg["DELETE_VARIABLE"] = "Kpochapụ agbanwe ‘%1' ahu"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Kpochapụ %1 ojịjị nke agbanwe '%2'?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Kpochapụ %1 Ngọngọ"; +Blockly.Msg["DISABLE_BLOCK"] = "Gbanyụọ Ngọngọ"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Ntụgharị"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Tụgharịa okwu"; +Blockly.Msg["ENABLE_BLOCK"] = "Gbanye Ngọngọ"; +Blockly.Msg["EXPAND_ALL"] = "Gbasaa Ngọngọ"; +Blockly.Msg["EXPAND_BLOCK"] = "Gbasaa Ngọngọ"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Ntinye Mpụta"; +Blockly.Msg["HELP"] = "Enyemaka"; +Blockly.Msg["INLINE_INPUTS"] = "Ntinye N'ahịrị"; +Blockly.Msg["IOS_CANCEL"] = "Hapụ̀"; +Blockly.Msg["IOS_ERROR"] = "Njehie"; +Blockly.Msg["IOS_OK"] = "Ọ DỊ MMA"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Tinye ntinye"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Kwe ka okwu"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Ọrụ a nwere ọnụọgụ abụọ."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "NTINYE"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Tinye"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Tinye agbanwe"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Kpochapụ"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Ị nweghị ike iji aha agbanwe dị n’efu."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Nyegharịa aha"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Aha agbanwe"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "mepụta ndepụta efu"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Weghachite ndepụta, nke ogologo 0, nke enweghị ndekọ data"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "ndepụta"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Tinye, wepu, ma ọ bụ megharia ngalaba iji haziearia ngọngọ ederede a."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "mepụta ndepụta"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Tinye ihe na ndepụta."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Mepụta ndepụta na nọmba ọ bụla."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "mbu"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# site na njedebe"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_GET"] = "nweta"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "nweta ma wepu"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "ikpeazụ"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "nke ọ bụla"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "wepu"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Weghachitere ihe mbụ n'ime ndepụta."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Weghachitere ihe na ọnọdụ a kapịrị ọnụ na ndepụta."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Weghachitere ihe ikpeazụ n'ime ndepụta."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Weghachitere ihe ọbụla n'ime ndepụta."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Wepu ma weghachite ihe mbu na ndepụta."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Wepu ma weghachite ihe na ọnọdụ a kapịrị ọnụ na ndepụta."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Wepu ma weghachite ihe ikpeazụ n'ime ndepụta."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Wepu ma weghachite ihe ọbụla n'ime ndepụta."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Wepu ihe mbụ n'ime ndepụta."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Wepu ihe ahụ na ọnọdụ a kapịrị ọnụ na ndepụta."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Wepu ihe ikpeazụ n'ime ndepụta."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Wepu ihe ọbụla n'ime ndepụta."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "rụọ # site na njedebe"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "rụọ #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "rụọ na ngwụcha"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "nweta akụkụ ndepụta site na mbịdo"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "nweta akụkụ ndepụta site na # site na njedebe"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "nweta akụkụ ndepụta site na #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Na-emepụta otu akụkụ a kapịrị ọnụ nke ndepụta."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 bụ ihe ikpeazụ."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 bụ ihe mbụ."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "chọta ihe mbu nke ihe"; +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"] = "chọta ihe ikpeazụ nke ihe"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Weghachitere ntughari nke mbụ / nke ikpeazụ nke ihe dị na ndepụta. Weghachitere %1 ma ọ bụrụ na achọtaghị ihe."; +Blockly.Msg["LISTS_INLIST"] = "n’ime ndepụta"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 ghe oghe"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Weghachite eziokwu ma ọ bụrụ na ndepụta ahụ dị n’efu."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "ogo nke %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Weghachite ogo nke ndepụta."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "mepụta ndepụta na ihe %1 emegharịrị ugboro %2"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Na-emepụta listi ndepụta gụnyere akara a nyere ya ugboro ugboro."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "gbanwe %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Tụgharịa otu akụkụ ndepụta."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "dị ka"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "tinye na"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "set"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Na-etinye ihe ahụ na mmalite nke ndepụta."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Na-etinye ihe na ọnọdụ a kapịrị ọnụ na ndepụta."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Na-etinye ihe ahụ na ngwụcha nke ndepụta."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Na-etinye ihe ahụ na ebe ọbụla nke ndepụta."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Debe ihe mbụ n'ime ndepụta."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Debe ihe ahụ na ọnọdụ a kapịrị ọnụ na ndepụta."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Debe ihe ikpeazụ n'ime ndepụta."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Debe ihe ọbụla n'ime ndepụta."; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "arịgo"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "agbada"; +Blockly.Msg["LISTS_SORT_TITLE"] = "hazie %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Tọọ otu akụkụ ndepụta ahụ."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "mkpụrụ edemede, leghara ọnọdụ anya"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "nọmba"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "mkpụrụ edemede"; +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"] = "mee ndepụta site na ederede"; +Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "mee ederede site na ndepụta"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Jikọọ ndepụta nke ederede gaa na otu ederede, nke oihe nkewa kewara."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Kewaa ederede n'ime ndepụta nke ederede, na-agbasa na ihe nkwea ọ bụla."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "na ihe nkewa"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "ụgha"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Weghachitere ezịọkwụ ma ọ bụ ụgha."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "ezịọkwụ"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Weghachi ezịọkwụ ma ọ bụrụ na ntinye hatara onwe ha."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Weghachi ezịọkwụ ma ọ bụrụ na ntinye mbu dị ụkwụụ karia ntinye nke abụọ."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Weghachi ezịọkwụ ma ọ bụrụ na ntinye mbu dị ụkwụụ karia ma ọ bụ hatara ntinye nke abụọ."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Weghachi ezịọkwụ ma ọ bụrụ na ntinye mbu dị obere karia ntinye nke abụọ."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Weghachi ezịọkwụ ma ọ bụrụ na ntinye mbu dị obere karia ma ọ bụ hatara ntinye nke abụọ."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Weghachi ezịọkwụ ma ọ bụrụ na ntinye aghataghị onwe ha."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "ma ọ bụghị %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Weghachitere ezịọkwụ ma ọ bụrụ na ntinye bụ ụgha. Weghachitere ụgha ma ọ bụrụ na ntinye bụ ezịọkwụ."; +Blockly.Msg["LOGIC_NULL"] = "null"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Weghachitere nkịtị."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "ma"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "ma ọ bụrụ"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Weghachi ezịọkwụ ma ọ bụrụ na ntinye abụọ a bụ ezịọkwụ."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Weghachi ezịọkwụ ma ọ bụrụ na ọdịkarịa ala otu n’ime ntinye a bụ ezịọkwụ."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "ule"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "ọ bụrụ ụgha"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "ọ bụrụ na eziokwu"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Lelee ọnọdụ na 'ule'. Ọ bụrụ na ọnọdụ ahụ bụ eziokwu, weghachitere akara 'ọ bụrụ na eziokwu’; ma ọ bụghị ya weghachitere akara 'ọ bụrụ ụgha'."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Weghachite ngụkọ ọnụ ọgụgụ abụọ ahụ."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Weghachite kwenye ọnụ ọgụgụ abụọ ahụ."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Weghachite nwepụ ọnụ ọgụgụ abụọ ahụ."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Weghachite mụbaa ọnụ ọgụgụ abụọ ahụ."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Weghachite nọmba mbu nke emeturu ike nke nọmba nke abụọ."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 nke X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Weghachite aktanjentị nke isi (X, Y) na ogo site na -180 rụọ 180."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "gbanwee %1 site na %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Tinye nọmba na agbanwe '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Weghachite otu n'ime kọnstant ndị nkịtị: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "gbochịe %1 ala %2 elu %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Gbochịe ọnụọgụgụ dị n'etiti nọmba dị oke ala na nọmba dị oke elu (gụnyere)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "ga ekenwụ"; +Blockly.Msg["MATH_IS_EVEN"] = "bụ ịvụn"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "bụ negetịf"; +Blockly.Msg["MATH_IS_ODD"] = "bụ ọd"; +Blockly.Msg["MATH_IS_POSITIVE"] = "bu posịtịf"; +Blockly.Msg["MATH_IS_PRIME"] = "bụ praim"; +Blockly.Msg["MATH_IS_TOOLTIP"] = "Tụlee ma nọmba ọ bụ ịvụn, ọd, praim, zuru ezu, posịtịf, negetịf, ma e nwere nọmba ga ekenwu ya. Weghachitere eziokwu ma ọ bụ ụgha."; +Blockly.Msg["MATH_IS_WHOLE"] = "zuru ezu"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "ihe fọdụrụ nke %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Weghachite ihe fọdụrụ site na nkewa nọmba abụọ."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Ọnụọgụgụ."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "agbaetiti nke ndepụta"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "ọkacha ukwuu nke ndepụta"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "etiti nke ndepụta"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "opekempe nke ndepụta"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "ụdị ndepụta"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "Ihe ọbụla nke ndepụta"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "ntughari usoro nke ndepụta"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "nchịkọta nke ndepụta"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Weghachite agbaetiti (nchịkọta mpụta) nke akara ọnụọgụ na ndepụta."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Weghachite nọmba kacha ukwuu na ndepụta."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Weghachite nọmba agbaetiti na ndepụta."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Weghachite nọmba kacha obere na ndepụta."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Weghachite ndepụta nke nke ihe kachasị mkpa na ndepụta."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Weghachite Ihe ọbụla site na ndepụta."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Weghachite ntughari usoro nke ndepụta."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Weghachite nchịkọta nke nọmba niile na ndepụta."; +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"] = "nkewa ọbụla"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Weghachite ọnụọgụgụ ọbụla dị n'etiti 0.0 (gụnyere) na 1.0 (agụnyeghị)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "ọnụọgụgụ ọbụla site na %1 rụọ %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Weghachite ọnụọgụgụ ọbụla dị n'etiti ihe abụọ a kapịrị ọnụ, agụnyere."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "gbaarịa"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "gbatụọ ala"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "gbaago elu"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Gbaago nọmba n'elu ma ọ bụ ala."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "ozụzụ"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "Isi ngụkọ"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Weghachite akara ozụzụ nke nọmba."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Weghachite na ike nke nọmba."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Weghachite lọgarịdịm nke di na nọmba."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Weghachite isi lọgarịdịm 10 nke nọmba."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Weghachite njụ nke nọmba."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Weghachite 10 na ike nke nọmba."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Weghachite Isi ngụkọ nke nọmba."; +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"] = "Weghachite akosaịn nke nọmba."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Weghachite aksaịn nke nọmba."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Weghachite aktanjentị nke nọmba."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Weghachite kosaịn nke ogo (ọ bụghị redian)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Weghachite saịn nke ogo (ọ bụghị redian)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Weghachite tanjentị nke ogo (ọ bụghị redian)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Mepụta agba agbanwe..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Mepụta nọmba agbanwe..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Mepụta njikọ agbanwe..."; +Blockly.Msg["NEW_VARIABLE"] = "Mepụta agbanwe..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Aha agbanwe ọhụụ:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Ụdị agbanwe ọhụụ:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "kwe ka okwu"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "na:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Gbaa ọrụ a kọwaa onye-ọrụ '%1'."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Gbaa ọrụ a kọwaa onye-ọrụ '%1' ma jiri mmepụta ya."; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "na:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "Mepụta '%1'"; +Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Kọwaa ọrụ a..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "megharịa"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "ga na"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Na emepụta ọrụ na-enweghị mmepụta."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "weghachite"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Na emepụta ọrụ nwere mmepụta."; +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Ịdọ aka ná ntị: Ọrụ a nwere ọnụọgụ abụọ."; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Nkọwapụta njirimara ọrụ"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Weghachite akara nke agbanwe a."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Ịdọ aka ná ntị: Ọrụ a nwere ọnụọgụ abụọ."; +Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "tinye aha:"; +Blockly.Msg["PROCEDURES_MUTATORARG_TOOLTIP"] = "Tinye ntinye aka na ọrụ ahụ."; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TITLE"] = "ntinye"; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TOOLTIP"] = "Tinye, wepu, ma ọ bụ tugharịa ntinye na ọrụ a."; +Blockly.Msg["REDO"] = "Megharịa"; +Blockly.Msg["REMOVE_COMMENT"] = "Wepu okwu"; +Blockly.Msg["RENAME_VARIABLE"] = "Nyegharịa agbanwe aha..."; +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Nyegharịa agbanwe '%1' nille ga:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "iji %1 tinye ederede %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Tinye ederede na mgbanwee '%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "na ahịrị elu"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "na Aha Ahịrị"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "na AHỊRỊ ELU"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "AA <-> aa"; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "nweta akwụkwọ ozi mbu"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "nweta akwụkwọ ozi # site na njedebe"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "nweta akwụkwọ ozi #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "nweta akwụkwọ ozi ikpeazụ"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "nweta akwụkwọ ozi ọbụla"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "chọta na ederede %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Weghachite akwụkwọ ozi ahụ na ọnọdụ a kapịrị ọnụ."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "gụọ %1 n’ime %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Gụọ ugboro ole ụfọdụ ederede na’apụta n’ụfọdụ ederede ọzọ."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Tinye ihe na ederede."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "jikọta"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Tinye, wepu, ma ọ bụ megharia ngalaba iji haziearia ngọngọ ederede a."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "na akwụkwọ ozi # site na njedebe"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "na akwụkwọ ozi #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "na leta ikpeazụ"; +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"] = "chọta na ederede"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "nweta njịkọ-ala na akwụkwọ ozi mbu"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "nweta njịkọ-ala na akwụkwọ ozi # site na njedebe"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "nweta njịkọ-ala na akwụkwọ ozi #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Weghachite akụkụ nke akọwapụtara ederede."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "chọta ihe omume mbu nke ederede"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "chọta ihe omume ikpeazụ nke ederede"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "chọta na ederede %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Weghachitere ntughari nke mbụ / nke ikpeazụ nke ihe dị na ndepụta. Weghachitere %1 ma ọ bụrụ na achọtaghị ihe."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 di n’efu"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Weghachitere ezịọkwụ ma ọ bụrụ na ederede enyere di n’efu."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "mepụta ederede na"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Mepụta otu ederede site na ijikọta ọnụ ọgụgụ ihe ọ bụla."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "ogologo nke %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Weghachitere nọmba nke akwụkwọ ozi (gụnyere oghere) na ederede enyere."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "bipụta %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Bipụta ederede a kapịrị ọnụ, nọmba ma ọ bụ akara ọzọ."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Mepụta ngwa onye ọrụ maka nọmba."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Mepụta ngwa onye ọrụ maka ederede."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "Mepụta ngwa maka maka nọmba na ozi"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "Mepụta ngwa maka iji ederede na ozi"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "dochie %1 na %2 n’ime %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Dochie ihe omuma nke ederede ufodu n'ime ufodu ederede ozo."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "gbanwe %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Na-agbanwe iwu nke ndị odide na ederede."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Akwụkwọ ozi, okwu, ma ọ bụ akara ederede."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "belata oghere dị mkpụmkpụ si n'akụkụ abụọ nke"; +Blockly.Msg["TEXT_TRIM_OPERATOR_LEFT"] = "belata oghere dị mkpụmkpụ si n'akụkụ aka ịkpa nke"; +Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "belata oghere dị mkpụmkpụ si n'akụkụ aka nrị nke"; +Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "Weghachite otu ederede ya na oghere ọzọ wepụrụ site n'otu ma ọ bụ akụkụ mechị abụọ."; +Blockly.Msg["TODAY"] = "Taa"; +Blockly.Msg["UNDO"] = "Me la àzụ"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // untranslated +Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "ihe"; +Blockly.Msg["VARIABLES_GET_CREATE_SET"] = "Mepụta 'dozie %1'"; +Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Weghachite akara nke agbanwe a."; +Blockly.Msg["VARIABLES_SET"] = "dozie %1 ga na %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Mepụta 'nweta uru %1'"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Debe mgbanwe a ka ọ ghata ihe ntinye."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Agbanwe akpọrọ '%1' dị adị."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Agbanwe akpọrọ '%1' dị adị na ụdị ozo: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Kwuo ihe ọ bụla..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/is.js b/js/msg/js/is.js new file mode 100644 index 0000000..9fb77f8 --- /dev/null +++ b/js/msg/js/is.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Skrifa skýringu"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Breyta gildi:"; +Blockly.Msg["CLEAN_UP"] = "Hreinsa kubba"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "Loka kubbum"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Loka kubbi"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "litur 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "litur 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg["COLOUR_BLEND_RATIO"] = "hlutfall"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "blöndun"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Blandar tveimur litum í gefnu hlutfalli (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Velja lit úr litakorti."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "einhver litur"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Velja einhvern lit af handahófi."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "blátt"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "grænt"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg["COLOUR_RGB_RED"] = "rauður"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "litur"; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "fara út úr lykkju"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "fara beint í næstu umferð lykkjunnar"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Fara út úr umlykjandi lykkju."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Sleppa afganginum af lykkjunni og fara beint í næstu umferð hennar."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Aðvörun: Þennan kubb má aðeins nota innan lykkju."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +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 á 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"; +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Bæta við, fjarlægja eða umraða til að breyta skipan þessa EF kubbs."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "annars"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "annars ef"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "ef"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Ef gildi er satt skal gera einhverjar skipanir."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Ef gildi er satt skal gera skipanir í fyrri kubbnum. Annars skal gera skipanir í seinni kubbnum."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "gera"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "endurtaka %1 sinnum"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Gera eitthvað aftur og aftur."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "endurtaka þar til"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "endurtaka á meðan"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Endurtaka eitthvað á meðan gildi er ósatt."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Endurtaka eitthvað á meðan gildi er satt."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Eyða öllum %1 kubbunum?"; +Blockly.Msg["DELETE_BLOCK"] = "Eyða kubbi"; +Blockly.Msg["DELETE_VARIABLE"] = "Eyða '%1' breytunni"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg["DELETE_X_BLOCKS"] = "Eyða %1 kubbum"; +Blockly.Msg["DISABLE_BLOCK"] = "Óvirkja kubb"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Afrita"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Tvítaka athugasemd"; +Blockly.Msg["ENABLE_BLOCK"] = "Virkja kubb"; +Blockly.Msg["EXPAND_ALL"] = "Opna kubba"; +Blockly.Msg["EXPAND_BLOCK"] = "Opna kubb"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Ytri inntök"; +Blockly.Msg["HELP"] = "Hjálp"; +Blockly.Msg["INLINE_INPUTS"] = "Innri inntök"; +Blockly.Msg["IOS_CANCEL"] = "Hætta við"; +Blockly.Msg["IOS_ERROR"] = "Villa"; +Blockly.Msg["IOS_OK"] = "Í lagi"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Add Input"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INPUTS"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Bæta við"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Bæta við breytu"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Eyða"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "You can't use an empty variable name."; // untranslated +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Endurnefna"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Nafn breytu"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "búa til tóman lista"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Skilar lista með lengdina 0 án gagna"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "listi"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Bæta við, fjarlægja eða umraða hlutum til að breyta skipan þessa listakubbs."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "búa til lista með"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Bæta atriði við listann."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Búa til lista með einhverjum fjölda atriða."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "fyrsta"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# frá enda"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; +Blockly.Msg["LISTS_GET_INDEX_GET"] = "sækja"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "sækja og fjarlægja"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "síðasta"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "eitthvert"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "fjarlægja"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Skilar fyrsta atriði í lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Skilar atriðinu í hinum tiltekna stað í lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Skilar síðasta atriði í lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Skilar einhverju atriði úr lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Fjarlægir og skilar fyrsta atriðinu í lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Fjarlægir og skilar atriðinu á hinum tiltekna stað í lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Fjarlægir og skilar síðasta atriðinu í lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Fjarlægir og skilar einhverju atriði úr lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Fjarlægir fyrsta atriðið í lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Fjarlægir atriðið á hinum tiltekna stað í lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Fjarlægir síðasta atriðið í lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Fjarlægir eitthvert atriði úr lista."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "til # frá enda"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "til #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "til síðasta"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "sækja undirlista frá fyrsta"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "sækja undirlista frá # frá enda"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "sækja undirlista frá #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Býr til afrit af tilteknum hluta lista."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 er síðasta atriðið."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 er fyrsta atriðið."; +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 %1 ef atriðið finnst ekki."; +Blockly.Msg["LISTS_INLIST"] = "í lista"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 er tómur"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Skilar sönnu ef listinn er tómur."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; +Blockly.Msg["LISTS_LENGTH_TITLE"] = "lengd %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Skilar lengd lista."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_REPEAT_TITLE"] = "búa til lista með atriði %1 endurtekið %2 sinnum"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Býr til lista sem inniheldur tiltekna gildið endurtekið tiltekið oft."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "snúa við %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Snúa við afriti lista."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "sem"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "bæta við"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "setja í"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Bætir atriðinu fremst í listann."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Bætir atriðinu í listann á tilteknum stað."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Bætir atriðinu aftan við listann."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Bætir atriðinu einhversstaðar við listann."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Setur atriðið í fyrsta sæti lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Setur atriðið í tiltekna sætið í listanum."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "hækkandi"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "lækkandi"; +Blockly.Msg["LISTS_SORT_TITLE"] = "raða %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Raða afriti lista."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "í stafrófsröð án tillits til stafstöðu"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "í númeraröð"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "í stafrófsröð"; +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"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Sameinar lista af textum í einn texta, með skiltákn á milli."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Skiptir texta í lista af textum, með skil við hvert skiltákn."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "með skiltákni"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "ósatt"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Skilar annað hvort sönnu eða ósönnu."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "satt"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Skila sönnu ef inntökin eru jöfn."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Skila sönnu ef fyrra inntakið er stærra en seinna inntakið."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Skila sönnu ef fyrra inntakið er stærra en eða jafnt og seinna inntakið."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Skila sönnu ef fyrra inntakið er minna en seinna inntakið."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Skila sönnu ef fyrra inntakið er minna en eða jafnt og seinna inntakið."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Skila sönnu ef inntökin eru ekki jöfn."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "ekki %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Skilar sönnu ef inntakið er ósatt. Skilar ósönnu ef inntakið er satt."; +Blockly.Msg["LOGIC_NULL"] = "tómagildi"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Skilar tómagildi."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "og"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; +Blockly.Msg["LOGIC_OPERATION_OR"] = "eða"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Skila sönnu ef bæði inntökin eru sönn."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Skila sönnu ef að minnsta kosti eitt inntak er satt."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "prófun"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "ef ósatt"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "ef satt"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Kanna skilyrðið í 'prófun'. Skilar 'ef satt' gildinu ef skilyrðið er satt, en skilar annars 'ef ósatt' gildinu."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Skila summu talnanna tveggja."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Skila deilingu talnanna."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Skila mismun talnanna."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Skila margfeldi talnanna."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Skila fyrri tölunni í veldinu seinni talan."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "breyta %1 um %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Bæta tölu við breytu '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["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)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "þröngva %1 lægst %2 hæst %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Þröngva tölu til að vera innan hinna tilgreindu marka (að báðum meðtöldum)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "er\u00A0deilanleg með"; +Blockly.Msg["MATH_IS_EVEN"] = "er\u00A0jöfn tala"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "er neikvæð"; +Blockly.Msg["MATH_IS_ODD"] = "er oddatala"; +Blockly.Msg["MATH_IS_POSITIVE"] = "er jákvæð"; +Blockly.Msg["MATH_IS_PRIME"] = "er prímtala"; +Blockly.Msg["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."; +Blockly.Msg["MATH_IS_WHOLE"] = "er heiltala"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "afgangur af %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Skila afgangi deilingar með tölunum."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Tala."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "meðaltal lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "stærst í lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "miðgildi lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "minnst í lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "tíðast í lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "eitthvað úr lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "staðalfrávik lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "summa lista"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Skila meðaltali talna í listanum."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Skila stærstu tölu í listanum."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Skila miðgildi listans."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Skila minnstu tölu í listanum."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Skila lista yfir tíðustu gildin í listanum."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Skila einhverju atriði úr listanum."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Skila staðalfráviki lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Skila summu allra talna í listanum."; +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"] = "slembibrot"; +Blockly.Msg["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."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "slembitala frá %1 til %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Skila heiltölu sem valin er af handahófi og er innan tilgreindra marka, að báðum meðtöldum."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "námunda"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "námunda niður"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "námunda upp"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Námunda tölu upp eða niður."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "algildi"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "kvaðratrót"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Skila algildi tölu."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Skila e í veldi tölu."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Skila náttúrlegum lógaritma tölu."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Skila tugalógaritma tölu."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Skila neitun tölu (tölunni með öfugu formerki)."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Skila 10 í veldi tölu."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Skila kvaðratrót tölu."; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; +Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; +Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; +Blockly.Msg["MATH_TRIG_COS"] = "cos"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Skila arkarkósínusi tölu."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Skila arkarsínusi tölu."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Skila arkartangensi tölu."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Skila kósínusi horns gefnu í gráðum."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Skila sínusi horns gefnu í gráðum."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Skila tangensi horns gefnu í gráðum."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "Búa til breytu..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Heiti nýrrar breytu:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "leyfa setningar"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "með:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Keyra heimatilbúna fallið '%1'."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +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"] = "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ð"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "til að"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Býr til fall sem skilar engu."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +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"; +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:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg["TEXT_APPEND_TITLE"] = "við %1 bæta texta %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Bæta texta við breytuna '%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "í lágstafi"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "í Upphafstafi"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "í HÁSTAFI"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Skila afriti af textanum með annarri stafastöðu."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "sækja fyrsta staf"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "sækja staf # frá enda"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "sækja staf #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; +Blockly.Msg["TEXT_CHARAT_LAST"] = "sækja síðasta staf"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "sækja einhvern staf"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "í texta %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Skila staf á tilteknum stað."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "fjöldi %1 í %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Bæta atriði við textann."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "tengja"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Bæta við, fjarlægja eða umraða hlutum til að breyta skipan þessa textakubbs."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "að staf # frá enda"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "að staf #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "að síðasta staf"; +Blockly.Msg["TEXT_GET_SUBSTRING_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; +Blockly.Msg["TEXT_GET_SUBSTRING_INPUT_IN_TEXT"] = "í texta"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "sækja textabút frá fyrsta staf"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "sækja textabút frá staf # frá enda"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "sækja textabút frá staf #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Skilar tilteknum hluta textans."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "finna fyrsta tilfelli texta"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "finna síðasta tilfelli texta"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "í texta %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Finnur fyrsta/síðasta tilfelli fyrri textans í seinni textanum og skilar sæti hans. Skilar %1 ef textinn finnst ekki."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 er tómur"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Skilar sönnu ef gefni textinn er tómur."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "búa til texta með"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Búa til texta með því að tengja saman einhvern fjölda atriða."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg["TEXT_LENGTH_TITLE"] = "lengd %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Skilar fjölda stafa (með bilum) í gefna textanum."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; +Blockly.Msg["TEXT_PRINT_TITLE"] = "prenta %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Prenta tiltekinn texta, tölu eða annað gildi."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Biðja notandann um tölu."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Biðja notandann um texta."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "biðja um tölu með skilaboðum"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "biðja um texta með skilaboðum"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "skipta %1 út með %2 í %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "snúa við %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Snýr við röð stafanna í textanum."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Stafur, orð eða textalína."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "eyða bilum báðum megin við"; +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["UNNAMED_KEY"] = "unnamed"; // untranslated +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"; +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Skilar gildi þessarar breytu."; +Blockly.Msg["VARIABLES_SET"] = "stilla %1 á %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Búa til 'sækja %1'"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Stillir þessa breytu á innihald inntaksins."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Breyta með heitinu '%1' er þegar til staðar."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Segðu eitthvað..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/it.js b/js/msg/js/it.js new file mode 100644 index 0000000..9148bb3 --- /dev/null +++ b/js/msg/js/it.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Aggiungi commento"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Non si può cancellare la variabile '%1' perché è parte della definizione della funzione '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Modifica valore:"; +Blockly.Msg["CLEAN_UP"] = "Pulisci i blocchi"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "I blocchi compressi contengono avvertimenti."; +Blockly.Msg["COLLAPSE_ALL"] = "Comprimi blocchi"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Comprimi blocco"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "colore 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "colore 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "rapporto"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "miscela"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Mescola due colori insieme con un determinato rapporto (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://it.wikipedia.org/wiki/Colore"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Scegli un colore dalla tavolozza."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "colore casuale"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Scegli un colore a caso."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "blu"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "verde"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "rosso"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "colora con"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Crea un colore con la quantità specificata di rosso, verde e blu. Tutti i valori devono essere compresi tra 0 e 100."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "esce dal ciclo"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "prosegui con la successiva iterazione del ciclo"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Esce dal ciclo."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Salta il resto di questo ciclo e prosegue con la successiva iterazione."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Attenzioneː Questo blocco può essere usato solo in un ciclo."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "per ogni elemento %1 nella lista %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Per ogni elemento in una lista, imposta la variabile '%1' pari all'elemento e quindi esegue alcune istruzioni."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "conta con %1 da %2 a %3 per %4"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Fa sì che la variabile '%1' prenda tutti i valori a partire dal numero di partenza fino a quello di arrivo, con passo pari all'intervallo specificato, ed esegue il blocco indicato."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Aggiungi una condizione al blocco se."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Aggiungi una condizione finale pigliatutto al blocco se."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Aggiungi, elimina o riordina le sezioni per riconfigurare questo blocco se."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "altrimenti"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "altrimenti se"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "se"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Se un valore è vero allora esegue alcune istruzioni."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Se un valore è vero allora esegue il primo blocco di istruzioni. Altrimenti esegue il secondo blocco di istruzioni."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Se il primo valore è vero allora esegue un primo blocco di istruzioni. Altrimenti, se il secondo valore è vero, esegue un secondo blocco di istruzioni."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Se il primo valore è vero allora esegue un primo blocco di istruzioni. Altrimenti, se il secondo valore è vero, esegue un secondo blocco di istruzioni. Se nessuno dei valori è vero esegue l'ultimo blocco di istruzioni."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://it.wikipedia.org/wiki/Ciclo_for"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "fai"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "ripeti %1 volte"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Esegue alcune istruzione diverse volte."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "ripeti fino a che"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "ripeti mentre"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Finché un valore è falso, esegue alcune istruzioni."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Finché un valore è vero, esegue alcune istruzioni."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Cancellare tutti i %1 blocchi?"; +Blockly.Msg["DELETE_BLOCK"] = "Cancella blocco"; +Blockly.Msg["DELETE_VARIABLE"] = "Cancella la variabile '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Cancella %1 usi della variabile '%2'?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Cancella %1 blocchi"; +Blockly.Msg["DISABLE_BLOCK"] = "Disattiva blocco"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Duplica"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplica commento"; +Blockly.Msg["ENABLE_BLOCK"] = "Attiva blocco"; +Blockly.Msg["EXPAND_ALL"] = "Espandi blocchi"; +Blockly.Msg["EXPAND_BLOCK"] = "Espandi blocco"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Ingressi esterni"; +Blockly.Msg["HELP"] = "Aiuto"; +Blockly.Msg["INLINE_INPUTS"] = "Ingressi in linea"; +Blockly.Msg["IOS_CANCEL"] = "Annulla"; +Blockly.Msg["IOS_ERROR"] = "Errore"; +Blockly.Msg["IOS_OK"] = "OK"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Aggiungi input"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Consenti dichiarazioni"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Questa funzione ha entrate duplicate."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INPUTS"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Aggiungi"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Aggiungi variabile"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Cancella"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Non puoi utilizzare un nome di variabile vuoto."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Rinomina"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Nome variabile"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "crea lista vuota"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Restituisce una lista, di lunghezza 0, contenente nessun record di dati"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "lista"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Aggiungi, rimuovi o riordina le sezioni per riconfigurare il blocco lista."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "crea lista con"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Aggiunge un elemento alla lista."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Crea una lista con un certo numero di elementi."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "primo"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# dalla fine"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_GET"] = "prendi"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "prendi e rimuovi"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "ultimo"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "casuale"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "rimuovi"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Restituisce il primo elemento in una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Restituisce l'elemento nella posizione indicata della lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Restituisce l'ultimo elemento in una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Restituisce un elemento casuale in una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Rimuove e restituisce il primo elemento in una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Rimuove e restituisce l'elemento nella posizione indicata in una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Restituisce e rimuove l'ultimo elemento in una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Restituisce e rimuove un elemento casuale in una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Rimuove il primo elemento in una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Rimuove l'elemento nella posizione indicata in una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Rimuove l'ultimo elemento in una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Rimuove un elemento casuale in una lista."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "da # dalla fine"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "fino a #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "dagli ultimi"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "prendi sotto-lista dall'inizio"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "prendi sotto-lista da # dalla fine"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "prendi sotto-lista da #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Crea una copia della porzione specificata di una lista."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 corrisponde all'ultimo elemento."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 corrisponde al primo elemento."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "trova la prima occorrenza dell'elemento"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "trova l'ultima occorrenza dell'elemento"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Restituisce l'indice della prima/ultima occorrenza dell'elemento nella lista. Restituisce %1 se l'elemento non viene trovato."; +Blockly.Msg["LISTS_INLIST"] = "nella lista"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 è vuota"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Restituisce vero se la lista è vuota."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "lunghezza di %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Restituisce la lunghezza della lista"; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "crea una lista con l'elemento %1 ripetuto %2 volte"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Crea una lista costituita dal valore indicato ripetuto per il numero di volte specificato."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "inverti %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Inverti una copia di un elenco."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "come"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "inserisci in"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "imposta"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Inserisci l'elemento all'inizio della lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Inserisci un elemento nella posizione indicata in una lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Aggiungi un elemento alla fine di una lista"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Inserisce l'elemento casualmente in una lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Imposta il primo elemento in una lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Imposta l'elemento nella posizione indicata di una lista."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "crescente"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "decrescente"; +Blockly.Msg["LISTS_SORT_TITLE"] = "ordinamento %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Ordina una copia di un elenco."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alfabetico, ignorare differenze maiuscole e minuscole"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numerico"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alfabetico"; +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"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Unisci una lista di testi in un unico testo, separato da un delimitatore."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Dividi il testo in un elenco di testi, interrompendo ad ogni delimitatore."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "con delimitatore"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "falso"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Restituisce vero o falso."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "vero"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://it.wikipedia.org/wiki/Disuguaglianza"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Restituisce vero se gli input sono uno uguale all'altro."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Restituisce vero se il primo input è maggiore o uguale al secondo."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Restituisce uguale se il primo input è maggiore o uguale al secondo input."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Restituisce vero se il primo input è minore del secondo."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Restituisce vero se il primo input è minore o uguale al secondo."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Restituisce vero se gli input non sono uno uguale all'altro."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "non %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Restituisce vero se l'input è falso. Restituisce falso se l'input è vero."; +Blockly.Msg["LOGIC_NULL"] = "nullo"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Restituisce valore nullo."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "e"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "o"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Restituisce vero se entrambi gli input sono veri."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Restituisce vero se almeno uno degli input è vero."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "test"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "se falso"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "se vero"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Verifica la condizione in 'test'. Se questa è vera restituisce il valore 'se vero' altrimenti restituisce il valore 'se falso'."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://it.wikipedia.org/wiki/Aritmetica"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Restituisce la somma dei due numeri."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Restituisce il quoziente dei due numeri."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Restituisce la differenza dei due numeri."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Restituisce il prodotto dei due numeri."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Restituisce il primo numero elevato alla potenza del secondo numero."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://it.wikipedia.org/wiki/Arcotangente2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 di X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Restituisce l'arcotangente del punto (X, Y) in gradi da -180 a 180."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://it.wikipedia.org/wiki/Addizione"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "cambia %1 di %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Aggiunge un numero alla variabile '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://it.wikipedia.org/wiki/Costante_matematica"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Restituisce una delle costanti comuniː π (3.141…), e (2.718…), φ (1.618…), radq(2) (1.414…), radq(½) (0.707…) o ∞ (infinito)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "costringi %1 da %2 a %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Costringe un numero all'interno dei limiti indicati (compresi)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "è divisibile per"; +Blockly.Msg["MATH_IS_EVEN"] = "è pari"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "è negativo"; +Blockly.Msg["MATH_IS_ODD"] = "è dispari"; +Blockly.Msg["MATH_IS_POSITIVE"] = "è positivo"; +Blockly.Msg["MATH_IS_PRIME"] = "è primo"; +Blockly.Msg["MATH_IS_TOOLTIP"] = "Verifica se un numero è pari, dispari, primo, intero, positivo, negativo o se è divisibile per un certo numero. Restituisce vero o falso."; +Blockly.Msg["MATH_IS_WHOLE"] = "è intero"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://it.wikipedia.org/wiki/Resto"; +Blockly.Msg["MATH_MODULO_TITLE"] = "resto di %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Restituisce il resto della divisione di due numeri."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://it.wikipedia.org/wiki/Numero"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Un numero."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "media della lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "massimo della lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "mediana della lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "minimo della lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "mode della lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "elemento casuale della lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "deviazione standard della lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "somma la lista"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Restituisce la media (media aritmetica) dei valori numerici nella lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Restituisce il più grande numero della lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Restituisce il valore mediano della lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Restituisce il più piccolo numero della lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Restituisce una lista degli elementi più frequenti nella lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Restituisce un elemento casuale della lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Restituisce la deviazione standard della lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Restituisce la somma si tutti i numeri nella lista."; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://it.wikipedia.org/wiki/Numeri_pseudo-casuali"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "frazione casuale"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Restituisce una frazione compresa fra 0.0 (incluso) e 1.0 (escluso)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://it.wikipedia.org/wiki/Numeri_pseudo-casuali"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "intero casuale da %1 a %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Restituisce un numero intero casuale compreso tra i due limiti indicati (inclusi)."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://it.wikipedia.org/wiki/Arrotondamento"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "arrotonda"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "arrotonda verso il basso"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "arrotonda verso l'alto"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Arrotonda un numero verso l'alto o verso il basso."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://it.wikipedia.org/wiki/Radice_quadrata"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "assoluto"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "radice quadrata"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Restituisce il valore assoluto del numero."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Restituisce e elevato alla potenza del numero."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Restituisce il logaritmo naturale del numero."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Restituisce il logaritmo in base 10 del numero."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Restituisce l'opposto del numero."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Restituisce 10 elevato alla potenza del numero."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Restituisce la radice quadrata del numero."; +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://it.wikipedia.org/wiki/Funzione_trigonometrica"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Restituisce l'arco-coseno di un numero."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Restituisce l'arco-seno di un numero."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Restituisce l'arco-tangente di un numero."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Restituisce il coseno di un angolo espresso in gradi (non radianti)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Restituisce il seno di un angolo espresso in gradi (non radianti)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Restituisce la tangente di un angolo espresso in gradi (non radianti)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Crea variabile colore..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Crea variabile numero..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Crea variabile stringa..."; +Blockly.Msg["NEW_VARIABLE"] = "Crea variabile..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Nome della nuova variabile:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Tipo della nuova variabile:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "consenti dichiarazioni"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "conː"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://it.wikipedia.org/wiki/Funzione (informatica)"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Esegue la funzione definita dall'utente '%1'."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://it.wikipedia.org/wiki/Funzione (informatica)"; +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"] = "Descrivi questa funzione..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "fai qualcosa"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "per"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Crea una funzione senza output."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +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"; +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:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "a %1 aggiungi il testo %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Aggiunge del testo alla variabile '%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "in minuscolo"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "con Iniziali Maiuscole"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "in MAIUSCOLO"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Restituisce una copia del testo in un diverso formato maiuscole/minuscole."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "prendi la prima lettera"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "prendi la lettera # dalla fine"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "prendi la lettera #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "prendi l'ultima lettera"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "prendi lettera casuale"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "nel testo %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Restituisce la lettera nella posizione indicata."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "conta %1 in %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Contare quante volte una parte di testo si ripete all'interno di qualche altro testo."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Aggiungi un elemento al testo."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "unisci"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Aggiungi, rimuovi o riordina le sezioni per riconfigurare questo blocco testo."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "alla lettera # dalla fine"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "alla lettera #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "all'ultima lettera"; +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"] = "nel testo"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "prendi sotto-stringa dalla prima lettera"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "prendi sotto-stringa dalla lettera # dalla fine"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "prendi sotto-stringa dalla lettera #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Restituisce la porzione di testo indicata."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "trova la prima occorrenza del testo"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "trova l'ultima occorrenza del testo"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "nel testo %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Restituisce l'indice della prima occorrenza del primo testo all'interno del secondo testo. Restituisce %1 se il testo non viene trovato."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 è vuoto"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Restituisce vero se il testo fornito è vuoto."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "crea testo con"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Crea un blocco di testo unendo un certo numero di elementi."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "lunghezza di %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Restituisce il numero di lettere (inclusi gli spazi) nel testo fornito."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "scrivi %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Scrive il testo, numero o altro valore indicato."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Richiedi un numero all'utente."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Richiede del testo da parte dell'utente."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "richiedi numero con messaggio"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "richiedi testo con messaggio"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "sostituisci %1 con %2 in %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "sostituisci tutte le occorrenze di un certo testo con qualche altro testo."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "inverti %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Inverte l'ordine dei caratteri nel testo."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://it.wikipedia.org/wiki/Stringa_(informatica)"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Una lettera, una parola o una linea di testo."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "rimuovi spazi da entrambi gli estremi"; +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["UNNAMED_KEY"] = "senza nome"; +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 +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Restituisce il valore di una variabile."; +Blockly.Msg["VARIABLES_SET"] = "imposta %1 a %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Crea 'prendi %1'"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Imposta questa variabile ad essere pari all'input."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Una variabile denominata '%1' esiste già."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Una variabile nominata '%1' esiste già per un'altro tipo: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Scrivi qualcosa..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/ja.js b/js/msg/js/ja.js new file mode 100644 index 0000000..645047f --- /dev/null +++ b/js/msg/js/ja.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "コメントを追加"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "変数 '%1' は関数 '%2' の定義の一部であるため、削除できません"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "値を変える:"; +Blockly.Msg["CLEAN_UP"] = "ブロックを整理する"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +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/"; +Blockly.Msg["COLOUR_BLEND_RATIO"] = "比率"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "ブレンド"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "2色を与えられた比率(0.0~1.0)で混ぜます。"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://ja.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"; +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"] = "リスト%2の各項目%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' が開始番号から終了番号まで指定した間隔での値をとって、指定したブロックを実行する。"; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "「もしも」のブロックに条件を追加します。"; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Ifブロックに、すべてをキャッチする条件を追加。"; +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"] = "値が true の場合、ステートメントを実行します。"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "値が true 場合は、ステートメントの最初のブロックを行います。それ以外の場合は、ステートメントの 2 番目のブロックを行います。"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "最初の値が true 場合は、ステートメントの最初のブロックを行います。それ以外の場合は、2 番目の値が true の場合、ステートメントの 2 番目のブロックをします。"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "最初の値が true 場合は、ステートメントの最初のブロックを行います。2 番目の値が true の場合は、ステートメントの 2 番目のブロックを行います。それ以外の場合は最後のブロックのステートメントを行います。"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://ja.wikipedia.org/wiki/for文"; +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"] = "値がfalseの間、いくつかのステートメントを実行する。"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "値がtrueの間、いくつかのステートメントを実行する。"; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "%1件のすべてのブロックを削除しますか?"; +Blockly.Msg["DELETE_BLOCK"] = "ブロックを削除"; +Blockly.Msg["DELETE_VARIABLE"] = "変数 '%1' を削除"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "%1か所で使われている変数 '%2' を削除しますか?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "%1 個のブロックを削除"; +Blockly.Msg["DISABLE_BLOCK"] = "ブロックを無効にする"; +Blockly.Msg["DUPLICATE_BLOCK"] = "複製"; +Blockly.Msg["DUPLICATE_COMMENT"] = "コメントを複製"; +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["IOS_CANCEL"] = "キャンセル"; +Blockly.Msg["IOS_ERROR"] = "エラー"; +Blockly.Msg["IOS_OK"] = "OK"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ 入力を追加"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "ステートメントを許可"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "この関数には重複する入力があります。"; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "入力"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "追加"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ 変数を追加"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "削除"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "空の変数名は使用できません。"; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "名前を変更"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "変数名"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +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_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"] = "以下を使ってリストを作成:"; +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"] = "位置:後ろから"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; +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"] = ""; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "リストの最初の項目を返します。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "リスト内の指定位置にある項目を返します。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "リストの最後の項目を返します。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "ランダム アイテム リストを返します。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "リスト内の最初の項目を削除し返します。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "リスト内の指定位置にある項目を削除し、返します。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "リスト内の最後の項目を削除したあと返します。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "リストのランダムなアイテムを削除し返します。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "リスト内の最初の項目を削除します。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "リスト内の指定された項目を削除します。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "リスト内の最後の項目を削除します。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "リスト内にあるアイテムをランダムに削除します。"; +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"] = "最初からサブリストを取得する。"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "端から #のサブリストを取得します。"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "# からサブディレクトリのリストを取得します。"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "リストの指定された部分のコピーを作成してくださ。"; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 は、最後の項目です。"; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 は、最初の項目です。"; +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"] = "リスト項目の最初/最後に出現するインデックス位置を返します。項目が見つからない場合は %1 を返します。"; +Blockly.Msg["LISTS_INLIST"] = "リスト"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1が空"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "リストが空の場合は、true を返します。"; +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"] = "リストの長さを返します。"; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "項目%1を%2回繰り返したリストを作成"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "与えられた値を指定された回数繰り返してリストを作成。"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "%1を逆順に"; +Blockly.Msg["LISTS_REVERSE_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_SET"] = "セット"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "リストの先頭に項目を挿入します。"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "リスト内の指定位置に項目を挿入します。"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "リストの末尾に項目を追加します。"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "リストに項目をランダムに挿入します。"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "リスト内に最初の項目を設定します。"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "リスト内の指定された位置に項目を設定します。"; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "昇順"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "降順"; +Blockly.Msg["LISTS_SORT_TITLE"] = "%1 ( %2 ) に %3 を並び替える"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "リストのコピーを並べ替え"; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "アルファベット順(大文字・小文字の区別無し)"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "数値順"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "アルファベット順"; +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"] = "リストからテキストを作る"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "テキストのリストを区切り記号で区切られた一つのテキストにする"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "テキストを区切り記号で分割したリストにする"; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "区切り記号"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "false"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "true または false を返します。"; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "true"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://ja.wikipedia.org/wiki/不等式"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "両方の入力が互いに等しい場合に true を返します。"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "最初の入力が 2 番目の入力よりも大きい場合は true を返します。"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "最初の入力が 2 番目の入力以上の場合に true を返します。"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "最初の入力が 2 番目の入力よりも小さい場合は true を返します。"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "最初の入力が 2 番目の入力以下の場合に true を返します。"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "両方の入力が互いに等しくない場合に true を返します。"; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://ja.wikipedia.org/wiki/否定"; +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "%1ではない"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "入力が false の場合は、true を返します。入力が true の場合は false を返します。"; +Blockly.Msg["LOGIC_NULL"] = "null"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "null を返します。"; +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"] = "両方の入力が true のときに true を返します。"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "少なくとも 1 つの入力が true のときに true を返します。"; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "テスト"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://ja.wikipedia.org/wiki/%3F:"; +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "false の場合"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "true の場合"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "'テスト' の条件をチェックします。条件が true の場合、'true' の値を返します。それ以外の場合 'false' のを返します。"; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://ja.wikipedia.org/wiki/算術"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "2 つの数の合計を返します。"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "2 つの数の商を返します。"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "2 つの数の差を返します。"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "2 つの数の積を返します。"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "最初の数を2 番目の値で累乗した結果を返します。"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://ja.wikipedia.org/wiki/加法"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "%1 を %2 増やす"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "変数'%1'に数をたす。"; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://ja.wikipedia.org/wiki/数学定数"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "いずれかの共通の定数のを返す: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (無限)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "%1 を %2 以上 %3 以下の範囲に制限"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "指定した上限と下限の間に値を制限する(上限と下限の値を含む)。"; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +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"] = "数字が、偶数、奇数、素数、整数、正数、負数、または特定の数で割り切れるかどうかを判定し、true か false を返します。"; +Blockly.Msg["MATH_IS_WHOLE"] = "は整数"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "%1÷%2の余り"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "2つの数値の割り算の余りを返す。"; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://ja.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"] = "^"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "1未満の正の乱数"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "0.0以上で1.0未満の範囲の乱数を返します。"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "%1から%2までのランダムな整数"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "指定された(上下限を含む)範囲のランダムな整数を返します。"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://ja.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://ja.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"] = "ネイピア数eの数値乗を返す。"; +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"] = "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://ja.wikipedia.org/wiki/三角関数"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "アークコサイン(arccosin)を返す。"; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "アークサイン(arcsin)を返す。"; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "アークタンジェント(arctan)を返す。"; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "(ラジアンではなく)度数の余弦(cosin)を返す。"; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "(ラジアンではなく)度数の正弦(sin)を返す。"; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "(ラジアンではなく)度数の正接(tan)を返す。"; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "色の変数を作る..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "数の変数を作る..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "文字列の変数を作る..."; +Blockly.Msg["NEW_VARIABLE"] = "変数の作成…"; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "新しい変数の名前:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "新しい変数の型:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "ステートメントを許可"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "引数:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://ja.wikipedia.org/wiki/サブルーチン"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "ユーザー定義関数 '%1' を実行します。"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://ja.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"] = "この関数の説明…"; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://ja.wikipedia.org/wiki/サブルーチン"; +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "何かする"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "関数"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "出力なしの関数を作成します。"; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://ja.wikipedia.org/wiki/サブルーチン"; +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_TOOLTIP"] = "1番目の値が true の場合、2番目の値を返します。"; +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の変数すべての名前を変える:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "項目 %1 へテキストを追加 %2"; +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"] = "タイトル ケースに"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "大文字に"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "別のケースに、テキストのコピーを返します。"; +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_LAST"] = "最後の文字を得る"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "ランダムな文字を得る"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; +Blockly.Msg["TEXT_CHARAT_TITLE"] = "テキスト %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "指定された位置に文字を返します。"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "%2に含まれる%1の数を数える"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "とある文が別の文のなかに使われた回数を数える。"; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "テキストへ項目を追加。"; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "結合"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "セクションを追加、削除、または順序変更して、ブロックを再構成。"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "終了位置:後ろから"; +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"] = "の部分文字列を取得;最初から"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "の部分文字列を取得;開始位置:後ろから"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "の部分文字列を取得;開始位置:"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "テキストの指定部分を返します。"; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "で以下のテキストの最初の出現箇所を検索:"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "で以下のテキストの最後の出現箇所を検索:"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "テキスト %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "二番目のテキストの中で一番目のテキストが最初/最後に出現したインデックスを返す。テキストが見つからない場合は%1を返す。"; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1が空"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "与えられたテキストが空の場合は true を返す。"; +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"] = "指定したテキスト、番号または他の値を印刷します。"; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "ユーザーに数値のインプットを求める。"; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "ユーザーにテキスト入力を求める。"; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "メッセージで番号の入力を求める"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "メッセージでテキスト入力を求める"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "%3に含まれる%1を%2に置換"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "文に含まれるキーワードを置換する。"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "%1を逆順に"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "文の文字を逆順にする。"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://ja.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_LEFT"] = "左端のスペースを取り除く"; +Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "右端のスペースを取り除く"; +Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "スペースを 1 つまたは両方の端から削除したのち、テキストのコピーを返します。"; +Blockly.Msg["TODAY"] = "今日"; +Blockly.Msg["UNDO"] = "取り消す"; +Blockly.Msg["UNNAMED_KEY"] = "名前なし"; +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_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["VARIABLE_ALREADY_EXISTS"] = "変数名 '%1' は既に存在しています。"; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "'%2' 型の '%1' という名前の変数が既に存在します。"; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blocklyワークスペース"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "ここへ入力"; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/kab.js b/js/msg/js/kab.js new file mode 100644 index 0000000..42272f3 --- /dev/null +++ b/js/msg/js/kab.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Rnu awennit"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Ur izmir ara ad yekkes amutti '%1' acku yedda di tbadut n twuri '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Beddel azal:"; +Blockly.Msg["CLEAN_UP"] = "Sfeḍ iḥedran"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Iḥedran yettin gebren ilɣa."; +Blockly.Msg["COLLAPSE_ALL"] = "Fneẓ iḥedran"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Fneẓ iḥder"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "ini 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "ini 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "afmiḍi"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "rkwec"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Sexleḍ sin n yiniten d tesmekta (gar 0.0 ar 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://kab.wikipedia.org/wiki/Ini"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Fren ini seg ugalis."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "ini agacuran"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Fren ini s wudem agacuran."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "anili"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "azegzaw"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "azeggaɣ"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "ini s"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Rnu ini s tnecta yettunefk s tesmekta n uzeggaɣ, azegzaw, akked unili. Yessefk akk azalen ad ilin gar 0 akked 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"] = "ffeɣ seg tneddict"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "kemmel s wallus d tneddict d-iteddun"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Ffeɣ si tneddict tamagbart."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Zgel ayen i d-yeqqimen di tneddict-agi, sakin kemmel allus d-iteddun."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Ɣur-k: Iḥder-agi yessefk ad yettwaseqdec di tneddict."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "i yal aferdis %1 di tebdart %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "I yal aferdis n tebdart, mudd azal n uferdis i umutti '%1', sakin selkem tinaḍin."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "siḍen akked %1 seg %2 ar %3 s %4"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Mudd i umutti '%1' azalen seg umḍan n tazwara arama d umḍan n tagara, stmerna n usurif yettunefken, sakin selkem tiaḍin yettunefken."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Rni tawtilt i yiḥder ma."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Rnu tawtilt taneggarut i yiḥder ma igebren akk tinaḍin."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Rnu, kkes, neq ales ales asmizzwer n tgezmiyin akken ad talseḍ tawila n iḥder-agi ma."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "neɣ"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "neɣ ma"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "ma"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "ma yella azal d idetti, ihi selkem kra n tinaḍin."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Ma yella zal d idetti, selkem iḥder amezwaru. Neɣ ma ulac, selkem iḥder wis sin."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Ma yella azal amezwaru d idetti, selkem iḥder amezwaru. Neɣ ma azal wis sin d ucciḍ, selkem iḥ€der wis sin."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Ma yella azal amezwaru d idetti, selkem iḥeder amezwaru. Neɣ, ma yella azal wis sin d idetti, selkem iḥder wis sin. Ma yella ula d yisen seg-sen mačči d idetti, selkem iḥder aneggaru."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "eg"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "Ales %1 n tikal"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Selkem ddeqs n tinaḍin ddeqs n tikal."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "ales arama"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "ales skud"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Skud azal d ucciḍ, selkem ihi tinadin."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Skud azal d idetti, selkem ihi tinadin."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Kkes akk %1 n yiḥedran?"; +Blockly.Msg["DELETE_BLOCK"] = "Kkes iḥder"; +Blockly.Msg["DELETE_VARIABLE"] = "Kkes amutti '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Kkes %1 n useqdec n umutti '%2'?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Kkes %1 n yiḥderan"; +Blockly.Msg["DISABLE_BLOCK"] = "Sens iḥder"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Sleg"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Sleg awennit"; +Blockly.Msg["ENABLE_BLOCK"] = "Sens iḥedran"; +Blockly.Msg["EXPAND_ALL"] = "Snefli iḥedran"; +Blockly.Msg["EXPAND_BLOCK"] = "Snefli iḥder"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Inekcam izɣarayen"; +Blockly.Msg["HELP"] = "Tallelt"; +Blockly.Msg["INLINE_INPUTS"] = "Inekcam srid"; +Blockly.Msg["IOS_CANCEL"] = "Sefsex"; +Blockly.Msg["IOS_ERROR"] = "Tuccḍa"; +Blockly.Msg["IOS_OK"] = "IH"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Rnu anekcum"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Sireg asmizzwer"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Tawuri-a ɣur-s inekcam imsinen."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INEKCAM"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Rnu"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Rnu amutti"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Kkes"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Ur tezmireḍ ara ad tesqedceḍ isem n umutti amaynut."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Snifel isem"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Isem n umutti"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "rnu tabdart tilemt"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Ad d-yerr tabdart n teɣzi 0 ur yegbiren ara ikalasen"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "tabdart"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Rnu, kkes, neɣ ales asmizzwer n tgezmiyin akken ad talseḍ tawila n iḥder-agi n tebdart."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "rnu tabdart s"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Ad yernu aferdis ar tebdart."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Ad yernu tabdart s umḍan n iferdisen."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "amezwaru"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# si tagara"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_GET"] = "awi"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "awi u kkes"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "aneggaru"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "agacuran"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "kkes"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Ad d-yerr aferdis amezwaru n tebdart.."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Ad d-yerr aferdis n wadig yettwammlen deg tabdart."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Ad d-yerr aferdis aneggaru di tebdart."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Ad yerr aferdis agacuran di tebdart."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Ad yekkes sakin ad -yerr aferdis amezwaru di tebdart."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Ad yekkes sakin ad d-yerr aferdis n wadig yettwammlen deg tabdart."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Ad yekkes sakin ad -yerr aferdis aneggaru di tebdart."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Ad yekkes sakin ad d-yerr aferdis agacuran di tebdart."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Ad yekkes aferdis amezwaru n tebdart.."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Ad yekkes aferdis n wadig yettwammlen deg tabdart."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Ad yekkes aferdis aneggaru di tebdart."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Ad yekkes aferdis agacuran di tebdart."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "ar # si tagara"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "ar #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "ar tagara"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "awi-d tabdart tasnawant si tazwara"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "awi-d tabdart tasnawant seg # si tagara"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "awi-d tabdart tasnawant seg #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Ad yernu anɣel n uḥric yettwammlen n tebdart."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 d aferdis aneggaru."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 d aferdis amezwaru."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "aff-d timeḍriwt tamezwarut n uferdis"; +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"] = "af-d timeḍriwt taneggarut n uferdis"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Ad d-yerr amatar n tmeḍriwt tamezwarut/taneggarut n uferdis amewaru deg tebdart. Ad d-yerr %1 ma yella ulac aferdis."; +Blockly.Msg["LISTS_INLIST"] = "di tebdart"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 d ilem"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Ad d-yerr idetti ma yella tabdart d tilemt."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "teɣzi n %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Ad d-yerr teɣzi n tebdart."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "ad yernu tabdart s uferdis %1 s tmeḍriwt %2"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Ad yernu tabdart inetmen n wazal yettunefken ddeqs n tikal s umḍan yettwammlen."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "tti %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Tti anɣel n tebdart."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "am"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "ger s"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "sbadu"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Ad iger aferdis di tazwara n tebdart."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Ad iger aferdis n wadig yettwammlen deg tabdart."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Ad yernu aferdis ar tagara n tebdart."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Ad iger aferdis s wudem agacuran deg tebdart."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Ad d-yerr aferdis amezwaru di tebdart."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Ad yesbadu aferdis n wadig yettwammlen deg tabdart."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Ad d-yerr aferdis aneggaru di tebdart."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Ad yesbadu aferdis agacuran di tebdart."; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "igemmen"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "amnusruy"; +Blockly.Msg["LISTS_SORT_TITLE"] = "smizzwer %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Smizzwer anɣel n tebdart."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "agemmayan, anef i truẓi n usekkil"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "umḍin"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "agemmayan"; +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"] = "rnu tabdart seg uḍris"; +Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "rnu aḍris si tebdart"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "ad yesdukel tabdart n yiḍrisen deg iwen s usnabraz."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Ad yegzem aḍris ɣef ddeqs n tebdarin n yoiḍrisen, s unegzum yal anabraz."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "s unabraz"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "ucciḍ"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Ad d-yerr idetti neɣ ucciḍ"; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "idetti"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Ad yerr idetti ma yella i sin n inekcam d imegduya."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Ad d-yerr idetti ma yella anekcam amezwaru meqqeṛ ɣef wis sin."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Ad d-yerr idetti ma yella anekcam amezwaru meqqeṛ neɣ yegda wis sin."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Ad d-yerr idetti ma yella anekcam amezwaru meẓẓi ɣef wis sin."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Ad d-yerr idetti ma yella anekcam amezwaru meẓẓi neɣ yegda wis sin."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Ad d-yerr idetti ma yella i sin n inekcam mačči d imegduya."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "mačči %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Ad d-yerr idetti ma yella anekcam d ucciḍ. Ad d-yerr ucciḍ ma yella anekcam d idetti."; +Blockly.Msg["LOGIC_NULL"] = "Ilem"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Ad d-yerr ilem"; +Blockly.Msg["LOGIC_OPERATION_AND"] = "akked"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "neɣ"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Ad d-yerr idetti ma yella inekcam d idettiyen."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Ad d-yerr idetti ma yella ɣarsum yiwen seg inekcam d idetti."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "sekyed"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "ma ucciḍ"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "ma d idetti"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Senqed tawtilt deg 'sekyed'. Ma yella d idetti, ad d-yerr azal 'ma idetti', ma ulac ad d-yerr azam 'ma ucciḍ'."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Ad d-yerr tmerni n sin n imiḍanen."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Ad d-yerr aful n sin n imḍanen."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Ad d-yerr tmernit n sin n imiḍanen."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Ad d-yerr tukksa gar sin n imiḍanen."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Ad d-yerr amḍan amezwaru uzmir wis sin."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://kab.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 seg X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Ad d-yerr arctangent n waggaz (X, Y) s tfesniwin deg -180 ɣer 180."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "snifel %1 s %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Rnu amḍan i umutti '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Ad d-yerr yiwet seg tmezgiyin yettwasnen : π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), neɣ ∞ (ifeḍ)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "Err tamara i %1 gar %2 akked %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Err tamara n umiḍan akken ad yili gar snat n tlisa (ddant)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "d ubṭay ɣef"; +Blockly.Msg["MATH_IS_EVEN"] = "d ayugan"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "d uzdir"; +Blockly.Msg["MATH_IS_ODD"] = "d aryugan"; +Blockly.Msg["MATH_IS_POSITIVE"] = "d ufrar"; +Blockly.Msg["MATH_IS_PRIME"] = "d amenzu"; +Blockly.Msg["MATH_IS_TOOLTIP"] = "Senqed ma yella amḍan d ayugan, d aryugan, d amenzu, d ummid, d ufrar, d uzdir, neɣ d ybṭay ɣef kra n umḍan. Ad d-yerr idettu neɣ ucciḍ."; +Blockly.Msg["MATH_IS_WHOLE"] = "d ummid"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "tasagert n %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Ad d-yerr tasagert n beṭṭu n sin n imḍanen."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Amḍan."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "talemmast n tebdart"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "afellay n tebdart"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "tanammast n tebdart"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "adday n tebdart"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "Tigwtiwin n tebdart"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "aferdis agacuran n tebdart"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "azza n tebdart"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "Timernit n tebdart"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Ad d-yerr talemmas( tasnamḍant) n wazalen umḍinen di tebdart."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Ad d-yerr amḍan ameqqran di tebdart."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Ad d-yerr amḍan n anammas n tebdart."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Ad d-yerr amḍan ameẓẓyan di tebdart."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Ad d-yerr tabdart n iferdisen i d-yettuɣalen s waṭas di tebdart."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Ad d-yerr aferdis seg tebdart s wudem agacuran."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Ad d-yerr azza n tebdart."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Ad d-yerr timernit n imḍanen meṛṛa deg tebdart."; +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"] = "tirẓi tagacurant"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Ad d-yerr tirẓi tagacurant gar 0.0 (yedda) akked 1.0 (ur yeddi ara)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "ummid agacuran gar %1 akked %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Ad d-yerr ummid agacuran gar snat n tlisa, ddant."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "Saẓ"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "Saẓ d akesser"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "Saẓ d asawen"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Saẓ amiḍan d asawen neɣ d akesser."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "azal amagdez"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "aẓar uzmir 2"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Ad d-yerr azal amagdez n umiḍan."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Ad d-yerr e uzmir amiḍan."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Ad d-yerr alugaritm agamawan n umiḍan."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Ad d-yerr alugaritm 10 n umiḍan."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Ad d-yerr ugmiḍ n umḍan."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Ad d-yerr 10 uzmir amiḍan."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Ad d-yerr aẓaṛ uzmir sin n umiḍan."; +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"] = "Ad d-yerr taganzi n ukusinus n umḍan."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Ad d-yerr taganzi n usinus n umḍan."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Ad d-yerr taganzi n teslayt n umiḍan."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Ad d-yerr akusinus n teɣmert s tfesna (mačči aṛadyan)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Ad d-yerr asinus n teɣmert s tfesna (mačči aṛadyan)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Ad d-yerr taslayt n teɣmert s tfesna (mačči aṛadyan)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Rnu amutti ini..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Rnu amutti amḍan..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Rnu amutti azrir n yisekkilen..."; +Blockly.Msg["NEW_VARIABLE"] = "Rnu amutti..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Isem amaynut n wazal:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Anaw amaynut n umutti:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "Sireg asmizzwer"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "s:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Selkem tawuri '%1' yesbadu u seqdac."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Selkem tawuri '%1' yesbadu useqdace sakin seqdec agmuḍ-is."; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "s:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "rnu '%1'"; +Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Seglem tawuri-agi..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "eg kra"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "i"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Rnu tawuri s war anekcam."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "tuɣalin"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "ad yernu tawuri s tuffɣa."; +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Ɣur-k: Tawuri-agi ɣur-s iɣewwaṛen usligen."; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Sebruṛeq tabadut n twuri"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "ma yella azal d idetti, ad d-yerr azal-nniḍen wis sin."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Ɣur-k: Iḥder-agi yezmer ur yettwaseqdac ara ala di tebadut n twuri-agi."; +Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "isem n unekcum:"; +Blockly.Msg["PROCEDURES_MUTATORARG_TOOLTIP"] = "rnu anekcam ar twuri-agi."; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TITLE"] = "inekcam"; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TOOLTIP"] = "Rnu, kkes neɣ ales asmizzwer n inekcam i twuri-agi."; +Blockly.Msg["REDO"] = "Uɣal"; +Blockly.Msg["REMOVE_COMMENT"] = "Kkes awennit"; +Blockly.Msg["RENAME_VARIABLE"] = "Beddel isem n umutti..."; +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Beddel akk isem n yimuttiyen '%1' ar:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "Rnu aḍris %2 ar %1"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Rnu aḍris ar umutti '%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "s usekkil ameẓẓyan"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "s Umeqqran Di Tazwara n Yal Awal."; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "s USEKKIL AMEQQRAN"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Ad d-yerr anɣel n uḍris s truẓi-nniḍen."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "awi-d asekkil amezwaru"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "awi-d asekkil # si tagara"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "awi asekkel #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "awi-d asekkil aneggaru"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "awi-d asekkil s wudem agacuran"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "deg uḍris %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Ad d-yerr asekkil deg wuṭṭun yettwammlen."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "amḍan %1 ɣef %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Ad isiḍen amḍan n tmeḍriwt n uḍris deg ayeḍ."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Rnu aferdis ar uḍris."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "sdukkel"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Rnu, kkes, neɣ ales asmizzwer n tgezmiyin akken ad talseḍ tawila n iḥder-agi."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "arama d asekkil # si tagara"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "arama d asekkil #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "arama d asekkil aneggaru"; +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"] = "deg uḍris"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "awi-d azrir asnawan seg usekkil amezwaru"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "awi-d azrir asnawan seg usekkil # si tagara"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "awi-d azrir asnawan seg usekkil #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Ad d-yerr aḥric yettwammlen deg uḍris."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "af-d timeḍriwt tamezwarut n uḍris"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "af-d timeḍriwt taneggarut deg uḍris"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "deg uḍris %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Ad d-yerr amatar n tmeḍriwt tamezwarut/taneggarut n uḍris amewaru deg uḍris wis sin. Ad d-yerr %1 ma yella ulac adris."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 d ilem"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Add d-yerr idetti ma yella aḍris d ilem."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "rnu aḍṛis s"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Ad yernu taceqquft n uḍris s usdukel gar yal amḍan n iferdisen."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "teɣzi n %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Ad d-yerr amḍan n isekkilen (ddab ula d imellalen) deg uḍris d-ittunefken."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "ad d-yesken %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Sken aḍris, amḍan neɣ azal-nniḍen d-ittunefken."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Suter amḍan i useqdac."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Suter aḍris i useqdac."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "aneftaɣ i umḍan s yizen"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "aneftaɣ i uḍris s yizen"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "semselsi %1 s %2 di %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "As isemselsi akk timeḍriwin n uḍris s wayeḍ."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "tti %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Ad yetti asmizzwer n isekkilen deg uḍris."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Asekkil, awal neɣ izirig n uḍris."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "Tukksa n isekkilen imellalen seg sin n idisan"; +Blockly.Msg["TEXT_TRIM_OPERATOR_LEFT"] = "tukksa n isekkilen seg uzelmaḍ"; +Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "tukksa n isekkilen seg uyeffus"; +Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "Ad d-yerr anɣel n uḍris s isekkilen ilmawen yettwakksen seg ixf neɣ i sin."; +Blockly.Msg["TODAY"] = "Ass-a"; +Blockly.Msg["UNDO"] = "Err-d"; +Blockly.Msg["UNNAMED_KEY"] = "warisem"; +Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "aferdis"; +Blockly.Msg["VARIABLES_GET_CREATE_SET"] = "Rnu 'sbadu %1'"; +Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Ad d-yerr azal n umutti-agi."; +Blockly.Msg["VARIABLES_SET"] = "sbadu %1 ar %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Rnu 'awi-d %1'"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Ad yesbadu amutti-agi akken ad yegdu azal n unekcam."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Amutti s yisem '%1' yella yakan."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Amutti s yisem '%1' yella yakan i wanaw-nniḍen: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Ini kra..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/ko.js b/js/msg/js/ko.js new file mode 100644 index 0000000..d02c9b1 --- /dev/null +++ b/js/msg/js/ko.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "주석 추가"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "'%2' 함수 정의의 일부이기 때문에 '%1' 변수를 삭제할 수 없습니다"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "값 바꾸기:"; +Blockly.Msg["CLEAN_UP"] = "블록 정리"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +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/"; +Blockly.Msg["COLOUR_BLEND_RATIO"] = "비율"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "혼합"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "두 색을 주어진 비율로 혼합 (0.0 - 1.0)"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://ko.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"; +Blockly.Msg["COLOUR_RGB_RED"] = "빨강"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "색"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "빨강,파랑,초록의 값을 이용하여 색을 만드십시오. 모든 값은 0과 100 사이에 있어야 합니다."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://ko.wikipedia.org/wiki/%EC%A0%9C%EC%96%B4_%ED%9D%90%EB%A6%84"; +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://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"; +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "각 항목에 대해 %1 목록으로 %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "리스트 안에 들어있는 각 아이템들을, 순서대로 변수 '%1' 에 한 번씩 저장시키고, 그 때 마다 명령을 실행합니다."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://ko.wikipedia.org/wiki/For_%EB%A3%A8%ED%94%84"; +Blockly.Msg["CONTROLS_FOR_TITLE"] = "으로 계산 %1 %2에서 %4을 이용하여 %3로"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "변수 \"%1\"은 지정된 간격으로 시작 수에서 끝 수까지를 세어 지정된 블록을 수행해야 합니다."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "\"만약\" 블럭에 조건 검사를 추가합니다."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "\"만약\" 블럭의 마지막에, 모든 검사 결과가 거짓인 경우 실행할 부분을 추가합니다."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://ko.wikipedia.org/wiki/%EC%A1%B0%EA%B1%B4%EB%AC%B8"; +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "섹션을 추가, 제거하거나 순서를 변경하여 이 if 블럭을 재구성합니다."; +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://ko.wikipedia.org/wiki/For_루프"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "하기"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "%1회 반복"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "여러 번 반복해 명령들을 실행합니다."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://ko.wikipedia.org/wiki/While_%EB%A3%A8%ED%94%84"; +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_VARIABLE"] = "'%1' 변수를 삭제합니다"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "'%2' 변수에서 %1을(를) 삭제하시겠습니까?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "블록 %1개 삭제"; +Blockly.Msg["DISABLE_BLOCK"] = "블록 비활성화"; +Blockly.Msg["DUPLICATE_BLOCK"] = "복제"; +Blockly.Msg["DUPLICATE_COMMENT"] = "주석 복제하기"; +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["IOS_CANCEL"] = "취소"; +Blockly.Msg["IOS_ERROR"] = "오류"; +Blockly.Msg["IOS_OK"] = "확인"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ 입력 추가"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "이 기능은 중복된 입력이 있습니다."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "입력"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "추가"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ 변수 추가"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "삭제"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "비어있는 변수 이름을 사용할 수 없습니다."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "이름 바꾸기"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "변수 이름"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +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_TOOLTIP"] = "섹션을 추가, 제거하거나 순서를 변경하여 이 리스트 블럭을 재구성합니다."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "리스트 만들기"; +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"] = "마지막 번째 위치부터, # 번째"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; +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"] = ""; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "첫 번째 아이템을 찾아 돌려줍니다."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "목록에서 특정 위치의 항목을 반환합니다."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "마지막 아이템을 찾아 돌려줍니다."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "리스트의 아이템들 중, 랜덤으로 선택해 돌려줍니다."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "첫 번째 아이템을 찾아내 돌려주고, 그 아이템을 리스트에서 삭제합니다."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "목록의 특정 위치에 있는 항목을 제거하고 반환합니다."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "마지막 아이템을 찾아내 돌려주고, 그 아이템을 리스트에서 삭제합니다."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "목록에서 임의 위치의 아이템을 찾아내 삭제하고 돌려줍니다."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "리스트에서 첫 번째 아이템을 삭제합니다."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "목록에서 특정 위치의 항목을 삭제합니다."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "리스트에서 마지막 아이템을 찾아 삭제합니다."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "리스트에서 랜덤하게 아이템을 삭제합니다."; +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"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "첫 번째 위치부터, 서브 리스트 추출"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "마지막부터 # 번째 위치부터, 서브 리스트 추출"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "처음 # 번째 위치부터, 서브 리스트 추출"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "목록의 특정 부분에 대한 복사본을 만듭니다."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1은(는) 마지막 항목입니다."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1은 첫 번째 항목입니다."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "처음으로 나타난 위치"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "마지막으로 나타난 위치"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "목록에서 항목이 처음 또는 마지막으로 발생한 색인 위치를 반환합니다. 항목이 없으면 %1을 반환합니다."; +Blockly.Msg["LISTS_INLIST"] = "리스트"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1이 비어 있습니다"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "목록이 비었을 때 참을 반환합니다."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; +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"; +Blockly.Msg["LISTS_REPEAT_TITLE"] = "%1을 %2번 넣어, 리스트 생성"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "지정된 값을, 지정된 개수 만큼 넣어, 목록을 생성합니다."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "%1 뒤집기"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "리스트의 복사본을 뒤집습니다."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; +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"] = "항목을 목록의 처음 위치에 삽입합니다."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "목록의 특정 위치에 항목을 삽입합니다."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "리스트의 마지막에 아이템을 추가합니다."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "목록에서 임의 위치에 아이템을 삽입합니다."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "첫 번째 위치의 아이템으로 설정합니다."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "목록의 특정 위치에 있는 항목으로 설정합니다."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "오름차순"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "내림차순"; +Blockly.Msg["LISTS_SORT_TITLE"] = "정렬 %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "목록의 사본을 정렬합니다."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "알파벳순 (대소문자 구분 안 함)"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "숫자순"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "알파벳순"; +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_HELPURL"] = "https://ko.wikipedia.org/wiki/%EC%A7%84%EB%A6%BF%EA%B0%92"; +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "참 혹은 거짓 모두 반환합니다."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "참"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://ko.wikipedia.org/wiki/부등식"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "두 값이 같으면, 참(true) 값을 돌려줍니다."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "첫 번째 값이 두 번째 값보다 크면, 참(true) 값을 돌려줍니다."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "첫 번째 값이 두 번째 값보다 크거나 같으면, 참(true) 값을 돌려줍니다."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "첫 번째 값이 두 번째 값보다 작으면, 참(true) 값을 돌려줍니다."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "첫 번째 값이 두 번째 값보다 작거나 같으면, 참(true) 값을 돌려줍니다."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "두 값이 서로 다르면, 참(true) 값을 돌려줍니다."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://ko.wikipedia.org/wiki/%EB%B6%80%EC%A0%95"; +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"; +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "빈 값을 반환합니다."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "그리고"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://ko.wikipedia.org/wiki/%EB%B6%88_%EB%85%BC%EB%A6%AC"; +Blockly.Msg["LOGIC_OPERATION_OR"] = "또는"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "두 값이 모두 참(true) 값이면, 참 값을 돌려줍니다."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "적어도 하나의 값이 참일 경우 참을 반환합니다."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "테스트"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://ko.wikipedia.org/wiki/물음표"; +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "만약 거짓이라면"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "만약 참이라면"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "'test'의 조건을 검사합니다. 조건이 참이면 'if true' 값을 반환합니다. 거짓이면 'if false' 값을 반환합니다."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://ko.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_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.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://ko.wikipedia.org/wiki/수학_상수"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "일반적인 상수 값들 중 하나를 돌려줍니다. : π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://ko.wikipedia.org/wiki/클램핑_(그래픽)"; +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "%1의 값을, 최소 %2 최대 %3으로 조정"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "어떤 수를, 특정 범위의 값이 되도록 강제로 조정합니다."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "가 다음 수로 나누어 떨어지면 :"; +Blockly.Msg["MATH_IS_EVEN"] = "가 짝수(even) 이면"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "가 음(-)수 이면"; +Blockly.Msg["MATH_IS_ODD"] = "가 홀수(odd) 이면"; +Blockly.Msg["MATH_IS_POSITIVE"] = "가 양(+)수 이면"; +Blockly.Msg["MATH_IS_PRIME"] = "가 소수(prime) 이면"; +Blockly.Msg["MATH_IS_TOOLTIP"] = "어떤 수가 짝 수, 홀 수, 소 수, 정 수, 양 수, 음 수, 나누어 떨어지는 수 인지 검사해 결과값을 돌려줍니다. 참(true) 또는 거짓(false) 값을 돌려줌."; +Blockly.Msg["MATH_IS_WHOLE"] = "가 정수이면"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "%1 ÷ %2의 나머지"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "첫 번째 수를 두 번째 수로 나눈, 나머지 값을 돌려줍니다."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "x"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://ko.wikipedia.org/wiki/수_(수학)"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "수"; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; +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"] = "리스트에 들어있는 수(값)들에 대해, 산술 평균(arithmetic mean) 한 값을 돌려줍니다."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "리스트에 들어있는 수(값) 들 중, 가장 큰(max) 수(값)를 돌려줍니다."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "리스트에 들어있는 수(값) 들 중, 중간(median) 수(값)를 돌려줍니다."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "리스트에 들어있는 수(값) 들 중, 가장 작은(min) 수(값)를 돌려줍니다."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "리스트에 들어있는 아이템들 중에서, 가장 여러 번 들어있는 아이템들을 리스트로 만들어 돌려줍니다. (최빈값, modes)"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "목록에서 임의의 아이템을 돌려줍니다."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "이 리스트의 표준 편차를 반환합니다."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "리스트에 들어있는 수(값)들을, 모두 합(sum) 한, 총합(sum)을 돌려줍니다."; +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"] = "임의 분수"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "0.0 (포함)과 1.0 (배타적) 사이의 임의 분수 값을 돌려줍니다."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "랜덤정수(%1<= n <=%2)"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "두 주어진 제한된 범위 사이의 임의 정수값을 돌려줍니다."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://ko.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://ko.wikipedia.org/wiki/제곱근"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "절대값"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "제곱근"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "어떤 수의 절대값(absolute)을 계산한 결과를, 정수값으로 돌려줍니다."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "e의 거듭제곱 값을 반환합니다."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "어떤 수의, 자연로그(natural logarithm) 값을 돌려줍니다.(밑 e, 예시 log e x)"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "어떤 수의, 기본로그(logarithm) 값을 돌려줍니다.(밑 10, 예시 log 10 x)"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "음(-)/양(+), 부호를 반대로 하여 값을 돌려줍니다."; +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://ko.wikipedia.org/wiki/삼각함수"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "어떤 수에 대한, acos(arccosine) 값을 돌려줍니다."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "어떤 수에 대한, asin(arcsine) 값을 돌려줍니다."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "어떤 수에 대한, atan(arctangent) 값을 돌려줍니다."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "각도의 코사인을 반환합니다. (라디안 아님)"; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "각도의 사인을 반환합니다. (라디안 아님)"; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "각도의 탄젠트를 반환합니다. (라디안 아님)"; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "색 변수 만들기..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "숫자 변수 만들기...."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "문자열 변수 만들기..."; +Blockly.Msg["NEW_VARIABLE"] = "변수 만들기..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "새 변수 이름:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "새 변수 유형:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "서술 허가"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "사용:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://ko.wikipedia.org/wiki/함수_(프로그래밍)"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "미리 정의해 둔 '%1' 함수를 실행합니다."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://ko.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"] = "이 함수를 설명하세요..."; +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"] = "함수 이름"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "함수"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "실행 후, 결과 값을 돌려주지 않는 함수를 만듭니다."; +Blockly.Msg["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"; +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"; +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' 변수 이름을 바꾸기:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg["TEXT_APPEND_TITLE"] = "다음 %1 내용 덧붙이기 %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "'%1' 변수의 끝에 일부 텍스트를 덧붙입니다."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "소문자로"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "첫 문자만 대문자로"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "대문자로"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "영문 대소문자 형태를 변경해 돌려줍니다."; +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"; +Blockly.Msg["TEXT_CHARAT_LAST"] = "에서, 마지막 문자 얻기"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "에서, 랜덤하게 한 문자 얻기"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; +Blockly.Msg["TEXT_CHARAT_TITLE"] = "텍스트 %1 %2에서"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "특정 번째 위치에서, 문자를 얻어내 돌려줍니다."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "%2에서 %1 숫자 세기"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "다른 어떤 텍스트에서 어떤 텍스트가 나타난 횟수를 셉니다."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "텍스트에 항목을 추가합니다."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "가입"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "섹션을 추가, 제거하거나 순서를 변경하여 이 텍스트 블럭을 재구성합니다."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "끝에서부터 # 번째 문자까지"; +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"; +Blockly.Msg["TEXT_GET_SUBSTRING_INPUT_IN_TEXT"] = "문장"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "에서, 처음부터 얻어냄"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "에서, 마지막에서 # 번째부터 얻어냄"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "에서, 처음부터 # 번째 문자부터 얻어냄"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "문장 중 일부를 얻어내 돌려줍니다."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "에서 다음 문장이 처음으로 나타난 위치 찾기 :"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "에서 다음 문장이 마지막으로 나타난 위치 찾기 :"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "문장 %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "두 번째 텍스트에서 첫 번째 텍스트가 처음 또는 마지막으로 발생한 색인 위치를 반환합니다. 텍스트가 없으면 %1을 반환합니다."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1이 비어 있습니다"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "입력된 문장이, 빈 문장(\"\")이면 참(true) 값을 돌려줍니다."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; +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"; +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"; +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"; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "수에 대해 사용자의 입력을 받습니다."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "문장에 대해 사용자의 입력을 받습니다."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "메시지를 활용해 수 입력"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "메시지를 활용해 문장 입력"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "%3에서 %2을(를) %1(으)로 바꾸기"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "%1 뒤집기"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "텍스트 안의 문자의 순서를 반전시킵니다."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://ko.wikipedia.org/wiki/문자열"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "문자, 단어, 문장."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; +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["UNNAMED_KEY"] = "이름이 없는"; +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)"; +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "변수에 저장 되어있는 값을 돌려줍니다."; +Blockly.Msg["VARIABLES_SET"] = "%1를 %2로 설정"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "'%1 값 읽기' 블럭 생성"; +Blockly.Msg["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)"; +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "변수의 값을 입력한 값으로 변경해 줍니다."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "'%1' 변수는 이미 존재합니다."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "'%1' 변수는 다른 유형에 대해 이미 존재합니다: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "말해 보세요..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/lb.js b/js/msg/js/lb.js new file mode 100644 index 0000000..4fa4404 --- /dev/null +++ b/js/msg/js/lb.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Bemierkung derbäisetzen"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Wäert änneren:"; +Blockly.Msg["CLEAN_UP"] = "Bléck opraumen"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // 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"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +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"] = "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."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "blo"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "gréng"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "rout"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "fierwe mat"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Create a colour with the specified amount of red, green, and blue. All values must be between 0 and 100."; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "break out of loop"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "continue with next iteration of loop"; // untranslated +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"] = "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"] = "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 +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"] = "soss"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "else if"; // untranslated +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "wann"; +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"; // untranslated +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"] = "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_VARIABLE"] = "Delete the '%1' variable"; // untranslated +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg["DELETE_X_BLOCKS"] = "%1 Bléck läschen"; +Blockly.Msg["DISABLE_BLOCK"] = "Block desaktivéieren"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Eng Kopie maachen"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Bemierkung kopéieren"; +Blockly.Msg["ENABLE_BLOCK"] = "Block aktivéieren"; +Blockly.Msg["EXPAND_ALL"] = "Bléck opklappen"; +Blockly.Msg["EXPAND_BLOCK"] = "Block opklappen"; +Blockly.Msg["EXTERNAL_INPUTS"] = "External Inputs"; // untranslated +Blockly.Msg["HELP"] = "Hëllef"; +Blockly.Msg["INLINE_INPUTS"] = "Inline Inputs"; // untranslated +Blockly.Msg["IOS_CANCEL"] = "Ofbriechen"; +Blockly.Msg["IOS_ERROR"] = "Feeler"; +Blockly.Msg["IOS_OK"] = "OK"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Add Input"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INPUTS"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Derbäisetzen"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Variabel derbäisetzen"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Läschen"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Dir kënnt keen eidelen Numm fir eng Variabel benotzen."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Ëmbenennen"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Numm vun der Variabel"; +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"] = "Lëscht"; +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"] = "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"] = "# 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 +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "lescht"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "Zoufall"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "ewechhuelen"; +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"] = "Returns the item at the specified position in a list."; // 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"] = "Schéckt en zoufällegt Element aus enger Lëscht zréck."; +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"] = "Removes and returns the item at the specified position in a list."; // 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"] = "Removes the item at the specified position in a list."; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Hëlt dat lescht Element aus enger Lëscht eraus."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Hëlt en zoufällegt Element aus enger Lëscht eraus."; +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_FROM_END_TOOLTIP"] = "%1 ass dat éischt Element."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 ass dat éischt Element."; +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 %1 if item is not found."; // untranslated +Blockly.Msg["LISTS_INLIST"] = "an der Lëscht"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 ass eidel"; +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"] = "Längt vu(n) %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_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "%1 ëmdréinen"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "als"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "asetzen op"; +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"] = "Inserts the item at the specified position in a list."; // untranslated +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"] = "Sets the item at the specified position in a list."; // 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 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"] = "%1 %2 %3 zortéieren"; +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"] = "numeresch"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alphabetesch"; +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"] = "falsch"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Schéckt entweder richteg oder falsch zréck."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "wouer"; +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_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "net %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Returns true if the input is false. Returns false if the input is true."; // untranslated +Blockly.Msg["LOGIC_NULL"] = "null"; +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"] = "an"; +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"] = "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_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"] = "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."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Return the first number raised to the power of the second number."; // untranslated +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated +Blockly.Msg["MATH_CHANGE_TITLE"] = "änneren %1 ëm %2"; +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 +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // 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"] = "is divisible by"; // untranslated +Blockly.Msg["MATH_IS_EVEN"] = "ass gerued"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "ass negativ"; +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 +Blockly.Msg["MATH_IS_WHOLE"] = "ass eng ganz Zuel"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated +Blockly.Msg["MATH_MODULO_TITLE"] = "Rescht vu(n) %1 ÷ %2"; +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"] = "Eng Zuel."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +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 +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "modes of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "zoufällegt Element vun enger Lëscht"; +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"] = "Schéckt de gréisste Wäert aus enger Lëscht zréck."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Return the median number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Return the smallest number in the list."; // untranslated +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"] = "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"] = "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 +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Return e to the power of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Return the natural logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Return the base 10 logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Return the negation of a number."; // untranslated +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_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"; // untranslated +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["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "Variabel uleeën..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Neie variabelen Numm:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "allow statements"; // untranslated +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "mat:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +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"] = "'%1' uleeën"; +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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "eppes maachen"; +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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "zréck"; +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"] = "inputs"; // untranslated +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TOOLTIP"] = "Add, remove, or reorder inputs to this function."; // untranslated +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_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "to %1 append text %2"; // 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"] = "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"] = "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_LAST"] = "get last letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "get random letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "am Text %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returns the letter at the specified position."; // untranslated +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "En Element bei den Text derbäisetzen."; +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 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 +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_OPERATOR_FIRST"] = "find first occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "find last occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "am Text %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 ass eidel"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Returns true if the provided text is empty."; // untranslated +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"] = "Längt vu(n) %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 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"] = "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_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "%1 duerch %2 a(n) %3 ersetzen"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "All Kéiers wou e bestëmmten Text do ass duerch en aneren Text ersetzen."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Dréint d'Reiefolleg vun den Zeechen am Text ëm."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "E Buschtaf, e Wuert oder eng Textzeil."; +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"] = "Haut"; +Blockly.Msg["UNDO"] = "Réckgängeg maachen"; +Blockly.Msg["UNNAMED_KEY"] = "ouni Numm"; +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 +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["VARIABLE_ALREADY_EXISTS"] = "A variable named '%1' already exists."; // untranslated +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Sot eppes..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/lki.js b/js/msg/js/lki.js new file mode 100644 index 0000000..e5fe87d --- /dev/null +++ b/js/msg/js/lki.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "گةپ دائن"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "تةغییر مقدار:"; +Blockly.Msg["CLEAN_UP"] = "تمیزکردن بلاکةل"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "نسبت"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "قاتی پاتی"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "دو رنگ را با نسبت مشخص‌شده مخلوط می‌کند (۰٫۰ - ۱٫۰)"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://lki.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"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "سۆر"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "رةنگ وة"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "ساخت یک رنگ با مقدار مشخص‌شده‌ای از سۆر، سؤز و کاوو. همهٔ مقادیر باید بین ۰ تا ۱۰۰ باشند."; +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"] = "با تعداد %1 از %2 به %3 با گام‌های %4"; +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://lki.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_VARIABLE"] = "Delete the '%1' variable"; // untranslated +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg["DELETE_X_BLOCKS"] = "حةذف %1 بلاکةل"; +Blockly.Msg["DISABLE_BLOCK"] = "إ کار کةتن(غیرفعال‌سازی) بلاک"; +Blockly.Msg["DUPLICATE_BLOCK"] = "کؤپی کردن"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +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["IOS_CANCEL"] = "Cancel"; // untranslated +Blockly.Msg["IOS_ERROR"] = "Error"; // untranslated +Blockly.Msg["IOS_OK"] = "OK"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Add Input"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INPUTS"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Add"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Add Variable"; // untranslated +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Delete"; // untranslated +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "You can't use an empty variable name."; // untranslated +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Rename"; // untranslated +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Variable name"; // 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"] = "فهرستی با طول صفر شامل هیچ رکورد داده‌ای بر می‌گرداند."; +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"] = "ایجاد فهرست با"; +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"] = "# إژ دؤما آخر"; +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"] = "اولین مورد یک فهرست را بر می‌گرداند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "موردی در محل مشخص‌شده بر می‌گرداند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "آخرین مورد در یک فهرست را بر می‌گرداند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "یک مورد تصادفی در یک فهرست بر می‌گرداند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "اولین مورد مشخص‌شده در فهرست را حذف و بر می‌گرداند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "مورد در محل مشخص‌شده در فهرست را حذف و بر می‌گرداند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "آخرین مورد مشخص‌شده در فهرست را حذف و بر می‌گرداند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "مورد تصادفی‌ای را در فهرست حذف و بر می‌گرداند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "اولین مورد را در یک فهرست حذف می‌کند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "مورد مشخص‌شده در موقعیت مشخص در یک فهرست را حذف و بر می‌گرداند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "آخرین مورد را در یک فهرست حذف می‌کند."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "یک مورد تصادفی را یک فهرست حذف می‌کند."; +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"] = "گرفتن زیرمجموعه‌ای از ابتدا"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "گرفتن زیرمجموعه‌ای از # از انتها"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "گرفتن زیرمجموعه‌ای از #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "کپی از قسمت مشخص‌شدهٔ لیست درست می‌کند."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 آخرین مورد است."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 اولین مورد است."; +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"] = "شاخصی از اولین/آخرین رخ‌داد مورد در فهرست را بر می‌گرداند. %1 بر می‌گرداند اگر آیتم موجود نبود."; +Blockly.Msg["LISTS_INLIST"] = "در فهرست"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 خالی است"; +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"] = "طول یک فهرست را برمی‌گرداند."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "فهرستی با %1 تکرارشده به اندازهٔ %2 می‌سازد"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "فهرستی شامل مقادیر داده‌شدهٔ تکرار شده عدد مشخص‌شده می‌سازد."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "موردی به ته فهرست اضافه می‌کند."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "موردی در موقعیت مشخص‌شده در یک فهرست اضافه می‌کند."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "موردی به ته فهرست الحاق می‌کند."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "مورد را به صورت تصادفی در یک فهرست می‌افزاید."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "اولین مورد در یک فهرست را تعیین می‌کند."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "مورد مشخص‌شده در یک فهرست را قرار می‌دهد."; +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"] = "ساخت متن إژ لیست"; +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"] = "همراه جداساز"; +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"] = "پةتی/خالی"; +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://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"] = "بازگرداندن اولین عددی که از توان عدد دوم حاصل شده باشد."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.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://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "یکی از مقادیر مشترک را برمی‌گرداند: π (۳٫۱۴۱…)، e (۲٫۷۱۸...)، φ (۱٫۶۱۸)، sqrt(۲) (۱٫۴۱۴)، sqrt(۱/۲) (۰٫۷۰۷...) و یا ∞ (بی‌نهایت)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // 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://en.wikipedia.org/wiki/Modulo_operation"; +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_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://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "کسر تصادفی"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "بازگرداندن کسری تصادفی بین ۰٫۰ (بسته) تا ۱٫۰ (باز)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "عدد صحیح تصادفی بین %1 تا %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "یک عدد تصادفی بین دو مقدار مشخص‌شده به صورت بسته باز می‌گرداند."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +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"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "مطلق"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "ریشهٔ دوم"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "قدر مطلق یک عدد را بازمی‌گرداند."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "بازگرداندن توان e یک عدد."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "لوگاریتم طبیعی یک عدد را باز می‌گرداند."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "بازگرداندن لگاریتم بر پایهٔ ۱۰ یک عدد."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "منفی‌شدهٔ یک عدد را باز می‌گرداند."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "بازگرداندن توان ۱۰ یک عدد."; +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/Trigonometric_functions"; +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["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "متغیر تازه..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "نام متغیر تازه:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "اجازه اظهارات"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "با:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "اجرای تابع تعریف‌شده توسط کاربر «%1»."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +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_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "انجام چیزی"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "به"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "تابعی می‌سازد بدون هیچ خروجی."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +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_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» به:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "به %1 چسباندن متن %2"; +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"] = "به حروف بزرگ عنوان"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "به حروف بزرگ"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "بازگرداندن کپی متن در حالتی متفاوت."; +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_LAST"] = "گرفتن آخرین حرف"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "گرفتن حرف تصادفی"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "حرفی در موقعیت مشخص‌شده بر می‌گرداند."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "افزودن یک مورد به متن."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "نام نؤیسی"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "اضافه‌کردن، حذف یا مرتب‌سازی بحش‌ها برای تنظیم مجدد این بلوک متنی."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "به حرف # از انتها"; +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"] = "گرفتن زیرمتن از اولین حرف"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "گرفتن زیرمتن از حرف # به انتها"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "گرفتن زیرمتن از حرف #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "قسمت مشخصی‌شده‌ای از متن را بر می‌گرداند."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "اولین رخداد متن را بیاب"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "آخرین رخداد متن را بیاب"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "در متن %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "شاخصی از اولین آخرین رخ‌داد متن اول در متن دوم بر می‌گرداند. اگر متن یافت نشد %1 باز می‌گرداند."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 خالی است"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "اضافه‌کردن صحیح اگر متن فراهم‌شده خالی است."; +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"] = "چاپ متن، عدد یا هر مقدار دیگر مشخص‌شده."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "اعلان برای کاربر با یک عدد."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "اعلان برای کاربر برای یک متن."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "اعلان برای عدد با پیام"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "اعلان برای متن با پیام"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +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"] = "Undo"; // untranslated +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // 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 +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["VARIABLE_ALREADY_EXISTS"] = "A variable named '%1' already exists."; // untranslated +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/lo.js b/js/msg/js/lo.js new file mode 100644 index 0000000..66f534d --- /dev/null +++ b/js/msg/js/lo.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "ເພີ່ມຄຳອະທິບາຍ"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "ປ່ຽນຄ່າ:"; +Blockly.Msg["CLEAN_UP"] = "ຈັດລຽນບລັອກໃຫ້ເປັນແຖວ"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "ອັດຕາສ່ວນ"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "ປະສົມ"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "ປະສົມສອງສີເຂົ້າກັນດ້ວຍອັດຕາສ່ວນ (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://lo.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"] = "https://www.december.com/html/spec/colorpercompact.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"] = "ນັບດ້ວຍ %1 ຈາກ %2 ເຖິງ %3 ປ່ຽນຄ່າທີລະ %4"; +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"] = "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"] = "ເຮັດຄຳສັ່ງບາງຄຳສັ່ງຄືນຫຼາຍໆຄັ້ງ."; +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_VARIABLE"] = "Delete the '%1' variable"; // untranslated +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg["DELETE_X_BLOCKS"] = "ລຶບ %1 ບລັອກ"; +Blockly.Msg["DISABLE_BLOCK"] = "ປິດໃຊ້ງານບລັອກ"; +Blockly.Msg["DUPLICATE_BLOCK"] = "ເຮັດສຳເນົາ"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +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["IOS_CANCEL"] = "Cancel"; // untranslated +Blockly.Msg["IOS_ERROR"] = "Error"; // untranslated +Blockly.Msg["IOS_OK"] = "OK"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Add Input"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INPUTS"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Add"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Add Variable"; // untranslated +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Delete"; // untranslated +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "You can't use an empty variable name."; // untranslated +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Rename"; // untranslated +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Variable name"; // untranslated +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"] = "list"; // untranslated +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"] = "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"] = "first"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# from end"; // untranslated +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"] = "last"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "random"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "remove"; // untranslated +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"] = "Returns the item at the specified position in a list."; // 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"] = "Removes and returns the item at the specified position in a list."; // 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"] = "Removes the item at the specified position in a list."; // 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_FROM_END_TOOLTIP"] = "%1 is the last item."; // untranslated +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 is the first item."; // 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 %1 if item is not found."; // untranslated +Blockly.Msg["LISTS_INLIST"] = "in list"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 is empty"; // untranslated +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_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "as"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "insert at"; // untranslated +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"] = "Inserts the item at the specified position in a list."; // 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"] = "Sets the item at the specified position in a list."; // 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://​​lo.wikipedia.org/wiki/ອະສົມຜົນ"; +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://en.wikipedia.org/wiki/Arithmetic"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Return the sum of the two numbers."; // untranslated +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"] = "Return the product of the two numbers."; // untranslated +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Return the first number raised to the power of the second number."; // untranslated +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +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"] = "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 +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // 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"] = "is divisible by"; // untranslated +Blockly.Msg["MATH_IS_EVEN"] = "is even"; // untranslated +Blockly.Msg["MATH_IS_NEGATIVE"] = "is negative"; // untranslated +Blockly.Msg["MATH_IS_ODD"] = "is odd"; // untranslated +Blockly.Msg["MATH_IS_POSITIVE"] = "is positive"; // untranslated +Blockly.Msg["MATH_IS_PRIME"] = "is prime"; // untranslated +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"] = "is whole"; // untranslated +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://lo.wikipedia.org/wiki/ຈຳນວນ"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "ຈຳນວນໜຶ່ງ."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "average of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "max of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "median of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "min of list"; // untranslated +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"] = "Return the largest number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Return the median number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Return the smallest number in the list."; // untranslated +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/Square_root"; // untranslated +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absolute"; // untranslated +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "square root"; // untranslated +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"] = "Return the natural logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Return the base 10 logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Return the negation of a number."; // untranslated +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_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"; // untranslated +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["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "Create variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE_TITLE"] = "ຊື່ຕົວແປໃໝ່:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // 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"] = "Create '%1'"; // untranslated +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/Subroutine"; // 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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "return"; // untranslated +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"] = "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"] = "ປ່ຽນຊື່ຕົວແປ '%1' ທັງໝົດເປັນ:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "to %1 append text %2"; // 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"] = "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"] = "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_LAST"] = "get last letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "get random letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returns the letter at the specified position."; // untranslated +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Add an item to the text."; // untranslated +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"] = "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_OPERATOR_FIRST"] = "find first occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "find last occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "in text %1 %2 %3"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 is empty"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Returns true if the provided text is empty."; // untranslated +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"] = "print %1"; // untranslated +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_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // 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"] = "ກັບຄືນ"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // 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["VARIABLE_ALREADY_EXISTS"] = "A variable named '%1' already exists."; // untranslated +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/lrc.js b/js/msg/js/lrc.js new file mode 100644 index 0000000..f265426 --- /dev/null +++ b/js/msg/js/lrc.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "نٱزٱرتو ناْ اْزاف بٱکؽت"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "ٱرزشت آلشت کو:"; +Blockly.Msg["CLEAN_UP"] = "Clean up Blocks"; // untranslated +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "نسڤٱت"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "شؽڤسٱ"; +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"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "سۏز"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "رٱنڳ ڤا"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Create a colour with the specified amount of red, green, and blue. All values must be between 0 and 100."; // untranslated +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"] = "continue with next iteration of loop"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "هٱلقٱ شومل بیٱ ناْ خراو کو"; +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"] = "سی هٱر قلٱم %1 د نومگٱ %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"] = "شماردن وا %1 د %2 سی %3 ڤا %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 +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_VARIABLE"] = "Delete the '%1' variable"; // untranslated +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg["DELETE_X_BLOCKS"] = "پاکسا کردن%1 د برشتؽا"; +Blockly.Msg["DISABLE_BLOCK"] = "ناکشتگر کردن برشت"; +Blockly.Msg["DUPLICATE_BLOCK"] = "کپی کردن"; +Blockly.Msg["DUPLICATE_COMMENT"] = "نٱزٱر تکراری"; +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["IOS_CANCEL"] = "Cancel"; // untranslated +Blockly.Msg["IOS_ERROR"] = "Error"; // untranslated +Blockly.Msg["IOS_OK"] = "OK"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Add Input"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INPUTS"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Add"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Add Variable"; // untranslated +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Delete"; // untranslated +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "You can't use an empty variable name."; // untranslated +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Rename"; // untranslated +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Variable name"; // 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"] = "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"] = "Returns the item at the specified position in a list."; // 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"] = "Removes and returns the item at the specified position in a list."; // 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"] = "Removes the item at the specified position in a list."; // 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"] = "سی#"; +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_FROM_END_TOOLTIP"] = "%1 is the last item."; // untranslated +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 is the first item."; // 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 %1 if item is not found."; // untranslated +Blockly.Msg["LISTS_INLIST"] = "د نومگٱ"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 هالٛیٱ"; +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_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "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"] = "Inserts the item at the specified position in a list."; // 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"] = "Sets the item at the specified position in a list."; // 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)"; // 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_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_NULL"] = "خونسا"; +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"] = "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"] = "آزماشت کردن"; +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"] = "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"] = "Return the product of the two numbers."; // untranslated +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Return the first number raised to the power of the second number."; // untranslated +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +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/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; // untranslated +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // 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"; +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"; +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"] = "random item of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "standard deviation of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "جٱم کردن نومگٱ"; +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"] = "Return the largest number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Return the median number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Return the smallest number in the list."; // untranslated +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"; +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"; +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"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "گرد کردن"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "ڤ هار گرد کردن"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "ڤ رۉ گرد کردن"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Round a number up or down."; // untranslated +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +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"] = "Return the natural logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Return the base 10 logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Return the negation of a number."; // untranslated +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_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"] = "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["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "آلشتگر تازٱ..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "نوم آلشتگر تازٱ:"; +Blockly.Msg["NEW_VARIABLE_TYPE_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"; +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"; +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/Subroutine"; // 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/Subroutine"; // 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_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "to %1 append text %2"; // 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_LAST"] = "get last letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "get random letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returns the letter at the specified position."; // untranslated +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // 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"] = "سی ڤاج# تا آخر"; +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_OPERATOR_FIRST"] = "find first occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "find last occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "د مٱتن %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 هالٛیٱ"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Returns true if the provided text is empty."; // untranslated +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"] = "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"] = "print %1"; // untranslated +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_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "A letter, word, or line of text."; // 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"] = "ٱنجوم نٱداٛئن"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // 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"] = "میزوکاری %1 سی %2"; +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["VARIABLE_ALREADY_EXISTS"] = "A variable named '%1' already exists."; // untranslated +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/lt.js b/js/msg/js/lt.js new file mode 100644 index 0000000..0b863c0 --- /dev/null +++ b/js/msg/js/lt.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Palikti komentarą"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Negalima ištrinti kintamojo '%1', nes jis yra dalis funkcijos '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Keisti reikšmę:"; +Blockly.Msg["CLEAN_UP"] = "Išvalyti blokus"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "Suskleisti blokus"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Suskleisti bloką"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "1 spalva"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "2 spalva"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "santykis"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "sumaišyk"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Sumaišo dvi spalvas su pateiktu santykiu (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://lt.wikipedia.org/wiki/Spalva"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Pasirinkti spalvą iš paletės."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "atsitiktinė spalva"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Pasirinkti spalvą atsitiktinai."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "mėlyna"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "žalia"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "raudona"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "spalva su"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Spalvą galima sudaryti iš raudonos, žalios ir mėlynos dedamųjų. Kiekvienos intensyvumas nuo 0 iki 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"] = "nutraukti kartojimą"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "šį kartą praleisti likusius veiksmus ir tęsti kartojimą"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Nutraukia (artimiausią) vykstantį kartojimą."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Praleidžia žemiau išvardintus kartojimo veiksmus (ir tęsia darbą nuo kartojimo pradinio veiksmo)."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Atsargiai: šis blokas gali būt naudojamas tik kartojimo bloko viduje."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "kartok su kiekvienu %1 iš sąrašo %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Kartok veiksmus, kol kintamasis \"%1\" paeiliui gauna kiekvieną sąrašo reikšmę."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "kartok, kai %1 kinta nuo %2 iki %3 po %4"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Imama kintamoji '%1' reikšmė nuo pradinio skaičiaus iki pabaigos skaičiaus, skaičiuojant nustatytais intervalais ir atliekant nustatytus blokus."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Pridėti sąlygą „jei“ blokui."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Pridėti veiksmų vykdymo variantą/\"šaką\", kai netenkinama nė viena sąlyga."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Galite pridėt/pašalinti/pertvarkyti sąlygų \"šakas\"."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "kitu atveju"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "arba jei"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "jei"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Jeigu sąlyga tenkinama, tai atlik veiksmus."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Jei sąlyga tenkinama, atlikti jai priklausančius veiksmus, o jei ne -- atlikti kitus nurodytus veiksmus."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "daryti"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "pakartokite %1 kartus"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Leidžia atlikti išvardintus veiksmus kelis kartus."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +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"] = "Ištrinti visus %1 blokus?"; +Blockly.Msg["DELETE_BLOCK"] = "Ištrinti bloką"; +Blockly.Msg["DELETE_VARIABLE"] = "Ištrinti „%1“ kintamąjį"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Ištrinti %1 '%2' panaudojimus?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Ištrinti %1 blokus"; +Blockly.Msg["DISABLE_BLOCK"] = "Išjungti bloką"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Kopijuoti"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Dubliuoti Komentarą"; +Blockly.Msg["ENABLE_BLOCK"] = "Įjungti bloką"; +Blockly.Msg["EXPAND_ALL"] = "Išskleisti blokus"; +Blockly.Msg["EXPAND_BLOCK"] = "Išskleisti bloką"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Išdėstyti stulpeliu, kai daug parametrų"; +Blockly.Msg["HELP"] = "Pagalba"; +Blockly.Msg["INLINE_INPUTS"] = "Išdėstyti vienoje eilutėje"; +Blockly.Msg["IOS_CANCEL"] = "Atšaukti"; +Blockly.Msg["IOS_ERROR"] = "Klaida"; +Blockly.Msg["IOS_OK"] = "Gerai"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Pridėti Įvestį"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Ši funkcija turi pasikartojančias įvestis"; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "ĮVESTYS"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Pridėti"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+Pridėti Kintamąjį"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Ištrinti"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Negalite naudoti tuščio kintamojo pavadinimo."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Pervadinti"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Kintamojo pavadinimas"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "tuščias sąrašas"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Grąžina sąrašą, ilgio 0, neturintį duomenų"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "sąrašas"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Pridėti, pašalinti arba paskirstyti skyrius, kad pertvarkyti šį teksto bloką."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "sukurti sąrašą su"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Pridėti elementą į sąrašą."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Sukurti sąrašą iš bet kokio skaičiaus elementų."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "pirmas"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# nuo galo"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_GET"] = "paimk"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "paimk ir ištrink"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "paskutinis"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "atsitiktinis"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "pašalinti"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Grąžina pirmąjį sąrašo elementą."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Gražina objektą į nurodyta poziciją sąraše."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Grąžina paskutinį elementą iš sąrašo."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Grąžina atsitiktinį elementą iš sąrašo."; +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"] = "Removes and returns the item at the specified position in a list."; // 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"] = "Pašalina pirmą objektą sąraše."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Pašalina objektą iš nurodytos vietos sąraše."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Pašalina paskutinį objektą sąraše."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Pašalina atsitiktinį objektą sąraše."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "iki # nuo galo"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "iki #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "iki galo"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "sąrašo dalis nuo pradžios"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "sąrašo dalis nuo # nuo galo"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "sąrašo dalis nuo #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Sukuria nurodytos sąrašo dalies kopiją."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 yra paskutinis objektas."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 yra pirmasis objektas."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "rask pirmą reikšmę"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "rask paskutinę reikšmę"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Grąžina pirmos/paskutinės reikšmės eilės nr. sąraše. Grąžina %1, jei reikšmės neranda."; +Blockly.Msg["LISTS_INLIST"] = "sąraše"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 yra tuščias"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Grąžina „true“, jeigu sąrašas tuščias."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "ilgis %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Grąžina sąrašo ilgį."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "sukurk sąrašą, kuriame %1 bus %2 kartus"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Creates a list consisting of the given value repeated the specified number of times."; // untranslated +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "kaip"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "įterpk į vietą"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "priskirk elementui"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Įterpia objektą į sąrašo pradžią."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Įterpią objektą į nurodytą poziciją sąraše."; +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"] = "Įterpia objektą į atsitiktinę sąrašo vietą."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Sets the first item in a list."; // untranslated +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Sets the item at the specified position in a list."; // 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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "didėjančia tvarka"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "mažėjančia tvarka"; +Blockly.Msg["LISTS_SORT_TITLE"] = "rūšiuoti %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Rūšiuoti sąrašo kopiją."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "abecėlės, ignoruoti raidžių dydį"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "skaitmeninis"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "abėcėlės"; +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"] = "su dalikliu"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "klaidinga"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Reikšmė gali būti \"teisinga\"/\"Taip\" arba \"klaidinga\"/\"Ne\"."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "tiesa"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Tenkinama, jei abu reiškiniai lygūs."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Grįžti tiesa, jei pirmoji įvestis didesnė nei antroji įvestis."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Grįžti tiesa, jei pirma įvestis didesnė arba lygi antrajai įvesčiai."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Grįžti tiesa, jei pirma įvestis mažesnė nei antra įvestis."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Grįžti tiesa, jei pirma įvestis mažesnė arba lygi antrajai įvesčiai."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Grįžti tiesa, jeigu abi įvestys ne lygios tarpusavyje."; +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"] = "Grįžti tiesa, jei įvestis klaidinga. Grįžti klaidinga, jei įvestis teisinga."; +Blockly.Msg["LOGIC_NULL"] = "nieko"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Reikšmė nebuvo nurodyta..."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "ir"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "arba"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Bus teisinga, kai abi sąlygos bus tenkinamos."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Grįžti tiesa, jei bent viena įvestis teisinga."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "sąlyga"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "jei ne"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "jei taip"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Jeigu sąlygą tenkinama, grąžina pirmą reikšmę, o jei ne - antrąją."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Grąžina dviejų skaičių sumą."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Grąžina dviejų skaičių dalmenį."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Grąžina dviejų skaičių skirtumą."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Grąžina dviejų skaičių sandaugą."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Grąžina pirmą skaičių pakeltą laipsniu pagal antrą skaičių."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "padidink %1 (emptypage) %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Prideda skaičių prie kintamojo '%1'. Kai skaičius neigiamas - gaunasi atimtis."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Grįžti viena iš pagrindinių konstantų: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (begalybė)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "apribok %1 tarp %2 ir %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Apriboti skaičių, kad būtų tarp nustatytų ribų (imtinai)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "yra dalus iš"; +Blockly.Msg["MATH_IS_EVEN"] = "yra lyginis"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "yra neigiamas"; +Blockly.Msg["MATH_IS_ODD"] = "yra nelyginis"; +Blockly.Msg["MATH_IS_POSITIVE"] = "yra teigiamas"; +Blockly.Msg["MATH_IS_PRIME"] = "yra pirminis"; +Blockly.Msg["MATH_IS_TOOLTIP"] = "Patikrina skaičiaus savybę: (ne)lyginis/pirminis/sveikasis/teigiamas/neigiamas/dalus iš x."; +Blockly.Msg["MATH_IS_WHOLE"] = "yra sveikasis"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "dalybos liekana %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Grįžti likučiu nuo dviejų skaičių dalybos."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://lt.wikipedia.org/wiki/Skaičius"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Skaičius."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "vidurkis"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "didžiausia reikšmė sąraše"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "mediana sąrašui"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "mažiausia reikšmė sąraše"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "statistinė moda sąrašui"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "atsitiktinis elementas iš sąrašo"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "standartinis nuokrypis sąraše"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "suma"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Grįžti vidurkiu (aritmetinis vidurkis) iš skaitinių reikšmių sąraše."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Grįžti didžiausiu skaičiumi sąraše."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Grąžinti sąrašo medianą."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Grįžti mažiausiu skaičiumi sąraše."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Grąžinti sąrašą dažniausių elementų sąraše."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Grąžinti atsitiktinį elementą iš sąrašo."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Grįžti standartine pakraipa iš sąrašo."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "didžiausia reikšmė"; +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"] = "atsitiktinė trupmena"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Atsitiktinė trupmena nuo 0 (imtinai) iki 1 (neimtinai)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "atsitiktinis sveikas sk. nuo %1 iki %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Grįžti atsitiktinį sveikąjį skaičių tarp dviejų nustatytų ribų, imtinai."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://lt.wikipedia.org/wiki/Apvalinimas"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "apvalink"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "apvalink žemyn"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "apvalink aukštyn"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Suapvalinti skaičių į žemesnę ar aukštesnę reikšmę."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "modulis"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "kvadratinė šaknis"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Skaičiaus modulis - reikšmė be ženklo (panaikina minusą)."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Grąžinti skaičių laipsniu e."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Grąžinti skaičiaus natūrinį logaritmą."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Grįžti 10 pagrindinių logaritmų iš skaičiaus."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Grąžina skaičiui priešingą skaičių."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Grąžinti skaičių laipsniu 10."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Grįžti kvadratinę šaknį iš skaičiaus."; +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://lt.wikipedia.org/wiki/Trigonometrinės_funkcijos"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Grąžinti skaičiaus arkkosinusą."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Grąžinti skaičiaus arksinusą."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Grąžinti skaičiaus arktangentą."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Grąžinti laipsnio kosinusą (ne radiano)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Grąžinti laipsnio sinusą (ne radiano)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Grąžinti laipsnio tangentą (ne radiano)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Sukurti spalvos kintamąjį..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Sukurti skaičiaus kintamąjį..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "Sukurti kintamąjį"; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Naujo kintamojo pavadinimas:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Naujas kintamojo tipas:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "leisti vidinius veiksmus"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "pagal:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Vykdyti sukurtą komandą \"%1\"."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Įvykdyti komandą \"%1\" ir naudoti jos suskaičiuotą (atiduotą) reikšmę."; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "su:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "Sukurti \"%1\""; +Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Apibūdinkite šią funkciją..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "daryk kažką"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "komanda:"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Sukuria procedūrą - komandą, kuri nepateikia jokio rezultato (tik atlieka veiksmus)."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "duok"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Sukuria funkciją - komandą, kuri ne tik atlieka veiksmus bet ir pateikia (grąžina/duoda) rezultatą."; +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Ši komanda turi du vienodus gaunamų duomenų pavadinimus."; +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"] = "Jeigu pirma reikšmė yra teisinga (sąlyga tenkinama), grąžina antrą reikšmę."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Perspėjimas: šis blokas gali būti naudojamas tik aprašant funkciją."; +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"] = "Atkurti"; +Blockly.Msg["REMOVE_COMMENT"] = "Pašalinti komentarą"; +Blockly.Msg["RENAME_VARIABLE"] = "Pervardyti kintamajį..."; +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Pervadinti visus '%1' kintamuosius į:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "prie %1 pridėk tekstą %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Pridėti tekstą prie kintamojo '%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = " mažosiom raidėm"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = " Pavadinimo Raidėmis"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = " DIDŽIOSIOM RAIDĖM"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Kitu atvėju, grąžina teksto kopiją."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "gauti pirmą raidę"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "raidė nuo galo #"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "gauti raidę #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "gauti paskutinę raidę"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "gauti atsitiktinę raidę"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Grąžina raidę į tam tikrą poziciją."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "skaičius %1 iš %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Suskaičiuoti, kiek kartų šis tekstas kartojasi kitame tekste."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Pridėti teksto elementą."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "sujunk"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Pridėti, pašalinti arba paskirstyti skyrius, kad pertvarkyti šį teksto bloką."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "iki raidės nuo galo #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "iki raidės #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "iki pabaigos"; +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"] = "tekste"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "dalis nuo pradžios"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "dalis nuo raidės #"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "dalis nuo raidės #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Grąžina tam tikrą teksto dalį."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "rask,kur pirmą kartą paminėta"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "rask,kur paskutinį kartą paminėta"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "tekste %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Grąžina pirmą/paskutinę pirmo teksto reikšmę antrame tekste. Grąžina %1, jei tekstas nerastas."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 yra tuščias"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Grįžti tiesa, jei numatytas tekstas tuščias."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "sukurti tekstą su"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Sukurti teksto fragmentą sujungiant bet kokį skaičių fragmentų."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "teksto %1 ilgis"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Suranda teksto simbolių kiekį (įskaitant ir tarpus)"; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "spausdinti %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Spausdinti nurodytą tekstą, skaičių ar kitą reikšmę."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Prašyti vartotoją įvesti skaičių."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Prašyti vartotoją įvesti tekstą."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "paprašyk įvesti skaičių :"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "paprašyk įvesti tekstą :"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "pakeisti %1 į %2 šiame %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Pašalinti visas teksto dalis kitame tekste."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "atbulai %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Apversti teksto simbolių tvarką."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Tekstas (arba žodis, ar raidė)"; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "išvalyk tarpus šonuose"; +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"] = "Grąžina teksto kopiją, pašalinus tarpus iš vieno ar abiejų kraštų."; +Blockly.Msg["TODAY"] = "Šiandien"; +Blockly.Msg["UNDO"] = "Anuliuoti"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // 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 +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Returns the value of this variable."; // untranslated +Blockly.Msg["VARIABLES_SET"] = "priskirk %1 = %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Sukurti 'kintamasis %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["VARIABLE_ALREADY_EXISTS"] = "Kintamasis, pavadinimu '%1', jau egzistuoja."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Kintamasis, pavadinimu '%1', jau egzistuoja kaip kitas tipas: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Kažką pasakykite..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/lv.js b/js/msg/js/lv.js new file mode 100644 index 0000000..7b7946a --- /dev/null +++ b/js/msg/js/lv.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Pievienot komentāru"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Mainīt vērtību:"; +Blockly.Msg["CLEAN_UP"] = "Sakopt blokus"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "Sakļaut blokus"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Sakļaut bloku"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "1. krāsa"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "2. krāsa"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "attiecība"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "sajaukt"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Sajauc kopā divas krāsas ar doto attiecību (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://lv.wikipedia.org/wiki/Krāsa"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Izvēlēties krāsu no paletes."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "nejauša krāsa"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Izvēlēties krāsu pēc nejaušības principa."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "zila"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "zaļa"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "sarkana"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "veido krāsu no"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Izveidot krāsu ar norādīto daudzumu sarkanā, zaļā un zilā toņu. Visas vērtības ir starp 0 un 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"] = "iet ārā no cikla"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "turpināt ar cikla nākamo iterāciju"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Iet ārā no iekļaujošā cikla"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Nepildīt atlikušo cikla daļu bet sākt nākamo iterāciju."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Brīdinājums: šo bloku drīkst izmantot tikai cikla iekšienē."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "visiem %1 no saraksta %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Katram objektam no saraksta piešķirt mainīgajam '%1' šo objektu un izpildīt komandas."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "skaitīt %1 no %2 līdz %3 ar soli %4"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Ļauj mainīgajam '%1' pieņemt vērtības no sākuma līdz beigu vērtībai, un izpildīt iekļautos blokus katrai no šīm pieņemtajām vērtībām."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Pievienot nosacījumu \"ja\" blokam."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Pievienot gala nosacījumu \"ja\" blokam."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Pievienot, noņemt vai mainīt sekciju secību šim \"ja\" blokam."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "citādi"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "citādi, ja"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "ja"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Ja vērtība ir patiesa, tad izpildīt komandas."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Ja vērtība ir patiesa, tad izpildīt pirmo bloku ar komandām. Citādi izpildīt otro bloku ar komandām."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Ja pirmā vērtība ir patiesa, tad izpildīt pirmo bloku ar komandām. Citādi, ja otrā vērtība ir patiesa, izpildīt otro bloku ar komandām."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Ja pirmā vērtība ir patiesa, tad izpildīt pirmo bloku ar komandām. Citādi, ja otrā vērtība ir patiesa, izpildīt otro bloku ar komandām. Ja neviena no vertībām nav patiesa, tad izpildīt pēdējo bloku ar komandām."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://lv.wikipedia.org/wiki/Cikls"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "izpildi"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "atkārtot %1 reizes"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Izpildīt komandas vairākas reizes."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "atkārtot līdz"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "atkārtot kamēr"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Izpildīt komandas, kamēr vērtība ir nepatiesa."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Izpildīt komandas, kamēr vērtība ir patiesa."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Izdzēst visus %1 blokus?"; +Blockly.Msg["DELETE_BLOCK"] = "Izmest bloku"; +Blockly.Msg["DELETE_VARIABLE"] = "Izdzēst mainīgo \"%1\""; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Mainīgais \"%2\" tiek izmantots %1 vietās. Dzēst?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Izmest %1 blokus"; +Blockly.Msg["DISABLE_BLOCK"] = "Atspējot bloku"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Dublēt"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +Blockly.Msg["ENABLE_BLOCK"] = "Iespējot bloku"; +Blockly.Msg["EXPAND_ALL"] = "Izvērst blokus"; +Blockly.Msg["EXPAND_BLOCK"] = "Izvērst bloku"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Ārējie ievaddati"; +Blockly.Msg["HELP"] = "Palīdzība"; +Blockly.Msg["INLINE_INPUTS"] = "Iekšējie ievaddati"; +Blockly.Msg["IOS_CANCEL"] = "Atcelt"; +Blockly.Msg["IOS_ERROR"] = "Kļūda"; +Blockly.Msg["IOS_OK"] = "Labi"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Add Input"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INPUTS"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Pievienot"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Pievienot mainīgo"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Dzēst"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "You can't use an empty variable name."; // untranslated +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Pārsaukt"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Mainīgā nosaukums"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "izveidot tukšu sarakstu"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Izveidot sarakstu bez elementiem tajā."; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "saraksts"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Pievienot, noņemt vai mainīt sekciju secību šim \"saraksta\" blokam."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "izveidot sarakstu no"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Pievienot objektu sarakstam."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Izveidot sarakstu no jebkura skaita vienību."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "pirmo"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "no beigām numur"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_GET"] = "paņemt"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "paņemt uz dzēst"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "pēdējo"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "nejauši izvēlētu"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "dzēst"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Atgriež pirmo saraksta elementu."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Atgriež norādīto elementu no saraksta."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Atgriež pēdējo saraksta elementu."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Atgriež nejauši izvēlētu saraksta elementu"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Atgriež un izdzēš saraksta pirmo elementu."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Atgriež un izdzēš no saraksta norādīto elementu."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Atgriež un izdzēš saraksta pēdējo elementu."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Atgriež un izdzēš no saraksta nejauši izvēlētu elementu."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Izdēš pirmo saraksta elementu."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Izdēš norādīto elementu no saraksta."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Izdēš pēdējo saraksta elementu."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Izdzēš no saraksta nejauši izvēlētu elementu."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "līdz pozīcijai no beigām"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "līdz pozīcijai"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "līdz beigām"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "paņemt apakšsarakstu no sākuma"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "paņemt apakšsarakstu no beigām no pozīcijas"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "paņemt apakšsarakstu no pozīcijas"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Nokopēt daļu no dotā saraksta."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "Saraksta elementu numerācija no beigām sākas no %1"; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "Saraksta elementu numerācija sākas no %1"; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "atrast pirmo elementu, kas vienāds ar"; +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"] = "atrast pēdējo elementu, kas vienāds ar"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Atgriež pozīciju sarakstā, kurā atrodas dotais objekts. Atgriež %1 ja objekts neatrodas sarakstā."; +Blockly.Msg["LISTS_INLIST"] = "sarakstā"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 ir tukšs"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Patiess, ja saraksts ir tukšs."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "%1 garums"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Atgriež elementu skaitu srakstā."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "saraksts no %1 atkārtots %2 reizes"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Izveido sarakstu, kas sastāv no dotās vērtības noteiktu reižu skaita."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "kā"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "ievieto"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "aizvieto"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Ievieto elementu saraksta sākumā."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Ievieto sarakstā elementu norādītajā pozīcijā."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Pievieno elementu saraksta beigās."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Ievieto sarakstā jaunu elementu nejauši izvēlētā pozīcijā."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Aizvieto elementu saraksta sākumā."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Aizvieto sarakstā elementu norādītajā pozīcijā."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Aizvieto elementu saraksta beigās."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Aizvieto sarakstā elementu nejauši izvēlētā pozīcijā."; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "augošā"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "dilstošā"; +Blockly.Msg["LISTS_SORT_TITLE"] = "Sakārtot sarakstu no %3 elementiem %2 secībā %1"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Saraksta sakārtota kopija."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "pēc alfabēta, ignorēt mazos/lielos burtus"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "skaitliski"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "pēc alfabēta"; +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"] = "vārdu saraksts no teksta"; +Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "izveidot tekstu no saraksta"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Apvienot tekstu izmantojot atdalītāju."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Sadalīt tekstu vārdos izmantojot atdalītāju."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "ar atdalītāju"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "aplams"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Atgriež rezultātu \"patiess\" vai \"aplams\"."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "patiess"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://lv.wikipedia.org/wiki/Nevien%C4%81d%C4%ABba"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Patiess, ja abas puses ir vienādas."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Patiess, ja kreisā puse ir lielāka par labo pusi."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Patiess, ja kreisā puse ir lielāka vai vienāda ar labo pusi."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Patiess, ja kreisā puse ir mazāka par labo pusi."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Patiess, ja kreisā puse ir mazāka vai vienāda ar labo pusi."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Patiess, ja abas puses nav vienādas."; +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"] = "Patiess, ja arguments ir aplams."; +Blockly.Msg["LOGIC_NULL"] = "nekas"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Atgriež neko."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "un"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "vai"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Patiess, ja abas puses ir patiesas."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Patiess, ja vismaz viena puse ir patiesa."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "nosacījums"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "ja aplams"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "ja patiess"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Pārbaudīt nosacījumu. Ja 'nosacījums' ir patiess, atgriež vērtību 'ja patiess', pretējā gadījumā vērtību 'ja aplams'."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://lv.wikipedia.org/wiki/Aritm%C4%93tika"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Atgriež divu skaitļu summu."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Atgriež divu skaitļu dalījumu."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Atgriež divu skaitļu starpību."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Atgriež divu skaitļu reizinājumu."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Atgriež pirmo skaitli kāpinātu pakāpē otrais skaitlis."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "izmainīt %1 par %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Pieskaitīt doto skaitli mainīgajam '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Atgriež kādu no matemātikas konstantēm: π (3.141…), e (2.718…), φ (1.618…), √(2) (1.414…), √(½) (0.707…), ∞ (bezgalība)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "ierobežot %1 no %2 līdz %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Ierobežo skaitli no noteiktajās robežās (ieskaitot galapunktus)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "dalās bez atlikuma ar"; +Blockly.Msg["MATH_IS_EVEN"] = "ir pāra"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "ir negatīvs"; +Blockly.Msg["MATH_IS_ODD"] = "ir nepāra"; +Blockly.Msg["MATH_IS_POSITIVE"] = "ir pozitīvs"; +Blockly.Msg["MATH_IS_PRIME"] = "ir pirmskaitlis"; +Blockly.Msg["MATH_IS_TOOLTIP"] = "Pārbauda, vai skaitlis ir pāra, nepāra, vesels, pozitīvs, negatīvs vai dalās ar noteiktu skaitli. Atgriež \"patiess\" vai \"aplams\"."; +Blockly.Msg["MATH_IS_WHOLE"] = "ir vesels"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "atlikums no %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Atlikums no divu skaitļu dalījuma."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://lv.wikipedia.org/wiki/Skaitlis"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Skaitlis."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "vidējais"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "lielākais"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "mediāna"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "mazākais"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "moda"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "nejaušs"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "standartnovirze"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "summa"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Atgriež dotā saraksta vidējo aritmētisko vērtību."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Atgriež lielāko vērtību no saraksta."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Atgriež dotā saraksta mediānas vērtību."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Atgriež mazāko vērtību no saraksta."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Atgriež dotā saraksta biežāk sastopamās vērtības (modas)."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Atgriež nejauši izvēlētu vērtību no dotā saraksta."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Atgriež dotā saraksta standartnovirzi."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Saskaitīt visus skaitļus no dotā saraksta."; +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"] = "nejaušs skaitlis [0..1)"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Atgriež nejaušu reālo skaitli robežās no 0 (iekļaujot) līdz 1 (neiekļaujot)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "nejaušs vesels skaitlis no %1 līdz %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Atgriež nejaušu veselu skaitli dotajās robežās (iekļaujot galapunktus)"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "noapaļot"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "apaļot uz leju"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "apaļot uz augšu"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Noapaļot skaitli uz augšu vai uz leju."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://lv.wikipedia.org/wiki/Kvadr%C4%81tsakne"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absolūtā vērtība"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "kvadrātsakne"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Atgriež skaitļa absolūto vērtību."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Atgriež e pakāpē dotais skaitlis."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Atgriež skaitļa naturālo logaritmu."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Atgriež skaitļa logaritmu pie bāzes 10."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Atgriež pretējo skaitli."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Atgriež 10 pakāpē dotais skaitlis."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Atgriež skaitļa kvadrātsakni."; +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://lv.wikipedia.org/wiki/Trigonometrisk%C4%81s_funkcijas"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Arkkosinuss (grādos)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Arksinuss (grādos)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Arktangenss (grādos)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Kosinuss no grādiem (nevis radiāniem)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Sinuss no grādiem (nevis radiāniem)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Tangenss no grādiem (nevis radiāniem)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "Izveidot mainīgo..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Jaunā mainīgā vārds:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "atļaut apakškomandas"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "ar:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Izpildīt iepriekš definētu funkcju '%1'."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Izpildīt iepriekš definētu funkcju '%1' un izmantot tās rezultātu."; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "ar:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "Izveidot '%1' izsaukumu"; +Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Funkcijas apraksts..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "darīt kaut ko"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "funkcija"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Izveido funkciju, kas neatgriež rezultātu."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "atgriezt"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Izveido funkciju, kas atgriež rezultātu."; +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Brīdinājums: funkcijai ir vienādi argumenti."; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Izcelt funkcijas definīciju"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Ja pirmā vērtība ir \"patiesa\", tad atgriezt otro vērtību."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Brīdinājums: Šo bloku var izmantot tikai funkcijas definīcijā."; +Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "arguments:"; +Blockly.Msg["PROCEDURES_MUTATORARG_TOOLTIP"] = "Pievienot funkcijai argumentu."; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TITLE"] = "argumenti"; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TOOLTIP"] = "Pievienot, pārkārtot vai dzēst funkcijas argumentus."; +Blockly.Msg["REDO"] = "Atcelt atsaukšanu"; +Blockly.Msg["REMOVE_COMMENT"] = "Noņemt komentāru"; +Blockly.Msg["RENAME_VARIABLE"] = "Pārdēvēt mainīgo..."; +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Pārdēvējiet visus '%1' mainīgos:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "tekstam %1 pievienot tekstu %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Pievienot tekstu mainīgajam '%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "kā mazie burti"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "kā Nosaukuma Burti"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "kā LIELIE BURTI"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Atgriež teksta kopiju ar mainītiem lielajiem/mazajiem burtiem."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "paņemt pirmo burtu"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "paņemt no beigām burtu #"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "paņemt burtu #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "paņemt pēdējo burtu"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "paņemt nejaušu burtu"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Atgriež burtu dotajā pozīcijā."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Pievienot tekstam objektu."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "savienot"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Pievienot, noņemt vai mainīt sekciju secību šim \"teksta\" blokam."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "līdz burtam nr (no beigām)"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "līdz burtam nr"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "līdz pēdējam burtam"; +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"] = "no teksta"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "paņemt apakšvirkni no sākuma"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "paņemt apakšvirkni no beigām sākot ar burta nr"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "paņemt apakšvirkni sākot no burta nr"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Atgriež norādīto teksta daļu."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "meklēt pirmo vietu, kur sākas teksts"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "meklēt pēdējo vietu, kur sākas teksts"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "tekstā %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Meklē pirmā teksta rindu otrajā tekstā. Atgriež pozīciju otrajā tekstā, kurā sākas pirmais teksts. Atgriež %1 ja pirmā teksta rinda nav atrasta."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 ir tukšs"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Patiess, ja teksts ir tukšs."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "veidot tekstu no"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Izveidot tekstu savienojot dotos argumentus."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "garums tekstam %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Atgriež burtu skaitu (ieskaitot atstarpes) dotajā tekstā."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "parādīt %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Parādīt norādīto tekstu vai skaitli."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Palūgt lietotāju ievadīt skaitli."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Palūgt lietotāju ievadīt tekstu."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "palūgt ievadīt skaitli ar ziņu"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "palūgt ievadīt tekstu ar ziņu"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Burts, vārds vai jebkāda teksta rinda."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "Dzēst atstarpes no abām pusēm"; +Blockly.Msg["TEXT_TRIM_OPERATOR_LEFT"] = "Dzēst atstarpes no sākuma"; +Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "Dzēst atstarpes no beigām"; +Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "Atgriež teksta kopiju ar noņemtām atstarpēm vienā vai otrā galā."; +Blockly.Msg["TODAY"] = "Šodiena"; +Blockly.Msg["UNDO"] = "Atsaukt"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // untranslated +Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "vienums"; +Blockly.Msg["VARIABLES_GET_CREATE_SET"] = "Izveidot piešķiršanu mainīgajam %1"; +Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Atgriež mainīgā vērtību."; +Blockly.Msg["VARIABLES_SET"] = "piešķirt mainīgajam %1 vērtību %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Izveidot 'ņem %1'"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Piešķirt mainīgajam vērtību."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Mainīgais '%1' jau eksistē."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/mk.js b/js/msg/js/mk.js new file mode 100644 index 0000000..51c54df --- /dev/null +++ b/js/msg/js/mk.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Додај коментар:"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Променливата '%1' не може се избрише бидејќи е дел од определението на функцијата '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Смена на вредност:"; +Blockly.Msg["CLEAN_UP"] = "Исчисти блокови"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "сооднос"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "смешај"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Меша две бои во даден сооднос (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://mk.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"] = "https://www.december.com/html/spec/colorpercompact.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"] = "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"] = "за секој елемент %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"] = "број со %1 од %2 до %3 со %4"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Променливата „%1“ да ги земе вредностите од почетниот до завршниот број, броејќи според укажаниот интервал и ги исполнува укажаните блокови."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Додај услов кон „ако“ блокот."; +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"] = "Додава, отстранува или прередува делови за прераспоредување на овој блок „ако“."; +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"] = "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://mk.wikipedia.org/wiki/For-јамка"; +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_VARIABLE"] = "Избриши ја променливата \"%1\""; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg["DELETE_X_BLOCKS"] = "Избриши %1 блока"; +Blockly.Msg["DISABLE_BLOCK"] = "Исклучи блок"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Ископирај"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Дуплирај коментар"; +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["IOS_CANCEL"] = "Откажи"; +Blockly.Msg["IOS_ERROR"] = "Грешка"; +Blockly.Msg["IOS_OK"] = "ОК"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Додај влез"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Дозволи тврдења"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INPUTS"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Додај"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Додај променлива"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Избриши"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Не можете да искористите празно име за променлива."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Преименувај"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Име на променливата"; +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"] = "Додај, отстрани или пререди ги деловите за прераспоредување на овој блок „список“."; +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"] = "Додај ставка кон списокот."; +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"] = "Returns the item at the specified position in a list."; // 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"] = "Removes and returns the item at the specified position in a list."; // 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"] = "Removes the item at the specified position in a list."; // 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_FROM_END_TOOLTIP"] = "%1 is the last item."; // untranslated +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 is the first item."; // 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 %1 if item is not found."; // untranslated +Blockly.Msg["LISTS_INLIST"] = "во списокот"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 е празен"; +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_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "Inserts the item at the specified position in a list."; // 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"] = "Sets the item at the specified position in a list."; // 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"] = "подреди %1 %2 %3"; +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://mk.wikipedia.org/wiki/Неравенство"; +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"] = "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://mk.wikipedia.org/wiki/Аритметика"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Return the sum of the two numbers."; // untranslated +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"] = "Return the product of the two numbers."; // untranslated +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Return the first number raised to the power of the second number."; // untranslated +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter?uselang=mk"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "повиши %1 за %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Ѝ додава број на променливата „%1“."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://mk.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_(graphics)"; // 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"] = "Проверува дали бројот е парен, непарен, прост, цел, позитивен, негативен или делив со некој број. Дава вистина или невистина."; +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://mk.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"] = "standard deviation of list"; // untranslated +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"] = "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"] = "Дава збир од сите броеви на списокот."; +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://mk.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://en.wikipedia.org/wiki/Square_root"; // untranslated +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_LN"] = "Return the natural logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Return the base 10 logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Return the negation of a number."; // untranslated +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://mk.wikipediа.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["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Создај променлива на низа..."; +Blockly.Msg["NEW_VARIABLE"] = "Создај променлива..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Назив на новата променлива:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Тип на новата променлива:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "дозволи тврдења"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "со:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://mk.wikipedia.org/wiki/Потпрограма"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // 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"] = "Опишете ја оваа функција..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // 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/Subroutine"; // 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"] = "inputs"; // 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["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "to %1 append text %2"; // 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"] = "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"] = "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_LAST"] = "get last letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "get random letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "во текст %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returns the letter at the specified position."; // untranslated +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "пресметка на %1 во %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Додај ставка кон текстот."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "поврзи"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Додај, отстрани или пререди ги деловите за прераспоредување на овој блок „текст“."; +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"] = "во текстот"; +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_OPERATOR_FIRST"] = "find first occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "find last occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "во текст %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 е празен"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Returns true if the provided text is empty."; // untranslated +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"] = "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"] = "должина на %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"] = "print %1"; // untranslated +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_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "замени го %1 со %2 во %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // 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"] = "Откажи"; +Blockly.Msg["UNNAMED_KEY"] = "без име"; +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"] = "Returns the value of this variable."; // untranslated +Blockly.Msg["VARIABLES_SET"] = "задај %1 на %2"; +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["VARIABLE_ALREADY_EXISTS"] = "Променлива со име '%1' веќе постои."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Променлива со име '%1' веќе постои за друг тип: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Работен простор на Blockly"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/mnw.js b/js/msg/js/mnw.js new file mode 100644 index 0000000..6c7f592 --- /dev/null +++ b/js/msg/js/mnw.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "စုတ် လညာတ်"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "မပြံင်လှာဲ '%1' ဂှ် ဇိုတ်ပလီု ဟွံဂွံ၊ ဟိုတ်နူ ဍေဟ်ဂှ် ဆက်စပ်ဒၟံင် ကုဝှင်ရှေန် '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "သၠာဲ ဍာ်ဒကေဝ်"; +Blockly.Msg["CLEAN_UP"] = "ဖအး ဗလံက်"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "ဖဍိုန်ဖ္ဍောတ် ဗလံက်ဂမၠိုင်"; +Blockly.Msg["COLLAPSE_BLOCK"] = "ဖဍိုန်ဖ္ဍောတ် ဗလံက်"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "အသာ် ၁"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "အသာ် ၂"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "ဗၞတ်ဗ္ၜတ်"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "ပနှဴ"; +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"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "ဗကေတ်"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "နကဵု အသာ်"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "ခၞံကၠောန်ကေတ် အသာ်တၟေင် အကြာ ဗကေတ်၊ သာ်ၚေက်၊ သာ်ဍီု၊၊ ဍာ်ဒကေဝ် သီုဖအိုတ် သ္ဒးဒှ် အကြာ ၀ ကဵု ၁၀၀၊၊"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "ကၟာတ်ထောအ် loop"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "ဆက်ကၠောန် နကဵု ပရေင်ချဳဒရာင်ဗွဲအပ္ဍဲ loop"; +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"] = "သွက်ဇၟာပ် ဒကုတ် %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"] = "ရိုဟ်လၟိဟ် %1 နူ %2 စဵုကဵု %3 နကဵု %4"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "ကလိဂွံ ပရေင်အပြံင်အလှာဲ '%1'ဏအ် ကေတ် ဍာ်ဒကေဝ် နူကဵု လၟိဟ်ဂၞန်စ စဵုကဵု လၟိဟ်ဂၞန်အိုတ်၊ မရိုဟ်လၟိဟ် နကဵုဗၞတ်ဗ္ၜတ် ဗွဲတၟေင် တုဲ ကၠောန်ပ ဗလံက် ဗွဲတၟေင်၊၊"; +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"] = "ထပ်, ပတိတ်, ဟွံသေၚ် ကလေၚ်ဖျေံလၟေၚ် ရုဲစှ် သွက်ဂွံကလေၚ်ထမံက်ဣဏံ ယဝ်ရကၟာတ်မ္ဂး"; +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"] = "ကၠောန်ပတိတ် လလောင်တြး မဂၠိုင် ကုအလန်၊၊"; +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_VARIABLE"] = "ဇိုတ်ပလီု အပြံင်အလှာဲ '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "ဇိုတ်ပလီု %1 တုဲ ရပ်စပ် '%2' နဒဒှ်မပြံင်လှာဲဟာ?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "ဇိုတ်ပလီု %1 ဗလံက်ဂမၠိုင်"; +Blockly.Msg["DISABLE_BLOCK"] = "ပဟွံသၟဟ်အစောံ ဗလံက်"; +Blockly.Msg["DUPLICATE_BLOCK"] = "ချာဲ"; +Blockly.Msg["DUPLICATE_COMMENT"] = "ချာဲ လညာတ်"; +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["IOS_CANCEL"] = "တးပဲါ"; +Blockly.Msg["IOS_ERROR"] = "ဗၠေတ်"; +Blockly.Msg["IOS_OK"] = "OK"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ စုတ် Input"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "ကဵုအခေါင် လိက်လလောင်တရးဂမၠိုင်"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INPUTS"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "စုတ်"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ ထပ် ကိုန်ချဳ"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "ပလီု"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "မၞးသုၚ်စောဲကေတ် ယၟုကိုန်ချဳမမုဟွံမွဲ"; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "ကဵုယၟုတၟိ"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "ယၟု ကိုန်ချဳ"; +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"] = "list"; // untranslated +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"] = "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"] = "first"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# from end"; // untranslated +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"] = "last"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "random"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "remove"; // untranslated +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"] = "Returns the item at the specified position in a list."; // 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"] = "Removes and returns the item at the specified position in a list."; // 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"] = "Removes the item at the specified position in a list."; // 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_FROM_END_TOOLTIP"] = "%1 is the last item."; // untranslated +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 is the first item."; // 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 %1 if item is not found."; // untranslated +Blockly.Msg["LISTS_INLIST"] = "in list"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 is empty"; // untranslated +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_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "as"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "insert at"; // untranslated +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"] = "Inserts the item at the specified position in a list."; // 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"] = "Sets the item at the specified position in a list."; // 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/ဟွံညဳသၟဟ်_(သၚ်္ချာဂမၠိုၚ်)"; +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_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"] = "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"] = "စမ်ၜတ်"; +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"] = "Return the sum of the two numbers."; // untranslated +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"] = "Return the product of the two numbers."; // untranslated +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Return the first number raised to the power of the second number."; // untranslated +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +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"] = "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 +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // 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"] = "is divisible by"; // untranslated +Blockly.Msg["MATH_IS_EVEN"] = "is even"; // untranslated +Blockly.Msg["MATH_IS_NEGATIVE"] = "is negative"; // untranslated +Blockly.Msg["MATH_IS_ODD"] = "is odd"; // untranslated +Blockly.Msg["MATH_IS_POSITIVE"] = "is positive"; // untranslated +Blockly.Msg["MATH_IS_PRIME"] = "is prime"; // untranslated +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"] = "is whole"; // untranslated +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"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "မဂၞန်မွဲ"; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "average of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "max of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "median of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "min of list"; // untranslated +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"] = "Return the largest number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Return the median number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Return the smallest number in the list."; // untranslated +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/Square_root"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "ဍာံဍာံ"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "square root"; // untranslated +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"] = "Return the natural logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Return the base 10 logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Return the negation of a number."; // untranslated +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_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"; // untranslated +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["NEW_COLOUR_VARIABLE"] = "အဃောမပြံင်လှာဲ ကၠောန်ဒၟံင် အသာ်..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "အဃောမပြံင်လှာဲ ကၠောန်ဒၟံင် လၟိဟ်ဂၞန်..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "အဃောမပြံင်လှာဲကၠောန်ဒၟံင် လၟေင်..."; +Blockly.Msg["NEW_VARIABLE"] = "အဃောမပြံင်လှာဲဒၟံင်..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "ယၟု မပြံင်လှာဲလဝ် တၟိ -"; +Blockly.Msg["NEW_VARIABLE_TYPE_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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // 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"] = "Create '%1'"; // untranslated +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/Subroutine"; // 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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "return"; // untranslated +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"] = "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"] = "'%1' သီုဖအိုတ်ဂှ် ကဵုယၟုတၟိ ပြံင်လှာဲထောအ်:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "to %1 append text %2"; // 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"] = "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"] = "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_LAST"] = "get last letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "get random letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returns the letter at the specified position."; // untranslated +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Add an item to the text."; // untranslated +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"] = "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_OPERATOR_FIRST"] = "find first occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "find last occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "in text %1 %2 %3"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 is empty"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Returns true if the provided text is empty."; // untranslated +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"] = "print %1"; // untranslated +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_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // 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"] = "ဟွံပ"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // 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["VARIABLE_ALREADY_EXISTS"] = "ယၟုမပြံင်လှာဲ '%1' ဂှ် နွံဒၟံင်တုဲရ၊၊"; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "ယၟုမပြံင်လှာဲ '%1' ဂှ် နွံဒၟံင်တုဲရ နကဵုဗီုပြင်တၞဟ် - '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/ms.js b/js/msg/js/ms.js new file mode 100644 index 0000000..38b8354 --- /dev/null +++ b/js/msg/js/ms.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Berikan Komen"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Ubah nilai:"; +Blockly.Msg["CLEAN_UP"] = "Kemaskan Blok"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "Lipat Blok²"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Lipat Blok"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "warna 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "warna 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "nisbah"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "adun"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Campurkan dua warna sekali pada nisbah yang ditentukan (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://ms.wikipedia.org/wiki/Warna"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Pilih satu warna daripada palet."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "warna rawak"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Pilih satu warna secara rawak."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "biru"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "hijau"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "merah"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "warnakan"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Peroleh satu warna dengan menentukan amaun campuran merah, hijau dan biru. Kesemua nilai haruslah antara 0 hingga 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"] = "hentikan gelung"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "teruskan dengan lelaran gelung seterusnya"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Keluar dari gelung pengandung."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Langkau seluruh gelung yang tinggal dan bersambung dengan lelaran seterusnya."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Amaran: Blok ini hanya boleh digunakan dalam satu gelung."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +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_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 +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Tambah, alih keluar, atau susun semula bahagian-bahagian untuk menyusun semula blok jika."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "lain"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "lain jika"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "jika"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Jika nilai yang benar, lakukan beberapa penyata."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Jika suatu nilai benar, lakukan penyata blok pertama. Jika tidak, bina penyata blok kedua."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Jika nilai yang pertama adalah benar, lakukan penyata pertama blok. Sebaliknya, jika nilai kedua adalah benar, lakukan penyata blok kedua."; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "lakukan"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "ulang %1 kali"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Lakukan perintah berulang kali."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "ulangi sehingga"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "ulangi apabila"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Lakukan beberapa perintah apabila nilainya palsu (false)."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Lakukan beberapa perintah apabila nilainya benar (true)."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Hapuskan kesemua %1 blok?"; +Blockly.Msg["DELETE_BLOCK"] = "Hapuskan Blok"; +Blockly.Msg["DELETE_VARIABLE"] = "Delete the '%1' variable"; // untranslated +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg["DELETE_X_BLOCKS"] = "Hapuskan %1 Blok"; +Blockly.Msg["DISABLE_BLOCK"] = "Matikan Blok"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Pendua"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +Blockly.Msg["ENABLE_BLOCK"] = "Hidupkan Blok"; +Blockly.Msg["EXPAND_ALL"] = "Buka Blok²"; +Blockly.Msg["EXPAND_BLOCK"] = "Buka Blok"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Input Luaran"; +Blockly.Msg["HELP"] = "Bantuan"; +Blockly.Msg["INLINE_INPUTS"] = "Input Sebaris"; +Blockly.Msg["IOS_CANCEL"] = "Cancel"; // untranslated +Blockly.Msg["IOS_ERROR"] = "Error"; // untranslated +Blockly.Msg["IOS_OK"] = "OK"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Add Input"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INPUTS"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Add"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Add Variable"; // untranslated +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Delete"; // untranslated +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "You can't use an empty variable name."; // untranslated +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Rename"; // untranslated +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Variable name"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "Wujudkan senarai kosong"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Kembalikan senarai panjang 0, yang tidak mengandungi rekod data"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "senarai"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Tambah, alih keluar, atau susun semula bahagian-bahagian untuk menyusun semula senarai blok."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "wujudkan senarai dengan"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Tambah item ke dalam senarai."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Wujudkan senarai dengan apa jua nombor item."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "pertama"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# dari akhir"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; +Blockly.Msg["LISTS_GET_INDEX_GET"] = "dapatkan"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "dapat dan alihkan"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "terakhir"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "rawak"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "alihkan"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Kembalikan item pertama dalam senarai."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Kembalikan item dalam kedudukan yang ditetapkan dalam senarai."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Kembalikan item pertama dalam senarai."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Kembalikan item rawak dalam senarai."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Alihkan dan kembalikan item pertama dalam senarai."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Alihkan dan kembalikan item mengikut spesifikasi posisi dalam senarai."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Alihkan dan kembalikan item terakhir dalam senarai."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Alihkan dan kembalikan item rawak dalam senarai."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Alihkan item pertama dalam senarai."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Alihkan item pada posisi mengikut spesifikasi dalam senarai."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Alihkan item terakhir dalam senarai."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Alihkan item rawak dalam senarai."; +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 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 sub-senarai daripada pertama"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "dapatkan sub-senarai daripada # daripada terakhir"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "dapatkan sub-senarai daripada #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Wujudkan salinan bahagian yang ditentukan dari senarai."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 ialah item terakhir."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 ialah item pertama."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "cari pertama item kejadian"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "cari kejadian akhir item"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Menyatakan indeks kejadian pertama/terakhir item berkenaan dalam senarai. Menyatakan %1 jika item berkenaan tidak ditemui."; +Blockly.Msg["LISTS_INLIST"] = "dalam senarai"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 adalah kosong"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Kembalikan benar jika senarai kosong."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "panjang %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Kembalikan panjang senarai"; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "wujudkan senarai dengan item %1 diulangi %2 kali"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Wujudkan senarai yang terdiri daripada nilai berulang mengikut nombor yang ditentukan."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "sebagai"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "masukkan pada"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "set"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Selit item pada permulaan senarai."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Masukkan item pada posisi yand ditentukan dalam senarai."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Tambahkan item dalam senarai akhir."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Selit item secara rawak di dalam senarai."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Set item pertama dalam senarai."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Masukkan item pada posisi yang ditentukan dalam senarai."; +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"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Cantumkan senarai teks menjadi satu teks, dipecahkan oleh delimiter."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Pecahkan teks kepada senarai teks, berpecah di setiap delimiter."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "dengan delimiter"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "palsu"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Kembalikan samada benar atau palsu."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "benar"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://id.wikipedia.org/wiki/Pertidaksamaan"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Kembali benar jika kedua-dua input benar antara satu sama lain."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Kembali benar jika input pertama adalah lebih besar daripada input kedua."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Kembali benar jika input pertama adalah lebih besar daripada atau sama dengan input kedua."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Kembali benar jika input pertama adalah lebih kecil daripada input kedua."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Kembali benar jika input pertama adalah lebih kecil daripada atau sama dengan input kedua."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Taip balik benar jika kedua-dua input tidak sama."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "bukan %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "'Benar' akan dibalas jika inputnya salah. 'Salah' akan dibalas jika inputnya benar."; +Blockly.Msg["LOGIC_NULL"] = "null"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Returns 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"] = "Return true if both inputs are true."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Return true if at least one of the inputs is true."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "test"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "Jika palsu"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "Jika benar"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://ms.wikipedia.org/wiki/Aritmetik"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Kembalikan jumlah kedua-dua bilangan."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Taip balik hasil bahagi dua nombor tersebut."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Taip balik hasil tolak dua nombor tersebut."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Taip balik hasil darab dua nombor tersebut."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Return the first number raised to the power of the second number."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://id.wikipedia.org/wiki/Perjumlahan"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "perubahan %1 oleh %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Tambah nombor kepada pembolehubah '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://ms.wikipedia.org/wiki/Pemalar_matematik"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "constrain %1 low %2 high %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Constrain a number to be between the specified limits (inclusive)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "Boleh dibahagikan dengan"; +Blockly.Msg["MATH_IS_EVEN"] = "Adalah genap"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "negatif"; +Blockly.Msg["MATH_IS_ODD"] = "aneh"; +Blockly.Msg["MATH_IS_POSITIVE"] = "adalah positif"; +Blockly.Msg["MATH_IS_PRIME"] = "is prime"; +Blockly.Msg["MATH_IS_TOOLTIP"] = "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false."; +Blockly.Msg["MATH_IS_WHOLE"] = "is whole"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://id.wikipedia.org/wiki/Operasi_modulus"; +Blockly.Msg["MATH_MODULO_TITLE"] = "remainder of %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Taip balik baki yang didapat daripada pembahagian dua nombor tersebut."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://ms.wikipedia.org/wiki/Nombor"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Suatu nombor."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "purata daripada senarai"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "Max senarai"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "Median senarai"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "min dalam senarai"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "jenis senarai"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "Item rawak daripada senarai"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "sisihan piawai bagi senarai"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "Jumlah senarai"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Kembalikan purata (min aritmetik) nilai-nilai angka di dalam senarai."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Pulangkan jumlah terbesar dalam senarai."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Kembalikan nombor median dalam senarai."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Kembalikan nombor terkecil dalam senarai."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Kembali senarai item yang paling biasa dalam senarai."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Kembalikan elemen rawak daripada senarai."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Kembali dengan sisihan piawai daripada senarai."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Kembalikan jumlah semua nombor dalam senarai."; +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"] = "pecahan rawak"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Kembali sebahagian kecil rawak 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"] = "integer rawak dari %1ke %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Kembalikan integer rawak diantara dua had yang ditentukan, inklusif."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "pusingan"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "Pusingan ke bawah"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "pusingan ke atas"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Bulat nombor yang naik atau turun."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://ms.wikipedia.org/wiki/Punca_kuasa_dua"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "mutlak"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "Punca kuasa dua"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Kembalikan nilai mutlak suatu nombor."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Kembalikan e kepada kuasa nombor."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Kembali dalam logaritma nombor asli."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Kembali logarithm 10 asas nombor."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Kembalikan nombor yang songsang."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Kembalikan 10 kepada kuasa nombor."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Kembalikan punca kuasa nombor."; +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://ms.wikipedia.org/wiki/Fungsi_trigonometri"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Kembali arccosine beberapa nombor."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Kembalikan arcsince beberapa nombor."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Kembalikan beberapa nombor arctangent."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Kembalikan darjah kosinus (bukan radian)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Kembalikan darjah sine (bukan radian)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Kembalikan darjah tangen (bukan radian)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "Pembolehubah baru..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Nama pembolehubah baru:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "bolehkan kenyataan"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "dengan:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://ms.wikipedia.org/wiki/Fungsi"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://ms.wikipedia.org/wiki/Fungsi"; +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"] = "Terangkan fungsi ini..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "Buat sesuatu"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "Untuk"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Menghasilkan suatu fungsi tanpa output."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +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"; +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:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "to %1 append text %2"; // untranslated +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Append some text to variable '%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "Kepada huruf kecil"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "to Title Case"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "Kepada HURUF BESAR"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Return a copy of the text in a different case."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "get first letter"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "get letter # from end"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "get letter #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "Dapatkan abjad terakhir"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "Dapatkan abjad rawak"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returns the letter at the specified position."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Add an item to the text."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "Sertai"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Add, remove, or reorder sections to reconfigure this text block."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "to letter # from end"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "to letter #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "untuk huruf terakhir"; +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"] = "dalam teks"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "get substring from first letter"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "get substring from letter # from end"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "get substring from letter #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Returns a specified portion of the text."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "mencari kejadian pertama teks"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "mencari kejadian terakhir teks"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "dalam teks %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Kembalikan Indeks kejadian pertama/terakhir dari teks pertama ke dalam teks kedua. Kembalikan %1 Jika teks tidak ditemui."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 adalah kosong"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Kembalikan benar jika teks yang disediakan adalah kosong."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "hasilkan teks dengan"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Hasilkan sebahagian teks dengan menghubungkan apa jua nombor item."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "panjang %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Kembalikan jumlah huruf (termasuk ruang) dalam teks yang disediakan."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "cetak %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Cetak teks yang ditentukan, nombor atau nilai lain."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Peringatan kepada pengguna untuk nombor."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Peringatkan pengguna untuk sebahagian teks."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "Prom untuk nombor dengan mesej"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "Prom untuk teks dengan mesej"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://ms.wikipedia.org/wiki/Rentetan"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Huruf, perkataan, atau baris teks."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "mengurangkan kawasan dari kedua-dua belah"; +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["UNNAMED_KEY"] = "unnamed"; // 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 +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Kembalikan nilai pemboleh ubah ini."; +Blockly.Msg["VARIABLES_SET"] = "set %1 ke %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Hasilkan 'set %1'"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Set pembolehubah ini supaya sama dengan input."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "A variable named '%1' already exists."; // untranslated +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/nb.js b/js/msg/js/nb.js new file mode 100644 index 0000000..8d74e63 --- /dev/null +++ b/js/msg/js/nb.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Legg til kommentar"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Kan ikke slette variabelen «%1» fordi den er del av definisjonen for funksjonen «%2»"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Bytt verdi:"; +Blockly.Msg["CLEAN_UP"] = "Rydd opp Blocks"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "Skjul blokker"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Skjul blokk"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "farge 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "farge 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg["COLOUR_BLEND_RATIO"] = "forhold"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "blande"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Blander to farger sammen med et gitt forhold (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Velg en farge fra paletten."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "tilfeldig farge"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Velg en tilfeldig farge."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "blå"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "grønn"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg["COLOUR_RGB_RED"] = "rød"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "farge med"; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "bryt ut av løkken"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "fortsett med neste gjentakelse av løkken"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Bryt ut av den gjeldende løkken."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Hopp over resten av denne løkken og fortsett med neste gjentakelse."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Advarsel: Denne blokken kan kun brukes innenfor en løkke."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "for hvert element %1 i listen %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "For hvert element i en liste, angi variabelen '%1' til elementet, og deretter lag noen setninger."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "tell med %1 fra %2 til %3 med %4"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Ha variabel \"%1\" ta verdiene fra start nummer til slutt nummer, telle med spesifisert intervall og lag de spesifiserte blokkene."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Legg til en betingelse til hvis blokken."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Legg til hva som skal skje hvis de andre ikke slår til."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Legg til, fjern eller flytt seksjoner i denne hvis-blokken."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "ellers"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "ellers hvis"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "hvis"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Hvis dette er sant, så gjør følgende."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Hvis dette er sant, så utfør den første blokken av instruksjoner. Hvis ikke, utfør den andre blokken."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "gjør"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "gjenta %1 ganger"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Gjenta noen instruksjoner flere ganger."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "gjenta til"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "gjenta mens"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Så lenge et utsagn ikke stemmer, gjør noen instruksjoner."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Så lenge et utsagn stemmer, utfør noen instruksjoner."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Slett alle %1 blokker?"; +Blockly.Msg["DELETE_BLOCK"] = "Slett blokk"; +Blockly.Msg["DELETE_VARIABLE"] = "Slett variabelen «%1»"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Slett %1 bruk av variabelen «%2»?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Slett %1 blokker"; +Blockly.Msg["DISABLE_BLOCK"] = "Deaktiver blokk"; +Blockly.Msg["DUPLICATE_BLOCK"] = "duplikat"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Dupliser kommentar"; +Blockly.Msg["ENABLE_BLOCK"] = "Aktiver blokk"; +Blockly.Msg["EXPAND_ALL"] = "Utvid blokker"; +Blockly.Msg["EXPAND_BLOCK"] = "Utvid blokk"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Eksterne kilder"; +Blockly.Msg["HELP"] = "Hjelp"; +Blockly.Msg["INLINE_INPUTS"] = "Interne kilder"; +Blockly.Msg["IOS_CANCEL"] = "Avbryt"; +Blockly.Msg["IOS_ERROR"] = "Feil"; +Blockly.Msg["IOS_OK"] = "OK"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Legg til parameter"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Tillat kommandoer"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Denne funksjonen har duplikatparametere."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "PARAMETERE"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Legg til"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Legg til variabel"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Slett"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Du kan ikke bruke et tomt variabelnavn."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Endre navn"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Variabelnavn"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "opprett en tom liste"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Returnerer en tom liste, altså med lengde 0"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "liste"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Legg til, fjern eller endre rekkefølgen for å endre på denne delen av listen."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "lag en liste med"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Tilføy et element til listen."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Lag en liste med et vilkårlig antall elementer."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "først"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# fra slutten"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; +Blockly.Msg["LISTS_GET_INDEX_GET"] = "hent"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "hent og fjern"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "siste"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "tilfeldig"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "fjern"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Returnerer det første elementet i en liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Returner elementet på den angitte posisjonen i en liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Returnerer det siste elementet i en liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Returnerer et tilfeldig element i en liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Fjerner og returnerer det første elementet i en liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Fjerner og returnerer elementet ved en gitt posisjon i en liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Fjerner og returnerer det siste elementet i en liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Fjerner og returnerer et tilfeldig element i en liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Fjerner det første elementet i en liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Fjerner et element ved en gitt posisjon i en liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Fjerner det siste elementet i en liste."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Fjerner et tilfeldig element i en liste."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "til # fra slutten"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "til #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "til siste"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "Hent en del av listen"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "Hent de siste # elementene"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "Hent del-listen fra #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Kopiérer en ønsket del av en liste."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 er det siste elementet."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 er det første elementet."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "finn første forekomst av elementet"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "finn siste forekomst av elementet"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Returnerer indeksen av den første/siste forekomsten av elementet i lista. Returnerer %1 hvis ikke funnet."; +Blockly.Msg["LISTS_INLIST"] = "i listen"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 er tom"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Returnerer sann hvis listen er tom."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "lengden på %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Returnerer lengden til en liste."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "Lag en liste hvor elementet %1 forekommer %2 ganger"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Lager en liste hvor den gitte verdien gjentas et antall ganger."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverser %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverser en kopi av ei liste."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "som"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "sett inn ved"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "sett"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Setter inn elementet i starten av en liste."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Setter inn elementet ved den angitte posisjonen i en liste."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Tilføy elementet til slutten av en liste."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Setter inn elementet ved en tilfeldig posisjon i en liste."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Angir det første elementet i en liste."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Setter inn elementet ved den angitte posisjonen i en liste."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "stigende"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "synkende"; +Blockly.Msg["LISTS_SORT_TITLE"] = "sorter %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Sorter en kopi av en liste."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alfabetisk, ignorert store/små bokstaver"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numerisk"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alfabetisk"; +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"] = "lag liste av tekst"; +Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "lag tekst av liste"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Føy sammen en liste tekster til én tekst, avskilt av en avgrenser."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Splitt teksten til en liste med tekster, brutt ved hver avgrenser."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "med avgrenser"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "usann"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Returnerer enten sann eller usann."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "sann"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Returnerer sann hvis begge inputene er like hverandre."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Returnerer sant hvis det første argumentet er større enn den andre argumentet."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Returnerer sant hvis det første argumentet er større enn eller likt det andre argumentet."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Returnerer sant hvis det første argumentet er mindre enn det andre argumentet."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Returnerer sant hvis det første argumentet er mindre enn eller likt det andre argumentet."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Returnerer sant hvis begge argumentene er ulike hverandre."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "ikke %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Returnerer sant hvis argumentet er usant. Returnerer usant hvis argumentet er sant."; +Blockly.Msg["LOGIC_NULL"] = "null"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Returnerer null."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "og"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "eller"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Returnerer sant hvis begge argumentene er sanne."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Returnerer sant hvis minst ett av argumentene er sant."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "test"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "hvis usant"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "hvis sant"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Sjekk betingelsen i 'test'. Hvis betingelsen er sann, da returneres 'hvis sant' verdien. Hvis ikke returneres 'hvis usant' verdien."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://no.wikipedia.org/wiki/Aritmetikk"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Returnerer summen av to tall."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Returner kvotienten av to tall."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Returner differansen mellom to tall."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Returner produktet av to tall."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Returner det første tallet opphøyd i den andre tallet."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 av X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "endre %1 ved %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Addere et tall til variabelen '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Returner en av felleskonstantene π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), eller ∞ (uendelig)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "begrense %1 lav %2 høy %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Begrens et tall til å være mellom de angitte grenseverdiene (inklusiv)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "er delelig med"; +Blockly.Msg["MATH_IS_EVEN"] = "er et partall"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "er negativer negativt"; +Blockly.Msg["MATH_IS_ODD"] = "er et oddetall"; +Blockly.Msg["MATH_IS_POSITIVE"] = "er positivt"; +Blockly.Msg["MATH_IS_PRIME"] = "er et primtall"; +Blockly.Msg["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."; +Blockly.Msg["MATH_IS_WHOLE"] = "er et heltall"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "resten av %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Returner resten fra delingen av to tall."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "x"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Et tall."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "gjennomsnittet av listen"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "maksimum av liste"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "medianen til listen"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "minimum av listen"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "Listens typetall"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "tilfeldig element i listen"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "standardavviket til listen"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "summen av listen"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Returner det aritmetiske gjennomsnittet av tallene i listen."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Returner det største tallet i listen."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Returner listens median."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Returner det minste tallet i listen."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Returner en liste av de vanligste elementene i listen."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Returner et tilfeldig element fra listen."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Returner listens standardavvik."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Returner summen av alle tallene i listen."; +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"] = "tilfeldig flyttall"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Returner et tilfeldig flyttall mellom 0.0 (inkludert) og 1.0 (ikke inkludert)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "Et tilfeldig heltall mellom %1 og %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Returner et tilfeldig tall mellom de to spesifiserte grensene, inkludert de to."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "avrunding"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "rund ned"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "rund opp"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Avrund et tall ned eller opp."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absoluttverdi"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "kvadratrot"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Returner absoluttverdien av et tall."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Returner e opphøyd i et tall."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Returner den naturlige logaritmen til et tall."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Returner base-10 logaritmen til et tall."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Returner det negative tallet."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Returner 10 opphøyd i et tall."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Returner kvadratroten av et tall."; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; +Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; +Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; +Blockly.Msg["MATH_TRIG_COS"] = "cos"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Returner arccosinus til et tall."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Returner arcsinus til et tall."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Returner arctangens til et tall."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Returner cosinus av en vinkel (ikke radian)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Returner sinus av en vinkel (ikke radian)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Returner tangenten av en vinkel (ikke radian)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Oppretter fargevariabel …"; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Oppretter tallvariabel …"; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Oppretter strengvariabel …"; +Blockly.Msg["NEW_VARIABLE"] = "Opprett variabel…"; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Nytt variabelnavn:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Ny variabeltype:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "tillat uttalelser"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "med:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Kjør den brukerdefinerte funksjonen '%1'."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Kjør den brukerdefinerte funksjonen'%1' og bruk resultatet av den."; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "med:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "Opprett '%1'"; +Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Beskriv denne funksjonen…"; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "gjør noe"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "til"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Opprett en funksjon som ikke har noe resultat."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "returner"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Oppretter en funksjon som har et resultat."; +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Advarsel: Denne funksjonen har duplikate parametere."; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Marker funksjonsdefinisjonen"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Hvis en verdi er sann, returner da en annen verdi."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Advarsel: Denne blokken kan bare benyttes innenfor en funksjonsdefinisjon."; +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"] = "Gjør om"; +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:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "til %1, legg til teksten %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Tilføy tekst til variabelen '%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "til små bokstaver"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "til store forbokstaver"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "til STORE BOKSTAVER"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Returnerer en kopi av teksten der store og små bokstaver er byttet om."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "hent første bokstav"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "hent bokstav # fra slutten"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "hent bokstav #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "hent den siste bokstaven"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "hent en tilfeldig bokstav"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; +Blockly.Msg["TEXT_CHARAT_TITLE"] = "i teksten %1, %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returnerer bokstaven på angitt plassering."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "tell %1 i %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Tell hvor mange ganger noe tekst dukker opp i annen tekst."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Legg til et element til teksten."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "føy sammen"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Legg til, fjern eller forandre rekkefølgen for å forandre på denne tekstblokken."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "til bokstav # fra slutten"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "til bokstav #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "til siste bokstav"; +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"] = "i tekst"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "hent delstreng fra første bokstav"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "hent delstreng fra bokstav # fra slutten"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "hent delstreng fra bokstav #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Returnerer den angitte delen av teksten."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "finn første forekomst av tekst"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "finn siste forekomst av tekst"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "i teksten %1, %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returnerer posisjonen for første/siste forekomsten av den første tekst i den andre teksten. Returnerer %1 hvis teksten ikke blir funnet."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 er tom"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Returnerer sann hvis den angitte teksten er tom."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "lag tekst med"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Opprett en tekst ved å sette sammen et antall elementer."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "lengden av %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Returnerer antall bokstaver (inkludert mellomrom) i den angitte teksten."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "skriv ut %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Skriv ut angitt tekst, tall eller annet innhold."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Be brukeren om et tall."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Spør brukeren om tekst."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "spør om et tall med en melding"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "spør om tekst med en melding"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "erstatt %1 med %2 i %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Erstatter alle forekomster av noe tekst i en annen tekst."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverser %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverserer rekkefølgen på tegnene i teksten."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "En bokstav, ett ord eller en linje med tekst."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "fjern mellomrom fra begge sider av"; +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"] = "Angre"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // 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 +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Returnerer verdien av denne variabelen."; +Blockly.Msg["VARIABLES_SET"] = "sett %1 til %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Opprett 'hent %1'"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Setter verdien av denne variablen lik parameteren."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "En variabel med navn «%1» finnes allerede."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "En variabel med navn «%1» finnes allerede for en annen type: «%2»."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Si noe …"; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/nl.js b/js/msg/js/nl.js new file mode 100644 index 0000000..adbda67 --- /dev/null +++ b/js/msg/js/nl.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Opmerking toevoegen"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "De variabele \"%1\" kan niet verwijderd worden omdat die onderdeel uitmaakt van de definitie van de functie \"%2\""; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Waarde wijzigen:"; +Blockly.Msg["CLEAN_UP"] = "Blokken opschonen"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Samengevouwen blokken bevatten waarschuwingen."; +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/"; +Blockly.Msg["COLOUR_BLEND_RATIO"] = "verhouding"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "mengen"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Mengt twee kleuren samen met een bepaalde verhouding (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://nl.wikipedia.org/wiki/Kleur"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Kies een kleur in het palet."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "willekeurige kleur"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Kies een willekeurige kleur."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "blauw"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "groen"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg["COLOUR_RGB_RED"] = "rood"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "kleuren met"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Maak een kleur met de opgegeven hoeveelheid rood, groen en blauw. Alle waarden moeten tussen 0 en 100 liggen."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "uit lus breken"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "doorgaan met de volgende iteratie van de lus"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "uit de bovenliggende lus breken"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "De rest van deze lus overslaan en doorgaan met de volgende herhaling."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Waarschuwing: dit blok mag alleen gebruikt worden in een lus."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "voor ieder item %1 in lijst %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Voor ieder item in een lijst, stel de variabele \"%1\" in op het item en voer daarna opdrachten uit."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; +Blockly.Msg["CONTROLS_FOR_TITLE"] = "rekenen met %1 van %2 tot %3 in stappen van %4"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Laat de variabele \"%1\" de waarden aannemen van het beginnummer tot het laatste nummer, tellende met het opgegeven interval, en met uitvoering van de opgegeven blokken."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Voeg een voorwaarde toe aan het als-blok."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Voeg een laatste, vang-alles conditie toe aan het als-statement."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Voeg stukken toe, verwijder of wijzig de volgorde om dit \"als\"-blok te wijzigen."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "anders"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "anders als"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "als"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Als een waarde waar is, voer dan opdrachten uit."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Als een waarde waar is, voert dan het eerste blok met opdrachten uit. Voer andere het tweede blok met opdrachten uit."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Als de eerste waarde waar is, voer dan het eerste blok met opdrachten uit. Voer anders, als de tweede waarde waar is, het tweede blok met opdrachten uit."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Als de eerste waarde \"waar\" is, voer dan het eerste blok uit. Voer anders wanneer de tweede waarde \"waar\" is, het tweede blok uit. Als geen van beide waarden waar zijn, voer dan het laatste blok uit."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://nl.wikipedia.org/wiki/Repetitie_(informatica)#For_en_Foreach"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "voer uit"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "%1 keer herhalen"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Voer een aantal opdrachten meerdere keren uit."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "herhalen totdat"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "herhalen zolang"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Terwijl een waarde onwaar is de volgende opdrachten uitvoeren."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Terwijl een waarde waar is de volgende opdrachten uitvoeren."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Alle %1 blokken verwijderen?"; +Blockly.Msg["DELETE_BLOCK"] = "Blok verwijderen"; +Blockly.Msg["DELETE_VARIABLE"] = "Verwijder de variabele \"%1\""; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "%1 gebruiken van de variabele \"%2\" verwijderen?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "%1 blokken verwijderen"; +Blockly.Msg["DISABLE_BLOCK"] = "Blok uitschakelen"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Duplicaat"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Opmerking dupliceren"; +Blockly.Msg["ENABLE_BLOCK"] = "Blok inschakelen"; +Blockly.Msg["EXPAND_ALL"] = "Blokken uitvouwen"; +Blockly.Msg["EXPAND_BLOCK"] = "Blok uitvouwen"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Externe invoer"; +Blockly.Msg["HELP"] = "Hulp"; +Blockly.Msg["INLINE_INPUTS"] = "Inline invoer"; +Blockly.Msg["IOS_CANCEL"] = "Annuleren"; +Blockly.Msg["IOS_ERROR"] = "Fout"; +Blockly.Msg["IOS_OK"] = "OK"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Invoer toevoegen"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Statements toestaan"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Deze functie heeft dubbele invoeren."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INVOER"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Toevoegen"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Variabele toevoegen"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Verwijderen"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "U kunt geen lege variabelenaam gebruiken."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Hernoemen"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Variabelenaam"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "maak een lege lijst"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Geeft een lijst terug met lengte 0, zonder items"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "lijst"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Voeg stukken toe, verwijder ze of wijzig de volgorde om dit lijstblok aan te passen."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "maak een lijst met"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Voeg iets toe aan de lijst."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Maak een lijst met een willekeurig aantal items."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "eerste"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# van einde"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; +Blockly.Msg["LISTS_GET_INDEX_GET"] = "haal op"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "haal op en verwijder"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "laatste"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "willekeurig"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "verwijder"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Geeft het eerste item in een lijst terug."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Geeft het item op de opgegeven positie in een lijst."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Geeft het laatste item in een lijst terug."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Geeft een willekeurig item uit een lijst."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Geeft het laatste item in een lijst terug en verwijdert het."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Geeft het item op de opgegeven positie in een lijst terug en verwijdert het."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Geeft het laatste item uit een lijst terug en verwijdert het."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Geeft een willekeurig item in een lijst terug en verwijdert het."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Verwijdert het eerste item in een lijst."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Verwijdert het item op de opgegeven positie in een lijst."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Verwijdert het laatste item uit een lijst."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Verwijdert een willekeurig item uit een lijst."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "naar # vanaf einde"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "naar item"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "naar laatste"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "haal sublijst op vanaf eerste"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "haal sublijst op van positie vanaf einde"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "haal sublijst op vanaf positie"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Maakt een kopie van het opgegeven deel van de lijst."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "Item %1 is het laatste item."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "Item %1 is het eerste item."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "zoek eerste voorkomen van item"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "zoek laatste voorkomen van item"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Geeft de index terug van het eerste of laatste voorkomen van een item in de lijst. Geeft %1 terug als het item niet is gevonden."; +Blockly.Msg["LISTS_INLIST"] = "in lijst"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 is leeg"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Geeft waar terug als de lijst leeg is."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; +Blockly.Msg["LISTS_LENGTH_TITLE"] = "lengte van %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Geeft de lengte van een lijst terug."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_REPEAT_TITLE"] = "Maak lijst met item %1, %2 keer herhaald"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Maakt een lijst die bestaat uit de opgegeven waarde, het opgegeven aantal keer herhaald."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "%1 omkeren"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Keert een kopie van een lijst om."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "als"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "tussenvoegen op"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "stel in"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Voegt het item toe aan het begin van de lijst."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Voegt het item op een opgegeven positie in een lijst in."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Voeg het item aan het einde van een lijst toe."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Voegt het item op een willekeurige positie in de lijst in."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Stelt het eerste item in een lijst in."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Zet het item op de opgegeven positie in de lijst."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "oplopend"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "aflopend"; +Blockly.Msg["LISTS_SORT_TITLE"] = "sorteer %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Sorteer een kopie van een lijst."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alfabetisch, negeer hoofd-/kleine letters"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numeriek"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alfabetisch"; +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"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Lijst van tekstdelen samenvoegen in één stuk tekst, waarbij de tekstdelen gescheiden zijn door een scheidingsteken."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Tekst splitsen in een lijst van teksten op basis van een scheidingsteken."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "met scheidingsteken"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "onwaar"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Geeft \"waar\" of \"onwaar\" terug."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "waar"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://nl.wikipedia.org/wiki/Ongelijkheid_(wiskunde)"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Geeft \"waar\", als beide waarden gelijk aan elkaar zijn."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Geeft \"waar\" terug als de eerste invoer meer is dan de tweede invoer."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Geeft \"waar\" terug als de eerste invoer groter is of gelijk aan de tweede invoer."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Geeft \"waar\" als de eerste invoer kleiner is dan de tweede invoer."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Geeft \"waar\" terug als de eerste invoer kleiner of gelijk is aan de tweede invoer."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Geeft \"waar\" terug als de waarden niet gelijk zijn aan elkaar."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "niet %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Geeft \"waar\" terug als de invoer \"onwaar\" is. Geeft \"onwaar\" als de invoer \"waar\" is."; +Blockly.Msg["LOGIC_NULL"] = "niets"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Geeft niets terug."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "en"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; +Blockly.Msg["LOGIC_OPERATION_OR"] = "of"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Geeft waar als beide waarden waar zijn."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Geeft \"waar\" terug als in ieder geval één van de waarden waar is."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "test"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "als onwaar"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "als waar"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Test de voorwaarde in \"test\". Als de voorwaarde \"waar\" is, geef de waarde van \"als waar\" terug; geef anders de waarde van \"als onwaar\" terug."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://nl.wikipedia.org/wiki/Rekenen"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Geeft de som van 2 getallen."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Geeft de gedeelde waarde van twee getallen."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Geeft het verschil van de twee getallen."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Geeft het product terug van de twee getallen."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Geeft het eerste getal tot de macht van het tweede getal."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 van X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Geef de boogtangens van punt (X, Y) terug in graden tussen -180 naar 180."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "%1 wijzigen met %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Voegt een getal toe aan variabele \"%1\"."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://nl.wikipedia.org/wiki/Wiskundige_constante"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Geeft een van de vaak voorkomende constante waardes: π (3.141…), e (2.718…), φ (1.618…), √2 (1.414…), √½ (0.707…), of ∞ (oneindig)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "beperk %1 van minimaal %2 tot maximaal %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Beperk een getal tussen de twee opgegeven limieten (inclusief)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "is deelbaar door"; +Blockly.Msg["MATH_IS_EVEN"] = "is even"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "is negatief"; +Blockly.Msg["MATH_IS_ODD"] = "is oneven"; +Blockly.Msg["MATH_IS_POSITIVE"] = "is positief"; +Blockly.Msg["MATH_IS_PRIME"] = "is priemgetal"; +Blockly.Msg["MATH_IS_TOOLTIP"] = "Test of een getal even, oneven, een priemgetal, geheel, positief of negatief is, of deelbaar is door een bepaald getal. Geeft \"waar\" of \"onwaar\"."; +Blockly.Msg["MATH_IS_WHOLE"] = "is geheel getal"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://nl.wikipedia.org/wiki/Modulair_rekenen"; +Blockly.Msg["MATH_MODULO_TITLE"] = "restgetal van %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Geeft het restgetal van het resultaat van de deling van de twee getallen."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://nl.wikipedia.org/wiki/Getal_%28wiskunde%29"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Een getal."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "gemiddelde van lijst"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "hoogste uit lijst"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "mediaan van lijst"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "laagste uit lijst"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "modi van lijst"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "willekeurige item van lijst"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "standaarddeviatie van lijst"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "som van lijst"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Geeft het gemiddelde terug van de numerieke waardes in een lijst."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Geeft het grootste getal in een lijst."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Geeft de mediaan in de lijst."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Geeft het kleinste getal uit een lijst."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Geeft een lijst van de meest voorkomende onderdelen in de lijst."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Geeft een willekeurig item uit de lijst terug."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Geeft de standaardafwijking van de lijst."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Geeft de som van alle getallen in de lijst."; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://nl.wikipedia.org/wiki/Toevalsgenerator"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "willekeurige fractie"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Geeft een willekeurige fractie tussen 0.0 (inclusief) en 1.0 (exclusief)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://nl.wikipedia.org/wiki/Toevalsgenerator"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "willekeurig geheel getal van %1 tot %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Geeft een willekeurig getal tussen de 2 opgegeven limieten in, inclusief."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://nl.wikipedia.org/wiki/Afronden"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "afronden"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "naar beneden afronden"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "omhoog afronden"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Rondt een getal af omhoog of naar beneden."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://nl.wikipedia.org/wiki/Vierkantswortel"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absoluut"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "wortel"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Geeft de absolute waarde van een getal."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Geeft e tot de macht van een getal."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Geeft het natuurlijk logaritme van een getal."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Geeft het logaritme basis 10 van een getal."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Geeft de negatief van een getal."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Geeft 10 tot de macht van een getal."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Geeft de wortel van een getal."; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; +Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; +Blockly.Msg["MATH_TRIG_ATAN"] = "arctan"; +Blockly.Msg["MATH_TRIG_COS"] = "cos"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://nl.wikipedia.org/wiki/Goniometrische_functie"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Geeft de arccosinus van een getal."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Geeft de arcsinus van een getal."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Geeft de arctangens van een getal."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Geeft de cosinus van een graad (geen radialen)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Geeft de sinus van een graad (geen radialen)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Geeft de tangens van een graad (geen radialen)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Creëer kleurvariabele"; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Creëer numeriek variabele"; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Creëer tekstvariabele"; +Blockly.Msg["NEW_VARIABLE"] = "Variabele maken..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Nieuwe variabelenaam:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Nieuw soort variabele"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "statements toestaan"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "met:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://nl.wikipedia.org/wiki/Subprogramma"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Voer de door de gebruiker gedefinieerde functie \"%1\" uit."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://nl.wikipedia.org/wiki/Subprogramma"; +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"] = "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"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "om"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Maakt een functie zonder uitvoer."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://nl.wikipedia.org/wiki/Subprogramma"; +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"; +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:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg["TEXT_APPEND_TITLE"] = "voor%1 voeg tekst toe van %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Voeg tekst toe aan de variabele \"%1\"."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "naar kleine letters"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "naar Hoofdletter Per Woord"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "naar HOOFDLETTERS"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Geef een kopie van de tekst met veranderde hoofdletters terug."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "haal eerste letter op"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "haal letter # op vanaf einde"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "haal letter # op"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; +Blockly.Msg["TEXT_CHARAT_LAST"] = "haal laatste letter op"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "haal willekeurige letter op"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in tekst %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Geeft de letter op de opgegeven positie terug."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "%1 in %2 tellen"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Tel hoe vaak bepaalde tekst voorkomt in andere tekst."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Voegt een item aan de tekst toe."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "samenvoegen"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Toevoegen, verwijderen of volgorde wijzigen van secties om dit tekstblok opnieuw in te stellen."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "van letter # tot einde"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "naar letter #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "naar laatste letter"; +Blockly.Msg["TEXT_GET_SUBSTRING_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; +Blockly.Msg["TEXT_GET_SUBSTRING_INPUT_IN_TEXT"] = "in tekst"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "haal subtekst op van eerste letter"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "haal subtekst op vanaf letter # vanaf einde"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "haal subtekst op vanaf letter #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Geeft het opgegeven onderdeel van de tekst terug."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "zoek eerste voorkomen van tekst"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "zoek het laatste voorkomen van tekst"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "in tekst %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Geeft de index terug van het eerste of laatste voorkomen van de eerste tekst in de tweede tekst. Geeft %1 terug als de tekst niet gevonden is."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 is leeg"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Geeft \"waar\" terug, als de opgegeven tekst leeg is."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "maak tekst met"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Maakt een stuk tekst door één of meer items samen te voegen."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg["TEXT_LENGTH_TITLE"] = "lengte van %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Geeft het aantal tekens terug (inclusief spaties) in de opgegeven tekst."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; +Blockly.Msg["TEXT_PRINT_TITLE"] = "tekst weergeven: %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Drukt de opgegeven tekst, getal of een andere waarde af."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Vraagt de gebruiker om een getal in te voeren."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Vraagt de gebruiker om invoer."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "vraagt de gebruiker om een getal met de tekst"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "vraagt om invoer met bericht"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "vervang %1 door %2 in %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Vervang alle voorkomens van tekst in een andere tekst."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "%1 omkeren"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Keert de volgorde van de tekens in de tekst om."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://nl.wikipedia.org/wiki/String_%28informatica%29"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Een letter, woord of een regel tekst."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "spaties van beide kanten afhalen van"; +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["UNNAMED_KEY"] = "zonder naam"; +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"; +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Geeft de waarde van deze variabele."; +Blockly.Msg["VARIABLES_SET"] = "stel %1 in op %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Maak 'opvragen van %1'"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Verandert de waarde van de variabele naar de waarde van de invoer."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Er bestaat al een variabele met de naam \"%1\"."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Een variabele met de naam '%1' bestaat al voor een ander soort variabele: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly werkruimte"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Zeg iets..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/oc.js b/js/msg/js/oc.js new file mode 100644 index 0000000..cd0e630 --- /dev/null +++ b/js/msg/js/oc.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Apondre un comentari"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Modificar la valor :"; +Blockly.Msg["CLEAN_UP"] = "Netejar los blòts"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "Redusir los blòts"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Redusir lo blòt"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "color 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "color 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "ratio"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "mesclar"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Blends two colours together with a given ratio (0.0 - 1.0)."; // untranslated +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://oc.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Causir una color dins la paleta."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "color aleatòria"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Causir una color a l'azard."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "blau"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "verd"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "roge"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "coloriar amb"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Create a colour with the specified amount of red, green, and blue. All values must be between 0 and 100."; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "quitar la bocla"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "passar a l’iteracion de bocla seguenta"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Sortir de la bocla englobanta."; +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"] = "per cada element %1 dins la lista %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"] = "comptar amb %1 de %2 a %3 per %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"] = "Apondre una condicion al blòt 'se'."; +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"] = "siquenon"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "siquenon se"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "se"; +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://oc.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "far"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "repetir %1 còps"; +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"] = "repetir fins a"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "repetir tant que"; +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"] = "Suprimir totes los %1 blòts ?"; +Blockly.Msg["DELETE_BLOCK"] = "Suprimir lo blòt"; +Blockly.Msg["DELETE_VARIABLE"] = "Suprimir la variabla '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg["DELETE_X_BLOCKS"] = "Suprimir %1 blòts"; +Blockly.Msg["DISABLE_BLOCK"] = "Desactivar lo blòt"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Duplicar"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +Blockly.Msg["ENABLE_BLOCK"] = "Activar lo blòt"; +Blockly.Msg["EXPAND_ALL"] = "Desvolopar los blòts"; +Blockly.Msg["EXPAND_BLOCK"] = "Desvolopar lo blòt"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Entradas extèrnas"; +Blockly.Msg["HELP"] = "Ajuda"; +Blockly.Msg["INLINE_INPUTS"] = "Entradas en linha"; +Blockly.Msg["IOS_CANCEL"] = "Anullar"; +Blockly.Msg["IOS_ERROR"] = "Error"; +Blockly.Msg["IOS_OK"] = "D'acòrdi"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Apondre una entrada"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Òrdres autorizats"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Aquesta foncion a d'entradas duplicadas."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "ENTRADAS"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Apondre"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Apondre una variabla"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Suprimir"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Podètz pas utilizar un nom de variabla void."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Renomenar"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Nom de la variabla"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "crear una lista voida"; +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"] = "lista"; +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"] = "crear una lista amb"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Apondre un element a la lista."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Create a list with any number of items."; // untranslated +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "primièr"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# dempuèi la fin"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_GET"] = "obténer"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "obténer e suprimir"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "darrièr"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "aleatòri"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "suprimit"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Renvia lo primièr element dins una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Renvia l'element de la posicion especificada dins la lista."; +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"] = "Removes and returns the item at the specified position in a list."; // 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"] = "Removes the item at the specified position in a list."; // 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"] = "fins a # dempuèi la fin"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "fins a #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "fins a la fin"; +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_FROM_END_TOOLTIP"] = "%1 es lo darrièr element."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 es lo primièr element."; +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 %1 if item is not found."; // untranslated +Blockly.Msg["LISTS_INLIST"] = "dins la lista"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 es voida"; +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"] = "longitud de %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_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "inversar %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Inversar la còpia d’una lista."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "coma"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "inserir en"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "metre"; +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"] = "Inserts the item at the specified position in a list."; // 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"] = "Sets the item at the specified position in a list."; // 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"] = "creissent"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "descreissent"; +Blockly.Msg["LISTS_SORT_TITLE"] = "triar %1 %2 %3"; +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"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alfabetic"; +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"] = "amb lo separador"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "fals"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Renvia siá verai siá fals."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "verai"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://fr.wikipedia.org/wiki/Inegalite_(mathematiques)"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Renviar verai se las doas entradas son egalas."; +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"] = "Renviar verai se las doas entradas son diferentas."; +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"] = "Returns true if the input is false. Returns false if the input is true."; // untranslated +Blockly.Msg["LOGIC_NULL"] = "nul"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Renvia nul."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "e"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "o"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Renviar verai se las doas entradas son vertadièras."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Return true if at least one of the inputs is true."; // untranslated +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "tèst"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "se fals"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "se verai"; +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://oc.wikipedia.org/wiki/Aritmetica"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Renvia la soma dels dos nombres."; +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"] = "Return the product of the two numbers."; // untranslated +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Return the first number raised to the power of the second number."; // untranslated +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated +Blockly.Msg["MATH_CHANGE_TITLE"] = "incrementar %1 per %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Add a number to variable '%1'."; // untranslated +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; // untranslated +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "constrénher %1 entre %2 e %3"; +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"] = "es devesible per"; +Blockly.Msg["MATH_IS_EVEN"] = "es par"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "es negatiu"; +Blockly.Msg["MATH_IS_ODD"] = "es impar"; +Blockly.Msg["MATH_IS_POSITIVE"] = "es positiu"; +Blockly.Msg["MATH_IS_PRIME"] = "es primièr"; +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"] = "es entièr"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "residú de %1 ÷ %2"; +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://oc.wikipedia.org/wiki/Nombre"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Un nombre."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "mejana de la lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "maximum de la lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "mediana de la lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "minimum de la lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "majoritaris de la lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "element aleatòri de lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "escart-tipe de la lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "soma de la lista"; +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"] = "Return the largest number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Return the median number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Return the smallest number in the list."; // untranslated +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"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "fraccion aleatòria"; +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"; +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"] = "arredondir"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "arredondir a l’inferior"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "arredondir al superior"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Round a number up or down."; // untranslated +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://fr.wikipedia.org/wiki/Racine_carree"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absolut"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "raiç carrada"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Renvia la valor absoluda d’un nombre."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Renvia a la poténcia d’un nombre."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Renvia lo logaritme natural d’un nombre."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Renvia lo logaritme decimal d’un nombre."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Renvia l’opausat d’un nombre"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Renvia 10 a la poténcia d’un nombre."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Renvia la raiç carrada d’un nombre."; +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"] = "Renvia l’arccosinus d’un nombre."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Renvia l’arcsinus d’un nombre."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Renvia l’arctangenta d’un nombre."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Renvia lo cosinus d’un angle en grases (pas en radians)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Renvia lo sinus d’un angle en grases (pas en radians)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Renvia la tangenta d’un angle en grases (pas en radians)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Crear una variabla color…"; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Crear una variabla nombre…"; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Crear una variabla cadena…"; +Blockly.Msg["NEW_VARIABLE"] = "Crear una variabla..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Nom de la novèla variabla :"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Novèl tipe de variabla :"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "autorizar los òrdres"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "amb :"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Run the user-defined function '%1' and use its output."; // untranslated +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "amb :"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "Crear '%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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "far quicòm"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "a"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Creates a function with no output."; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "retorn"; +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"] = "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"] = "Refar"; +Blockly.Msg["REMOVE_COMMENT"] = "Suprimir un comentari"; +Blockly.Msg["RENAME_VARIABLE"] = "Renomenar la variabla…"; +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Renomenar totas las variablas « %1 » a :"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "a %1 apondre lo tèxte %2"; +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"] = "en minusculas"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "en Majuscula Al Començament De Cada Mot"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "en MAJUSCULAS"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Return a copy of the text in a different case."; // untranslated +Blockly.Msg["TEXT_CHARAT_FIRST"] = "obténer la primièra letra"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "obténer la letra # dempuèi la fin"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "obténer la letra #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "obténer la darrièra letra"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "obténer una letra a l'azard"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "dins lo tèxte %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Renvia la letra a la posicion indicada."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "nombre %1 sus %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Add an item to the text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "jónher"; +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"] = "fins a la letra #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "fins a la darrièra letra"; +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"] = "dins lo tèxte"; +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_OPERATOR_FIRST"] = "find first occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "find last occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "dins lo tèxte %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 es void"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Returns true if the provided text is empty."; // untranslated +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "crear un tèxte amb"; +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"] = "longor de %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"] = "afichar %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_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "inversar %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Una letra, un mot o una linha de tèxte."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "suprimir los espacis dels dos costats"; +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"] = "Uèi"; +Blockly.Msg["UNDO"] = "Anullar"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // 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 +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Returns the value of this variable."; // untranslated +Blockly.Msg["VARIABLES_SET"] = "fixar %1 a %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Crear 'obténer %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["VARIABLE_ALREADY_EXISTS"] = "Existís ja una variabla nomenada \"%1\"."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/pl.js b/js/msg/js/pl.js new file mode 100644 index 0000000..c884529 --- /dev/null +++ b/js/msg/js/pl.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Dodaj Komentarz"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Nie można usunąć zmiennej '%1', ponieważ jest częścią definicji funkcji '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Zmień wartość:"; +Blockly.Msg["CLEAN_UP"] = "Uporządkuj Bloki"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "Zwiń Bloki"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Zwiń Klocek"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "kolor 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "kolor 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg["COLOUR_BLEND_RATIO"] = "proporcja"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "wymieszaj"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Miesza dwa kolory w danej proporcji (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Wybierz kolor z palety."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "losowy kolor"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Wybierz kolor w sposób losowy."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "niebieski"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "zielony"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg["COLOUR_RGB_RED"] = "czerwony"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "kolor z"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Utwórz kolor składający sie z podanej ilości czerwieni, zieleni i błękitu. Zakres wartości: 0 do 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"] = "przerwij pętlę"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "przejdź do kolejnej iteracji pętli"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Przerwij działanie pętli."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Pomiń resztę pętli i kontynuuj w kolejnej iteracji."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Uwaga: Ten klocek może być użyty tylko wewnątrz 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 listy %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Przypisz zmiennej '%1' kolejno wartość każdego elementu listy, 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"] = "Zmiennej '%1' przypisuje wartości z podanego zakresu z podanym interwałem i wykonuje zadane bloki."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Dodaj warunek do klocka „jeśli”."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Dodaj ostatni zawsze prawdziwy warunek do klocka „jeśli”."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Dodaj, usuń lub zmień kolejność czynności, żeby zmodyfikować ten klocek „jeśli”."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "w przeciwnym razie"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "w przeciwnym razie, jeśli"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "jeśli"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Jeśli warunek jest spełniony, wykonaj zadane czynności."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Jeśli warunek jest spełniony, wykonaj pierwszy blok instrukcji. W przeciwnym razie, wykonaj drugi blok instrukcji."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Jeśli pierwszy warunek jest spełniony, wykonaj pierwszy blok instrukcji. W przeciwnym razie, jeśli drugi warunek jest spełniony, wykonaj drugi blok instrukcji."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Jeśli pierwszy warunek jest spełniony, wykonaj pierwszy blok czynności. W przeciwnym razie jeśli drugi warunek jest spełniony, wykonaj drugi blok czynności. Jeżeli żaden z warunków nie zostanie spełniony, wykonaj ostatni blok czynności."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "wykonaj"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "powtórz %1 razy"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Wykonaj niektóre instrukcje kilka razy."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "powtarzaj aż do"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "powtarzaj dopóki"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Dopóki wyrażenie jest nieprawdziwe, wykonaj zadane czynności."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Dopóki wyrażenie jest prawdziwe, wykonaj zadane czynności."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Usunąć wszystkie klocki z %1?"; +Blockly.Msg["DELETE_BLOCK"] = "Usuń Klocek"; +Blockly.Msg["DELETE_VARIABLE"] = "Usuń zmienną '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Usunąć %1 wystąpień zmiennej '%2'?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Usuń %1 Bloki(ów)"; +Blockly.Msg["DISABLE_BLOCK"] = "Wyłącz Klocek"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Powiel"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Zduplikowany komentarz"; +Blockly.Msg["ENABLE_BLOCK"] = "Włącz Blok"; +Blockly.Msg["EXPAND_ALL"] = "Rozwiń Bloki"; +Blockly.Msg["EXPAND_BLOCK"] = "Rozwiń Klocek"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Zewnętrzne Wejścia"; +Blockly.Msg["HELP"] = "Pomoc"; +Blockly.Msg["INLINE_INPUTS"] = "Wbudowane Wejścia"; +Blockly.Msg["IOS_CANCEL"] = "Anuluj"; +Blockly.Msg["IOS_ERROR"] = "Błąd"; +Blockly.Msg["IOS_OK"] = "OK"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Dodaj Wejście"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Zezwalaj na czynności."; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Ta funkcja ma zduplikowane wejścia."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "WEJŚCIA"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Dodaj"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Dodaj Zmienną"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Usuń"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Nie możesz utworzyć funkcji bez nazwy."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Zmień nazwę"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Nazwa zmiennej"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +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ą danych"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "lista"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Dodaj, usuń lub zmień kolejność sekcji aby przekonfigurować blok tej 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"] = "utwórz listę z"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Dodaj element do listy."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Utwórz listę z dowolną ilością elementów."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "pierwszy"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# od końca"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; +Blockly.Msg["LISTS_GET_INDEX_GET"] = "pobierz"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "zabierz"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "ostatni"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "losowy"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "usuń"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Zwraca pierwszy element z listy."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Zwraca element z konkretnej pozycji na liście."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Zwraca ostatni element z listy."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Zwraca losowy element z listy."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Usuwa i zwraca pierwszy element z listy."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Usuwa i zwraca element z określonej pozycji na liście."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Usuwa i zwraca ostatni element z listy."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Usuwa i zwraca losowy element z listy."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Usuwa pierwszy element z listy."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Usuwa element z określonej pozycji na liście."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Usuwa ostatni element z listy."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Usuwa losowy element z listy."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "do # od końca"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "do #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "do ostatniego"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "utwórz listę podrzędną od pierwszego"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "utwórz listę podrzędną z # od końca"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "utwórz listę podrzędną z #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Tworzy kopię żądanej części listy."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 to ostatni element."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 to pierwszy element."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "znajdź pierwsze wystąpienie elementu"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "znajdź ostatanie wystąpienie elementu"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Zwraca indeks pierwszego/ostatniego wystąpienia elementu z listy. Zwraca %1, jeśli nie zostanie znaleziony."; +Blockly.Msg["LISTS_INLIST"] = "na liście"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 jest pusta"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Zwraca \"prawda\" jeśli lista jest pusta."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "długość %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Zwraca długość listy."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "utwórz listę powtarzając %1 %2 razy."; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Tworzy listę zawierającą podaną wartość powtórzoną żądaną ilość razy."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "odwróć %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Odwraca kolejność danych w kopii listy."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "jako"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "wstaw w"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "ustaw"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Wstawia element na początku listy."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Wstawia element na żądanej pozycji listy."; +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"] = "Ustawia element w określonym miejscu na liście."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "rosnąco"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "malejąco"; +Blockly.Msg["LISTS_SORT_TITLE"] = "sortuj %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Sortuj kopię listy."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alfabetycznie, ignoruj wielkość liter"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numerycznie"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alfabetycznie"; +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"] = "utwórz listę z tekstu"; +Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "utwórz tekst z listy"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Łączy listę tekstów w jeden tekst, rozdzielany separatorem."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Rozdziela tekst zgodnie z separatorem tworząc listę z powstałych elementów."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "z separatorem"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "fałsz"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Zwraca 'prawda' lub 'fałsz'."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "prawda"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://pl.wikipedia.org/wiki/Nierówność"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Zwraca \"prawda\", jeśli wejścia są identyczne."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Zwraca \"prawda\" jeśli pierwsze wejście jest większe od drugiego."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Zwraca \"prawda\", jeśli pierwsze wejście jest większe lub równe drugiemu."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Zwraca \"prawda\" jeśli pierwsze wejście jest mniejsze od drugiego."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Zwraca \"prawda\", jeśli pierwsze wejście jest mniejsze lub równe drugiemu."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Zwraca \"prawda\", jeśli wejścia nie są identyczne."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "nie %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Zwraca \"prawda\", jeśli wejściu jest \"fałsz\". Zwraca \"fałsz\", jeśli na wejściu jest \"prawda\"."; +Blockly.Msg["LOGIC_NULL"] = "nic"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Zwraca nic."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "i"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "lub"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Zwraca \"prawda\" jeśli na obydwóch wejściach jest \"prawda\"."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Zwraca \"prawda\" jeśli co najmniej na jednyk wejściu jest \"prawda\"."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "test"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "jeśli fałsz"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "jeśli prawda"; +Blockly.Msg["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”."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://pl.wikipedia.org/wiki/Arytmetyka"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Zwróć sumę dwóch liczb."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Zwróć iloraz dwóch liczb."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Zwróć różnicę dwóch liczb."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Zwróć iloczyn dwóch liczb."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Zwróć pierwszą liczbę podniesioną do potęgi o wykładniku drugiej liczby."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "zmień %1 o %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Dodaj liczbę do zmiennej '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://pl.wikipedia.org/wiki/Stała_(matematyka)"; +Blockly.Msg["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ść)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "ogranicz %1 z dołu %2 z góry %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Ogranicz liczbę, aby była w określonych granicach (włącznie)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "/"; +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "jest podzielna przez"; +Blockly.Msg["MATH_IS_EVEN"] = "jest parzysta"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "jest ujemna"; +Blockly.Msg["MATH_IS_ODD"] = "jest nieparzysta"; +Blockly.Msg["MATH_IS_POSITIVE"] = "jest dodatnia"; +Blockly.Msg["MATH_IS_PRIME"] = "jest liczbą pierwszą"; +Blockly.Msg["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\"."; +Blockly.Msg["MATH_IS_WHOLE"] = "jest liczbą całkowitą"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://pl.wikipedia.org/wiki/Modulo"; +Blockly.Msg["MATH_MODULO_TITLE"] = "reszta z dzielenia %1 przez %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Zwróć resztę z dzielenia dwóch liczb przez siebie."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Liczba."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "średnia elementów listy"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "maksymalna wartość z listy"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "mediana listy"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "minimalna wartość z listy"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "dominanty listy"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "losowy element z listy"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "odchylenie standardowe listy"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "suma elementów listy"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Zwróć średnią (średnią arytmetyczną) wartości liczbowych z listy."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Zwróć największą liczbę w liście."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Zwróć medianę listy."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Zwróć najmniejszą liczbę w liście."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Zwróć listę najczęściej występujących elementów w liście."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Zwróć losowy element z listy."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Zwróć odchylenie standardowe listy."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Zwróć sumę wszystkich liczb z listy."; +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"] = "losowy ułamek"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Zwróć losowy ułamek między 0.0 (włącznie), a 1.0 (wyłącznie)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "losowa liczba całkowita od %1 do %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Zwróć losową liczbę całkowitą w ramach dwóch wyznaczonych granic, włącznie."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://pl.wikipedia.org/wiki/Zaokrąglanie"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "zaokrąglij"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "zaokrąglij w dół"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "zaokrąglij w górę"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Zaokrąglij w górę lub w dół."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://pl.wikipedia.org/wiki/Pierwiastek_kwadratowy"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "wartość bezwzględna"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "pierwiastek kwadratowy"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Zwróć wartość bezwzględną danej liczby."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Zwróć e do potęgi danej liczby."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Zwróć logarytm naturalny danej liczby."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Zwraca logarytm dziesiętny danej liczby."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Zwróć negację danej liczby."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Zwróć 10 do potęgi danej liczby."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Zwróć pierwiastek kwadratowy danej liczby."; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_TRIG_ACOS"] = "arccos"; +Blockly.Msg["MATH_TRIG_ASIN"] = "arcsin"; +Blockly.Msg["MATH_TRIG_ATAN"] = "arctg"; +Blockly.Msg["MATH_TRIG_COS"] = "cos"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://pl.wikipedia.org/wiki/Funkcje_trygonometryczne"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; +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 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["NEW_COLOUR_VARIABLE"] = "Utwórz zmienną colour"; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Utwórz zmienną typu number"; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Utwórz zmienną typu string"; +Blockly.Msg["NEW_VARIABLE"] = "Utwórz zmienną..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Nowa nazwa zmiennej:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Nowy typ zmiennej:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "zezwól na czynności"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "z:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://pl.wikipedia.org/wiki/Podprogram"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Uruchom zdefiniowaną przez użytkownika funkcję '%1'."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://pl.wikipedia.org/wiki/Podprogram"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Uruchom zdefiniowaną przez użytkownika funkcję '%1' i użyj jej wyjścia."; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "z:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "Utwórz '%1'"; +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ś"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "do"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Tworzy funkcję nie posiadającą wyjścia."; +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ę posiadającą wyjście."; +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 warunek jest spełniony zwróć drugą wartość."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Uwaga: Ten klocek może być używany tylko w definicji funkcji."; +Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "nazwa wejścia:"; +Blockly.Msg["PROCEDURES_MUTATORARG_TOOLTIP"] = "Dodaj wejście do funkcji."; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TITLE"] = "wejścia"; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TOOLTIP"] = "Dodaj, usuń lub zmień kolejność wejść tej funkcji."; +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_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "dodaj tekst %2 do %1"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Dołącz tekst do zmiennej '%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "na małe litery"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "na Pierwsza Duża"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "na WIELKIE LITERY"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Zwraca kopię tekstu z odwruconą wielkością liter."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "pobierz pierwszą literę"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "pobierz literę # od końca"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "pobierz literę #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "pobierz ostatnią literę"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "pobierz losową literę"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; +Blockly.Msg["TEXT_CHARAT_TITLE"] = "w tekście %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Zwraca literę z określonej pozycji."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "policz %1 w %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Liczy ile razy dany tekst występuje w innym tekście."; +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ć klocek 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_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_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 +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "znajdź pierwsze wystąpienie tekstu"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "znajdź ostatnie wystąpienie tekstu"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "w tekście %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Zwraca indeks pierwszego/ostatniego wystąpienia pierwszego tekstu w drugim tekście. Zwraca wartość %1, jeśli tekst nie został znaleziony."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 jest pusty"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Zwraca prawda (true), jeśli podany tekst jest pusty."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "utwórz tekst z"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Tworzy fragment tekstu, łącząc ze sobą dowolną liczbę tekstów."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +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"] = "Wyświetl 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."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "poproś o liczbę z tą wiadomością"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "poproś o tekst z tą wiadomością"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "zamień %1 na %2 w %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Zastąp wszystkie wystąpienia danego tekstu innym."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "odwróć %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Odwraca kolejność znaków w tekście."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://pl.wikipedia.org/wiki/Tekstowy_typ_danych"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Litera, wyraz lub linia tekstu."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "usuń spacje po obu stronach"; +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["UNNAMED_KEY"] = "bez nazwy"; +Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "element"; +Blockly.Msg["VARIABLES_GET_CREATE_SET"] = "Utwórz klocek 'ustaw %1'"; +Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Zwraca wartość tej zmiennej."; +Blockly.Msg["VARIABLES_SET"] = "przypisz %1 wartość %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Utwórz klocek 'pobierz %1'"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Wartości zmiennej i wejście będą identyczne."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Zmienna o nazwie '%1' już istnieje."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Zmienna o nazwie '%1' już istnieje i jest typu '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Powiedz coś..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/pms.js b/js/msg/js/pms.js new file mode 100644 index 0000000..5d27337 --- /dev/null +++ b/js/msg/js/pms.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Gionté un coment"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "As peul nen eliminesse la variàbil '%1' përchè a l'é part ëd la definission dla fonsion '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Modifiché ël valor:"; +Blockly.Msg["CLEAN_UP"] = "Dëscancelé ij blòch"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Ij blòch sarà a conten-o dj'avertense."; +Blockly.Msg["COLLAPSE_ALL"] = "Arduve ij blòch"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Arduve ël blòch"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "color 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "color 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "rapòrt"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "mës-cé"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "A mës-cia doi color ansema con un rapòrt dàit (0,0 - 1,0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Serne un color ant la taulòssa."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "color a asar"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Serne un color a asar."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "bleu"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "verd"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "ross"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "coloré con"; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "seurte da la liassa"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "continué con l'iterassion sucessiva dla liassa"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Seurte da la liassa anglobanta."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Sauté ël rest ëd sa liassa, e continué con l'iterassion apress."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Atension: Ës blòch a peul mach esse dovrà andrinta a na liassa."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "për minca n'element %1 ant la lista %2"; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "conté con %1 da %2 a %3 për %4"; +Blockly.Msg["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à."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Gionté na condission al blòch si."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Gionté na condission final ch'a cheuj tut al blòch si."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Gionté, gavé o riordiné le session për cinfiguré torna ës blòch si."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "dësnò"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "dësnò si"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "si"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Si un valor a l'é ver, antlora eseguì chèiche anstrussion."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "fé"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "arpete %1 vire"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Eseguì chèiche anstrussion vàire vire."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "arpete fin-a a"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "arpete antramentre che"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Cand un valor a l'é fàuss, eseguì chèiche anstrussion."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Cand un valor a l'é ver, eseguì chèiche anstrussion."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Scancelé tuti ij %1 blòch?"; +Blockly.Msg["DELETE_BLOCK"] = "Scancelé ël blòch"; +Blockly.Msg["DELETE_VARIABLE"] = "Eliminé la variàbil '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Eliminé %1 utilisassion ëd la variàbil '%2'?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Scancelé %1 blòch"; +Blockly.Msg["DISABLE_BLOCK"] = "Disativé ël blòch"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Dupliché"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Dupliché ël coment"; +Blockly.Msg["ENABLE_BLOCK"] = "Ativé ël blòch"; +Blockly.Msg["EXPAND_ALL"] = "Dësvlupé ij blòch"; +Blockly.Msg["EXPAND_BLOCK"] = "Dësvlupé ël blòch"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Imission esterne"; +Blockly.Msg["HELP"] = "Agiut"; +Blockly.Msg["INLINE_INPUTS"] = "Imission an linia"; +Blockly.Msg["IOS_CANCEL"] = "Anulé"; +Blockly.Msg["IOS_ERROR"] = "Eror"; +Blockly.Msg["IOS_OK"] = "Va bin"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Gionté n'imission"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Përmëtte le diciairassion"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Costa imission a dj'imission duplicà."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "IMISSION"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Gionté"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Gionté na variàbil"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Eliminé"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "A peul nen dovré un nòm ëd variàbil veuid."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Arnominé"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Nòm ëd la variàbil"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "creé na lista veuida"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Smon-e na lista, ëd longheur 0, ch'a conten gnun-a argistrassion"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "lista"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Gionté, gavé o riordiné le session për configuré torna cost blòch ëd lista."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "creé na lista con"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Gionté n'element a la lista."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Creé na lista con un nùmer qualsëssìa d'element."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "prim"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# da la fin"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_GET"] = "oten-e"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "oten-e e eliminé"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "ùltim"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "a l'ancàpit"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "eliminé"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "A smon ël prim element an na lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "A smon l'element a la posission ëspessificà an na lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "A smon l'ùltim element an na lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "A smon n'element a l'ancàpit an na lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "A gava e a smon ël prim element an na lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "A gava e a smon l'element a la posission ëspessificà an na lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "A gava e a smon l'ùltim element an na lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "A gava e a smon n'element a l'ancàpit an na lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "A gava ël prim element an na lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "A gava l'element a la posission ëspessificà an na lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "A gava l'ùltim element an na lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "A gava n'element a l'ancàpit da na lista."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "fin-a a # da la fin"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "fin-a a #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "fin-a a l'ùltim"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "oten-e la sot-lista dal prim"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "oten-e la sot-lista da # da la fin"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "oten-e la sot-lista da #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "A crea na còpia dël tòch ëspessificà ëd na lista."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 a l'é l'ùltim element."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 a l'é ël prim element."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "trové la prima ocorensa dl'element"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "trové l'ùltima ocorensa dl'element"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "A smon l'ìndes ëd la prima/ùltima ocorensa dl'element ant la lista. A smon %1 se l'element a l'é nen trovà."; +Blockly.Msg["LISTS_INLIST"] = "ant la lista"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 a l'é veuid"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "A smon ver se la lista a l'é veuida."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "longheur ëd %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "A smon la longheur ¨d na lista."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "creé na lista con l'element %1 arpetù %2 vire"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "A crea na lista ch'a consist dël valor dàit arpetù ël nùmer ëspessificà ëd vire."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "anversé %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Anversé na còpia ëd na lista"; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "tanme"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "anserì an"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "buté"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "A anseriss l'element al prinsipi ëd na lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "A anseriss l'element a la posission ëspessificà an na lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Gionté l'element a la fin ëd na lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "A anseriss l'element a l'ancàpit an na lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "A fissa ël prim element an na lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "A fissa l'element a la posission ëspessificà an na lista."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "chërsent"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "calant"; +Blockly.Msg["LISTS_SORT_TITLE"] = "ordiné %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Ordiné na còpia ëd na lista."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alfabétich, ignorand ël caràter minùscol o majùscol"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numérich"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alfabétich"; +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"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Gionze na lista ëd test ant un test sol, separandje con un separator."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Divide un test an na lista ëd test, tajand a minca 'n separator."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "con ël separator"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "fàuss"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "A rëspond ver o fàuss."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "ver"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Rësponde ver si le doe imission a son uguaj."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Rësponde ver si la prima imission a l'é pi granda che la sconda."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Rësponde ver si la prima imission a l'é pi granda o ugual a la sconda."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Rësponde ver si la prima imission a l'é pi cita dla sconda."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Rësponde ver si la prima imission a l'é pi cita o ugual a la sconda."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Rësponde ver si le doe imission a son nen uguaj."; +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_TOOLTIP"] = "A rëspond ver se l'imission a l'é fàussa. A rëspond fàuss se l'imission a l'é vera."; +Blockly.Msg["LOGIC_NULL"] = "gnente"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "A rëspond gnente."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "e"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "o"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Rësponde ver se tute doe j'imission a son vere."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Rësponde ver se almanch un-a d'imission a l'é vera."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "preuva"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "se fàuss"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "se ver"; +Blockly.Msg["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'."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "A smon la soma ëd doi nùmer."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "A smon ël cossient dij doi nùmer."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "A smon la diferensa dij doi nùmer."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "A smon ël prodot dij doi nùmer."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "A smon ël prim nùmer alvà a la potensa dël second."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 ëd X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "A rëspond con l'arch-tangent dël pont (X, Y) an gre da -180 a 180."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "ancrementé %1 për %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Gionté un nùmer a la variàbil '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["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ì)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "limité %1 antra %2 e %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Limité un nùmer a esse antra le limitassion ëspessificà (comprèise)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "a l'é divisìbil për"; +Blockly.Msg["MATH_IS_EVEN"] = "a l'é cobi"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "a l'é negativ"; +Blockly.Msg["MATH_IS_ODD"] = "a l'é dëscobi"; +Blockly.Msg["MATH_IS_POSITIVE"] = "a l'é positiv"; +Blockly.Msg["MATH_IS_PRIME"] = "a l'é prim"; +Blockly.Msg["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."; +Blockly.Msg["MATH_IS_WHOLE"] = "a l'é antregh"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "resta ëd %1:%2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "A smon la resta ëd la division dij doi nùmer."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Un nùmer."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "media dla lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "màssim ëd la lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "mesan-a dla lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "mìnim ëd la lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "mòde dla lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "element a l'ancàpit ëd la lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "deviassion ëstàndard ëd la lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "soma dla lista"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "A smon la media (aritmética) dij valor numérich ant la lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "A smon ël pi gròss nùmer ëd la lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "A smon ël nùmer mesan ëd la lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "A smon ël pi cit nùmer ëd la lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "A smon na lista dj'element pi frequent ëd la lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "A smon n'element a l'ancàpit da la lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "A smon la deviassion ëstàndard ëd la lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "A smon la soma ëd tuti ij nùmer ant la lista."; +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"] = "frassion aleatòria"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "A smon na frassion aleatòria antra 0,0 (comprèis) e 1,0 (esclus)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "antregh aleatòri antra %1 e %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "A smon n'antregh aleatòri antra ij doi lìmit ëspessificà, comprèis."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "ariondé"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "ariondé për difet"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "ariondé për ecess"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "A arionda un nùmer për difet o ecess."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "assolù"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "rèis quadra"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "A smon ël valor assolù d'un nùmer."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "A smon e a la potensa d'un nùmer."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "A smon ël logaritm natural d'un nùmer."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "A smon ël logaritm an base 10 d'un nùmer."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "A smon l'opòst d'un nùmer."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "A smon 10 a la potensa d'un nùmer."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "A smon la rèis quadra d'un nùmer."; +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"] = "A smon l'arch-cosen d'un nùmer."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "A smon l'arch-sen d'un nùmer."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "A smon l'arch-tangenta d'un nùmer."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "A smon ël cosen ëd n'àngol an gré (pa an radiant)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "A smon ël sen ëd n'àngol an gré (pa an radiant)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "A smon la tangenta ëd n'àngol an gré (pa an radiant)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Creé na variàbil ëd color..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Creé na variàbil numérica..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Creé na variàbil dë stringa..."; +Blockly.Msg["NEW_VARIABLE"] = "Creé na variàbil..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Nòm ëd la neuva variàbil:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Neuva sòrt ëd variàbil:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "përmëtte le diciairassion"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "con:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Eseguì la fonsion '%1' definìa da l'utent."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +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"] = "Descrive sa fonsion..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "fé cheicòs"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "a"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "A crea na fonsion sensa surtìa."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +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"; +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:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "a %1 taché ël test %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Taché dël test a la variàbil '%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "an minùscul"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "an Majùscol A L'Ancamin Ëd Minca Paròla"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "an MAJÙSCOL"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "A smon na còpia dël test ant un caràter diferent."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "oten-e la prima litra"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "oten-e la litra # da la fin"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "oten-e la litra #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "oten-e l'ùltima litra"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "oten-e na litra a l'ancàpit"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "ant ël test %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "A smon la litra ant la posission ëspessificà."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "nùmer %1 su %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Conté vàire vire un test dàit a compariss an n'àutr test."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Gionté n'element al test."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "gionze"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Gionté, gavé o riordiné le session për configuré torna ës blòch ëd test."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "fin-a a la litra # da la fin"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "fin-a a la litra #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "fin-a a l'ùltima litra"; +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"] = "ant ël test"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "oten-e la sota-stringa da la prima litra"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "oten-e la sota-stringa da la litra # da la fin"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "oten-e la sota-stringa da la litra #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "A smon un tòch ëspessificà dël test."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "trové la prima ocorensa dël test"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "trové l'ùltima ocorensa dël test"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "ant ël test %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "A smon l'ìndes dla prima/ùltima ocorensa dël prim test ant ël second test. A smon %1 se ël test a l'é nen trovà."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 a l'é veuid"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "A smon ver se ël test fornì a l'é veuid."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "creé ël test con"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Creé un tòch ëd test an gionzend un nùmer qualsëssìa d'element."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "longheur ëd %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "A smon ël nùmer ëd litre (spassi comprèis) ant ël test fornì."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "smon-e %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Smon-e ël test, ël nùmer o n'àutr valor ëspessificà."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Ciamé un nùmer a l'utent."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Ciamé un test a l'utent."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "anvit për un nùmer con un mëssagi"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "anvit për un test con un mëssagi"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "rampiassé %1 con %2 an %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Rampiassé tute j'ocorense d'un test con n'àutr."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "Anversé %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Anversé l'òrdin dij caràter ant ël test."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Na litra, na paròla o na linia ëd test."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "gavé jë spassi da le doe bande ëd"; +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["UNNAMED_KEY"] = "anònim"; +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 +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "A smon ël valor ëd sa variàbil."; +Blockly.Msg["VARIABLES_SET"] = "fissé %1 a %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Creé 'oten-e %1'"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Fissé costa variàbil ugual al valor d'imission."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Na variàbil con ël nòm '%1' a esist già."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Na variàbil ciamà '%1' a esist già për n'àutra sòrt: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Spassi ëd travaj ëd Blockly"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Dì cheicòs..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/pt-br.js b/js/msg/js/pt-br.js new file mode 100644 index 0000000..c40c383 --- /dev/null +++ b/js/msg/js/pt-br.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Adicionar comentário"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Não se pode deletar a variável '%1' porque é parte da definição da função '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Mudar valor:"; +Blockly.Msg["CLEAN_UP"] = "Limpar blocos"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Bloqueios recolhidos contêm avisos."; +Blockly.Msg["COLLAPSE_ALL"] = "Colapsar Blocos"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Colapsar Bloco"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "cor 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "cor 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "proporção"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "misturar"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Mistura duas cores em uma dada proporção (0,0 - 1,0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://pt.wikipedia.org/wiki/Cor"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Escolher uma cor da palheta de cores."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "cor aleatória"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Escolher cor de forma aleatória."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "azul"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "verde"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "vermelho"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "colorir com"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Criar uma cor com a quantidade especificada de vermelho, verde e azul. Todos os valores devem estar entre 0 e 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"] = "encerra o laço"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "continua com a próxima iteração do laço"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Encerra o laço."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Ignora o resto deste laço, e continua com a próxima iteração."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Atenção: Este bloco só pode ser usado dentro de um laço."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "para cada item %1 na lista %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Para cada item em uma lista, atribua o item à variável '%1' e então realize algumas instruções."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "contar com %1 de %2 até %3 por %4"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Faça 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 execute os blocos especificados."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Acrescente uma condição para o bloco se."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Acrescente uma condição final para o bloco se."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Acrescente, remova ou reordene seções para reconfigurar este bloco."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "senão"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "senão se"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "se"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Se um valor for verdadeiro, então realize algumas instruções."; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Se o primeiro valor é verdadeiro, então realize o primeiro bloco de instruções. Senão, se o segundo valor é verdadeiro, realize o segundo bloco de instruções."; +Blockly.Msg["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."; +Blockly.Msg["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"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "faça"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "repita %1 vezes"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Faça algumas instruções várias vezes."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +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"] = "Deletar todos os blocos %1?"; +Blockly.Msg["DELETE_BLOCK"] = "Deletar bloco"; +Blockly.Msg["DELETE_VARIABLE"] = "Deletar a variável '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Deletar %1 usos da variável '%2'?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Deletar %1 blocos"; +Blockly.Msg["DISABLE_BLOCK"] = "Desabilitar bloco"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Duplicar"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicar comentário"; +Blockly.Msg["ENABLE_BLOCK"] = "Habilitar bloco"; +Blockly.Msg["EXPAND_ALL"] = "Expandir blocos"; +Blockly.Msg["EXPAND_BLOCK"] = "Expandir bloco"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Entradas externas"; +Blockly.Msg["HELP"] = "Ajuda"; +Blockly.Msg["INLINE_INPUTS"] = "Entradas incorporadas"; +Blockly.Msg["IOS_CANCEL"] = "blockly:IOS Cancelar/pt-br"; +Blockly.Msg["IOS_ERROR"] = "Erro"; +Blockly.Msg["IOS_OK"] = "Ok"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Adicionar Entrada"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Permitir declarações"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Essa função tem entradas duplicadas."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "ENTRADAS"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Adicionar"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Adicionar Variável"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Deletar"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Você não pode usar um nome de variável vazio."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Blockly:Renomear varioas botoens/pt-br"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Nome variavel"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "criar lista vazia"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Retorna uma lista, de tamanho 0, contendo nenhum registro"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "lista"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Acrescenta, remove ou reordena seções para reconfigurar este bloco de lista."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "criar lista com"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Acrescenta um item à lista."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Cria uma lista com a quantidade de itens informada."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "primeiro"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "nº a partir do final"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "nº"; +Blockly.Msg["LISTS_GET_INDEX_GET"] = "obter"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "obter e remover"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "último"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "aleatório"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "remover"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Retorna o primeiro item em uma lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Retorna o item da lista na posição especificada."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Retorna o último item em uma lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Retorna um item aleatório de uma lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Remove e retorna o primeiro item de uma lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Remove e retorna o item na posição especificada em uma lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Remove e retorna o último item de uma lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Remove e retorna um item aleatório de uma lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Remove o primeiro item de uma lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Remove o item na posição especificada em uma lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Remove o último item de uma lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Remove um item aleatório de uma lista."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "até nº a partir do final"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "até nº"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "até último"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "obtém sublista a partir do primeiro"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "obtém sublista de nº a partir do final"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "obtém sublista de nº"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Cria uma cópia da porção especificada de uma lista."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 é o último item."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 é o primeiro item."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "encontre a primeira ocorrência do item"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "encontre a última ocorrência do item"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Retorna o índice da primeira/última ocorrência do item na lista. Retorna %1 se o item não for encontrado."; +Blockly.Msg["LISTS_INLIST"] = "na lista"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 é 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"; +Blockly.Msg["LISTS_LENGTH_TITLE"] = "tamanho de %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Retorna o tamanho de uma lista."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_REPEAT_TITLE"] = "criar lista com item %1 repetido %2 vezes"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Cria uma lista consistindo no valor informado repetido o número de vezes especificado."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Listas#invertendo-uma-lista"; +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "inverter %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Inverter uma cópia da lista."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "como"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "inserir em"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "definir"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Insere o item no início de uma lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Insere o item na posição especificada em uma lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Insere o item no final de uma lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Insere o item em uma posição qualquer de uma lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Define o primeiro item de uma lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Define o item da posição especificada de uma lista."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "ascendente"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "descendente"; +Blockly.Msg["LISTS_SORT_TITLE"] = "ordenar %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Ordenar uma cópia de uma lista."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alfabético, ignorar maiúscula/minúscula"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numérico"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alfabético"; +Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +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"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Juntar uma lista de textos em um único texto, separado por um delimitador."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Dividir o texto em uma lista de textos, separando-o em cada delimitador."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "com delimitador"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "falso"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Retorna verdadeiro ou falso."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "verdadeiro"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://pt.wikipedia.org/wiki/Inequa%C3%A7%C3%A3o"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Retorna verdadeiro se ambas as entradas forem iguais."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Retorna verdadeiro se a primeira entrada for maior que a segunda entrada."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Retorna verdadeiro se a primeira entrada for maior ou igual à segunda entrada."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Retorna verdadeiro se a primeira entrada for menor que a segunda entrada."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Retorna verdadeiro se a primeira entrada for menor ou igual à segunda entrada."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Retorna verdadeiro se ambas as entradas forem diferentes."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "não %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Retorna verdadeiro se a entrada for falsa. Retorna falsa se a entrada for verdadeira."; +Blockly.Msg["LOGIC_NULL"] = "nulo"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Retorna nulo."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "e"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "ou"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Retorna verdadeiro se ambas as entradas forem verdadeiras."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Retorna verdadeiro se uma das estradas for verdadeira."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "teste"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "se falso"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "se verdadeiro"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Avalia a condição em \"teste\". Se a condição for verdadeira retorna o valor \"se verdadeiro\", senão retorna o valor \"se falso\"."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://pt.wikipedia.org/wiki/Aritm%C3%A9tica"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Retorna a soma dos dois números."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Retorna o quociente da divisão dos dois números."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Retorna a diferença entre os dois números."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Retorna o produto dos dois números."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Retorna o primeiro número elevado à potência do segundo número."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 de X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Retorne o arco tangente do ponto (X, Y) em graus de -180 a 180."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://pt.wikipedia.org/wiki/Adi%C3%A7%C3%A3o"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "alterar %1 por %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Soma um número à variável \"%1\"."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://pt.wikipedia.org/wiki/Anexo:Lista_de_constantes_matem%C3%A1ticas"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Retorna uma das constantes comuns: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), ou ∞ (infinito)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "restringe %1 inferior %2 superior %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Restringe um número entre os limites especificados (inclusivo)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "é divisível por"; +Blockly.Msg["MATH_IS_EVEN"] = "é par"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "é negativo"; +Blockly.Msg["MATH_IS_ODD"] = "é ímpar"; +Blockly.Msg["MATH_IS_POSITIVE"] = "é positivo"; +Blockly.Msg["MATH_IS_PRIME"] = "é primo"; +Blockly.Msg["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."; +Blockly.Msg["MATH_IS_WHOLE"] = "é inteiro"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://pt.wikipedia.org/wiki/Opera%C3%A7%C3%A3o_m%C3%B3dulo"; +Blockly.Msg["MATH_MODULO_TITLE"] = "resto da divisão de %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Retorna o resto da divisão de dois números."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://pt.wikipedia.org/wiki/N%C3%BAmero"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Um número."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "média da lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "maior da lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "mediana da lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "menor da lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "moda da lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "item aleatório da lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "desvio padrão da lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "soma de uma lista"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Retorna a média aritmética dos números da lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Retorna o maior número da lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Retorna a mediana dos números da lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Retorna o menor número da lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Retorna uma lista do(s) item(ns) mais comum(ns) da lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Retorna um elemento aleatório da lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Retorna o desvio padrão dos números da lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Retorna a soma de todos os números na lista."; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://pt.wikipedia.org/wiki/Gerador_de_n%C3%BAmeros_pseudoaleat%C3%B3rios"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "fração aleatória"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Retorna uma fração aleatória entre 0.0 (inclusivo) e 1.0 (exclusivo)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://pt.wikipedia.org/wiki/Gerador_de_n%C3%BAmeros_pseudoaleat%C3%B3rios"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "inteiro aleatório entre %1 e %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Retorna um número inteiro entre os dois limites informados, inclusivo."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://pt.wikipedia.org/wiki/Arredondamento"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "arredonda"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "arredonda para baixo"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "arredonda para cima"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Arredonda um número para cima ou para baixo."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://pt.wikipedia.org/wiki/Raiz_quadrada"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absoluto"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "raiz quadrada"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Retorna o valor absoluto de um número."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Retorna o número e elevado à potência de um número."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Retorna o logaritmo natural de um número."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Retorna o logaritmo em base 10 de um número."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Retorna o oposto de um número."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Retorna 10 elevado à potência de um número."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Retorna a raiz quadrada de um número."; +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://pt.wikipedia.org/wiki/Fun%C3%A7%C3%A3o_trigonom%C3%A9trica"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Retorna o arco cosseno de um número."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Retorna o arco seno de um número."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Retorna o arco tangente de um número."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Retorna o cosseno de um grau (não radiano)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Retorna o seno de um grau (não radiano)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Retorna a tangente de um grau (não radiano)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Criar variável colorida..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Criar variável numérica..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Criar variável de segmentos de texto..."; +Blockly.Msg["NEW_VARIABLE"] = "Criar variável..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Nome da nova variável:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Tipo da nova variável:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "permitir declarações"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "com:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://pt.wikipedia.org/wiki/M%C3%A9todo_(programa%C3%A7%C3%A3o)"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Executa a função definida pelo usuário \"%1\"."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://pt.wikipedia.org/wiki/Sub-rotina"; +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"] = "Descreva esta função..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://pt.wikipedia.org/wiki/M%C3%A9todo_(programa%C3%A7%C3%A3o)"; +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "faça algo"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "para"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Cria uma função que não tem retorno."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://pt.wikipedia.org/wiki/M%C3%A9todo_(programa%C3%A7%C3%A3o)"; +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"; +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:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "para %1 anexar texto %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Acrescentar um pedaço de texto à variável \"%1\"."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "para minúsculas"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "para Nomes Próprios"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "para MAIÚSCULAS"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Retorna uma cópia do texto em um formato diferente."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "obter primeira letra"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "obter letra # a partir do final"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "obter letra nº"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "obter última letra"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "obter letra aleatória"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "no texto %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Retorna a letra na posição especificada."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "Contar %1 em %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Calcule quantas vezes algum texto aparece centro de algum outro texto."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Acrescentar um item ao texto."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "unir"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Acrescenta, remove ou reordena seções para reconfigurar este bloco de texto."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "até letra nº a partir do final"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "até letra nº"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "até última letra"; +Blockly.Msg["TEXT_GET_SUBSTRING_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; +Blockly.Msg["TEXT_GET_SUBSTRING_INPUT_IN_TEXT"] = "no texto"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "obter trecho de primeira letra"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "obter trecho de letra nº a partir do final"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "obter trecho de letra nº"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Retorna o trecho de texto especificado."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "encontre a primeira ocorrência do item"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "encontre a última ocorrência do texto"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "no texto %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Retorna a posição da primeira/última ocorrência do primeiro texto no segundo texto. Retorna %1 se o texto não for encontrado."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 é vazio"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Retorna verdadeiro se o texto fornecido for vazio."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "criar texto com"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Criar um pedaço de texto juntando qualquer número de itens."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "tamanho de %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Retorna o número de letras (incluindo espaços) no texto fornecido."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; +Blockly.Msg["TEXT_PRINT_TITLE"] = "imprime %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Imprime o texto, número ou valor especificado."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Pede ao usuário um número."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Pede ao usuário um texto."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "Pede um número com uma mensagem"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "Pede um texto com uma mensagem"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Texto#substituindo-substrings"; +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "substituir %1 por %2 em %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Substitua todas as ocorrências de algum texto dentro de algum outro texto."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Texto#invertendo-texto"; +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "inverter %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Inverter a ordem dos caracteres no texto."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://pt.wikipedia.org/wiki/Cadeia_de_caracteres"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Uma letra, palavra ou linha de texto."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "remover espaços de ambos os lados de"; +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["UNNAMED_KEY"] = "Sem título"; +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"; +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Retorna o valor desta variável."; +Blockly.Msg["VARIABLES_SET"] = "definir %1 para %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Criar \"obter %1\""; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Define esta variável para o valor da entrada."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "A variável chamada '%1' já existe."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Já existe uma variável chamada '%1' para outra do tipo: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Espaço de trabalho do Blockly"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Diz algo..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/pt.js b/js/msg/js/pt.js new file mode 100644 index 0000000..7804f40 --- /dev/null +++ b/js/msg/js/pt.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Adicionar Comentário"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Não se pode eliminar a variável '%1' porque faz parte da definição da função '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Alterar valor:"; +Blockly.Msg["CLEAN_UP"] = "Limpar Blocos"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Os blocos ocultados contêm avisos."; +Blockly.Msg["COLLAPSE_ALL"] = "Ocultar Blocos"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Ocultar Bloco"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "cor 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "cor 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg["COLOUR_BLEND_RATIO"] = "proporção"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "misturar"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Mistura duas cores com a proporção indicada (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "http://pt.wikipedia.org/wiki/Cor"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Escolha uma cor da paleta de cores."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "cor aleatória"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Escolha uma cor aleatoriamente."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "azul"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "verde"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg["COLOUR_RGB_RED"] = "vermelho"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "pinte com"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Cria uma cor de acordo com a quantidade especificada de vermelho, verde e azul. Todos os valores devem estar entre 0 e 100."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "sair do ciclo"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "continuar com a próxima iteração do ciclo"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Sair do ciclo que está contido."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Ignorar o resto deste ciclo, e continuar com a próxima iteração."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Aviso: Este bloco só pode ser usado dentro de um ciclo."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "para cada item %1 na lista %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Para cada item numa lista, define a variável \"%1\" para o item e então faz algumas instruções."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "contar com %1 de %2 até %3 por %4"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Faz com que a variável \"%1\" assuma os valores desde o número inicial até ao número final, contando de acordo com o intervalo especificado e executa os blocos especificados."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Acrescente uma condição ao bloco se."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Acrescente uma condição de excepação final para o bloco se."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Acrescente, remova ou reordene secções para reconfigurar este bloco se."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "senão"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "senão se"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "se"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Se um valor é verdadeiro, então realize alguns passos."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Se um valor é verdadeiro, então realize o primeiro bloco de instruções. Senão, realize o segundo bloco de instruções"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Se o primeiro valor é verdadeiro, então realize o primeiro bloco de instruções. Senão, se o segundo valor é verdadeiro, realize o segundo bloco de instruções."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Se o primeiro valor é verdadeiro, então realize o primeiro bloco de instruções. Senão, se o segundo valor é verdadeiro, realize o segundo bloco de instruções. Se nenhum dos blocos for verdadeiro, realize o último bloco de instruções."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "http://pt.wikipedia.org/wiki/Estrutura_de_repeti%C3%A7%C3%A3o#Repeti.C3.A7.C3.A3o_com_vari.C3.A1vel_de_controle"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "faça"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "repetir %1 vez"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Faça algumas instruções várias vezes."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "repetir até"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "repetir 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"] = "Eliminar todos os %1 blocos?"; +Blockly.Msg["DELETE_BLOCK"] = "Eliminar Bloco"; +Blockly.Msg["DELETE_VARIABLE"] = "Eliminar a variável '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Eliminar %1 utilizações da variável '%2'?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Eliminar %1 Blocos"; +Blockly.Msg["DISABLE_BLOCK"] = "Desativar Bloco"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Duplicar"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicar comentário"; +Blockly.Msg["ENABLE_BLOCK"] = "Ativar Bloco"; +Blockly.Msg["EXPAND_ALL"] = "Expandir Blocos"; +Blockly.Msg["EXPAND_BLOCK"] = "Expandir Bloco"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Entradas Externas"; +Blockly.Msg["HELP"] = "Ajuda"; +Blockly.Msg["INLINE_INPUTS"] = "Entradas Em Linhas"; +Blockly.Msg["IOS_CANCEL"] = "Cancelar"; +Blockly.Msg["IOS_ERROR"] = "Erro"; +Blockly.Msg["IOS_OK"] = "Aceitar"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Adicionar entrada"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Permitir declarações"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Essa função tem entradas duplicadas."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "ENTRADAS"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Adicionar"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Adicionar Variável"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Eliminar"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Você não pode usar um nome de variável vazio."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Renomear"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Nome da variável"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "criar lista vazia"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Retorna uma lista, de tamanho 0, contendo nenhum registo"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "lista"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Acrescente, remova ou reordene as seções para reconfigurar este bloco lista."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "criar lista com"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Acrescenta um item à lista."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Cria uma lista com qualquer número de itens."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "primeiro"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# a partir do final"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; +Blockly.Msg["LISTS_GET_INDEX_GET"] = "obter"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "obter e remover"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "último"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "aleatório"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "remover"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Retorna o primeiro item de uma lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Retorna o item na posição especificada da lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Retorna o último item de uma lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Retorna um item aleatório de uma lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Remove e retorna o primeiro item de uma lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Remove e retorna o item na posição especificada de uma lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Remove e retorna o último item de uma lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Remove e retorna um item aleatório de uma lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Remove o primeiro item de uma lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Remove o item de uma posição especifica da lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Remove o último item de uma lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Remove um item aleatório de uma lista."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "até #, a partir do final"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "até #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "para o último"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "obtem sublista da primeira lista"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "obtem sublista de # a partir do final"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "obtem sublista de #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Cria uma cópia da porção especificada de uma lista."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 é o último item."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 é o primeiro item."; +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 %1 se o item não for encontrado."; +Blockly.Msg["LISTS_INLIST"] = "na lista"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 está vazia"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Retona 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."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "criar lista com o item %1 repetido %2 vezes"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Cria uma lista constituída por um dado valor repetido o número de vezes especificado."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "inverter %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Inverter uma cópia da lista."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "como"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "inserir em"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "definir"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Insere o item no início da lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Insere o item numa posição especificada numa lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Insere o item no final da lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Insere o item numa posição aleatória de uma lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Define o primeiro item de uma lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Define o item na posição especificada de uma lista."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "ascendente"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "descendente"; +Blockly.Msg["LISTS_SORT_TITLE"] = "ordenar %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Ordenar uma cópia de uma lista."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alfabética, ignorar maiúsculas/minúsculas"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numérica"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alfabética"; +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"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Juntar uma lista de textos num único texto, separado por um delimitador."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Dividir o texto numa lista de textos, separando-o em cada delimitador."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "com delimitador"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "falso"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Retorna verdadeiro ou falso."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "verdadeiro"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "http://pt.wikipedia.org/wiki/Inequa%C3%A7%C3%A3o"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Retorna verdadeiro se ambas as entradas forem iguais entre si."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Retorna verdadeiro se a primeira entrada for maior que a segunda entrada."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Retorna verdadeiro se a primeira entrada for maior ou igual à segunda entrada."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Retorna verdadeiro se a primeira entrada for menor que a segunda entrada."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Retorna verdadeiro se a primeira entrada for menor ou igual à segunda entrada."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Retorna verdadeiro se ambas as entradas forem diferentes entre si."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "não %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Retorna verdadeiro se a entrada for falsa. Retorna falso se a entrada for verdadeira."; +Blockly.Msg["LOGIC_NULL"] = "nulo"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "http://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Retorna nulo."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "e"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "ou"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Retorna verdadeiro se ambas as entradas forem verdadeiras."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Retorna verdadeiro se pelo menos uma das estradas for verdadeira."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "teste"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "http://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "se falso"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "se verdadeiro"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Avalia a condição em \"teste\". Se a condição for verdadeira retorna o valor \"se verdadeiro\", senão retorna o valor \"se falso\"."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "http://pt.wikipedia.org/wiki/Aritm%C3%A9tica"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Retorna a soma de dois números."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Retorna o quociente da divisão de dois números."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Retorna a diferença de dois números."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Retorna o produto de dois números."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Retorna o primeiro número elevado à potência do segundo número."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 de X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Devolver o arco tangente do ponto (X, Y) em graus entre -180 e 180."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "http://pt.wikipedia.org/wiki/Adi%C3%A7%C3%A3o"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "alterar %1 por %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Soma um número à variável \"%1\"."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "http://pt.wikipedia.org/wiki/Anexo:Lista_de_constantes_matem%C3%A1ticas"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Retorna uma das constantes comuns: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), ou ∞ (infinito)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "restringe %1 inferior %2 superior %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Restringe um número entre os limites especificados (inclusive)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "é divisível por"; +Blockly.Msg["MATH_IS_EVEN"] = "é par"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "é negativo"; +Blockly.Msg["MATH_IS_ODD"] = "é impar"; +Blockly.Msg["MATH_IS_POSITIVE"] = "é positivo"; +Blockly.Msg["MATH_IS_PRIME"] = "é primo"; +Blockly.Msg["MATH_IS_TOOLTIP"] = "Verifica se um número é par, impar, primo, inteiro, positivo, negativo, ou se é divisível por outro número. Retorna verdadeiro ou falso."; +Blockly.Msg["MATH_IS_WHOLE"] = "é inteiro"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "http://pt.wikipedia.org/wiki/Opera%C3%A7%C3%A3o_m%C3%B3dulo"; +Blockly.Msg["MATH_MODULO_TITLE"] = "resto da divisão de %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Retorna o resto da divisão de dois números."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "http://pt.wikipedia.org/wiki/N%C3%BAmero"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Um número."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "média de uma lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "maior de uma lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "mediana de uma lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "menor de uma lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "moda de uma lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "item aleatório de uma lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "desvio padrão de uma lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "soma da lista"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Retorna a média aritmética dos valores números da lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Retorna o maior número da lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Retorna a mediana da lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Retorna o menor número da lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Retorna a lista de item(ns) mais comum(ns) da lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Retorna um elemento aleatório da lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Retorna o desvio padrão dos números da lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Retorna a soma de todos os números da lista."; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "http://pt.wikipedia.org/wiki/N%C3%BAmero_aleat%C3%B3rio"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "fração aleatória"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Insere uma fração aleatória entre 0.0 (inclusive) e 1.0 (exclusive)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "http://pt.wikipedia.org/wiki/N%C3%BAmero_aleat%C3%B3rio"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "inteiro aleatório entre %1 e %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Retorna um número inteiro entre os dois limites especificados, inclusive."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "http://pt.wikipedia.org/wiki/Arredondamento"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "arredonda"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "arredonda para baixo"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "arredonda para cima"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Arredonda um número para cima ou para baixo."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "http://pt.wikipedia.org/wiki/Raiz_quadrada"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absoluto"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "raíz quadrada"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Retorna o valor absoluto de um número."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Retorna o número e elevado à potência de um número."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Retorna o logarítmo natural de um número."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Retorna o logarítmo em base 10 de um número."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Retorna o oposto de um número."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Retorna 10 elevado à potência de um número."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Retorna a raiz quadrada de um número."; +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"] = "http://pt.wikipedia.org/wiki/Fun%C3%A7%C3%A3o_trigonom%C3%A9trica"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Retorna o arco cosseno de um número."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Retorna o arco seno de um número."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Retorna o arco tangente de um número."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Retorna o cosseno de um grau (não radiano)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Retorna o seno de um grau (não radiano)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Retorna a tangente de um grau (não radiano)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Criar variável colorida..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Criar variável numérica..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Criar variável de segmentos de texto..."; +Blockly.Msg["NEW_VARIABLE"] = "Criar variável…"; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Nome da nova variável:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Tipo da nova variável:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "permitir declarações"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "com:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://pt.wikipedia.org/wiki/Sub-rotina"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Executa a função \"%1\"."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://pt.wikipedia.org/wiki/Sub-rotina"; +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"] = "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"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "para"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Cria uma função que não tem retorno."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "http://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +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"] = "Aviso: 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_TOOLTIP"] = "se o valor é verdadeiro, então retorna um segundo valor."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Aviso: 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"] = "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"] = "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:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "para %1 acrescentar texto %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Acrescentar um pedaço de texto à variável \"%1\"."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "para minúsculas"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "para Iniciais Maiúsculas"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "para MAIÚSCULAS"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Retorna uma cópia do texto em formato diferente."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "obter primeira letra"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "obter letra nº a partir do final"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "obter letra nº"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "obter última letra"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "obter letra aleatória"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "no texto %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Retorna a letra na posição especificada."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "contar %1 em %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Conte quantas vezes um certo texto aparece dentro de algum outro texto."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Acrescentar um item ao texto."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "unir"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Acrescenta, remove ou reordena seções para reconfigurar este bloco de texto."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "até letra nº a partir do final"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "até letra nº"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "até última letra"; +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"] = "no texto"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "obter subsequência a partir da primeira letra"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "obter subsequência de tamanho # a partir do final"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "obter subsequência de tamanho #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Retorna a parte especificada do texto."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "primeira ocorrência do texto"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "última ocorrência do texto"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "no texto %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Retorna a posição da primeira/última ocorrência do primeiro texto no segundo texto. Retorna %1 se o texto não for encontrado."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 está vazio"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Retorna verdadeiro se o texto fornecido estiver vazio."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "criar texto com"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Criar um pedaço de texto juntando qualquer número de itens."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "tamanho de %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Devolve o número de letras (incluindo espaços) do texto fornecido."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "imprime %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Imprime o texto, número ou outro valor especificado."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Pede ao utilizador um número."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Pede ao utilizador um texto."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "pede um número com a mensagem"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "Pede um texto com a mensagem"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "substituir %1 por %2 em %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Substituir todas as ocorrências de um certo texto dentro de algum outro texto."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "inverter %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Inverte a ordem dos caracteres no texto."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "http://pt.wikipedia.org/wiki/Cadeia_de_caracteres"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Uma letra, palavra ou linha de texto."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "remover espaços de ambos os lados"; +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["UNNAMED_KEY"] = "sem nome"; +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 +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Retorna o valor desta variável."; +Blockly.Msg["VARIABLES_SET"] = "definir %1 para %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Criar \"obter %1\""; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Define esta variável para o valor inserido."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Já existe uma variável com o nome de '%1'."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Já existe uma variável chamada '%1' para outra do tipo: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Espaço de trabalho de Blockly"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Diz algo..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/ro.js b/js/msg/js/ro.js new file mode 100644 index 0000000..0464519 --- /dev/null +++ b/js/msg/js/ro.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Adaugă un comentariu"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Nu se poate șterge variabila '%1' deoarece face parte din definiția funcției '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Schimbaţi valoarea:"; +Blockly.Msg["CLEAN_UP"] = "Curăță blocări"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Blocurile blocate conțin avertismente."; +Blockly.Msg["COLLAPSE_ALL"] = "Restrange blocurile"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Restrange blocul"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "culoare 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "culoare 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg["COLOUR_BLEND_RATIO"] = "Raport"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "amestec"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Amestecă două culori cu un raport dat (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://ro.wikipedia.org/wiki/Culoare"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Alege o culoare din paleta de culori."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "culoare aleatorie"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Alege o culoare la întâmplare."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "albastru"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "verde"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg["COLOUR_RGB_RED"] = "roşu"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "colorează cu"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Creează o culoare cu suma specificată de roşu, verde şi albastru. Toate valorile trebuie să fie între 0 şi 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"] = "ieşi din bucla"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "continuă cu următoarea iterație a buclei"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Ieși din bucla care conţine."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Sari peste restul aceastei bucle, şi continuă cu urmatoarea iteratie."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Avertisment: Acest bloc pote fi utilizat numai în interiorul unei bucle."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "pentru fiecare element %1 în listă %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Pentru fiecare element din listă, setaţi variabila '%1' ca valoarea elementului, şi apoi faceţi unele declaraţii."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "numără cu %1 de la %2 la %3 prin %4"; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Adăugaţi o condiţie in blocul if."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Adauga o stare finala, cuprinde toata conditia din blocul if."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Adaugă, elimină sau reordonează secţiuni pentru a reconfigura acest bloc if."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "altfel"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "altfel dacă"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "dacă"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Dacă o valoare este adevărată, atunci fa unele declaraţii."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "fă"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "repetă de %1 ori"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Face unele afirmaţii de mai multe ori."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "Repetaţi până când"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "repetă în timp ce"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "În timp ce o valoare este adevărat, atunci face unele declaraţii."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "În timp ce o valoare este adevărat, atunci face unele declaraţii."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Ștergi toate cele %1 (de) blocuri?"; +Blockly.Msg["DELETE_BLOCK"] = "Șterge Bloc"; +Blockly.Msg["DELETE_VARIABLE"] = "Ștergeți variabila '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Șterge %1 utilizările variabilei '%2'?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Ștergeți %1 Blocuri"; +Blockly.Msg["DISABLE_BLOCK"] = "Dezactivaţi bloc"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Duplicate"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Coment duplicat"; +Blockly.Msg["ENABLE_BLOCK"] = "Permite bloc"; +Blockly.Msg["EXPAND_ALL"] = "Extinde blocuri"; +Blockly.Msg["EXPAND_BLOCK"] = "Extinde bloc"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Intrări externe"; +Blockly.Msg["HELP"] = "Ajutor"; +Blockly.Msg["INLINE_INPUTS"] = "Intrări în linie"; +Blockly.Msg["IOS_CANCEL"] = "Anulare"; +Blockly.Msg["IOS_ERROR"] = "Eroare"; +Blockly.Msg["IOS_OK"] = "OK"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Adăugați intrare"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Permite declarațiile"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Această funcție are intrări duplicate."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INTRĂRI"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Adaugă"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+Adăugați variabilă"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Ştergeți"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Nu puteți utiliza un nume de variabilă gol."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Redenumire"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Numele variabilei"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "creează listă goală"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Returnează o listă, de lungime 0, care nu conţine înregistrări de date"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "listă"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Adaugă, elimină sau reordonează secţiuni ca să reconfiguraţi aceste blocuri de listă."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "creează listă cu"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Adăugaţi un element la listă."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Creaţi o listă cu orice număr de elemente."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "primul"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# de la sfârșit"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; +Blockly.Msg["LISTS_GET_INDEX_GET"] = "obţine"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "obţine şi elimină"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "ultimul"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "aleator"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "elimină"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Returnează primul element dintr-o listă."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Returneaza elementul la poziţia specificată într-o listă."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Returnează ultimul element într-o listă."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Returneaza un element aleatoriu într-o listă."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Elimină şi returnează primul element într-o listă."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Elimină şi returneaza elementul la poziţia specificată într-o listă."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Elimină şi returnează ultimul element într-o listă."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Elimină şi returnează un element aleatoriu într-o listă."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Elimină primul element într-o listă."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Elimină elementul la poziţia specificată într-o listă."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Elimină ultimul element într-o listă."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Elimină un element aleatoriu într-o listă."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "la # de la sfarsit"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "la #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "la ultima"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "obţine sub-lista de la primul"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "obţine sub-lista de la # de la sfârşitul"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "obţine sub-lista de la #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Creează o copie a porţiunii specificate dintr-o listă."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 este ultimul element."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 este primul element."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "Găseşte prima apariţie a elementului"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "găseşte ultima apariţie a elementului"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Returnează indexul primei/ultimei apariții a articolului din listă. Returnează %1 dacă elementul nu este găsit."; +Blockly.Msg["LISTS_INLIST"] = "în listă"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 este gol"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Returnează adevărat dacă lista este goală."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "lungime de %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Returnează lungimea unei liste."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "creaza lista cu %1 elemente repetate de %2 ori"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Creează o listă alcătuită dintr-o anumită valoare repetată de numărul specificat de ori."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "inversă %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Inversați copia unei liste."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "ca"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "introduceţi la"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "seteaza"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Inserează elementul la începutul unei liste."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Inserează elementul la poziţia specificată într-o listă."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Adăugă elementul la sfârşitul unei liste."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Inserează elementul aleatoriu într-o listă."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Setează primul element într-o listă."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Setează elementul la poziţia specificată într-o listă."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "crescător"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "descrescător"; +Blockly.Msg["LISTS_SORT_TITLE"] = "sortați %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Sortați o copie a unei liste."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alfabetic, ignorați cazul"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numeric"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alfabetic"; +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"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Concatenează o listă de texte (alternate cu separatorul) într-un text unic"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Împarte textul într-o listă de texte, despărțite prin fiecare separator"; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "cu separatorul"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "fals"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Returnează adevărat sau fals."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "adevărat"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Returnează adevărat dacă ambele intrări sunt egale."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Returnează adevărat dacă prima intrare este mai mare decât a doua intrare."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Returnează adevărat dacă prima intrare este mai mare sau egală cu a doua intrare."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Returnează adevărat dacă prima intrare este mai mică decât a doua intrare."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Returnează adevărat dacă prima intrare este mai mică sau egală cu a doua intrare."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Returnează adevărat daca cele două intrări nu sunt egale."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "non %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Returnează adevărat dacă intrarea este falsă. Returnează fals dacă intrarea este adevărată."; +Blockly.Msg["LOGIC_NULL"] = "nul"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "returnează nul."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "şi"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "sau"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Returnează adevărat daca ambele intrări sunt adevărate."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Returnează adevărat dacă cel puţin una din intrări este adevărată."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "test"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "dacă este fals"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "dacă este adevărat"; +Blockly.Msg["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\"."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://ro.wikipedia.org/wiki/Aritmetic%C4%83"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Returnează suma a două numere."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Returnează câtul celor două numere."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Returneaza diferenţa dintre cele două numere."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Returnează produsul celor două numere."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Returneaza numărul rezultat prin ridicarea primului număr la puterea celui de-al doilea."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Întoarceți arctangentul punctului (X, Y) în grade de la -180 la 180."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "schimbă %1 de %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Adaugă un număr variabilei '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://ro.wikipedia.org/wiki/Constant%C4%83_matematic%C4%83"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Întoarcă una din constantele comune: π (3.141...), e (2.718...), φ (1,618...), sqrt(2) (1.414...), sqrt(½) (0.707...) sau ∞ (infinitate)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "constrânge %1 redus %2 ridicat %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Constrânge un număr să fie între limitele specificate (inclusiv)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "este divizibil cu"; +Blockly.Msg["MATH_IS_EVEN"] = "este par"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "este negativ"; +Blockly.Msg["MATH_IS_ODD"] = "este impar"; +Blockly.Msg["MATH_IS_POSITIVE"] = "este pozitiv"; +Blockly.Msg["MATH_IS_PRIME"] = "este prim"; +Blockly.Msg["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."; +Blockly.Msg["MATH_IS_WHOLE"] = "este întreg"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "restul la %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Întoarce restul din împărţirea celor două numere."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Un număr."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "media listei"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "maximul listei"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "media listei"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "minimul listei"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "moduri de listă"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "element aleatoriu din lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "deviația standard a listei"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "suma listei"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Întoarce media (aritmetică) a valorilor numerice în listă."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Întoarce cel mai mare număr din listă."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Întoarce numărul median în listă."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Returnează cel mai mic număr din listă."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Returnează o listă cu cel(e) mai frecvent(e) element(e) din listă."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Returnează un element aleatoriu din listă."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Întoarce deviația standard a listei."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Returnează suma tuturor numerelor din lista."; +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"] = "fracții aleatorii"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Returnează o fracţie aleatoare între 0.0 (inclusiv) si 1.0 (exclusiv)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "un număr întreg aleator de la %1 la %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Returnează un număr întreg aleator aflat între cele două limite specificate, inclusiv."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "rotund"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "rotunjit"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "rotunjește în sus"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Rotunjirea unui număr în sus sau în jos."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absolută"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "rădăcina pătrată"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Returnează valoarea absolută a unui număr."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Returnează e la puterea unui număr."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Întoarce logaritmul natural al unui număr."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Returnează logaritmul în baza 10 a unui număr."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Returnează negaţia unui număr."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Returnează 10 la puterea unui număr."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Returnează rădăcina pătrată a unui număr."; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_TRIG_ACOS"] = "arccos"; +Blockly.Msg["MATH_TRIG_ASIN"] = "arcsin"; +Blockly.Msg["MATH_TRIG_ATAN"] = "arctg"; +Blockly.Msg["MATH_TRIG_COS"] = "cos"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://ro.wikipedia.org/wiki/Funcții_trigonometrice"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; +Blockly.Msg["MATH_TRIG_TAN"] = "tg"; +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Returnează arccosinusul unui număr."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Returnează arcsinusul unui număr."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Returnează arctangenta unui număr."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Întoarce cosinusul unui grad (nu radianul)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Întoarce cosinusul unui grad (nu radianul)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Întoarce tangenta unui grad (nu radianul)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Crează o variabilă culoare"; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Crează o variabilă număr"; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Crează o variabilă string"; +Blockly.Msg["NEW_VARIABLE"] = "Crează variabilă"; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Noul nume de variabilă:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Tip nou de variabilă"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "permite declarațiile"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "cu:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Executați funcția '%1 'definită de utilizator."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Executați funcția '%1 'definită de utilizator şi folosiţi producţia sa."; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "cu:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "Creaţi '%1'"; +Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Descrieți această funcție ..."; +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"] = "fă ceva"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "la"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Crează o funcţie cu nici o ieşire."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://ro.wikipedia.org/wiki/Subrutină"; +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "returnează"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Creează o funcţie cu o ieşire."; +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Atenţie: Această funcţie are parametri duplicaţi."; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Evidenţiază definiţia funcţiei"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Dacă o valoare este adevărată, atunci returnează valoarea a doua."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Avertisment: Acest bloc poate fi utilizat numai în definiţia unei funcţii."; +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"] = "Refă"; +Blockly.Msg["REMOVE_COMMENT"] = "Elimină comentariu"; +Blockly.Msg["RENAME_VARIABLE"] = "Redenumirea variabilei..."; +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Redenumeşte toate variabilele '%1' în:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "la %1 Adăugaţi text %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Adăugaţi text la variabila '%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "la litere mici"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "către Titlul de caz"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "la MAJUSCULE"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Întoarce o copie a textului într-un caz diferit."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "obţine prima litera"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "obţine litera # de la sfârșit"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "obtine litera #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "obţine o litera oarecare"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "obtine o litera oarecare"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "în text %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returnează litera la poziția specificată."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "numără %1 in %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Aflați de câte ori apare un text într-un alt text."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Adaugă un element în text."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "alăturaţi-vă"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Adaugă, elimină sau reordonează secțiuni ca să reconfigureze blocul text."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "la litera # de la sfarsit"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "la litera #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "la ultima literă"; +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"] = "în text"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "obţine un subșir de la prima literă"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "obține un subșir de la litera # de la sfârșit"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "obține subșir de la litera #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Returnează o anumită parte din text."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "găseşte prima apariţie a textului"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "găseşte ultima apariţie a textului"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "în text %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returnează indicele primei/ultimei apariţii din primul text în al doilea text. Returnează %1 dacă textul nu este găsit."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 este gol"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Returnează adevărat dacă textul furnizat este gol."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "crează text cu"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Creaţi o bucată de text prin unirea oricărui număr de elemente."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "lungime de %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Returnează numărul de litere (inclusiv spaţiile) în textul furnizat."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "imprimare %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Afișează textul specificat, numărul sau altă valoare."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Solicită utilizatorul pentru un număr."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Solicită utilizatorul pentru text."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "solicită pentru număr cu mesaj"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "solicită pentru text cu mesaj"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "înlocuiți %1 cu %2 în %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Înlocuiți toate aparițiile anumitor texte într-un alt text."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "inversă %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Inversează ordinea caracterelor din text."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "O literă, cuvânt sau linie de text."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "taie spațiile de pe ambele părți ale"; +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"] = "Anulează"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // 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 +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Returnează valoarea acestei variabile."; +Blockly.Msg["VARIABLES_SET"] = "seteaza %1 la %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Crează 'get %1'"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Setează această variabilă sa fie egală la intrare."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "O variabilă cu numele '%1' există deja."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "o variabilă numită '%1' există deja pentru alt tip: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Spune ceva..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/ru.js b/js/msg/js/ru.js new file mode 100644 index 0000000..d04422e --- /dev/null +++ b/js/msg/js/ru.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Добавить комментарий"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Невозможно удалить переменную '%1', поскольку она является частью определения функции '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Измените значение:"; +Blockly.Msg["CLEAN_UP"] = "Убрать блоки"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Свёрнутые блоки содержат предупреждения."; +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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // 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://ru.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"] = "https://www.december.com/html/spec/colorpercompact.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"] = "цикл по %1 от %2 до %3 с шагом %4"; +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://ru.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_VARIABLE"] = "Удалить переменную '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Удалить %1 использований переменной '%2'?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Удалить %1 блоков"; +Blockly.Msg["DISABLE_BLOCK"] = "Отключить блок"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Дублировать"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Клонировать комментарий"; +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["IOS_CANCEL"] = "Отмена"; +Blockly.Msg["IOS_ERROR"] = "Ошибка"; +Blockly.Msg["IOS_OK"] = "ОК"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Добавить входную переменную"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Разрешить операторы"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "У этой функции есть дублирующиеся входные переменные."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "ВХОД"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Добавить"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Добавить переменную"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Удалить"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Вы не можете использовать пустое имя переменной."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Переименовать"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Имя переменной"; +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_TOOLTIP"] = "Добавьте, удалите, переставьте элементы для переделки блока списка."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "создать список из"; +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"] = "№ с конца"; +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"] = "Возвращает первый элемент списка."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Возвращает элемент в указанной позиции списка."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Возвращает последний элемент списка."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Возвращает случайный элемент списка."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Удаляет и возвращает первый элемент списка."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Удаляет и возвращает элемент в указанной позиции списка."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Удаляет и возвращает последний элемент списка."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Удаляет и возвращает случайный элемент списка."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Удаляет первый элемент списка."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Удаляет элемент в указанной позиции списка."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Удаляет последний элемент списка."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Удаляет случайный элемент списка."; +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"] = "взять подсписок с первого"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "взять подсписок с № с конца"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "взять подсписок с №"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Создаёт копию указанной части списка."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 - последний элемент."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 - первый элемент."; +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"] = "Возвращает номер позиции первого/последнего вхождения элемента в списке. Возвращает %1, если элемент не найден."; +Blockly.Msg["LISTS_INLIST"] = "в списке"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 пуст"; +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"] = "Возвращает длину списка."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "создать список из элемента %1, повторяющегося %2 раз"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Создаёт список, состоящий из заданного числа копий элемента."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "изменить порядок на обратный %1"; +Blockly.Msg["LISTS_REVERSE_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_SET"] = "присвоить"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Вставляет элемент в начало списка."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Вставляет элемент в указанной позиции списка."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Добавляет элемент в конец списка."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Вставляет элемент в случайное место в списке."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Присваивает значение первому элементу списка."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Присваивает значение элементу в указанной позиции списка."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "по возрастанию"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "по убыванию"; +Blockly.Msg["LISTS_SORT_TITLE"] = "сортировать %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Сортировать копию списка."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "по алфавиту, без учёта регистра"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "числовая"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "по алфавиту"; +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_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://ru.wikipedia.org/wiki/Неравенство"; +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"; +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://ru.wikipedia.org/wiki/Тернарная_условная_операция"; +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://ru.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_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 от X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Возвращает арктангенс точки (X, Y) в градусах от -180 до 180."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://ru.wikipedia.org/wiki/%D0%98%D0%B4%D0%B8%D0%BE%D0%BC%D0%B0_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29#.D0.98.D0.BD.D0.BA.D1.80.D0.B5.D0.BC.D0.B5.D0.BD.D1.82"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "увеличить %1 на %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Добавляет число к переменной '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://ru.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_(graphics)"; // 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://ru.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://ru.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://ru.wikipedia.org/wiki/Генератор_псевдослучайных_чисел"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "случайное число от 0 (включительно) до 1"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Возвращает случайное число от 0.0 (включительно) до 1.0."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://ru.wikipedia.org/wiki/Генератор_псевдослучайных_чисел"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "случайное целое число от %1 для %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Возвращает случайное число между двумя заданными пределами (включая и их)."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://ru.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://ru.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://ru.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["NEW_COLOUR_VARIABLE"] = "Создать переменную цвета..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Создать числовую переменную..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Создать строковую переменную..."; +Blockly.Msg["NEW_VARIABLE"] = "Создать переменную…"; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Имя новой переменной:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Новый тип переменной:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "разрешить операторы"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "с:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://ru.wikipedia.org/wiki/Подпрограмма"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Исполняет определённую пользователем процедуру '%1'."; +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"] = "Опишите эту функцию…"; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "выполнить что-то"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "чтобы"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Создаёт процедуру, не возвращающую значение."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +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"; +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' в:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "к %1 добавить текст %2"; +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"] = "в Заглавные Начальные Буквы"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "в ЗАГЛАВНЫЕ БУКВЫ"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Возвращает копию текста с ЗАГЛАВНЫМИ или строчными буквами."; +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_LAST"] = "взять последнюю букву"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "взять случайную букву"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "в тексте %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Возвращает букву в указанной позиции."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "подсчитать количество %1 в %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Подсчитать, сколько раз отрывок текста появляется в другом тексте."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Добавить элемент к тексту."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "соединить"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Добавьте, удалите, переставьте фрагменты для переделки текстового блока."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "по букву № с конца"; +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"] = "взять подстроку с первой буквы"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "взять подстроку с буквы № с конца"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "взять подстроку с буквы №"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Возвращает указанную часть текста."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "найти первое вхождение текста"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "найти последнее вхождение текста"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "в тексте %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Возвращает номер позиции первого/последнего вхождения первого текста во втором. Возвращает %1, если текст не найден."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 пуст"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Возвращает значение истина, если предоставленный текст пуст."; +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"] = "Печатает текст, число или другой объект."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Запросить у пользователя число."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Запросить у пользователя текст."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "запросить число с подсказкой"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "запросить текст с подсказкой"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "заменить %1 на %2 в %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Заменить все вхождения некоторого текста другим текстом."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "изменить порядок на обратный %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Меняет порядок символов в тексте на обратный."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://ru.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_LEFT"] = "обрезать пробелы слева"; +Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "обрезать пробелы справа"; +Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "Возвращает копию текста с пробелами, удалёнными с одного или обоих концов."; +Blockly.Msg["TODAY"] = "Сегодня"; +Blockly.Msg["UNDO"] = "Отменить"; +Blockly.Msg["UNNAMED_KEY"] = "без названия"; +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_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["VARIABLE_ALREADY_EXISTS"] = "Переменная с именем '%1' уже существует."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Название переменной '%1' уже используется другой типа: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Рабочая область Blockly"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Напишите здесь что-нибудь..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/sc.js b/js/msg/js/sc.js new file mode 100644 index 0000000..a6fdb17 --- /dev/null +++ b/js/msg/js/sc.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Agiunghe unu cumentu"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Muda valori:"; +Blockly.Msg["CLEAN_UP"] = "Lìmpia is brocus"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "Serra e stringi Brocus"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Serra e stringi Brocu"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "colori 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "colori 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "raportu"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "mestura"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Amestura duus coloris cun unu raportu (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Scebera unu colori de sa tauledda."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "Unu colori a brítiu"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Scebera unu colori a brítiu."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "blue"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "birdi"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "arrùbiu"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "colora cun"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Cuncorda unu colori cun su tanti de arrubiu, birdi, e blue. Totu is valoris depint essi intra 0 e 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"] = "sàrtiat a foras de sa lòriga"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "sighit cun su repicu afatànti"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Bessit de sa lòriga."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Sartiat su chi abarrat de sa loriga, e sighit cun su repicu afatànti."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Amonestu: Custu brocu ddu podis ponni sceti aintru de una lòriga."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "po dònnia item %1 in lista %2"; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "po %1 de %2 fintzas %3 a passus de %4"; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Aciungi una cunditzioni a su brocu si."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Aciungi una urtima cunditzioni piga-totu a su brocu si."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Aciungi, fùlia, o assenta is partis po torrai a sètiu custu brocu si."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "sinuncas"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "sinuncas si"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "si"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Si su valori est berus, tandu fait pariga de cumandus."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "fai"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "repiti %1 bortas"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Fait pariga de cumandus prus bortas."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "repiti fintzas"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "repiti interis"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Interis su valori est frassu, tandu fai pariga de cumandus."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Interis su valori est berus, tandu fai pariga de cumandus."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Scancellu su %1 de is brocus?"; +Blockly.Msg["DELETE_BLOCK"] = "Fùlia Blocu"; +Blockly.Msg["DELETE_VARIABLE"] = "Delete the '%1' variable"; // untranslated +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg["DELETE_X_BLOCKS"] = "Fulia %1 Blocus"; +Blockly.Msg["DISABLE_BLOCK"] = "Disabìlita Blocu"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Dùplica"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +Blockly.Msg["ENABLE_BLOCK"] = "Abìlita Blocu"; +Blockly.Msg["EXPAND_ALL"] = "Aberi Brocus"; +Blockly.Msg["EXPAND_BLOCK"] = "Aberi Brocu"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Intradas esternas"; +Blockly.Msg["HELP"] = "Agiudu"; +Blockly.Msg["INLINE_INPUTS"] = "Intradas in lìnia"; +Blockly.Msg["IOS_CANCEL"] = "Cancel"; // untranslated +Blockly.Msg["IOS_ERROR"] = "Error"; // untranslated +Blockly.Msg["IOS_OK"] = "OK"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Add Input"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INPUTS"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Add"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Add Variable"; // untranslated +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Delete"; // untranslated +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "You can't use an empty variable name."; // untranslated +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Rename"; // untranslated +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Variable name"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "fait una lista buida"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Torrat una lista, de longària 0, chena records de datus."; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "lista"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Aciungi, fùlia, o assenta is partis po torrai a sètiu custu brocu lista."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "fait una lista cun"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Acciungi unu item a sa lista."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Fait una lista cun calisiollat numeru de items."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "primu"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# de sa fini"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_GET"] = "piga"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "piga e fùlia"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "urtimu"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "a brìtiu (random)"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "fùlia"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Torrat su primu elementu de una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Torrat s'elementu de su postu inditau de una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Torrat s'urtimu elementu de una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Torrat un'elementu a brìtiu de una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Fùliat e torrat su primu elementu de una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Fùliat e torrat s'elementu de su postu inditau de una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Fùliat e torrat s'urtimu elementu de una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Fùliat e torrat un'elementu a brìtiu de una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Fùliat su primu elementu de una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Fùliat s'elementu de su postu inditau de una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Fùliat s'urtimu elementu de una lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Fùliat unu elementu a brìtiu de una lista."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "a # de sa fini"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "fintzas a #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "a s'urtimu"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "bogandi suta-lista de su primu"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "bogandi suta-lista de # de sa fini."; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "bogandi suta-lista de #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Fait una copia de sa parti inditada de sa lista."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 est po s'urtimu elementu."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 est po su primu elementu."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "circa prima ocasioni de s'item"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "circa urtima ocasioni de s'item"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Torrat s'indixi de sa primu/urtima ocasioni de s'item in sa lista. Torrat %1 si s'item non s'agatat."; +Blockly.Msg["LISTS_INLIST"] = "in lista"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 est buidu"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Torrat berus si sa lista est buida."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "longària de %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Torrat sa longària de una lista."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "fait una lista cun item %1 repitiu %2 bortas"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Fait una lista cun unu numeru giau repitiu su tanti de is bortas inditadas."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "a"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "inserta a"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "imposta"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Insertat s'elementu a su cumintzu de sa lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Insertat s'elementu in su postu inditau in una lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Aciungit s'elementu a sa fini de sa lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Aciungit s'elementu a brítiu in sa lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Impostat su primu elementu in una lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Impostat s'elementu in su postu inditau de una lista."; +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"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Auni una lista de testus in d-unu sceti, ponendi separadoris."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Dividi su testu in un'elencu de testus, firmendi po dònnia separadori."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "cun separadori"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "frassu"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Torrat berus o frassu."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "berus"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Torrat berus si is inputs funt unu uguali a s'àteru."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Torrat berus si su primu input est prus mannu de s'àteru."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Torrat berus si su primu input est prus mannu o uguali a s'àteru."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Torrat berus si su primu input est prus piticu de s'àteru."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Torrat berus si su primu input est prus piticu o uguali a s'àteru."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Torrat berus si is inputs non funt unu uguali a s'àteru."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "non %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Torrat berus si s'input est frassu. Torrat frassu si s'input est berus."; +Blockly.Msg["LOGIC_NULL"] = "null"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Torrat null."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "and"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "or"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Torrat berus si ambos is inputs funt berus."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Torrat berus si assumancu unu de is inputs est berus."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "cumpròa"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "si frassu"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "si berus"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "‎Cumproa sa cunditzioni in 'cumproa'. Si sa cunditzioni est berus, torrat su valori 'si berus'; sinuncas torrat su valori 'si frassu'."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Torrat sa summa de is duus nùmerus."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Torrat su cuotzienti de is duus nùmerus."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Torrat sa diferèntzia de is duus nùmerus."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Torrat su produtu de is duus nùmerus."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Torrat su primu numeru artziau a sa potenza de su segundu nùmeru."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "muda %1 de %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Aciungi unu numeru a sa variabili '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["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)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "custringi %1 de %2 a %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Custringi unu numeru aintru de is liminaxus giaus (cumprendius)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "fait a ddu dividi po"; +Blockly.Msg["MATH_IS_EVEN"] = "est paris"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "est negativu"; +Blockly.Msg["MATH_IS_ODD"] = "est dísparu"; +Blockly.Msg["MATH_IS_POSITIVE"] = "est positivu"; +Blockly.Msg["MATH_IS_PRIME"] = "est primu"; +Blockly.Msg["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."; +Blockly.Msg["MATH_IS_WHOLE"] = "est intreu"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "arrestu de %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Torrat s'arrestu de sa divisioni de duus numerus."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Unu numeru"; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "mèdia de sa lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "massimu de sa lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "medianu de sa lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "minimu de sa lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "modas de sa lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "unu item a brìtiu de sa lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "deviadura standard de sa lista"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "suma sa lista"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Torrat sa mèdia (aritimètica) de is valoris de sa lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Torrat su numeru prus mannu de sa lista"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Torrat su numeru medianu de sa lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Torrat su numeru prus piticu de sa lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Torrat una lista de is itams prus frecuentis de sa lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Torrat unu item a brìtiu de sa lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Torrat sa deviadura standard de sa lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Torrat sa suma de totu is numerus de sa lista."; +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"] = "una fratzioni a brìtiu"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Torrat una fratzioni a brìtiu intra 0.0 (cumpresu) e 1.0 (bogau)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "numeru intreu a brítiu de %1 a %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Torrat unu numeru intreu a brìtiu intra duus nùmerus giaus (cumpresus)."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "arretunda"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "arretunda faci a bàsciu."; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "Arretunda faci a susu"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Arretunda unu numeru faci a susu o faci a bàsciu."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "assolutu"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "arraxina cuadra"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Torrat su valori assolútu de unu numeru."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Torrat (e) a sa potèntzia de unu numeru."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Torrat su logaritmu naturali de unu numeru."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Torrat su logaritmu a basi 10 de unu numeru."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Torrat su valori negau de unu numeru."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Torrat (10) a sa potèntzia de unu numeru."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Torrat s'arraxina cuadra de unu numeru."; +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"] = "Torrat su arccosinu de unu numeru."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Torrat su arcsinu de unu numeru."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Torrat su arctangenti de unu numeru."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Torrat su cosinu de unu gradu (no radianti)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Torrat su sinu de unu gradu (no radianti)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Torrat sa tangenti de unu gradu (no radianti)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "Variabili noa..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Nòmini de sa variabili noa:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "permiti decraratzionis"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "con:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Arròllia sa funtzione '%1' cuncordada dae s'impitadore."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Arròllia sa funtzione '%1' cuncordada dae s'impitadore e imprea s'output suu."; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "cun"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "Ingenerau'%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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "fait calincuna cosa"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "po"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Fait una funtzioni chena output."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "torrat"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Fait una funtzioni cun output."; +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Amonestu: Custa funtzioni tenit parametrus duplicaus."; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Marca sa definitzioni de funtzioni."; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Si unu valori est berus, tandu torrat unu segundu valori."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Amonestu: Custu brocu ddu podis ponni sceti aintru de una funtzioni."; +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:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "a %1 acciungi su testu %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Aciungit testu a sa variàbili '%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "a minúdu"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "cun Primu lìtera a Mauschínu"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "a mauschínu"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Torrat una copia de su testu inditau mudendi mauschínu/minúdu."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "piga sa prima lìtera"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "piga sa lìtera # de sa fini"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "piga sa lìtera #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "piga s'urtima lìtera"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "piga una lìtera a brìtiu"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Torrat sa lìtera de su postu giau."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Acciungi unu item a su testu."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "auni a pari"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Aciungi, fùlia, o assenta is partis po torrai a sètiu custu brocu de testu."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "a sa lìtera # de sa fini"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "a sa lìtera #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "a s'urtima lìtera"; +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 su testu"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "piga suta-stringa de sa primu lìtera"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "piga suta-stringa de sa lìtera # fintzas a fini"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "piga suta-stringa de sa lìtera #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Torrat su testu inditau."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "circa prima ocasioni de su testu"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "circa urtima ocasioni de su testu"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "in su testu %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Torrat s'indixi de sa primu/urtima ocasioni de su primu testu in su segundu testu. Torrat %1 si su testu no ddu agatat."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 est buidu"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Torrat berus si su testu giau est buidu."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "scri testu cun"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Fait unu testu ponendi a pari parigas de items."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "longària de %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Torrat su numeru de lìteras (cun is spàtzius) in su testu giau."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "scri %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Scri su testu, numeru o àteru valori."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Pregonta unu nùmeru a s'impitadore."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Pregonta testu a s'impitadore."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "pregonta po unu numeru"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "pregonta po su testu"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Una lìtera, paràula, o linia de testu."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "bogat spàtzius de ambus càbudus de"; +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["UNNAMED_KEY"] = "unnamed"; // 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 +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Torrat su valori de custa variabili."; +Blockly.Msg["VARIABLES_SET"] = "imposta %1 a %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Fait 'piga %1'"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Imposta custa variabili uguali a s'input."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "A variable named '%1' already exists."; // untranslated +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/sd.js b/js/msg/js/sd.js new file mode 100644 index 0000000..5a5d253 --- /dev/null +++ b/js/msg/js/sd.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "رايو ڏيو"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "قدر بدلايو"; +Blockly.Msg["CLEAN_UP"] = "بندشون هٽايو"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "تناسب"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "گڏيل"; +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"] = "https://www.december.com/html/spec/colorpercompact.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"] = "سڀ %1 بلاڪ ڊاھيون؟"; +Blockly.Msg["DELETE_BLOCK"] = "بلاڪ ڊاهيو"; +Blockly.Msg["DELETE_VARIABLE"] = "Delete the '%1' variable"; // untranslated +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg["DELETE_X_BLOCKS"] = "1٪ بلاڪ ڊاهيو"; +Blockly.Msg["DISABLE_BLOCK"] = "بلاڪ کي غيرفعال بڻايو"; +Blockly.Msg["DUPLICATE_BLOCK"] = "نقل"; +Blockly.Msg["DUPLICATE_COMMENT"] = "نقل رايو"; +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["IOS_CANCEL"] = "رد"; +Blockly.Msg["IOS_ERROR"] = "چُڪَ"; +Blockly.Msg["IOS_OK"] = "ٺيڪ (او ڪي) آهي"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Add Input"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "داخلائون (اِن پٽس)"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "شامل ڪيو"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "تبديل ٿيندڙ (ويريئيبل) وجهو"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "ڊاهيو"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "You can't use an empty variable name."; // untranslated +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "ٻيهر نالو ڏيو"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "تبيديل ٿيندڙ (ويريئيبل) جو نالو"; +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"] = "سان فهرست تخليق ڪيو"; +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"] = "Returns the item at the specified position in a list."; // 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"] = "Removes and returns the item at the specified position in a list."; // 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"] = "Removes the item at the specified position in a list."; // 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_FROM_END_TOOLTIP"] = "%1 is the last item."; // untranslated +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 is the first item."; // 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 %1 if item is not found."; // untranslated +Blockly.Msg["LISTS_INLIST"] = "فهرست ۾"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 خالي آهي"; +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_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "Inserts the item at the specified position in a list."; // 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"] = "Sets the item at the specified position in a list."; // 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"] = "اُڀو (اَسينڊنگ)"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "descending"; // untranslated +Blockly.Msg["LISTS_SORT_TITLE"] = "ترتيب ڏيو %1 %2 %3"; +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"] = "الف ب وار (الفابيٽڪ)"; +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"] = "پرک (ٽيسٽ)"; +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_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // 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_(graphics)"; // 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"] = "فهرست جا طريقيڪا (موڊز آف لسٽ)"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "بي ترتيب جذن جي فهرست (رينڊم آئيٽم آف لسٽ)"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "standard deviation of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "فهرست جو وچور"; +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"] = "هيٺ ڦيرايو (رائونڊ ڊائون)"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "ويڙهيو (رائونڊ اَپ)"; +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["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "نئون ڦرڻو..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "ڦرڻي جو نئون نالو:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // 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/Subroutine"; // 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/Subroutine"; // 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"] = "ٻيهر ڪريو"; +Blockly.Msg["REMOVE_COMMENT"] = "رايو ڊاهيو"; +Blockly.Msg["RENAME_VARIABLE"] = "ڦرڻي کي نئون نالو ڏيو..."; +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Rename all '%1' variables to:"; // untranslated +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "to %1 append text %2"; // 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_LAST"] = "get last letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "get random letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returns the letter at the specified position."; // untranslated +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "ڳڻيو %1 ۾ %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // 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"] = "متن ۾"; +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_OPERATOR_FIRST"] = "find first occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "find last occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "۾ متن %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 is empty"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Returns true if the provided text is empty."; // untranslated +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"] = "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_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // 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"] = "ڊاهيو"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // 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["VARIABLE_ALREADY_EXISTS"] = "A variable named '%1' already exists."; // untranslated +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/shn.js b/js/msg/js/shn.js new file mode 100644 index 0000000..f7436e4 --- /dev/null +++ b/js/msg/js/shn.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "သႂ်ႇၶေႃႈၶႆႈၸႂ်"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "လႅၵ်ႈလၢႆႈၼမ်ႉၵတ်ႉ"; +Blockly.Msg["CLEAN_UP"] = "Clean up Blocks"; // untranslated +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "သႅၼ်း"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "လေႃးလႄး"; +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"] = "https://www.december.com/html/spec/colorpercompact.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"] = "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"] = "တႄႇဢၢၼ်ႇၵိုၵ်း %1 တေႃႇ %2 တေႃႇ %3 လူၺ်ႈ %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"] = "သင်ဝႃႈ ပလွၵ်ႉၸိုင် သႂ်ႇပၼ်လွင်ႈတၢင်းမၼ်း တမ်ႈ"; +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"] = "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"] = "ပေႃးဝႃႈ ၵႃႈၶၼ် (ၼမ်ႉၵတ်ႉ) မၢၼ်ႇမႅၼ်ႈယဝ်ႉၸိုင် ႁဵတ်းၶေႃႈၵဵပ်းထွၼ်ၵမ်ႈၽွင်ႈ"; +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 တႃႇတူင်ႇမူၼ်း"; +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"] = "Delete all %1 blocks?"; // untranslated +Blockly.Msg["DELETE_BLOCK"] = "မွတ်ႇပလွၵ်ႉ"; +Blockly.Msg["DELETE_VARIABLE"] = "Delete the '%1' variable"; // untranslated +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg["DELETE_X_BLOCKS"] = "မွတ်ႇလွင်ႈႁႄႉတတ်း %1"; +Blockly.Msg["DISABLE_BLOCK"] = "ဢိုတ်းၸႂ်ႉ လွင်ႈႁႄႉတတ်း"; +Blockly.Msg["DUPLICATE_BLOCK"] = "ထုတ်ႇ"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +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["IOS_CANCEL"] = "Cancel"; // untranslated +Blockly.Msg["IOS_ERROR"] = "Error"; // untranslated +Blockly.Msg["IOS_OK"] = "OK"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Add Input"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INPUTS"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Add"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Add Variable"; // untranslated +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Delete"; // untranslated +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "You can't use an empty variable name."; // untranslated +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Rename"; // untranslated +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Variable name"; // untranslated +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"] = "list"; // untranslated +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"] = "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"] = "first"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# from end"; // untranslated +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"] = "last"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "random"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "remove"; // untranslated +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"] = "Returns the item at the specified position in a list."; // 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"] = "Removes and returns the item at the specified position in a list."; // 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"] = "Removes the item at the specified position in a list."; // 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_FROM_END_TOOLTIP"] = "%1 is the last item."; // untranslated +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 is the first item."; // 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 %1 if item is not found."; // untranslated +Blockly.Msg["LISTS_INLIST"] = "in list"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 is empty"; // untranslated +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_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "as"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "insert at"; // untranslated +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"] = "Inserts the item at the specified position in a list."; // 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"] = "Sets the item at the specified position in a list."; // 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://en.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_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +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"] = "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 +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // 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"] = "is divisible by"; // untranslated +Blockly.Msg["MATH_IS_EVEN"] = "ပဵၼ်ၵူပ်ႉ"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "is negative"; // untranslated +Blockly.Msg["MATH_IS_ODD"] = "ပဵၼ်ၵိၵ်ႈ"; +Blockly.Msg["MATH_IS_POSITIVE"] = "is positive"; // untranslated +Blockly.Msg["MATH_IS_PRIME"] = "is prime"; // untranslated +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"] = "is whole"; // untranslated +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/မၢႆၼပ်ႉ"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "မၢႆၼပ်ႉ ၼိုင်ႈဢၼ်"; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "average of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "max of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "median of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "min of list"; // untranslated +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"] = "Return the largest number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Return the median number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Return the smallest number in the list."; // untranslated +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/Square_root (မၢႆတူပ်ႉမိူၼ်)"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "ပၵတိ"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "မၢႆတူပ်ႉမိူၼ်"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "လဵဝ်ၶိုၼ်း ၵႃႈၶၼ် (ၼမ်ႉၵတ်ႉ) ပၵတိ ၼႂ်းမၢႆၼပ်ႉ"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "လဵဝ်ၶိုၼ်း e ၵႂႃႇတီႈ ပႃႇဝႃႇ ၼႂ်းမၢႆၼပ်ႉ"; +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"] = "လဵဝ်ၶိုၼ်း 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://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated +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["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "ၵေႃႇသၢင်ႈ တူဝ်ၼိုင်..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "ၸိုဝ်ႈဢၼ်လၢႆႈမႂ်ႇ"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // 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"] = "Create '%1'"; // untranslated +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/Subroutine"; // 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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "return"; // untranslated +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"] = "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' ထိုင်"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "to %1 append text %2"; // 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"] = "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"] = "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_LAST"] = "get last letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "get random letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returns the letter at the specified position."; // untranslated +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Add an item to the text."; // untranslated +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"] = "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_OPERATOR_FIRST"] = "find first occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "find last occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "in text %1 %2 %3"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 is empty"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Returns true if the provided text is empty."; // untranslated +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"] = "print %1"; // untranslated +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_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // 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["UNNAMED_KEY"] = "unnamed"; // 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["VARIABLE_ALREADY_EXISTS"] = "A variable named '%1' already exists."; // untranslated +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/sk.js b/js/msg/js/sk.js new file mode 100644 index 0000000..c30f71e --- /dev/null +++ b/js/msg/js/sk.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Pridať komentár"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Nie je možné zmazať premennú „%1“, pretože je súčasťou definície funkcie „%2“"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Zmeniť hodnotu:"; +Blockly.Msg["CLEAN_UP"] = "Narovnať bloky"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "Zvinúť bloky"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Zvinúť blok"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "farba 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "farba 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "pomer"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "zmiešať"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Zmieša dve farby v danom pomere (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Zvoľte farbu z palety."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "náhodná farba"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Zvoliť farbu náhodne."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "modrá"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "zelená"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "červená"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "ofarbiť s"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Vytvoriť farbu pomocou zadaného množstva červenej, zelenej a modrej. Množstvo musí byť medzi 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"] = "opustiť slučku"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "prejdi na nasledujúce opakovanie slučky"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Opustiť túto slučku."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Vynechať zvyšok tejto slučky a pokračovať ďalším opakovaním."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Upozornenie: Tento blok sa môže používať len v rámci slučky."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "pre každý prvok %1 v zozname %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Pre každý prvok v zozname priraď jeho hodnotu do premenej '%1' a vykonaj príkazy."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "počítať s %1 od %2 do %3 o %4"; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Pridať podmienku k \"ak\" bloku."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Pridať poslednú záchytnú podmienku k \"ak\" bloku."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Pridať, odstrániť alebo zmeniť poradie oddielov tohto \"ak\" bloku."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "inak"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "inak ak"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "ak"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Ak je hodnota pravda, vykonaj príkazy."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Ak je hodnota pravda, vykonaj príkazy v prvom bloku. Inak vykonaj príkazy v druhom bloku."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "rob"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "opakuj %1 krát"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Opakuj určité príkazy viackrát."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "opakuj kým nebude"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "opakuj kým"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Kým je hodnota nepravdivá, vykonávaj príkazy."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Kým je hodnota pravdivá, vykonávaj príkazy."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Zmazať všetkých %1 dielcov?"; +Blockly.Msg["DELETE_BLOCK"] = "Odstrániť blok"; +Blockly.Msg["DELETE_VARIABLE"] = "Odstrániť premennú '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Odstrániť %1 použití premennej '%2'?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Odstrániť %1 blokov"; +Blockly.Msg["DISABLE_BLOCK"] = "Vypnúť blok"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Duplikovať"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicitný komentár"; +Blockly.Msg["ENABLE_BLOCK"] = "Povoliť blok"; +Blockly.Msg["EXPAND_ALL"] = "Rozvinúť bloky"; +Blockly.Msg["EXPAND_BLOCK"] = "Rozvinúť blok"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Vonkajšie vstupy"; +Blockly.Msg["HELP"] = "Pomoc"; +Blockly.Msg["INLINE_INPUTS"] = "Riadkové vstupy"; +Blockly.Msg["IOS_CANCEL"] = "Zrušiť"; +Blockly.Msg["IOS_ERROR"] = "Chyba"; +Blockly.Msg["IOS_OK"] = "OK"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Pridať vstup"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Povoľujú príkazy"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Táto funkcia obsahuje duplikáty vstupov."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "Vstupy"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Pridať"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Pridať premennú"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Zmazať"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Nie je možné použiť premennú bez mena."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Premenovať"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Názov premennej"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "prázdny zoznam"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Vráti zoznam nulovej dĺžky, ktorý neobsahuje žiadne prvky."; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "zoznam"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Pridaj, odstráň alebo zmeň poradie v tomto zoznamovom bloku."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "vytvor zoznam s"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Pridaj prvok do zoznamu."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Vytvor zoznam s ľubovoľným počtom prvkov."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "prvý"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# od konca"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_GET"] = "zisti"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "zisti a odstráň"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "posledný"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "náhodný"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "odstráň"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Vráti počiatočný prvok zoznamu."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Vráti prvok na určenej pozícii v zozname."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Vráti posledný prvok zoznamu."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Vráti náhodný prvok zoznamu."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Odstráni a vráti prvý prvok v zozname."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Odstráni a vráti prvok z určenej pozície v zozname."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Odstráni a vráti posledný prvok v zozname."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Odstráni a vráti náhodný prvok v zozname."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Odstráni prvý prvok v zozname."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Odstráni prvok na určenej pozícii v zozname."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Odstráni posledný prvok v zozname."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Odstráni náhodný prvok v zozname."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "po # od konca"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "po #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "po koniec"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "Získať podzoznam od začiatku"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "Získať podzoznam od # od konca"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "získať podzoznam od #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Skopíruje určený úsek zoznamu."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 je posledný prvok."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 je počiatočný prvok."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "nájdi prvý výskyt prvku"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "nájdi posledný výskyt prvku"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Vráti index prvého/posledného výskytu prvku v zozname. Ak sa nič nenašlo, vráti %1."; +Blockly.Msg["LISTS_INLIST"] = "v zozname"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 je prázdny"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Vráti pravda, ak je zoznam prázdny."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "dĺžka %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Vráti dĺžku zoznamu"; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "vytvor zoznam s prvkom %1 opakovaným %2 krát"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Vytvorí zoznam s niekoľkými rovnakými prvkami s danou hodnotou."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "obrátiť %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Obrátiť kópiu zoznamu."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "ako"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "vložiť na"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "nastaviť"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Vsunie prvok na začiatok zoznamu."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Vsunie prvok na určenú pozíciu v zozname."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Pripojí prvok na koniec zoznamu."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Vsunie prvok na náhodné miesto v zozname."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Nastaví prvý prvok v zozname."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Nastaví prvok na určenej pozícii v zozname."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "Vzostupne"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "Zostupne"; +Blockly.Msg["LISTS_SORT_TITLE"] = "zoradiť %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Zoradiť kópiu zoznamu."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "abecedne, ignorovať veľkosť písmen"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numericky"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "abecedne"; +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"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Spojiť zoznam textov do jedného textu s oddeľovačmi."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Rozdelenie textu do zoznamu textov, lámanie na oddeľovačoch."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "s oddeľovačom"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "nepravda"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Vráť buď hodnotu pravda alebo nepravda."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "pravda"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Vráť hodnotu pravda, ak sú vstupy rovnaké."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Vráť hodnotu pravda ak prvý vstup je väčší než druhý."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Vráť hodnotu pravda ak prvý vstup je väčší alebo rovný druhému."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Vráť hodnotu pravda, ak prvý vstup je menší než druhý."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Vráť hodnotu pravda ak prvý vstup je menší alebo rovný druhému."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Vráť hodnotu pravda, ak vstupy nie sú rovnaké."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "nie je %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Vráti hodnotu pravda, ak je vstup nepravda. Vráti hodnotu nepravda ak je vstup pravda."; +Blockly.Msg["LOGIC_NULL"] = "nič"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Vráti hodnotu nula."; +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"] = "alebo"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Vráť hodnotu pravda, ak sú vstupy pravdivé."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Vráť hodnotu pravda, ak je aspoň jeden vstup 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"] = "ak nepravda"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "ak pravda"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Skontroluj podmienku testom. Ak je podmienka pravda, vráť hodnotu \"ak pravda\", inak vráť hodnotu \"ak nepravda\"."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Vráť súčet dvoch čísel."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Vráť podiel dvoch čísel."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Vráť rozdiel dvoch čísel."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Vráť súčin dvoch čísel."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Vráť prvé číslo umocnené druhým."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Vráťte arktangent bodu (X, Y) v stupňoch od -180 do 180."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "zmeniť %1 o %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Pridaj číslo do premennej \"%1\"."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant‎"; +Blockly.Msg["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)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "obmedz %1 od %2 do %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Obmedzí číslo do zadaných hraníc (vrátane)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "je deliteľné"; +Blockly.Msg["MATH_IS_EVEN"] = "je párne"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "je záporné"; +Blockly.Msg["MATH_IS_ODD"] = "je nepárne"; +Blockly.Msg["MATH_IS_POSITIVE"] = "je kladné"; +Blockly.Msg["MATH_IS_PRIME"] = "je prvočíslo"; +Blockly.Msg["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."; +Blockly.Msg["MATH_IS_WHOLE"] = "je celé číslo"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "zvyšok po delení %1 + %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Vráť zvyšok po delení jedného čísla druhým."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Číslo."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "priemer zoznamu"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "najväčšie v zozname"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "medián zoznamu"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "najmenšie v zozname"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "najčastejšie v zozname"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "náhodný prvok zoznamu"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "smerodajná odchýlka zoznamu"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "súčet zoznamu"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Vráť aritmetický priemer čísel v zozname."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Vrátiť najväčšie číslo v zozname."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Vráť medián čísel v zozname."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Vrátiť najmenšie číslo v zozname."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Vrátiť najčastejší prvok v zozname."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Vráť náhodne zvolený prvok zoznamu."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Vráť smeroddajnú odchýlku zoznamu."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Vráť súčet všetkých čísel v zozname."; +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"] = "náhodné číslo od 0 do 1"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Vráť náhodné číslo z intervalu 0.0 (vrátane) až 1.0."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "náhodné celé číslo od %1 do %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Vráť náhodné celé číslo z určeného intervalu (vrátane)."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "zaokrúhli"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "zaokrúhli nadol"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "zaokrúhli nahor"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Zaokrúhli číslo nahor alebo nadol."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absolútna hodnota"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "druhá odmocnina"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Vráť absolútnu hodnotu čísla."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Vráť e umocnené číslom."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Vráť prirodzený logaritmus čísla."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Vráť logaritmus čísla so základom 10."; +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"] = "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 +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Vráť arkus kosínus čísla."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Vráť arkus sínus čísla."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Vráť arkus tangens čísla."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Vráť kosínus uhla (v stupňoch)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Vráť sínus uhla (v stupňoch)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Vráť tangens uhla (v stupňoch)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "vytvoriť farbu premennej"; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Vytvoriť číselnú premennú..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Vytvoriť reťazovú premennú..."; +Blockly.Msg["NEW_VARIABLE"] = "Vytvoriť premennú..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Názov novej premennej:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "nový typ premennej"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "povoliť príkazy"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "s:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://sk.wikipedia.org/wiki/Podprogram"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Spustí používateľom definovanú funkciu '%1'."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://sk.wikipedia.org/wiki/Podprogram"; +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"] = "Doplň, čo robí táto funkcia..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "urob niečo"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "na"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Vytvorí funciu bez výstupu."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "vrátiť"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Vytvorí funkciu s výstupom."; +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Upozornenie: Táto funkcia má duplicitné parametre."; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Zvýrazniť definíciu funkcie"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Ak je hodnota pravda, tak vráti druhú hodnotu."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Upozornenie: Tento blok môže byť len vo vnútri funkcie."; +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"] = "Znova"; +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:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "do %1 pridaj text %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Pridaj určitý text do premennej '%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "na malé písmená"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "na Veľké Začiatočné Písmená"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "na VEĽKÉ PÍSMENÁ"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Vráť kópiu textu s inou veľkosťou písmen."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "zisti prvé písmeno"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "zisti # písmeno od konca"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "zisti písmeno #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "zisti posledné písmeno"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "vyber náhodné písmeno"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "v texte %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Vráti písmeno na určenej pozícii."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "počet výskytov %1 v %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Počet výskytov textu nachádzajúcom sa v inom texte."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Pridaj prvok do textu."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "spoj"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Pridaj, odstráň alebo zmeň poradie oddielov v tomto textovom bloku."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "po # písmeno od konca"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "po písmeno #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "po koniec"; +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"] = "v texte"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "vyber podreťazec od začiatku"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "vyber podreťazec od # písmena od konca"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "vyber podreťazec od písmena #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Vráti určenú časť textu."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "nájdi prvý výskyt textu"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "nájdi posledný výskyt textu"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "v texte %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Vráti index prvého/posledného výskytu prvého textu v druhom texte. Ak nenájde, vráti %1."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 je prázdny"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Vráti hodnotu pravda, ak zadaný text je prázdny."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "vytvor text z"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Vytvor text spojením určitého počtu prvkov."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "dĺžka %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Vráti počet písmen (s medzerami) v zadanom texte."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "píš %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Napíš zadaný text, číslo alebo hodnotu."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Výzva pre používateľa na zadanie čísla."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Výzva pre používateľa na zadanie textu."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "výzva na zadanie čísla so správou"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "výzva za zadanie textu so správou"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "zameniť %1 za %2 v reťazci %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Zameniť všetky výskyty textu za iný text."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "text odzadu %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Obrátiť poradie písmen v texte."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Písmeno, slovo alebo riadok textu."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "odstráň medzery z oboch strán"; +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"] = "Späť"; +Blockly.Msg["UNNAMED_KEY"] = "nepomenované"; +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 +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Vráti hodnotu tejto premennej."; +Blockly.Msg["VARIABLES_SET"] = "nastaviť %1 na %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Vytvoriť \"získať %1\""; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Nastaví túto premennú, aby sa rovnala vstupu."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Premenná s názvom %1 už existuje."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Premenná s názvom '%1' už existuje pre inú premennú typu '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Pracovisko Bloskly"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Povedz niečo..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/skr-arab.js b/js/msg/js/skr-arab.js new file mode 100644 index 0000000..a17f700 --- /dev/null +++ b/js/msg/js/skr-arab.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "تبصرہ کرو"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "ویلیو تبدیل کرو:"; +Blockly.Msg["CLEAN_UP"] = "بلاک صاف کرو"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "نسبت"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "مرکب"; +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"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Choose a colour from the palette."; // untranslated +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "بنا ترتيب رنگ"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Choose a colour at random."; // untranslated +Blockly.Msg["COLOUR_RGB_BLUE"] = "نیلا"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "ساوا"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "رتا"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "نال رن٘گ"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Create a colour with the specified amount of red, green, and blue. All values must be between 0 and 100."; // untranslated +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"] = "continue with next iteration of loop"; // untranslated +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"; // untranslated +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "کرو"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "repeat %1 times"; // untranslated +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"] = "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["DELETE_ALL_BLOCKS"] = "بھلا %1 بلاکاں کوں مٹاؤں؟"; +Blockly.Msg["DELETE_BLOCK"] = "بلاک مٹاؤ"; +Blockly.Msg["DELETE_VARIABLE"] = "Delete the '%1' variable"; // untranslated +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg["DELETE_X_BLOCKS"] = "%1 بلاکاں کوں مٹاؤ"; +Blockly.Msg["DISABLE_BLOCK"] = "بلاک ہٹاؤ"; +Blockly.Msg["DUPLICATE_BLOCK"] = "ڈپلیکیٹ"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +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["IOS_CANCEL"] = "منسوخ"; +Blockly.Msg["IOS_ERROR"] = "نقص"; +Blockly.Msg["IOS_OK"] = "ٹھیک ہے"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Add Input"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "ان پٹ"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "شامل کرو"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ متغیر شامل کرو"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "مٹاؤ"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "You can't use an empty variable name."; // untranslated +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "نواں ناں لکھو"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "متغیر ناں"; +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"] = "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"] = "Returns the item at the specified position in a list."; // 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"] = "Removes and returns the item at the specified position in a list."; // 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"] = "Removes the item at the specified position in a list."; // 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_FROM_END_TOOLTIP"] = "%1 is the last item."; // untranslated +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 is the first item."; // 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 %1 if item is not found."; // untranslated +Blockly.Msg["LISTS_INLIST"] = "فہرست وچ"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 خالی ہے"; +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_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "Inserts the item at the specified position in a list."; // 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"] = "Sets the item at the specified position in a list."; // 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"] = "چڑھدا ہویا"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "لہندا ہویا"; +Blockly.Msg["LISTS_SORT_TITLE"] = "سارٹ کرو%1%2%3"; +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"] = "عددی"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "الف بے دی"; +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"] = "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_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_NULL"] = "کوئی وی کائنی"; +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"] = "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"] = "ٹیسٹ"; +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"] = "Return the sum of the two numbers."; // untranslated +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"] = "Return the product of the two numbers."; // untranslated +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Return the first number raised to the power of the second number."; // untranslated +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +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"] = "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 +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // 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"] = "is divisible by"; // untranslated +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"] = "median of list"; // untranslated +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"] = "لسٹ دا مجموعہ"; +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"] = "Return the largest number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Return the median number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Return the smallest number in the list."; // untranslated +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/Square_root"; // untranslated +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"] = "Return the natural logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Return the base 10 logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Return the negation of a number."; // untranslated +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_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"; // untranslated +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["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "متغیر بݨاؤ۔۔۔"; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "نواں متغیر ناں:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // 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"] = "Create '%1'"; // untranslated +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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "do something"; // untranslated +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/Subroutine"; // 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"] = "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 +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "to %1 append text %2"; // 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"] = "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"] = "get letter # from end"; // untranslated +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_LAST"] = "چھیکڑی حرف گھنو"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "get random letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returns the letter at the specified position."; // untranslated +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // 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"] = "ٹیکسٹ وچ"; +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_OPERATOR_FIRST"] = "find first occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "find last occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "in text %1 %2 %3"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 خالی ہے"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Returns true if the provided text is empty."; // untranslated +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"] = "%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_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_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // 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"] = "واپس"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // 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["VARIABLE_ALREADY_EXISTS"] = "'%1' نامی متغیر پہلے موجود ہے۔"; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/sl.js b/js/msg/js/sl.js new file mode 100644 index 0000000..d664f63 --- /dev/null +++ b/js/msg/js/sl.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Dodaj komentar"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Ni mogoče izbrisati spremenljivke »%1«, ker je uporabljena v definiciji funkcije »%2«"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Spremeni vrednost:"; +Blockly.Msg["CLEAN_UP"] = "Ponastavi delčke"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Skrčeni delčki vsebujejo opozorila."; +Blockly.Msg["COLLAPSE_ALL"] = "Skrči delčke"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Skrči delček"; +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/"; +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"; +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"; +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: Ta delček lahko uporabiš samo znotraj zanke."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; +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čeni delčki."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; +Blockly.Msg["CONTROLS_FOR_TITLE"] = "štej s/z %1 od %2 do %3 po %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čeni delčki."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Dodaj pogoj »če« delčku."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Dodaj končni pogoj »če« delčku."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Dodaj, odstrani ali spremeni vrstni red odsekov za ponovno nastavitev »če« delčka."; +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 delčke."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Če je vrednost resnična, izvedi prvo skupino delčkov. Sicer izvedi drugo skupino delčkov."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Če je prva vrednost resnična, izvedi prvo skupino delčkov. Sicer, če je resnična druga vrednost, izvedi drugo skupino delčkov."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Če je prva vrednost resnična, izvedi prvo skupino delčkov. Sicer, če je resnična druga vrednost, izvedi drugo skupino delčkov. Če nobena izmed vrednosti ni resnična, izvedi zadnjo skupino delčkov."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "izvedi"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "ponovi %1 krat"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Delčki se izvedejo večkrat."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "ponavljaj dokler ni"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "ponavljaj dokler"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Delčki se izvajajo dokler je vrednost neresnična."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Delčki se izvajajo dokler je vrednost resnična."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Izbrišem vse delčke (%1)?"; +Blockly.Msg["DELETE_BLOCK"] = "Izbriši delček"; +Blockly.Msg["DELETE_VARIABLE"] = "Izbriši spremenljivko »%1«"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Izbrišem %1 uporab spremenljivke »%2«?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Izbriši delčke (%1)"; +Blockly.Msg["DISABLE_BLOCK"] = "Onemogoči delček"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Podvoji"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Podvoji komentar"; +Blockly.Msg["ENABLE_BLOCK"] = "Omogoči delček"; +Blockly.Msg["EXPAND_ALL"] = "Razširi delčke"; +Blockly.Msg["EXPAND_BLOCK"] = "Razširi delček"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Zunanji vnosi"; +Blockly.Msg["HELP"] = "Pomoč"; +Blockly.Msg["INLINE_INPUTS"] = "Vrstični vnosi"; +Blockly.Msg["IOS_CANCEL"] = "Prekliči"; +Blockly.Msg["IOS_ERROR"] = "Napaka"; +Blockly.Msg["IOS_OK"] = "V redu"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Dodaj vnos"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Dovoli izjave"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Ta funkcija ima podvojene vnose"; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "VNOSI"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Dodaj"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Dodaj spremenljivko"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Izbriši"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Ne moreš uporabiti spremenljivke brez imena."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Preimenuj"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Ime spremenljivke"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +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"; +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"] = "št."; +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"] = "Vrne element na določenem mestu v seznamu."; +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"] = "Odstrani in vrne element na določenem mestu v seznamu."; +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"] = "Odstrani element na določenem mestu v seznamu."; +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"; +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_FROM_END_TOOLTIP"] = "Zadnji element je št. %1."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "Prvi element je št. %1."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "najdi prvo pojavitev elementa"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "najdi zadnjo pojavitev elementa"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Vrne mesto (indeks) prve/zadnje pojavitve elementa v seznamu. Če elementa ne najde, vrne %1."; +Blockly.Msg["LISTS_INLIST"] = "v seznamu"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 je prazen"; +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"; +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"; +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_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "obrni %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Obrne kopijo seznama."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; +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"] = "Vstavi element na določeno mesto v seznamu."; +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"] = "Nastavi element na določenem mestu v seznamu."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "naraščajoče"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "padajoče"; +Blockly.Msg["LISTS_SORT_TITLE"] = "uredi %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Uredi kopijo seznama."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "abecedno, brez velikosti črk"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "številčno"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "abecedno"; +Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +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"; +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"; +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"; +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"; +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:"; +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"] = "+"; +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_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 koordinate X:%1 in Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Vrne arkus tangens točke (X, Y) v stopinjah med -180 in 180."; +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"; +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"] = "÷"; +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"] = "×"; +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"] = "^"; +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"] = "-"; +Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; +Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; +Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; +Blockly.Msg["MATH_TRIG_COS"] = "cos"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "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["NEW_COLOUR_VARIABLE"] = "Ustvari spremenljivko barve"; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Ustvari spremenljivko števila"; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Ustvari spremenljivko niza"; +Blockly.Msg["NEW_VARIABLE"] = "Ustvari spremenljivko ..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Ime nove spremenljivke:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Novi tip 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ši funkcijo ..."; +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"] = "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"; +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"; +Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Če je vrednost resnična, vrne drugo vrednost."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Pozor: Ta delček 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"] = "Ponovi"; +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_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg["TEXT_APPEND_TITLE"] = "k %1 dodaj besedilo %2"; +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"; +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"; +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_TITLE"] = "v besedilu %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Vrne črko na določenem mestu v besedilu."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "preštej %1 v %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Prešteje kolikokrat se neko besedilo pojavi znotraj drugega besedila."; +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"; +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"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "najdi prvo pojavitev besedila"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "najdi zadnjo pojavitev besedila"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "v besedilu %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Vrne mesto (indeks) prve/zadnje pojavitve drugega besedila v prvem besedilu. Če besedila ne najde, vrne %1."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 je prazno"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Vrne resnično, če je določeno besedilo prazno."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; +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"; +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"; +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"; +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_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "zamenjaj %1 z %2 v %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Zamenja vse pojavitve besedila znotraj drugega besedila."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "obrni %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Obrne vrstni red znakov v besedilu."; +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"; +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"] = "Razveljavi"; +Blockly.Msg["UNNAMED_KEY"] = "neimenovano"; +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"; +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"; +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Nastavi, da je vrednost spremenljivke enaka vnosu."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Spremenljivka »%1« že obstaja."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Spremenljivka z imenom »%1« že obstaja za tip »%2«"; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly-jev delovni prostor"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Povej nekaj ..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/sq.js b/js/msg/js/sq.js new file mode 100644 index 0000000..33def78 --- /dev/null +++ b/js/msg/js/sq.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Vendos nje Koment"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Nuk mund të fshihet variabla '%1' sepse është pjesë e definicionit të funksionit '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Ndrysho Vlerat:"; +Blockly.Msg["CLEAN_UP"] = "Pastro blloqet"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "Mbyll blloqet"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Mbyll bllokun"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "Ngjyra 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "Ngjyra 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg["COLOUR_BLEND_RATIO"] = "Perpjesetim"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "Përzierje"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Perzien dy ngjyra së bashku me një raport të dhënë (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "http://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Zgjidh nje ngjyre nga nje game ngjyrash."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "ngjyre e rastesishme"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Zgjidhni një ngjyrë në mënyrë të rastësishme."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "blu"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "jeshile"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg["COLOUR_RGB_RED"] = "e kuqe"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "ngjyre me"; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "dil nga nje faze perseritese"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "vazhdo me elementin tjeter te nje faze perseritese"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Ndahu nga unaza."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Kapërce pjesën e mbetur të unazës, dhe vazhdo me ripërsëritjen tjetër."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Paralajmërim: Ky bllok mund të përdoret vetëm brenda unazës."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "per cdo produkt %1 ne liste %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Per cdo produkt ne nje \"liste\" \"vendos\" ndryshoren '%1' produktit, dhe pastaj bej disa deklarata."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "numero me %1 nga %2 ne %3 me nga %4"; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "\"Vendos\" \"kushtein\"tek \"pjesa\" \"if\""; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Shto një përfundues, që i mbërrin të gjitha kushtet në bllokun nëse."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Shto, fshij, ose rirregullo sektoret për ta rikonfiguruar këte bllok nëse."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "përndryshe"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "përndryshe nëse"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "nëse"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Nëse një vlerë është e saktë, atëherë ekzekuto disa fjali."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "http://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "ekzekuto"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "përsërit %1 herë"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Ekzekuto disa fjali disa herë."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "përsërit derisa"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "përsërit përderisa"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Përderisa një vlerë është e pasaktë, atëherë ekzekuto disa fjali."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Përderisa një vlerë është e saktë, atëherë ekzekuto disa fjali."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Fshijë të gjitha %1 të blloqeve?"; +Blockly.Msg["DELETE_BLOCK"] = "Fshij bllokun"; +Blockly.Msg["DELETE_VARIABLE"] = "Fshi variablën '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Fshi përdorimin %1 të variablës '%2'?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Fshij %1 blloqe"; +Blockly.Msg["DISABLE_BLOCK"] = "Çaktivizo bllokun"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Kopjo"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +Blockly.Msg["ENABLE_BLOCK"] = "Aktivizo bllokun"; +Blockly.Msg["EXPAND_ALL"] = "Zmadho blloqet"; +Blockly.Msg["EXPAND_BLOCK"] = "Zmadho bllokun"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Hyrjet e jashtme"; +Blockly.Msg["HELP"] = "Ndihmë"; +Blockly.Msg["INLINE_INPUTS"] = "Hyrjet e brendshme"; +Blockly.Msg["IOS_CANCEL"] = "Anulo"; +Blockly.Msg["IOS_ERROR"] = "Gabim"; +Blockly.Msg["IOS_OK"] = "Në rregull"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Shto Inputet"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Lejo deklaratat"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Ky funksion ka inpute të dyfishta."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INPUTET"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Shto"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Shto Variabël"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Grise"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Nuk mund të përdorni variabël pa emër."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Riemro"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Emri i variablës"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "krijo një listë të zbrazët"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Kthen një listë, te gjatësisë 0, duke mos përmbajtur asnjë regjistrim të të dhënave"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "listë"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Shto, fshij, ose rirregullo sektoret për ta rikonfiguruar këtë bllok të listës."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "krijo listë me"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Shto një send në listë."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Krijo një listë me ndonjë numbër të sendeve."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "i parë"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# nga fundi"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; +Blockly.Msg["LISTS_GET_INDEX_GET"] = "merr"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "merr dhe fshij"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "i fundit"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "i rastësishëm"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "largo"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Rikthen tek artikulli i par në list."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Kthen një send në pozicionin e specifikuar në listë."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Kthen artikullin e fundit në list."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Kthen një send të rastësishëm në listë."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Fshin dhe kthen sendin e parë në listë."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Fshin dhe kthen sendin në pozicionin e specifikuar në listë."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Fshin dhe kthen sendin e fundit në listë."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Fshin dhe kthen një send të rastësishëm në listë."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Fshin sendin e parë në listë."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Fshin sendin në pozicionin e specifikuar në listë."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Fshin sendin e fundit në listë."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Kthen një send të rastësishëm në listë."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "tek # nga fundi"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "tek #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "tek i fundit"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "merr nën-listën nga i pari"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "merr nën listën nga # nga fundi"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "merr nën-listën nga #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Krijon në kopje të pjesës së specifikuar të listës."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 është sendi i fundit."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 është sendi i parë."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "gjen ndodhjen e parë të sendit"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "gjen ndodhjen e fundit të sendit"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Kthen indeksin e ndodhjes së parë/fudit të sendit në listë. Kthen %1 nëse teksti nuk është gjetur."; +Blockly.Msg["LISTS_INLIST"] = "në listë"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 është e zbraztë"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Kthehet i saktë nëse lista është e zbraztë."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "gjatësia e %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Kthen gjatësinë e listës."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "krijo listën me sendin %1 të përsëritur %2 herë"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Krijon në listë qe përmban vlerën e dhënë të përsëritur aq herë sa numri i specifikuar."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "kthe %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Ndërro renditjen e një kopjeje të listës."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "sikurse"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "fut në"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "vendos"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Fut sendin në fillim të listës."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Fut sendin në pozicionin e specifikuar të listës."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Bashkangjit sendin në fund të listës."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Fut sendin rastësisht në listë."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Vendos sendin e parë në listë."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Vendos sendin në pozicionin e specifikuar në listë."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "ngjitje"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "zbritje"; +Blockly.Msg["LISTS_SORT_TITLE"] = "rendit %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Rendit një kopje të listës."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alfabetike, injoro madhësinë e shkronjave"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numerike"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alfabetike"; +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"] = "bëj listë nga teksti"; +Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "bëj tekst nga lista"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Ngjit një listë tekstesh në një, të ndara me ndarës."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Ndaj tekstin në një listë tekstesh, duke ndarë në secilin ndarës."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "me ndarës"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "e pasaktë"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Kthehet ose të saktë ose të pasaktë."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "e saktë"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "http://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Ktheje të saktë nëse të dy hyrjet janë të barabarta me njëra-tjetrën."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Ktheje të saktë nëse hyrja e parë është më e madhe se hyrja e dytë."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Ktheje të saktë nëse hyrja e parë është më e madhe ose e barabartë me hyrjen e dytë."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Ktheje të saktë nëse hyrja e parë është më e vogël se hyrja e dytë."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Ktheje të saktë nëse hyrja e parë është më e vogël ose e barabartë me hyrjen e dytë."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Ktheje të saktë nëse të dy hyrjet nuk janë të barabarta me njëra-tjetrën."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "jo %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Kthehet e saktë nëse hyrja është e pasaktë. Kthehet e pasaktë nëse hyrja është e saktë."; +Blockly.Msg["LOGIC_NULL"] = "pavlerë"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "http://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Kthehet e pavlerë."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "dhe"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "ose"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Kthehet të saktë nëse të dy hyrjet janë të sakta."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Kthehet e saktë nëse së paku njëra nga hyrjet është e saktë."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "test"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "http://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "nëse e pasaktë"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "nëse e saktë"; +Blockly.Msg["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ë'."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "http://sq.wikipedia.org/wiki/Aritmetika"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Kthen shumën e dy numrave."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Kthen herësin e dy numrave."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Kthen ndryshimin e dy numrave."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Kthen produktin e dy numrave."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Kthen numrin e parë të ngritur në fuqinë e numrit të dytë."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "http://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "ndrysho %1 nga %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Shto një numër në ndryshoren '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "http://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["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)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "detyro %1 e ulët %2 e lartë %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Vëni një numër që të jetë në mes të kufive të specifikuara(përfshirëse)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "është i pjestueshme me"; +Blockly.Msg["MATH_IS_EVEN"] = "është çift"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "është negativ"; +Blockly.Msg["MATH_IS_ODD"] = "është tek"; +Blockly.Msg["MATH_IS_POSITIVE"] = "është pozitiv"; +Blockly.Msg["MATH_IS_PRIME"] = "është prim"; +Blockly.Msg["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ë."; +Blockly.Msg["MATH_IS_WHOLE"] = "është i plotë"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "http://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "mbetësi i %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Kthen mbetësin nga pjestimi i dy numrave."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "x"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "http://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Një numër."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "mesatarja e listës"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "numri më i madh i listës"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "mediana e listës"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "numri më i ulët i listës"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "modat e listës"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "send i rastësishëm i listës"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "devijimi standard i listës"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "mbledhja e listës"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Kthen mesatarën (kuptimi aritmetik) i vlerave numerike të listës."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Kthe numrin më të madh të listës."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Kthe numrin median të listës."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Kthe numrin me të vogël të listës."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Kthe listën e sendit(eve) më të zakonshme të listës."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Kthe një element të rastësishëm nga lista."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Kthe devijimin standard të listës."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Kthe shumën e të gjithë numrave të listës."; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "http://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "fraksioni i rastësishëm"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Kthe fraksionin e rastësishëm në mes të 0.0 (përfshirëse) dhe 1.0 (jopërfshirëse)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "http://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "numër i plotë i rastësishëm nga %1 deri në %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Kthe një numër të plotë të rastësishëm të dy kufijve të specifikuar, të përfshirë."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "http://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "rrumbullakësimi"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "rrumbullakësimi i ulët"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "rrumbullakësimi i lartë"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Rrumbullakësimi i numrit të lartë ose të ulët."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "http://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absolut"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "rrënja katrore"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Kthen vlerën absolute të një numri."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Kthen e në fuqinë e një numri."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Kthen logaritmën natyrale të një numri."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Kthen 10 logaritmet bazë të një numri."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Kthe negacionin e një numri."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Kthen 10 në fuqinë e një numri."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Kthen rrënjën katrore të një numri."; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_TRIG_ACOS"] = "acosinus"; +Blockly.Msg["MATH_TRIG_ASIN"] = "asinus"; +Blockly.Msg["MATH_TRIG_ATAN"] = "atangjentë"; +Blockly.Msg["MATH_TRIG_COS"] = "cos"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "http://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Rikthe cos-1 e nje numeri."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Rikthe sin-1 e nje numeri."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Kthe tg-1 e nje numeri."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Kthe kosinusin e nje grade (jo ne radiant)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Kthe kosinusin e nje kendi (jo ne radiant)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Kthe tangentin e nje kendi (jo radiant)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Krijo variabël ngjyrë..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Krijo variabël numër"; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Krijo variabël varg"; +Blockly.Msg["NEW_VARIABLE"] = "Krijo variabël..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Emri i identifikatorit të ri:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Tip i ri i variablës:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "lejo deklaratat"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "me:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Lësho funksionin e definuar nga përdoruesi '%1'."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Lëho funksionin e definuar nga përdoruesi '%1' dhe përdor daljen e tij."; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "me:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "Krijo '%1'"; +Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Përshkruaj këtë funksion..."; +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"] = "bëj diqka"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "te"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Krijon një funksion pa dalje."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "http://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "rikthe"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Krijon një funksion me një dalje."; +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Paralajmërim: Ky funksion ka parametra të dyfishuar."; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Thekso definicionin e funksionit"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Nëse një vlerë është e saktë, atëherë kthe një vlerë të dytë."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Paralajmërim: Ky bllok mund të përdoret vetëm brenda definicionit të funksionit."; +Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "Fut emrin:"; +Blockly.Msg["PROCEDURES_MUTATORARG_TOOLTIP"] = "Shto një input në këtë funksion."; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TITLE"] = "Informacioni i futur"; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TOOLTIP"] = "Shto, hiq, ose rirendit inputet e këtij funksioni."; +Blockly.Msg["REDO"] = "Ribëj"; +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 :"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "ne %1 shto tekst %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "shto tekst tek varibla '%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "me shkronja te vogla shtypi"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "Fillimi me shkronje te madhe shtypi"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "me shkronja te medha shtypi"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Kthe nje kopje te tekstit ne nje rast te ndryshem."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "merr shkronjen e pare"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "merr shkronjen # nga fundi"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "merr shkronjen #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "merr shkronjen e fundit"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "merr nje shkronje te rastesishme"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "në tekst %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Kthe nje shkronje nga nje pozicion i caktuar."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "numro %1 në %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Numrin sa herë paraqitet një tekst brenda një teksti tjetër."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Shto nje gje ne tekst"; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "bashkangjit"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Shto, fshij, ose rirregullo sektoret për ta rikonfiguruar këtë bllok teksti."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "ne shkronjen # nga fundi"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "ne shkronjen #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "tek shkronja e fundit"; +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"] = "ne tekst"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "merr vlerat qe vazhdojne me shkronjen e pare"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "merr nenvargun nga shkronja # nga fundi"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "Merr nenvargun nga shkronja #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Pergjigjet me nje pjese te caktuar teksti."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "gjej rastisjen e pare te tekstit"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "gjej rastisjen e fundit te tekstit"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "ne tekst %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Pergjigjet me indeksin e pare/fundit te rastisjes se tekstit te pare ne tekstin e dyte. Pergjigjet me %1 ne qofte se teksti nuk u gjet."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 eshte bosh"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Kthehet e vertete neqoftese teksti i dhene eshte bosh."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "krijo tekst me"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Krijo nje pjese te tekstit duke bashkuar se bashku disa sende"; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "gjatesi %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Pergjigjet me nje numer shkronjash (duke perfshire hapesire) ne tekstin e dhene."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "printo %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Printo tekstin e caktuar, numer ose vlere tjeter."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Kerkoji perdoruesit nje numer."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Kerkoji perdoruesit ca tekst."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "kerko nje numer me njoftim"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "kerko tekst me njoftim"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "zëvendëso %1 me %2 në %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Zëvendëso të gjitha paraqitjet e një teksti brenda një teksti tjetër."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "kthe %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Kthen renditjen e karaktereve në tekst."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "http://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Nje shkronje, fjale, ose rresht teksti."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "prit hapesirat nga te dyja anet"; +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"] = "Sot"; +Blockly.Msg["UNDO"] = "Zhbëj"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // 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 +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Pergjigjet me nje vlere te kesaj variable."; +Blockly.Msg["VARIABLES_SET"] = "vendos %1 ne %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Krijo 'merr %1"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Vendos kete variable te jete e barabarte me te dhenat ne hyrje."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Një variabël e quajtur '%1' tashmë ekziston."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Një variabël me emrin '%1' veç ekziston për një tip tjetër: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/sr-latn.js b/js/msg/js/sr-latn.js new file mode 100644 index 0000000..fce1ca3 --- /dev/null +++ b/js/msg/js/sr-latn.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Dodaj komentar"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Ne mogu da obrišem varijablu ’%1’ jer je deo definicije funkcije ’%2’"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Promeni vrednost:"; +Blockly.Msg["CLEAN_UP"] = "Ukloni blokove"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "Skupi blokove"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Skupi blok"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "boja 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "boja 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg["COLOUR_BLEND_RATIO"] = "odnos"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "pomešaj"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Pomešati dve boje zajedno sa datim odnosom (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://sr.wikipedia.org/wiki/Boja"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Izaberite boju sa palete."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "slučajna boja"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Izaberite boju nasumice."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "plava"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "zelena"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg["COLOUR_RGB_RED"] = "crvena"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "boja sa"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Kreiraj boju sa određenom količinom crvene,zelene, i plave. Sve vrednosti moraju biti između 0 i 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"] = "Izađite iz petlje"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "nastavi sa sledećom iteracijom petlje"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Napusti sadržaj petlje."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Preskoči ostatak ove petlje, i nastavi sa sledećom iteracijom(ponavljanjem)."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Upozorenje: Ovaj blok može da se upotrebi samo unutar petlje."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "za svaku stavku %1 na spisku %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Za svaku stavku unutar liste, podesi promenjivu '%1' po stavci, i onda načini neke izjave-naredbe."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "prebroj sa %1 od %2 do %3 od %4"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Imaj promenjivu \"%1\" uzmi vrednosti od početnog broja do zadnjeg broja, brojeći po određenom intervalu, i izvrši određene blokove."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Dodajte uslov bloku „ako“."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Dodaj konačni, catch-all (uhvati sve) uslove if bloka."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Dodaj, ukloni, ili preuredi delove kako bih rekonfigurisali ovaj if blok."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "inače"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "inače-ako"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "ako"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "ako je vrednost tačna, onda izvrši neke naredbe-izjave."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "ako je vrednost tačna, onda izvrši prvi blok naredbi, U suprotnom, izvrši drugi blok naredbi."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Ako je prva vrednost tačna, onda izvrši prvi blok naredbi, u suprotnom, ako je druga vrednost tačna , izvrši drugi blok naredbi."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Ako je prva vrednost tačna, onda izvrši prvi blok naredbi, u suprotnom, ako je druga vrednost tačna , izvrši drugi blok naredbi. Ako ni jedna od vrednosti nije tačna, izvrši poslednji blok naredbi."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://sr.wikipedia.org/wiki/For_petlja"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "izvrši"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "ponovi %1 puta"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Odraditi neke naredbe nekoliko puta."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "ponavljati do"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "ponavljati dok"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Dok vrednost nije tačna, onda izvršiti neke naredbe."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Dok je vrednost tačna, onda izvršite neke naredbe."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Da obrišem svih %1 blokova?"; +Blockly.Msg["DELETE_BLOCK"] = "Obriši blok"; +Blockly.Msg["DELETE_VARIABLE"] = "Obriši promenljivu '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Da obrišem %1 upotreba promenljive '%2'?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Obriši %1 blokova"; +Blockly.Msg["DISABLE_BLOCK"] = "Onemogući blok"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Dupliraj"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +Blockly.Msg["ENABLE_BLOCK"] = "Omogući blok"; +Blockly.Msg["EXPAND_ALL"] = "Proširi blokove"; +Blockly.Msg["EXPAND_BLOCK"] = "Proširi blok"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Spoljni ulazi"; +Blockly.Msg["HELP"] = "Pomoć"; +Blockly.Msg["INLINE_INPUTS"] = "Unutrašnji ulazi"; +Blockly.Msg["IOS_CANCEL"] = "Otkaži"; +Blockly.Msg["IOS_ERROR"] = "Greška"; +Blockly.Msg["IOS_OK"] = "U redu"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Dodaj unos"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Dozvoli izjave"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Ova funkcija ima duplicirane unose."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "UNOSI"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Dodaj"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Dodaj varijablu"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Obriši"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Ne možete da koristite prazno ime varijable."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Preimenuj"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Ime varijable"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "napravi prazan spisak"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "vraća listu, dužine 0, ne sadržavajući evidenciju podataka"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "spisak"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Dodajte, izbrišite, ili preuredite delove kako bi se reorganizovali ovaj blok liste."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "napravi spisak sa"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Dodajte stavku na spisak."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Kreiraj listu sa bilo kojim brojem stavki."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "prva"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# sa kraja"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; +Blockly.Msg["LISTS_GET_INDEX_GET"] = "preuzmi"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "preuzmi i ukloni"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "poslednja"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "slučajna"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "ukloni"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Vraća prvu stavku na spisku."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Vraća stavku na određenu poziciju na listi."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Vraća poslednju stavku na spisku."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Vraća slučajnu stavku sa spiska."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Uklanja i vraća prvu stavku sa spiska."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Uklanja i vraća stavku sa određenog položaja na spisku."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Uklanja i vraća poslednju stavku sa spiska."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Uklanja i vraća slučajnu stavku sa spiska."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Uklanja prvu stavku sa spiska."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Uklanja stavku sa određenog položaja na spisku."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Uklanja poslednju stavku sa spiska."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Uklanja slučajnu stavku sa spiska."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "do # od kraja"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "do #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "do poslednje"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "preuzmi podspisak od prve"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "preuzmi podspisak iz # sa kraja"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "preuzmi podspisak od #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Pravi kopiju određenog dela liste."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 je poslednja stavka."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 je prva stavka."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "pronađi prvo pojavljivanje stavke"; +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"] = "pronađi poslednje pojavljivanje stavke"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Vraća broj prvog i/poslednjeg ulaska elementa u listu. Vraća %1 Ako element nije pronađen."; +Blockly.Msg["LISTS_INLIST"] = "na spisku"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 je prazan"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Vraća vrednost tačno ako je lista prazna."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "dužina spiska %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Vraća dužinu spiska."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "Napraviti listu sa stavkom %1 koja se ponavlja %2 puta"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Pravi listu koja se sastoji od zadane vrednosti koju ponavljamo određeni broj šuta."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "obrnuto %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Obrni kopiju spiska."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "kao"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "ubaci na"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "postavi"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Ubacuje stavku na početak spiska."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Ubacuje stavku na određeni položaj na spisku."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Dodajte stavku na kraj spiska."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Ubacuje stavku na slučajno mesto na spisku."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Postavlja prvu stavku na spisku."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Postavlja stavku na određeni položaj na spisku."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Postavlja poslednju stavku na spisku."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Postavlja slučajnu stavku na spisku."; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "rastuće"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "opadajuće"; +Blockly.Msg["LISTS_SORT_TITLE"] = "sortiraj %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Sortirajte kopiju spiska."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "azbučno, ignoriši mala i velika slova"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "kao brojeve"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "azbučno"; +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"] = "napravite listu sa teksta"; +Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "da tekst iz liste"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Da se pridruži listu tekstova u jedan tekst, podeljenih za razdvajanje."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Podeliti tekst u listu tekstova, razbijanje na svakom graničnik."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "sa razdvajanje"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "netačno"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Vraća ili tačno ili netačno."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "tačno"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://sr.wikipedia.org/wiki/Nejednakost"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Vraća vrednost „tačno“ ako su oba ulaza jednaka."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Vraća vrednost „tačno“ ako je prvi ulaz veći od drugog."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Vraća vrednost „tačno“ ako je prvi ulaz veći ili jednak drugom."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Vraća vrednost „tačno“ ako je prvi ulaz manji od drugog."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Vraća vrednost „tačno“ ako je prvi ulaz manji ili jednak drugom."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Vraća vrednost „tačno“ ako su oba ulaza nejednaka."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "nije %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Vraća vrednost „tačno“ ako je ulaz netačan. Vraća vrednost „netačno“ ako je ulaz tačan."; +Blockly.Msg["LOGIC_NULL"] = "bez vrednosti"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Vraća „bez vrednosti“."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "i"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "ili"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Vraća vrednost „tačno“ ako su oba ulaza tačna."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Vraća vrednost „tačno“ ako je bar jedan od ulaza tačan."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "proba"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "ako je netačno"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "ako je tačno"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Proveri uslov u 'test'. Ako je uslov tačan, tada vraća 'if true' vrednost; u drugom slučaju vraća 'if false' vrednost."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Vratite zbir dva broja."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Vraća količnik dva broja."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Vraća razliku dva broja."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Vraća proizvod dva broja."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Vraća prvi broj stepenovan drugim."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "promeni %1 za %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Dodajte broj promenljivoj „%1“."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://sr.wikipedia.org/wiki/Matematička_konstanta"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "vrati jednu od zajedničkih konstanti: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), ili ∞ (infinity)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "ograniči %1 nisko %2 visoko %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Ograničava broj na donje i gornje granice (uključivo)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "je deljiv sa"; +Blockly.Msg["MATH_IS_EVEN"] = "je paran"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "je negativan"; +Blockly.Msg["MATH_IS_ODD"] = "je neparan"; +Blockly.Msg["MATH_IS_POSITIVE"] = "je pozitivan"; +Blockly.Msg["MATH_IS_PRIME"] = "je prost"; +Blockly.Msg["MATH_IS_TOOLTIP"] = "Provjerava da li je broj paran, neparan, prost, cio, pozitivan, negativan, ili da li je deljiv sa određenim brojem. Vraća tačno ili netačno."; +Blockly.Msg["MATH_IS_WHOLE"] = "je ceo"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://sr.wikipedia.org/wiki/Kongruencija"; +Blockly.Msg["MATH_MODULO_TITLE"] = "podsetnik od %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Vraća podsetnik od deljenja dva broja."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Neki broj."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "prosek spiska"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "maks. spiska"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "medijana spiska"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "min. spiska"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "modus spiska"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "slučajna stavka spiska"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "standardna devijacija spiska"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "zbir spiska"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Vraća prosek numeričkih vrednosti sa spiska."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Vraća najveći broj sa spiska."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Vraća medijanu sa spiska."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Vraća najmanji broj sa spiska."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Vraća najčešće stavke sa spiska."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Vraća slučajni element sa spiska."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Vraća standardnu devijaciju spiska."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Vraća zbir svih brojeva sa spiska."; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://sr.wikipedia.org/wiki/Generator_slučajnih_brojeva"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "slučajni razlomak"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Vraća slučajni razlomak između 0.0 (uključivo) i 1.0 (isključivo)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://sr.wikipedia.org/wiki/Generator_slučajnih_brojeva"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "sličajno odabrani cijeli broj od %1 do %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Vraća slučajno odabrani celi broj između dve određene granice, uključivo."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://sr.wikipedia.org/wiki/Zaokruživanje"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "zaokruži"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "zaokruži naniže"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "zaokruži naviše"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Zaokružite broj na veću ili manju vrednost."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://sr.wikipedia.org/wiki/Kvadratni_koren"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "apsolutan"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "kvadratni koren"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Vraća apsolutnu vrednost broja."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "vratiti e na vlasti broja."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Vraća prirodni logaritam broja."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Vraća logaritam broja sa osnovom 10."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Vraća negaciju broja."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Vraća 10-ti stepen broja."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Vraća kvadratni koren broja."; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_TRIG_ACOS"] = "arc cos"; +Blockly.Msg["MATH_TRIG_ASIN"] = "arc sin"; +Blockly.Msg["MATH_TRIG_ATAN"] = "arc tan"; +Blockly.Msg["MATH_TRIG_COS"] = "cos"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://sr.wikipedia.org/wiki/Trigonometrijske_funkcije"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Vraća arkus kosinus broja."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Vraća arkus broja."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Vraća arkus tangens broja."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Vraća kosinus stepena (ne radijan)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Vraća sinus stepena (ne radijan)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Vraća tangens stepena (ne radijan)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "Napravi promenljivu…"; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Ime nove promenljive:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "dozvoliti izreke"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "sa:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Pokrenite prilagođenu funkciju „%1“."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Pokrenite prilagođenu funkciju „%1“ i koristi njen izlaz."; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "sa:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "Napravi „%1“"; +Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Opisati ovu funkciju..."; +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"] = "uradite nešto"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "da"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Pravi funkciju bez izlaza."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "vrati"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Pravi funkciju sa izlazom."; +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Upozorenje: Ova funkcija ima duplikate parametara."; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Istakni definiciju funkcije"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Ukoliko je vrednost tačna, vrati drugu vrednost."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Upozorenje: Ovaj blok se može koristiti jedino u definiciji funkcije."; +Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "naziv ulaza:"; +Blockly.Msg["PROCEDURES_MUTATORARG_TOOLTIP"] = "Dodajte ulazna funkcija."; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TITLE"] = "ulazi"; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TOOLTIP"] = "Da dodate, uklonite ili pereuporяdočitь ulaza za ovu funkciju."; +Blockly.Msg["REDO"] = "Ponovi"; +Blockly.Msg["REMOVE_COMMENT"] = "Ukloni komentar"; +Blockly.Msg["RENAME_VARIABLE"] = "Preimenuj promenljivu…"; +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Preimenuj sve „%1“ promenljive u:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "na %1 dodaj tekst %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Dodajte tekst na promenljivu „%1“."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "malim slovima"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "svaka reč velikim slovom"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "velikim slovima"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Vraća primerak teksta sa drugačijom veličinom slova."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "preuzmi prvo slovo"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "preuzmi slovo # sa kraja"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "preuzmi slovo #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "preuzmi poslednje slovo"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "preuzmi slučajno slovo"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "u tekstu %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Vraća slovo na određeni položaj."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "broj %1 u %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Broji koliko puta se neki tekst pojavljuje unutar nekog drugog teksta."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Dodajte stavku u tekst."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "spajanjem"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Dodaj, ukloni, ili drugačije poredaj odjelke kako bi iznova postavili ovaj tekst blok."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "slovu # sa kraja"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "slovu #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "poslednjem slovu"; +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"] = "u tekstu"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "preuzmi podnisku iz prvog slova"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "preuzmi podnisku iz slova # sa kraja"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "preuzmi podnisku iz slova #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Vraća određeni deo teksta."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "pronađi prvo pojavljivanje teksta"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "pronađi poslednje pojavljivanje teksta"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "u tekstu %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Vraća odnos prvog/zadnjeg pojavljivanja teksta u drugom tekstu. Vrađa %1 ako tekst nije pronađen."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 je prazan"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Vraća tačno ako je dostavljeni tekst prazan."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "napiši tekst sa"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Napraviti dio teksta spajajući različite stavke."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "dužina teksta %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Vraća broj slova (uključujući razmake) u datom tekstu."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "prikaži %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Prikažite određeni tekst, broj ili drugu vrednost na ekranu."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Pitajte korisnika za broj."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Pitajte korisnika za unos teksta."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "pitaj za broj sa porukom"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "pitaj za tekst sa porukom"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "zamena %1 sa %2 u %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Zamena svih pojava nekog teksta unutar nekog drugog teksta."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "obrnuto %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Obrće redosled karaktera u tekstu."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://sr.wikipedia.org/wiki/Niska"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Slovo, reč ili red teksta."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "trim praznine sa obe strane"; +Blockly.Msg["TEXT_TRIM_OPERATOR_LEFT"] = "skratiti prostor sa leve strane"; +Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "skratiti prostor sa desne strane"; +Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "Vraća kopiju teksta sa uklonjenim prostorom sa jednog od dva kraja."; +Blockly.Msg["TODAY"] = "Danas"; +Blockly.Msg["UNDO"] = "Opozovi"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // untranslated +Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "stavka"; +Blockly.Msg["VARIABLES_GET_CREATE_SET"] = "Napravi „postavi %1“"; +Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Vraća vrednost ove promenljive."; +Blockly.Msg["VARIABLES_SET"] = "postavi %1 u %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Napravi „preuzmi %1“"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Postavlja promenljivu tako da bude jednaka ulazu."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Promenljiva pod imenom '%1' već postoji."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Varijabla po imenu '%1' već postoji za drugu varijablu tipa '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/sr.js b/js/msg/js/sr.js new file mode 100644 index 0000000..22deafa --- /dev/null +++ b/js/msg/js/sr.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Додај коментар"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Није могуће избрисати променљиву „%1” јер је део дефиниције функције „%2”"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Промена вредности:"; +Blockly.Msg["CLEAN_UP"] = "Очисти блокове"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Срушени блокови садрже упозорења."; +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/"; +Blockly.Msg["COLOUR_BLEND_RATIO"] = "однос"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "помешај"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Меша две боје заједно са датим односом (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://sr.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"; +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"] = "преброј са %1 од %2 до %3 од %4"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Имај промењиву \"%1\" узми вредности од почетног броја до задњег броја, бројећи по одређеном интервалу, и изврши одређене блокове."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Додајте услов блоку „ако“."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Додај коначни, catch-all (ухвати све) услове иф блока."; +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://sr.wikipedia.org/wiki/For_петља"; +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_VARIABLE"] = "Избриши променљиву ’%1’"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Избрисати %1 употребу променљиве „%2”?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Избриши %1 блокова"; +Blockly.Msg["DISABLE_BLOCK"] = "Онемогући блок"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Дуплирај"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Дуплирај коментар"; +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["IOS_CANCEL"] = "Откажи"; +Blockly.Msg["IOS_ERROR"] = "Грешка"; +Blockly.Msg["IOS_OK"] = "У реду"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Додај унос"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Дозволи изјаве"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Ова функција има дуплиране уносе."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "УНОСИ"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Додај"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Додај променљиву"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Избриши"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Не можете да користите празно име променљиве."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Преименуј"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Име променљиве"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +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_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"] = "направи списак са"; +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"] = "# са краја"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; +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"] = ""; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Враћа прву ставку на списку."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Враћа ставку на одређену позицију на списку."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Враћа последњу ставку са списка."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Враћа случајну ставку са списка."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Уклања и враћа прву ставку са списка."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Уклања и враћа ставку са одређеног положаја са списка."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Уклања и враћа последњу ставку са списка."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Уклања и враћа случајну ставку са списка."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Уклања прву ставку са списка."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Уклања ставку са одређеног положаја са списка."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Уклања последњу ставку са списка."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Уклања случајну ставку са списка."; +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"] = "преузми подсписак од прве"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "преузми подсписак из # са краја"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "преузми подсписак од #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Прави копију одређеног дела списка."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 је последња ставка."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 је прва ставка."; +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"] = "Враћа индекс прве/последње појаве ставке на списку. Враћа %1 ако ставка није пронађена."; +Blockly.Msg["LISTS_INLIST"] = "на списку"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 је празан"; +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"] = "Враћа дужину списка."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "Направити списак са ставком %1 која се понавља %2 пута"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Прави листу која се састоји од задане вредности коју понавлјамо одређени број шута."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "обрнуто %1"; +Blockly.Msg["LISTS_REVERSE_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_SET"] = "постави"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Убацује ставку на почетак списка."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Убацује ставку на одређени положај на списку."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Додајте ставку на крај списка."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Убацује ставку на случајно место на списку."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Поставља прву ставку на списку."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Поставља ставку на одређени положај на списку."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "растуће"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "опадајуће"; +Blockly.Msg["LISTS_SORT_TITLE"] = "сортирај %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Сортирајте копију списка."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "азбучно, игнориши мала и велика слова"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "као бројеве"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "азбучно"; +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"] = "направи текст из списка"; +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"] = "Враћа или „тачно“ или „нетачно“."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "тачно"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://sr.wikipedia.org/wiki/Неједнакост"; +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"; +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:"; +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "ако је нетачно"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "ако је тачно"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Проверите услов у „проба”. Ако је услов тачан, тада враћа „ако је тачно” вредност; у другом случају враћа „ако је нетачно” вредност."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://sr.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_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "атан2 од X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Врати арктангенту тачке (X, Y) у степенима од -180 до 180."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.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://sr.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_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "ограничи %1 ниско %2 високо %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Ограничава број на доње и горње границе (укључиво)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +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://sr.wikipedia.org/wiki/Конгруенција"; +Blockly.Msg["MATH_MODULO_TITLE"] = "подсетник од %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Враћа подсетник од дељења два броја."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://sr.wikipedia.org/wiki/Број"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Број."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; +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"] = "^"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://sr.wikipedia.org/wiki/Генератор_случајних_бројева"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "случајни разломак"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Враћа случајни разломак између 0.0 (укључиво) и 1.0 (искључиво)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://sr.wikipedia.org/wiki/Генератор_случајних_бројева"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "сличајно одабрани цијели број од %1 до %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Враћа случајно одабрани цели број између две одређене границе, уклјучиво."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://sr.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://sr.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"] = "Враћа логаритам броја са основом 10."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Враћа негацију броја."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Враћа 10-ти степен броја."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Враћа квадратни корен броја."; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_TRIG_ACOS"] = "арц цос"; +Blockly.Msg["MATH_TRIG_ASIN"] = "арц син"; +Blockly.Msg["MATH_TRIG_ATAN"] = "арц тан"; +Blockly.Msg["MATH_TRIG_COS"] = "цос"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://sr.wikipedia.org/wiki/Тригонометријске_функције"; +Blockly.Msg["MATH_TRIG_SIN"] = "син"; +Blockly.Msg["MATH_TRIG_TAN"] = "тан"; +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["NEW_COLOUR_VARIABLE"] = "Направи променљиву боје..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Направи променљиву броја..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Направи променљиву ниске..."; +Blockly.Msg["NEW_VARIABLE"] = "Направи променљиву…"; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Име нове променљиве:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Нова врста променљиве:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; +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”."; +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"] = "Опишите ову функцију…"; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "урадите нешто"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "до"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Прави функцију без излаза."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +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_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’ променљиве у:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "на %1 додај текст %2"; +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"] = "свака реч великим словом"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "великим словима"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Враћа примерак текста са другачијом величином слова."; +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_LAST"] = "преузми последње слово"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "преузми случајно слово"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; +Blockly.Msg["TEXT_CHARAT_TITLE"] = "у тексту %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Враћа слово на одређени положај."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "број %1 у %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Броји колико пута се неки текст појављује унутар неког другог текста."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Додајте ставку у текст."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "спој"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Додај, уклони, или другачије поредај одјелке како би изнова поставили овај текст блок."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "слову # са краја"; +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"] = "преузми подниску из првог слова"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "преузми подниску из слова # са краја"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "преузми подниску из слова #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Враћа одређени део текста."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "пронађи прво појављивање текста"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "пронађи последње појављивање текста"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "у тексту %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Враћа индекс првог/задњег појављивања првог текста у другом тексту. Враћа %1 ако текст није пронађен."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 је празан"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Враћа „тачно” ако је достављени текст празан."; +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"] = "Прикажите одређени текст, број или другу вредност на екрану."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Питајте корисника за број."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Питајте корисника за унос текста."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "питај за број са поруком"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "питај за текст са поруком"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "замена %1 са %2 у %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Замена свих појава неког текста унутар неког другог текста."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "обрнуто %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Обрће редослед карактера у тексту."; +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_LEFT"] = "скратити простор са леве стране"; +Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "скратити простор са десне стране"; +Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "Враћа копију текста са уклонјеним простором са једног од два краја."; +Blockly.Msg["TODAY"] = "Данас"; +Blockly.Msg["UNDO"] = "Опозови"; +Blockly.Msg["UNNAMED_KEY"] = "неименовано"; +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_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["VARIABLE_ALREADY_EXISTS"] = "Променљива под именом ’%1’ већ постоји."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Променљива под именом ’%1’ већ постоји за други тип: ’%2’."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Блоклијев радни простор"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Кажите нешто…"; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/sv.js b/js/msg/js/sv.js new file mode 100644 index 0000000..91fc457 --- /dev/null +++ b/js/msg/js/sv.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Lägg till kommentar"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Kan inte radera variabeln '%1' eftersom den är en del av definition för funktionen '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Ändra värde:"; +Blockly.Msg["CLEAN_UP"] = "Städa upp block"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Hopfällda block innehåller varningar."; +Blockly.Msg["COLLAPSE_ALL"] = "Fäll ihop block"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Fäll ihop block"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "färg 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "färg 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg["COLOUR_BLEND_RATIO"] = "förhållande"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "blanda"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Blandar ihop två färger med ett bestämt förhållande (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://sv.wikipedia.org/wiki/Färg"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Välj en färg från paletten."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "slumpfärg"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Slumpa fram en färg."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "blå"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "grön"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg["COLOUR_RGB_RED"] = "röd"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "färg med"; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "bryt ut ur loop"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "fortsätta med nästa upprepning av loop"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Bryt ut ur den innehållande upprepningen."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Hoppa över resten av denna loop och fortsätt med nästa loop."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Varning: Detta block kan endast användas i en loop."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "för varje föremål %1 i listan %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "För varje objekt i en lista, ange variabeln '%1' till objektet, och utför sedan några kommandon."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "räkna med %1 från %2 till %3 med %4"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Låt variabeln \"%1\" anta värden från starttalet till sluttalet, beräknat med det angivna intervallet, och utför de angivna blocken."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Lägg till ett villkor blocket \"om\"."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Lägg till ett sista villkor som täcker alla alternativ som är kvar för \"if\"-blocket."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Lägg till, ta bort eller ändra ordningen för sektioner för att omkonfigurera blocket \"om\"."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "annars"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "annars om"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "om"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Om ett värde är sant, utför några kommandon."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Om värdet är sant, utför det första kommandoblocket. Utför annars det andra kommandoblocket."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "utför"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "upprepa %1 gånger"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Utför några kommandon flera gånger."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "upprepa tills"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "upprepa så länge"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Medan ett värde är falskt, utför några kommandon."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Medan ett värde är sant, utför några kommandon."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Radera alla %1 block?"; +Blockly.Msg["DELETE_BLOCK"] = "Radera block"; +Blockly.Msg["DELETE_VARIABLE"] = "Radera variabeln \"%1\""; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Radera %1 användningar av variabeln \"%2\"?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Radera %1 block"; +Blockly.Msg["DISABLE_BLOCK"] = "Inaktivera block"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Duplicera"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicera kommentar"; +Blockly.Msg["ENABLE_BLOCK"] = "Aktivera block"; +Blockly.Msg["EXPAND_ALL"] = "Fäll ut block"; +Blockly.Msg["EXPAND_BLOCK"] = "Fäll ut block"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Externa inmatningar"; +Blockly.Msg["HELP"] = "Hjälp"; +Blockly.Msg["INLINE_INPUTS"] = "Radinmatning"; +Blockly.Msg["IOS_CANCEL"] = "Avbryt"; +Blockly.Msg["IOS_ERROR"] = "Fel"; +Blockly.Msg["IOS_OK"] = "OK"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Lägg till inmatning"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Tillåt kommandon"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Denna funktion har dubblettinmatningar."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INMATNINGAR"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Lägg till"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Lägg till variabel"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Radera"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Du kan inte använda ett tomt variabelnamn."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Döp om"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Variabelnamn"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "skapa tom lista"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Ger tillbaka en lista utan någon data, alltså med längden 0"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "lista"; +Blockly.Msg["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."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "skapa lista med"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Lägg till ett föremål till listan."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Skapa en lista med valfritt antal föremål."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "första"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# från slutet"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; +Blockly.Msg["LISTS_GET_INDEX_GET"] = "hämta"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "hämta och ta bort"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "sista"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "slumpad"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "ta bort"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Returnerar det första objektet i en lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Ger tillbaka objektet på den efterfrågade positionen i en lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Returnerar det sista objektet i en lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Returnerar ett slumpmässigt objekt i en lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Tar bort och återställer det första objektet i en lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Tar bort och återställer objektet på den specificerade positionen i en lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Tar bort och återställer det sista objektet i en lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Tar bort och återställer ett slumpmässigt objekt i en lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Tar bort det första objektet i en lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Tar bort objektet på den specificerade positionen i en lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Tar bort det sista objektet i en lista."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Tar bort en slumpmässig post i en lista."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "till # från slutet"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "till #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "till sista"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "få underlista från första"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "få underlista från # från slutet"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "få underlista från #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Skapar en kopia av den specificerade delen av en lista."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 är det sista objektet."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 är det första objektet."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "hitta första förekomsten av objektet"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "hitta sista förekomsten av objektet"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Ger tillbaka den första/sista förekomsten av objektet i listan. Returnerar %1 om objektet inte hittas."; +Blockly.Msg["LISTS_INLIST"] = "i listan"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 är tom"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Returnerar sant om listan är tom."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "längden på %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Returnerar längden på en lista."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "skapa lista med föremålet %1 upprepat %2 gånger"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Skapar en lista som innehåller ett valt värde upprepat ett bestämt antalet gånger."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "vänd på %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Vänd på en kopia av en lista."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "som"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "Sätt in vid"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "ange"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "sätter in objektet i början av en lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Sätter in objektet vid en specificerad position i en lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Lägg till objektet i slutet av en lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "sätter in objektet på en slumpad position i en lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Anger det första objektet i en lista."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Sätter in objektet vid en specificerad position i en lista."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "stigande"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "fallande"; +Blockly.Msg["LISTS_SORT_TITLE"] = "sortera %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Sortera en kopia av en lista."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alfabetiskt, ignorera skiftläge"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numeriskt"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alfabetiskt"; +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"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Sammanfoga en textlista till en text, som separeras av en avgränsare."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Dela upp text till en textlista och bryt vid varje avgränsare."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "med avgränsare"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "falskt"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Returnerar antingen sant eller falskt."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "sant"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://sv.wikipedia.org/wiki/Olikhet"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Ger tillbaka sant om båda värdena är lika med varandra."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Ger tillbaka sant om det första värdet är större än det andra."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Ger tillbaka sant om det första värdet är större än eller lika med det andra."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Ger tillbaka sant om det första värdet är mindre än det andra."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Ger tillbaka sant om det första värdet är mindre än eller lika med det andra."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Ger tillbaka sant om båda värdena inte är lika med varandra."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "inte %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Ger tillbaka sant om inmatningen är falsk. Ger tillbaka falskt och inmatningen är sann."; +Blockly.Msg["LOGIC_NULL"] = "null"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://sv.wikipedia.org/wiki/Null"; +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Returnerar null."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "och"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "eller"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Ger tillbaka sant om båda värdena är sanna."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Ger tillbaka sant om minst ett av värdena är sant."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "test"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "om falskt"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "om sant"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Kontrollera villkoret i \"test\". Om villkoret är sant, ge tillbaka \"om sant\"-värdet; annars ge tillbaka \"om falskt\"-värdet."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://sv.wikipedia.org/wiki/Aritmetik"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Returnerar summan av de två talen."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Returnerar kvoten av de två talen."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Returnerar differensen mellan de två talen."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Returnerar produkten av de två talen."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Ger tillbaka det första talet upphöjt till det andra talet."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 av X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Returnerar arcustangens av punkt (X, Y) i grader från -180 till 180."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "ändra %1 med %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Lägg till ett tal till variabeln '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://sv.wikipedia.org/wiki/Matematisk_konstant"; +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_(graphics)"; // 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 (inkluderande)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "är delbart med"; +Blockly.Msg["MATH_IS_EVEN"] = "är jämnt"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "är negativt"; +Blockly.Msg["MATH_IS_ODD"] = "är ojämnt"; +Blockly.Msg["MATH_IS_POSITIVE"] = "är positivt"; +Blockly.Msg["MATH_IS_PRIME"] = "är ett primtal"; +Blockly.Msg["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."; +Blockly.Msg["MATH_IS_WHOLE"] = "är helt"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "resten av %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Returnerar kvoten från divisionen av de två talen."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://sv.wikipedia.org/wiki/Tal"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Ett tal."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "medelvärdet av listan"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "högsta talet i listan"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "medianen av listan"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "minsta talet i listan"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "typvärdet i listan"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "slumpmässigt objekt i listan"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "standardavvikelsen i listan"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "summan av listan"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Ger tillbaka medelvärdet (aritmetiskt) av de numeriska värdena i listan."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Ger tillbaka det största talet i listan."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Returnerar medianen av talen i listan."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Ger tillbaka det minsta talet i listan."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Ger tillbaka en lista med de(t) vanligaste objekte(t/n) i listan."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Returnerar ett slumpmässigt element från listan."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Ger tillbaka standardavvikelsen i listan."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Ger tillbaka summan av alla talen i listan."; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://sv.wikipedia.org/wiki/Slumptalsgenerator"; +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, 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"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "avrunda uppåt"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Avrunda ett tal uppåt eller nedåt."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://sv.wikipedia.org/wiki/Kvadratrot"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absolut"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "kvadratrot"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Returnerar absolutvärdet av ett tal."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Ger tillbaka e upphöjt i ett tal."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Returnera den naturliga logaritmen av ett tal."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Returnerar logaritmen för bas 10 av ett tal."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Returnerar negationen av ett tal."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Ger tillbaka 10 upphöjt i ett tal."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Returnerar kvadratroten av ett tal."; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +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://sv.wikipedia.org/wiki/Trigonometrisk_funktion"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Ger tillbaka arcus cosinus (arccos) för ett tal."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Ger tillbaka arcus sinus (arcsin) för ett tal."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Ger tillbaka arcus tangens (arctan) av ett tal."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Ger tillbaka cosinus för en grad (inte radian)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Ger tillbaka sinus för en grad (inte radian)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Ger tillbaka tangens för en grad (inte radian)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Skapa färgvariabel..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Skapa siffervariabel..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Skapa strängvariabel..."; +Blockly.Msg["NEW_VARIABLE"] = "Skapa variabel..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Nytt variabelnamn:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Ny variabeltyp:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "tillåta uttalanden"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "med:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Kör den användardefinierade funktionen \"%1\"."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +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"] = "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"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "för att"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Skapar en funktion utan output."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://sv.wikipedia.org/wiki/Funktion_%28programmering%29"; +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"; +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:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "för att %1 lägga till text %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Lägg till lite text till variabeln '%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "till gemener"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "till Versala Initialer"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "till VERSALER"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Returnerar en kopia av texten i ett annat skiftläge."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "hämta första bokstaven"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "hämta bokstaven # från slutet"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "hämta bokstaven #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "hämta sista bokstaven"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "hämta slumpad bokstav"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "i texten %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Ger tillbaka bokstaven på den specificerade positionen."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "räkna %1 i %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Räkna hur många gånger en text förekommer inom en annan text."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Lägg till ett föremål till texten."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "sammanfoga"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Lägg till, ta bort eller ändra ordningen för sektioner för att omkonfigurera detta textblock."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "till bokstav # från slutet"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "till bokstav #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "till sista bokstaven"; +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"] = "i texten"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "få textdel från första bokstaven"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "få textdel från bokstav # från slutet"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "få textdel från bokstav #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Ger tillbaka en viss del av texten."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "hitta första förekomsten av texten"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "hitta sista förekomsten av texten"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "i texten %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Ger tillbaka indexet för den första/sista förekomsten av första texten i den andra texten. Ger tillbaka %1 om texten inte hittas."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 är tom"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Returnerar sant om den angivna texten är tom."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "skapa text med"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Skapa en textbit genom att sammanfoga ett valfritt antal föremål."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "längden på %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Ger tillbaka antalet bokstäver (inklusive mellanslag) i den angivna texten."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "skriv %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Skriv den angivna texten, talet eller annat värde."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Fråga användaren efter ett tal."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Fråga användaren efter lite text."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "fråga efter ett tal med meddelande"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "fråga efter text med meddelande"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "ersätt %1 med %2 i %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Ersätt alla förekomster av en text inom en annan text."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "vänd på %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Vänder på teckenordningen i texten."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://sv.wikipedia.org/wiki/Str%C3%A4ng_%28data%29"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "En bokstav, ord eller textrad."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "ta bort mellanrum från båda sidorna av"; +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["UNNAMED_KEY"] = "namnlös"; +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 +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Returnerar värdet av denna variabel."; +Blockly.Msg["VARIABLES_SET"] = "ange %1 till %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Skapa 'hämta %1'"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Gör så att den här variabeln blir lika med inputen."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "En variabel med namn \"%1\" finns redan."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "En variabel med namnet \"%1\" finns redan för en annan typ: \"%2\"."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blocklys arbetsyta"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Säg någonting..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/ta.js b/js/msg/js/ta.js new file mode 100644 index 0000000..eb749ae --- /dev/null +++ b/js/msg/js/ta.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "கருத்தை சேர்"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "மதிப்பை மாற்றவும்:"; +Blockly.Msg["CLEAN_UP"] = "Clean up Blocks"; // untranslated +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "விகிதம்"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "கலப்பு (வண்ணம்)"; +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"] = "https://www.december.com/html/spec/colorpercompact.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"] = "மாறியை வைத்து எண்ண %1 %2 இல் இருந்து %3 வரை %4-இன் படியாக"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "முதல் எண்ணில் இருந்து கடை எண் வரை எடுத்துக்கொள்ள ஒரு மாறியை வைத்துக்கொள், குறித்த இடைவெளியை சேர்த்தவறே தொகுதிகளை செயலாக்கு."; +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/For_loop"; +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_VARIABLE"] = "Delete the '%1' variable"; // untranslated +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg["DELETE_X_BLOCKS"] = "%1 உறுப்பை நீக்கு"; +Blockly.Msg["DISABLE_BLOCK"] = "உறுப்பை இயங்காது செய்"; +Blockly.Msg["DUPLICATE_BLOCK"] = "மறுநகல்"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +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["IOS_CANCEL"] = "Cancel"; // untranslated +Blockly.Msg["IOS_ERROR"] = "Error"; // untranslated +Blockly.Msg["IOS_OK"] = "OK"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Add Input"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INPUTS"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "சேர்க்கவும்"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Add Variable"; // untranslated +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "நீக்கவும்"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "You can't use an empty variable name."; // untranslated +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "பெயர் மாற்றுக"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Variable name"; // 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"] = "காலி பட்டியல் பின்கொடு."; +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"] = "வைத்து பட்டியல் உருவாக்க"; +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"] = "கடைசியில் இருந்து #"; +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"] = "பட்டியல் முதல் உருப்படியை பின்கொடு,"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "பட்டியலில் இடத்தில் உருப்படி பின்கொடு."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "பட்டியல் கடைசி உருப்படியை பின்கொடு,"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "பட்டியல் சீரற்ற உருப்படியை பின்கொடு,"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "பட்டியல் முதல் உருப்படியை நீக்கியபின் பின்கொடு,"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "பட்டியலில் கேட்ட இடத்தின் உருப்படி நீக்கி பின்கொடு."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "பட்டியல் இறுதி உருப்படியை நீக்கியபின் பின்கொடு,"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "பட்டியல் சீரற்ற உருப்படியை நீக்கியபின் பின்கொடு,"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "பட்டியலில் முதல் உருப்படியை நீக்கு"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "பட்டியலில் கேட்ட இடத்தின் உருப்படி நீக்கு."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "பட்டியலில் கடைசி உருப்படியை நீக்கு"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "பட்டியல் சீரற்ற உருப்படியை நீக்கு,"; +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"] = "# முதலில் இருந்து பகுதி பட்டியலை கொடு"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "# கடைசியில் இருந்து பகுதி பட்டியலை கொடு"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "பகுதி பட்டியலை # இடத்தில் இருந்து கொடு"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "குறிப்பட்ட பகுதி பட்டியலின் நகலை கொடு"; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 கடைசி உருப்படி.ி"; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 முதல் உருப்படி."; +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"] = "பட்டியலில் மதிப்பின் முதல், கடைசி தோற்ற இடத்தை பின்கொடு. காணாவிட்டால் %1 பின்கொடு."; +Blockly.Msg["LISTS_INLIST"] = "பட்டியலில் உள்ள"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 காலியானது"; +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"] = "பட்டியல் நீளம் பின்கொடு"; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "உருப்படி %1-யை, %2 தடவைகள் உள்ளவாறு ஒரு பட்டியலை உருவாக்கு"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "கொடுக்க பட்ட மதிப்பை, கூறியுள்ள தடவைகள் உள்ளவாறு ஒரு பட்டியலை உருவாக்கு"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "மதிப்பை பட்டியலின் முதலில் நுழை"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "பட்டியலில் கேட்ட இடத்தில் உருப்படியை நுழை."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "மதிப்பை பட்டியலின் முடிவில் நுழை"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "மதிப்பை பட்டியலின் சீற்ற இடத்தில் நுழை"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "மதிப்பை பட்டியலில் முதல் உருப்படியில் வை"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "பட்டியலில் கேட்ட இடத்தில் உருப்படியை வை."; +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"] = "பட்டியலில் இருந்து உரை உருவாக்கு"; +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"] = "மெய், அல்லது பொய் பின்கொடு."; +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"] = "பூஜியம்"; +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"] = "'test' உள்ள நிபந்தனையை சரிபார்க்கவும், நிபந்தனை மெய்யானால்,'if true'வை பின்கொடுக்கும் இல்லையெனில் 'if false'வை பின்கொடுக்கும்."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["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"; +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_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.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://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"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "ஒரு மாறிலியை பின்கொடு π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (முடிவிலி)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // 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"] = "2-ஆல் பகும்"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "எண் குறைவானதா ?"; +Blockly.Msg["MATH_IS_ODD"] = "2-ஆல் பகாத"; +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"; +Blockly.Msg["MATH_MODULO_TITLE"] = "%1 ÷ %2ன் மீதி"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "இரண்டு எண்கள் மூலம் பிரிவில் இருந்து எஞ்சியதை பின்கொடு."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://ta.wikipedia.org/wiki/%E0%AE%8E%E0%AE%A3%E0%AF%8D"; +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://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "சீரற்ற எண் பின்னம்"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "சீரற்ற எண் பின்னம், 0.0 இல் இருந்து 1.0 உட்பட, பின்கொடு."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "வீசுகளம் %1 இல் இருந்து %2 உள்ளடங்கிய வாறு சீரற்ற எண்"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "வீசுகளம் இல் இருந்த (உள்ளடங்கிய) வாறு சீரற்ற எண் பின்கொடு."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +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://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"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "தனித்த"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "வர்க்கமூலம்"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "ஒரு எண்ணின் தனித்த மதிப்பை பின்கொடு"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "e-இன் எண் அடுக்கு பெருக்கை பின்கொடு."; +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"] = "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://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"; +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["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "மாறிலியை உருவாக்குக..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "புதிய மாறிலியின் பெயர்:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "வாக்குமூலங்களை அனுமதிக்கவும்"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "இத்துடன்"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "பயனரின் '%1' செயற்கூற்றை ஓட்டு."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +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_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "கட்டளைகள் செய்ய (இடம்காட்டி)"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "இந்த மாறியிற்கு"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "வெளியீடு இல்லாத ஒரு செயல்பாடு உருவாக்குகிறது"; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +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_TOOLTIP"] = "மதிப்பு உண்மையானால், இரண்டாவது மதிப்பை பின்கொடு."; +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"] = "செயல்கூறுக்கு ஒரு உள்ளீட்டை சேர்."; +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' மாறிலிகளையும் பின்வருமாறு மறுபெயரிடுக:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "இந்த மாறியிற்கு %1 உரை சேர்க்க %2"; +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"] = "தலைப்பு எழுத்துக்கு மாற்று"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "பொரிய எழுத்துக்கு மாற்று"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "உரை நகல் எடுத்து பொரிய/சின்ன எழுத்து மாற்றி பின்கொடு."; +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_LAST"] = "இறுதி எழுத்தைப் பெறுக"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "சமவாய்ப்புள்ள எழுத்தை எடு"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "கூறிய இடத்தில் உள்ள எழுத்தை எடு"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "உருபடியை உரையில் சேர்க்க."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "சேர்க்க"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "தொகுப்பு உரை திருத்துதம் செய்"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "எழுத்து கடைசியில் இருந்து # வரை"; +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"] = "-இல் உட்கணம் முதல் எழுத்திலிருந்து"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "-இல் உட்கணம் கடைசி # எழுத்திலிருந்து"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "-இல் உட்கணம் # எழுத்திலிருந்து"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "உரையின் குறியிடப்பட்ட சரம் பின்கொடு"; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "உரையில் முதல் தோற்ற இடத்தை பின்கொடு"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "உரையில் கடைசி தோற்ற இடத்தை பின்கொடு"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "உரையில் %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "இரண்டாவது உரையில் முதல் உரையின் முதல்/கடை இருக்கை குறிஎண்ணை பின்கொடு."; +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"] = "காலியானது என்றால் மெய் மதிப்பை பின்கொடு"; +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"] = "மதிப்பை அச்சிடு"; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "எண்-உள்ளீடு தூண்டுதலை காட்டு"; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "உரை-உள்ளீடு தூண்டுதலை காட்டு"; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "உரை கொண்டு எண்-உள்ளீடு தூண்டுதலை காட்டு"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "உரை கொண்டு உரை-உள்ளீடு தூண்டுதலை காட்டு"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg["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"; +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"] = "Undo"; // untranslated +Blockly.Msg["UNNAMED_KEY"] = "பெயரிடப்படாதது"; +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_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["VARIABLE_ALREADY_EXISTS"] = "A variable named '%1' already exists."; // untranslated +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "ஏதாகினும் பகர்க..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/tcy.js b/js/msg/js/tcy.js new file mode 100644 index 0000000..1b9b385 --- /dev/null +++ b/js/msg/js/tcy.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "ಟಿಪ್ಪಣಿ ಸೇರ್ಸಲೆ"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "ಮೌಲ್ಯೊನು ಬದಲ್ ಮಲ್ಪು"; +Blockly.Msg["CLEAN_UP"] = "ಬ್ಲಾಕ್‍ಲೆನ್ ಸ್ವೊಚ್ಚೊ ಮಲ್ಪುಲೆ"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "ಮಾತಾ ತಡೆಕ್ಲೆನ ಮಾಹಿತಿನ್ ಎಲ್ಯ ಮಲ್ಪು"; +Blockly.Msg["COLLAPSE_BLOCK"] = "ಎಲ್ಯೆ ಮಲ್ತ್‌ದ್ ತಡೆಲೆ"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "ಬಣ್ಣೊ ೧(ಒಂಜಿ)"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "ಬಣ್ಣೊ ೨(ರಡ್ಡ್)"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "ಅನುಪಾತೊ"; +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"] = "https://www.december.com/html/spec/colorpercompact.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"] = "%2 ಪಟ್ಟಿಡ್ ಪ್ರತಿ ಒಂಜಿ ವಿಸಯ %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"] = "%2 ಡ್ದ್ %3 ಮುಟ %4 ಸರ್ತಿ %1 ದ ಒಟ್ಟುಗು ಗೆನ್ಪು"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "ನಿರ್ದಿಸ್ಟೊ ಮದ್ಯಂತರೊದ ಮೂಲಕೊ ದೆತೊಂದು '%1' ವ್ಯತ್ಯಯೊಡ್ ಸುರುತ್ತ ಅಂಕೆಡ್ದ್ ಕಡೆತ್ತ ಅಂಕೆ ಮುಟ್ಟದ ಮೌಲ್ಯೊನು ದೆತ್ತೊನಾವ್ ಬೊಕ್ಕ ನಿಗಂಟ್ ಮಲ್ತಿನ ತಡೆಕ್ಲೆನ್ ಮಲ್ಪು"; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "'ಒಂಜಿ ವೇಲೆ' ತಡೆಕ್ಕ್ ಒಂಜಿ ಶರ್ತನ್ ಸೇರಾವ್"; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "'ಒಂಜಿ ವೇಲೆ' ತಡೆಕ್ಕ್ ಒಂಜಿ ಕಡೆತ್ತ ಮಾತೆನ್ಲಾ-ಪತ್ತ್ (catch-all) ಶರ್ತನ್ ಸೇರಾವ್"; +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/For_loop"; +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_VARIABLE"] = "'%1' ವ್ಯತ್ಯಯೊನು ಮಾಜಾಲೆ"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "'%2' ವ್ಯತ್ಯಯೊದ %1 ಉಪಯೋಗೊಲೆನ್ ಮಾಜಾವೊಡೆ?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "%1 ಬ್ಲಾಕ್‍ಲೆನ್ ಮಾಜಾವು"; +Blockly.Msg["DISABLE_BLOCK"] = "ಬ್ಲಾಕ್‍ನ್ ದೆತ್ತ್‌ಪಾಡ್"; +Blockly.Msg["DUPLICATE_BLOCK"] = "ನಕಲ್"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +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["IOS_CANCEL"] = "ವಜಾ ಮಲ್ಪುಲೆ"; +Blockly.Msg["IOS_ERROR"] = "ದೋಷ"; +Blockly.Msg["IOS_OK"] = "ಸರಿ"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ ಇನ್‌ಪುಟ್ ಸೇರಾಲೆ"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "ಹೇಳಿಕೆಗ್ ಅವಕಾಸೊ"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "ಈ ಕಾರ್ಯೊಡು ಡುಪ್ಲಿಕೇಟ್ ಇನ್‌ಪುಟ್ ಉಂಡು."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "ಇನ್‌ಪುಟ್‌ಲು"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "ಸೇರಾಲೆ"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ ವ್ಯತ್ಯಯೊನು ಸೇರಾಲೆ"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "ಮಾಜಾಲೆ"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "ವ್ಯತ್ಯಯೊದ ಪುದರ್‌ನ್ ಖಾಲಿ ಬುಡಿಯೆರೆ ಆಪುಜಿ"; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "ಪೊಸ ಪುದರ್"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "ವ್ಯತ್ಯಯೊದ ಪುದರ್"; +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"] = "ಒಂಜಿ ಪಟ್ಟಿ, ೦ ಉದ್ದೊದ, ಒವ್ವೇ ಮಾಹಿತಿ ದಾಂತಿನ ದಾಖಲೆ ಪಿರಕೊರು."; +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"] = "ಒಟ್ಟುಗು ಪಟ್ಟಿನ್ ಉಂಡುಮಲ್ಪುಲೆ"; +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"] = "ಅಕೇರಿಡ್ದ್ #"; +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"] = "ಒಂಜಿ ಪಟ್ಟಿಡ್ ಸುರುತ್ತ ವಿಸಯೊನು ಪಿರಕೊರ್ಪುಂಡು."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "ಒಂಜಿ ಪಟ್ಟಿಡ್ ನಿರ್ದಿಷ್ಟ ಸ್ಥಿತಿಡ್ ವಿಸಯೊನು ಪಿರಕೊರ್ಪುಂಡು."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "ಒಂಜಿ ಪಟ್ಟಿಡ್ ಅಕೇರಿದ ವಿಸಯೊನು ಪಿರಕೊರ್ಪುಂಡು."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "ಒಂಜಿ ಪಟ್ಟಿಡ್ ಒವ್ವಾಂಡಲ ಒಂಜಿ ವಿಸಯೊನು ಪಿರಕೊರ್ಪುಂಡು."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "ಒಂಜಿ ಪಟ್ಟಿಡ್ ಸುರುತ್ತ ವಿಸಯೊನು ಪಿರಕೊರ್ಪುಂಡು ಬೊಕ್ಕ ದೆತ್ತ್ ಬುಡ್ಪುಂಡು."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "ಒಂಜಿ ಪಟ್ಟಿಡ್ ನಿರ್ದಿಷ್ಟ ಸ್ಥಿತಿಡ್ ವಿಸಯೊನು ಪಿರಕೊರ್ಪುಂಡು ಬೊಕ್ಕ ದೆತ್ತ್ ಬುಡ್ಪುಂಡು."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "ಒಂಜಿ ಪಟ್ಟಿಡ್ ಅಕೇರಿದ ವಿಸಯೊನು ಪಿರಕೊರ್ಪುಂಡು ಬೊಕ್ಕ ದೆತ್ತ್ ಬುಡ್ಪುಂಡು."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "ಒಂಜಿ ಪಟ್ಟಿಡ್ ಒವ್ವಾಂಡಲ ಒಂಜಿ ವಿಸಯೊನು ಪಿರಕೊರ್ಪುಂಡು ಬೊಕ್ಕ ದೆತ್ತ್ ಬುಡ್ಪುಂಡು."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "ಒಂಜಿ ಪಟ್ಟಿಡ್ ಸುರುತ್ತ ವಿಸಯೊನು ದೆತ್ತ್ ಬುಡ್ಪುಂಡು."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "ಒಂಜಿ ಪಟ್ಟಿಡ್ ನಿರ್ದಿಷ್ಟ ಸ್ಥಿತಿಡ್ ವಿಸಯೊನು ದೆತ್ತ್ ಬುಡ್ಪುಂಡು."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "ಒಂಜಿ ಪಟ್ಟಿಡ್ ಅಕೇರಿದ ವಿಸಯೊನು ದೆತ್ತ್ ಬುಡ್ಪುಂಡು."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "ಒಂಜಿ ಪಟ್ಟಿಡ್ ಒವ್ವಾಂಡಲ ಒಂಜಿ ವಿಸಯೊನು ದೆತ್ತ್ ಬುಡ್ಪುಂಡು."; +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"] = "ಸುರುಡ್ದು ಉಪ-ಪಟ್ಟಿನ್ ದೆತ್ತೊನು"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "ಅಕೇರಿಡ್ದ್ # ಡ್ದ್ ಉಪ-ಪಟ್ಟಿನ್ ದೆತ್ತೊನು"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "# ಡ್ದ್ ಉಪ-ಪಟ್ಟಿನ್ ದೆತ್ತೊನು"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "ಪಟ್ಯೊದ ನಿರ್ದಿಷ್ಟ ಬಾಗೊದ ಪ್ರತಿನ್ ಉಂಡುಮಲ್ಪುಂಡು."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 ಅಕೇರಿತ ವಿಸಯೊ"; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 ಸುರುತ ವಿಸಯೊ"; +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"] = "ಪಟ್ಟಿಡುಪ್ಪುನ ವಿಸಯೊ ಸುರುಕ್ಕು/ಅಕೇರಿಗ್ ಬತ್ತಿನೆತ್ತ ಸೂಚಿನ್ ಪಿರಕೊರ್ಪುಂಡು. ವಿಸಯೊ ತಿಕ್ಕಿಜ್ಜಾಂಡ %1 ನ್ ಪಿರಕೊರ್ಪುಂಡು."; +Blockly.Msg["LISTS_INLIST"] = "ಪಟ್ಟಿಡ್"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 ಕಾಲಿ"; +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"] = "ಪಟ್ಟಿದ ಉದ್ದೊನು ಪಿರಕೊರು."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "%1 ವಿಸಯೊ %2 ಸರ್ತಿ ಪುನರಾವರ್ತನೆ ಆದುಪ್ಪುನ ಪಟ್ಟಿನ್ ಉಂಡುಮಲ್ಪುಲೆ."; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "ಕೊರಿನ ಮೌಲ್ಯೊ ಒಂಜಿ ನಿರ್ದಿಷ್ಟ ಸಂಕ್ಯೆದಾತ್ ಸರ್ತಿ ಪುನರಾವರ್ತನೆ ಆದುಪ್ಪುನ ಒಂಜಿ ಪಟ್ಟಿನ್ ಉಂಡುಮಲ್ಪುಲೆ."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "ಒಂಜಿ ಪಟ್ಟಿದ ಸುರುಕ್ಕು ವಿಸಯೊನು ಸೇರಾವುಂಡು."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "ಒಂಜಿ ಪಟ್ಟಿಡ್ ನಿರ್ದಿಷ್ಟ ಸ್ಥಿತಿಡ್ ವಿಸಯೊನು ಸೇರಾವುಂಡು."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "ಒಂಜಿ ಪಟ್ಟಿದ ಅಕೇರಿಗ್ ವಿಸಯೊನು ಸೇರಾವುಂಡು."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "ಒಂಜಿ ಪಟ್ಟಿಡ್ ಓಲಾಂಡಲ ವಿಸಯೊನು ಸೇರಾವುಂಡು."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "ಒಂಜಿ ಪಟ್ಟಿಡ್ ಸುರುತ್ತ ವಿಸಯೊನು ಸೆಟ್ ಮಲ್ಪುಂಡು."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "ಒಂಜಿ ಪಟ್ಟಿಡ್ ನಿರ್ದಿಷ್ಟ ಸ್ಥಿತಿಡ್ ವಿಸಯೊನು ಸೆಟ್ ಮಲ್ಪುಂಡು."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "ಏರುನು"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "ಜಪ್ಪುನು"; +Blockly.Msg["LISTS_SORT_TITLE"] = "%1 %2 %3 ಇಂಗಡಿಪು"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "ಒಂಜಿ ಪಟ್ಟಿದ ಒಂಜಿ ಪ್ರತಿನ್ ಇಂಗಡಿಪು"; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "ಅಕ್ಷರೊ, ನಮೂನೆ (case) ಅಲಕ್ಷ್ಯೊ ಮಲ್ಪುಲೆ"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "ಸಂಖ್ಯೆ"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "ಅಕ್ಷರೊ"; +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"] = "ಪಟ್ಟಿದ ಪಟ್ಯೊನು ತಯಾರ್ ಮಲ್ಪುಲೆ"; +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"] = "ಒಂಜೆ ನಿಜ ಅತ್ತಂಡ ಸುಲ್ಲುನ್ ಪಿರಕೊರು"; +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"] = "ಸೊನ್ನೆ"; +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://en.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_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.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://en.wikipedia.org/wiki/ಗಣಿತ_ನಿರಂತರ"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "ಒಂಜಿ ಸಾಮಾನ್ಯ ಸ್ಥಿರಾಂಕೊನು ಪಿರಕೊರು: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "%2 ಕಮ್ಮಿ %3 ಜಾಸ್ತಿ %1 ನಿರ್ಬಂಧ ಮಲ್ಪು"; +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://en.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://en.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://en.wikipedia.org/wiki/ರಾಂಡಮ್_ನಂಬರ್_ಜನರೇಶನ್"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "ಒವ್ವಾಂಡಲ ಒಂಜಿ ಭಿನ್ನರಾಶಿ"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "0.0 (ಸೇರ್‌ದ್) ಬೊಕ್ಕ 1.0 (ಸೇರಂದೆ) ನಡುತ ಒವ್ವಾಂಡಲ ಒಂಜಿ ಭಿನ್ನರಾಶಿನ್ ಪಿರಕೊರು."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/ರಾಂಡಮ್_ನಂಬರ್_ಜನರೇಶನ್"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = " %1 ಡ್ದ್ %2 ಯಾದೃಚ್ಛಿಕ ಪೂರ್ಣಾಂಕೊ"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "ರಡ್ಡ್ ನಿಗದಿತ ಮಿತಿತ ನಡುತ್ತ ಯಾದೃಚ್ಛಿಕ ಪೂರ್ಣಾಂಕೊನು ಪಿರಕೊರು"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.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://en.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"] = "ಒಂಜಿ ಸಂಖ್ಯೆದ ಘಾತೊಗು 'e'ನ್ ಪಿರಕೊರು."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "ಸಂಖ್ಯೆದ ಪ್ರಾಕೃತಿಕ ಲಘುಗಣಕನ್ ಪಿರಕೊರು"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "ಸಂಖ್ಯೆದ ದಶಮಾನ ಲಘುಗಣಕನ್ ಪಿರಕೊರು"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "ಸಂಖ್ಯೆದ ನಿಷೇಧೊನು ಪಿರಕೊರು"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "ಒಂಜಿ ಸಂಖ್ಯೆದ ಘಾತೊಗು ೧೦ನ್ ಪಿರಕೊರು"; +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"] = "ಒಂಜಿ ಸಂಖ್ಯೆದ ಆರ್ಕ್‌‌ಕೊಸೈನ್ ಪಿರಕೊರು."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "ಒಂಜಿ ಸಂಖ್ಯೆದ ಆರ್ಕ್‌ಸೈನ್ ಪಿರಕೊರು."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "ಒಂಜಿ ಸಂಖ್ಯೆದ ಆರ್ಕ್‌ಟ್ಯಾನ್‌ಜ್ಂಟ್ ಪಿರಕೊರು."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "ಒಂಜಿ ಡಿಗ್ರಿದ ಕೊಸೈನ್ (cosine) ಪಿರಕೊರು (ರೇಡಿಯನ್ ಅತ್ತ್)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "ಒಂಜಿ ಡಿಗ್ರಿದ ಸೈನ್ (sine) ಪಿರಕೊರು (ರೇಡಿಯನ್ ಅತ್ತ್)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "ಒಂಜಿ ಡಿಗ್ರಿದ ಟ್ಯಾನ್‌ಜೆಂಟ್ (tangent) ಪಿರಕೊರು (ರೇಡಿಯನ್ ಅತ್ತ್)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "ವ್ಯತ್ಯಯೊನು ಉಂಡು ಮಲ್ಪುಲೆ"; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "ಪೊಸ ವ್ಯತ್ಯಯೊದ ಪುದರ್:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "ಹೇಳಿಕೆಗ್ ಅವಕಾಸೊ"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "ಒಟ್ಟುಗು:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/ವರ್ಗಮೂಲೊ"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "'%1' ಬಳಕೆದಾರೆರೆ ಕಾರ್ಯೊನು ನಡಪಾಲೆ."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.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"] = "ಈ ಕಾರ್ಯೊನು ಇವರಿಪುಲೆ..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "ಎಂಚಿನಾಂಡಲ ಮಲ್ಪುಲೆ"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "ಇಂದೆಕ್"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "ಔಟ್‌ಪುಟ್ ದಾಂತಿನ ಕಾರ್ಯೊನು ಉಂಡುಮಲ್ಪುಂಡು."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +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_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' ವ್ಯತ್ಯಯೊಲೆನ ಪುದರ್‌ನ್ ನೆಕ್ಕ್ ಬದಲ್ ಮಲ್ಪುಲೆ:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "ಇಂದೆಕ್ %1 ಪಟ್ಯೊನು ಸೇರವೆ %2"; +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"] = "ತರೆಬರವುದ ಅಕ್ಷರೊಗು"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "ಮಲ್ಲ ಅಕ್ಷರೊಗು"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "ಪಟ್ಯೊದ ಒಂಜಿ ನಕಲ್‍ನ್ ಬೇತೆ ನಮೂನೆಡ್ (case) ಪಿರಕೊರು."; +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_LAST"] = "ಅಕೇರಿದ ಅಕ್ಷರೊನು ದೆತ್ತೊನು"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "ಒವ್ವಾಂಡಲ ಒಂಜಿ ಅಕ್ಷರೊನು ದೆತ್ತೊನು"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "%1 %2 ಪದೊಟ್ಟು"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "ಅಕ್ಷರೊನು ನಿರ್ದಿಷ್ಟ ಸ್ಥಿತಿಡ್ ಪಿರಕೊರ್ಪುಂಡು."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "ಪಟ್ಯೊಗು ಒಂಜಿ ವಿಷಯೊನು ಸೇರಾವ್"; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "ಸೇರಾವ್"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "ಈ ಪಠ್ಯ ತಡೆನ್ ಕುಡ ಸಂರಚಣೆ ಮಲ್ಪೆರೆ, ಸೇರಾವ್, ದೆತ್ತ್ ಬುಡು, ಅತ್ತಂಡ ವಿಭಾಗೊಲೆನ್ ಕುಡ ಒತ್ತರೆ ಮಲ್ಪು."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "ಅಕೇರಿಡ್ದ್ ಅಕ್ಷರೊ #ಗು"; +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"] = "ಸುರುತ್ತ ಅಕ್ಷರೊ #ಡ್ದು ಉಪವಾಕ್ಯೊನು ದೆತ್ತೊನು"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "ಅಕೇರಿಡ್ದ್ ಅಕ್ಷರೊ #ಡ್ದು ಉಪವಾಕ್ಯೊನು ದೆತ್ತೊನು"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "ಅಕ್ಷರೊ #ಡ್ದು ಉಪವಾಕ್ಯೊ ದೆತ್ತೊನು"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "ಪಟ್ಯೊದ ಒಂಜಿ ನಿರ್ದಿಷ್ಟ ಬಾಗೊನು ಪಿರಕೊರ್ಪುಂಡು."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "ಪಟ್ಯೊ ಸುರುಕ್ಕು ಬತ್ತಿನೇನ್ ನಾಡ್"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "ಪಟ್ಯೊ ಅಕೇರಿಗ್ ಬತ್ತಿನೇನ್ ನಾಡ್"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "ಪಟ್ಯೊಡು %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "ರಡ್ಡನೆ ಪಟ್ಯೊಡು ಉಪ್ಪುನ ಸುರುತ ಪಟ್ಯೊ ಸುರುಕ್ಕು/ಅಕೇರಿಗ್ ಬತ್ತಿನೆತ್ತ ಸೂಚಿನ್ ಪಿರಕೊರು. ಪಟ್ಯೊ ತಿಕ್ಕಿಜ್ಜಾಂಡ %1 ನ್ ಪಿರಕೊರು."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 ಖಾಲಿ"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "ಕೊರಿನ ಪಟ್ಯೊ ಖಾಲಿ ಇತ್ತ್ಂಡ 'ನಿಜ'ನ್ ಪಿರಕೊರು."; +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"] = "ನಿರ್ದಿಷ್ಟ ಪಟ್ಯೊ, ಸಂಖ್ಯೆ ಅತ್ತಂಡ ಬೇತೆ ಮೌಲ್ಯೊನು ಮುದ್ರಿಪುಲೆ."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "ಒಂಜಿ ಸಂಖ್ಯೆಗ್ ಸದಸ್ಯೆರೆನ್ ಕೇನ್"; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "ಕೆಲವು ಪಟ್ಯೊಗು ಸದಸ್ಯೆರೆನ್ ಕೇನ್."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "ಸಂದೇಶೊದೊಟ್ಟುಗು ಸಂಕ್ಯೆನ್ ಕೇನ್"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "ಸಂದೇಶೊದೊಟ್ಟುಗು ಪಟ್ಯೊಗು ಕೇನ್."; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.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"] = "ರಡ್ಡ್ ಮೆಯಿತ್ತಲ ಅಂತರೊಲೆನ್ (space) ಕತ್ತೆರ್."; +Blockly.Msg["TEXT_TRIM_OPERATOR_LEFT"] = "ಎಡತ್ತ ಮೆಯಿತ್ತ ಅಂತರೊಲೆನ್ (space) ಕತ್ತೆರ್."; +Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "ಬಲತ್ತ ಮೆಯಿತ್ತ ಅಂತರೊಲೆನ್ (space) ಕತ್ತೆರ್."; +Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "ಒಂಜಿ ಅತ್ತಂಡ ರಡ್ಡ್ ಕೊಡಿಡ್ದ್ ಅಂತರೊಲೆನ್ (space) ದೆತ್ತ್‌ದ್ ಪಟ್ಯೊದ ಪ್ರತಿನ್ ಪಿರಕೊರು."; +Blockly.Msg["TODAY"] = "ಇನಿ"; +Blockly.Msg["UNDO"] = "ದುಂಬುದಲೆಕೊ"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // 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 +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["VARIABLE_ALREADY_EXISTS"] = "'%1' ಪನ್ಪಿ ಪುದರ್‌ದ ವ್ಯತ್ಯಯೊ ದುಂಬೆ ಅಸ್ತಿತ್ವೊಡು ಉಂಡು."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/te.js b/js/msg/js/te.js new file mode 100644 index 0000000..76371c2 --- /dev/null +++ b/js/msg/js/te.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "వ్యాఖ్య చేర్చు"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "విలువ మార్చు"; +Blockly.Msg["CLEAN_UP"] = "నిరోదనలను శుభ్రపరుచు"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "నిష్పత్తి"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "మిశ్రమం"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "రెండు రంగులను (0.0 - 1.0) నిష్పత్తిలో మిశ్రమించాలి."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://te.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"] = "https://www.december.com/html/spec/colorpercompact.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"] = "break out of loop"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "continue with next iteration of loop"; // untranslated +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"] = "ఒక అంశం కోసం %1 జాబితా లో %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"] = "దీనితో లెక్కించు %1 నుండి %2 వరకు %3 తో %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 +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"] = "else"; // untranslated +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "else if"; // untranslated +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://te.wikipedia.org/wiki/For_loop"; +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"] = "repeat while"; // untranslated +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_VARIABLE"] = "Delete the '%1' variable"; // untranslated +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg["DELETE_X_BLOCKS"] = "%1నిరోదనలను తోలగించు"; +Blockly.Msg["DISABLE_BLOCK"] = "నిరోదన పని చేయకుండా చేయు"; +Blockly.Msg["DUPLICATE_BLOCK"] = "నకలు"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +Blockly.Msg["ENABLE_BLOCK"] = "నిరోదన ప్రారంబించు"; +Blockly.Msg["EXPAND_ALL"] = "నిరోదనలను విస్తరించు"; +Blockly.Msg["EXPAND_BLOCK"] = "నిరోదన విస్తరించు"; +Blockly.Msg["EXTERNAL_INPUTS"] = "External Inputs"; // untranslated +Blockly.Msg["HELP"] = "సహాయం"; +Blockly.Msg["INLINE_INPUTS"] = "Inline Inputs"; // untranslated +Blockly.Msg["IOS_CANCEL"] = "Cancel"; // untranslated +Blockly.Msg["IOS_ERROR"] = "Error"; // untranslated +Blockly.Msg["IOS_OK"] = "OK"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Add Input"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INPUTS"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Add"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Add Variable"; // untranslated +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Delete"; // untranslated +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "You can't use an empty variable name."; // untranslated +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Rename"; // untranslated +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Variable name"; // untranslated +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"] = "create list with"; // untranslated +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"] = "Returns the item at the specified position in a list."; // 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"] = "Removes and returns the item at the specified position in a list."; // 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"] = "Removes the item at the specified position in a list."; // 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_FROM_END_TOOLTIP"] = "%1 is the last item."; // untranslated +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 is the first item."; // 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 %1 if item is not found."; // untranslated +Blockly.Msg["LISTS_INLIST"] = "జాబితాలో"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 is empty"; // untranslated +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_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "insert at"; // untranslated +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"] = "Inserts the item at the specified position in a list."; // 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"] = "Sets the item at the specified position in a list."; // 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"] = "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_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_NULL"] = "చెల్లని"; +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"] = "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"] = "పరీక్షించు"; +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://te.wikipedia.org/wiki/Arithmetic"; +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_MINUS"] = "రెండు సంఖ్యల తేడాకి తిరిగి వెళ్ళండి"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Return the product of the two numbers."; // untranslated +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Return the first number raised to the power of the second number."; // untranslated +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +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"] = "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 +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // 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"] = "is even"; // untranslated +Blockly.Msg["MATH_IS_NEGATIVE"] = "ప్రతికూలంగా ఉంది"; +Blockly.Msg["MATH_IS_ODD"] = "is odd"; // untranslated +Blockly.Msg["MATH_IS_POSITIVE"] = "అనుకూలంగా ఉంది"; +Blockly.Msg["MATH_IS_PRIME"] = "is prime"; // untranslated +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"] = "is whole"; // untranslated +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"] = "max of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "median of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "min of list"; // untranslated +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"] = "జాబితా మొత్తం"; +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"] = "Return the largest number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Return the median number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Return the smallest number in the list."; // untranslated +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/Square_root"; // untranslated +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absolute"; // untranslated +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "square root"; // untranslated +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"] = "Return the natural logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Return the base 10 logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Return the negation of a number."; // untranslated +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_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"; // untranslated +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["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "కొత్త వ్యత్యాసం..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "కొత్త వ్యత్యాసం పేరు:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // 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"] = "Create '%1'"; // untranslated +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/Subroutine"; // 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/Subroutine"; // 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"] = "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"] = "మొత్తం వ్యత్యాసాలను '%1' దీనికి పునఃనామకరణించు:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "to %1 append text %2"; // 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"] = "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"] = "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_LAST"] = "చివరి వర్ణాన్ని పొందు"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "యాదృశ్చిక వర్ణాన్ని పొందు"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returns the letter at the specified position."; // untranslated +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // 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_OPERATOR_FIRST"] = "find first occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "find last occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "in text %1 %2 %3"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "% 1 ఖాళీ"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Returns true if the provided text is empty."; // untranslated +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"] = "%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"] = "print %1"; // untranslated +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_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // 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"] = "రద్దుచెయ్యి"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // 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["VARIABLE_ALREADY_EXISTS"] = "A variable named '%1' already exists."; // untranslated +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/th.js b/js/msg/js/th.js new file mode 100644 index 0000000..947308c --- /dev/null +++ b/js/msg/js/th.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "ใส่คำอธิบาย"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "ไม่สามารถลบตัวแปร '%1' ได้เนื่องจากเป็นส่วนหนึ่งของนิยามของฟังก์ชัน '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "เปลี่ยนค่า:"; +Blockly.Msg["CLEAN_UP"] = "จัดเรียงบล็อกให้เป็นแถว"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "บล็อกที่ถูกพับมีคำเตือนอยู่ข้างใน."; +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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "อัตราส่วน"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "ผสม"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "ผสมสองสีเข้าด้วยกันด้วยอัตราส่วน (0.0 - 1.0)"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://th.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"] = "https://www.december.com/html/spec/colorpercompact.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"] = "นับด้วย %1 จาก %2 จนถึง %3 เปลี่ยนค่าทีละ %4"; +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/For_loop"; +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_VARIABLE"] = "ลบตัวแปร '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "ลบการใช้ตัวแปร %2 %1 ครั้งหรือไม่"; +Blockly.Msg["DELETE_X_BLOCKS"] = "ลบ %1 บล็อก"; +Blockly.Msg["DISABLE_BLOCK"] = "ปิดใช้งานบล็อก"; +Blockly.Msg["DUPLICATE_BLOCK"] = "ทำสำเนา"; +Blockly.Msg["DUPLICATE_COMMENT"] = "ทำสำเนาความเห็น"; +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["IOS_CANCEL"] = "ยกเลิก"; +Blockly.Msg["IOS_ERROR"] = "ข้อผิดพลาด"; +Blockly.Msg["IOS_OK"] = "ตกลง"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ เพิ่มอินพุต"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "อนุญาตคำสั่ง"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "ฟังก์ชันนี้มีอินพุตที่ซ้ำกัน"; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "อินพุต"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "เพิ่ม"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ เพิ่มตัวแปร"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "ลบ"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "คุณไม่สามารถใช้ชื่อตัวแปรที่ว่างเปล่าได้"; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "เปลี่ยนชื่อ"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "ชื่อตัวแปร"; +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_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"] = "สร้างข้อความด้วย"; +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"] = "# จากท้าย"; +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"] = "คืนค่าไอเท็มอันแรกในรายการ"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "คืนค่าเป็นไอเท็มตามตำแหน่งที่ระบุ"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "คืนค่าไอเท็มอันสุดท้ายในรายการ"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "คืนค่าไอเท็มแบบสุ่มจากรายการ"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "เอาออก และคืนค่าไอเท็มอันแรกในรายการ"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "เอาออก และคืนค่าไอเท็มในตำแหน่งที่ระบุจากรายการ"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "เอาออก และคืนค่าไอเท็มอันสุดท้ายในรายการ"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "เอาออก และคืนค่าไอเท็มแบบสุ่มจากรายการ"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "เอาไอเท็มแรกสุดในรายการออก"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "คืนค่าเป็นไอเท็มตามตำแหน่งที่ระบุ"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "เอาไอเท็มอันท้ายสุดในรายการออก"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "เอาไอเท็มแบบสุ่มจากรายการออก"; +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"] = "ดึงรายการย่อยทั้งแต่แรกสุด"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "ดึงรายการย่อยจาก # จากท้ายสุด"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "ดึงรายการย่อยจาก #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "สร้างสำเนารายการในช่วงที่กำหนด"; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 คือไอเท็มอันท้ายสุด"; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 คือไอเท็มอันแรกสุด"; +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"] = "คืนค่าตำแหน่งของไอเท็มอันแรก/สุดท้ายที่พบในรายการ คืนค่า %1 ถ้าหาไม่พบ"; +Blockly.Msg["LISTS_INLIST"] = "ในรายการ"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 ว่างเปล่า"; +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"] = "ส่งคืนค่าความยาวของรายการ"; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "สร้างรายการที่มีไอเท็ม %1 จำนวน %2"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "สร้างรายการที่ประกอบด้วยค่าตามที่ระบุในจำนวนตามที่ต้องการ"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "เรียง %1 แบบย้อนกลับ"; +Blockly.Msg["LISTS_REVERSE_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_SET"] = "กำหนด"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "แทรกไอเท็มเข้าไปเป็นอันแรกสุดของรายการ"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "แทรกไอเท็มเข้าไปในตำแหน่งที่กำหนด"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "เพิ่มไอเท็มเข้าไปท้ายสุดของรายการ"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "เพิ่มไอเท็มเข้าไปในรายการแบบสุ่ม"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "กำหนดไอเท็มอันแรกในรายการ"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "กำหนดไอเท็มในตำแหน่งที่ระบุในรายการ"; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "น้อยไปหามาก"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "มากไปหาน้อย"; +Blockly.Msg["LISTS_SORT_TITLE"] = "เรียงลำดับ %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "เรียงลำดับสำเนาของรายชื่อ"; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "ตัวอักษร"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "ตัวเลข"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "ตัวอักษร"; +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"] = "สร้างข้อความจากรายการ"; +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"] = "คืนค่าเป็นจริงหรือเท็จ"; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "จริง"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://th.wikipedia.org/wiki/อสมการ"; +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://th.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_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "เปลี่ยนอาร์กแทนเจนต์ของชุด (X, Y) จากองศา 180 เป็น -180."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.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://th.wikipedia.org/wiki/ค่าคงตัวทางคณิตศาสตร์"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "คืนค่าคงตัวทางคณิตศาสตร์ที่พบบ่อยๆ เช่น π (3.141…), e (2.718…), φ (1.618…), รากที่สอง (1.414…), รากที่ ½ (0.707…), ∞ (อนันต์)"; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // 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://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "เศษของ %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "คืนค่าเศษที่ได้จากการหารของตัวเลขทั้งสองจำนวน"; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://th.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://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "สุ่มเลขเศษส่วน"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "สุ่มเลขเศษส่วน ตั้งแต่ 0.0 แต่ไม่เกิน 1.0"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "สุ่มเลขจำนวนเต็มตั้งแต่ %1 จนถึง %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "สุ่มเลขจำนวนเต็มจากช่วงที่กำหนด"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://th.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://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "ค่าสัมบูรณ์"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "รากที่สอง"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "คืนค่าค่าสัมบูรณ์ของตัวเลข"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "คืนค่า e ยกกำลังด้วยตัวเลข"; +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://th.wikipedia.org/wiki/ฟังก์ชันตรีโกณมิติ"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "คืนค่า arccosine ของตัวเลข"; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "คืนค่า arcsine ของตัวเลข"; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "คืนค่า arctangent ของตัวเลข"; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "คืนค่า cosine ขององศา (ไม่ใช่เรเดียน)"; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "คืนค่า sine ขององศา (ไม่ใช่เรเดียน)"; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "คืนค่า tangent ขององศา (ไม่ใช่เรเดียน)"; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "สร้างตัวแปรสี"; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "สร้างตัวแปรจำนวน"; +Blockly.Msg["NEW_STRING_VARIABLE"] = "สร้างตัวแปร string"; +Blockly.Msg["NEW_VARIABLE"] = "สร้างตัวแปร..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "ชื่อตัวแปรใหม่:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "ชนิดตัวแปรใหม่"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "ข้อความที่ใช้ได้"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "ด้วย:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://th.wikipedia.org/wiki/ซับรู้ทีน"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "เรียกใช้ฟังก์ชันที่สร้างโดยผู้ใช้ \"%1\""; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://th.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"] = "อธิบายฟังก์ชันนี้"; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "ทำอะไรบางอย่าง"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "ถึง"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "สร้างฟังก์ชันที่ไม่มีผลลัพธ์"; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +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_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' ทั้งหมดเป็น:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "นำเอา %1 ต่อด้วยข้อความ %2"; +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"] = "เปลี่ยนเป็น ตัวอักษรแรกเป็นตัวพิมพ์ใหญ่"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "เปลี่ยนเป็น ตัวพิมพ์ใหญ่"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "คืนค่าสำเนาของข้อความในกรณีต่างๆ"; +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_LAST"] = "ดึง ตัวอักษรตัวสุดท้าย"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "ถึงตัวอักษรแบบสุ่ม"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "ในข้อความ %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "คืนค่าตัวอักษรจากตำแหน่งที่ระบุ"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "นับ %1 ภายใน %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "นับจำนวนข้อความแรกที่พบอยู่ในข้อความที่สอง"; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "เพิ่มรายการเข้าไปในข้อความ"; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "รวม"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "เพิ่ม ลบ หรือจัดเรียงบล็อกข้อความนี้ใหม่"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "จนถึง ตัวอักษรที่ # จากท้าย"; +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"] = "แยกข้อความย่อยตั้งแต่ ตัวอักษรแรก"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "แยกข้อความย่อยตั้งแต่ ตัวอักษรที่ # จากท้าย"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "แยกข้อความย่อยตั้งแต่ ตัวอักษรที่"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "คืนค่าบางส่วนของข้อความ"; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "หาข้อความแรกที่พบ"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "หาข้อความสุดท้ายที่พบ"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "ในข้อความ %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "คืนค่าตำแหน่งที่พบข้อความแรกอยู่ในข้อความที่สอง คืนค่า %1 ถ้าหาไม่พบ"; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 ว่าง"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "คืนค่าจริง ถ้าข้อความยังว่างเปล่า"; +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"] = "พิมพ์ข้อความ ตัวเลข หรือค่าอื่นๆ"; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "แสดงหน้าต่างให้ผู้ใช้ใส่ตัวเลข"; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "แสดงหน้าต่างให้ผู้ใช้ใส่ข้อความ"; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "แสดงหน้าต่างตัวเลข"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "แสดงหน้าต่างข้อความ"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "แทนที่ %1 ด้วย %2 ใน %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "แทนที่ข้อความแรกทั้งหมดที่พบในข้อความที่สอง"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "เรียง %1 แบบย้อนกลับ"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "เรียงตัวอักษรทั้งหมดของข้อความแบบย้อนกลับ"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://th.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_LEFT"] = "ลบช่องว่างด้านหน้าของ"; +Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "ลบช่องว่างข้างท้ายของ"; +Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "คืนค่าสำเนาของข้อความที่ลบเอาช่องว่างหน้าและหลังข้อความออกแล้ว"; +Blockly.Msg["TODAY"] = "วันนี้"; +Blockly.Msg["UNDO"] = "ย้อนกลับ"; +Blockly.Msg["UNNAMED_KEY"] = "ไม่มีชื่อ"; +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_SET"] = "กำหนด %1 จนถึง %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "สร้าง \"get %1\""; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "กำหนดให้ตัวแปรนี้เท่ากับการป้อนข้อมูล"; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "มีตัวแปรชื่อ '%1' อยู่แล้ว"; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "ตัวแปรชื่อ '%1' มีอยู่แล้วสำหรับตัวแปรอื่นของชนิด: '%2'"; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "พื้นที่ทำงาน Blockly"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "เขียนอะไรสักอย่าง"; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/tl.js b/js/msg/js/tl.js new file mode 100644 index 0000000..e88f511 --- /dev/null +++ b/js/msg/js/tl.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Dagdag komento"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "pagbago ng value:"; +Blockly.Msg["CLEAN_UP"] = "Clean up Blocks"; // untranslated +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "bloke"; +Blockly.Msg["COLLAPSE_BLOCK"] = "bloke"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "kulay 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "kulay 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "proporsyon"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "halo"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Paghalo ng dalawang kulay kasama ng ibinigay na proporsyon (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; // untranslated +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "pagpili ng kulay sa paleta."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "iba ibang kulay"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "pagpili ng iba't ibang kulay."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "asul"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "berde"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "pula"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "kulayan ng"; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "putulin ang paulit ulit"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "Magpatuloy sa susunod na pag-ulit ng loop"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Hatiin ang nilalaman ng loop."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Laktawan ang natitirang bahagi ng loop, at magpatuloy sa susunod na pag-ulit."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Babala: Ang block ito ay maaari lamang magamit sa loob ng loop."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "sa bawat bagay %1 sa listahan %2"; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "bilangin %1 mula %2 hanggang %3 ng %4"; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Mag dagdag ng condition sa if block."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Mag Add ng final, kunin lahat ng condition sa if block."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Mag Add, remove o kaya mag reorder ng sections para maayos ang if block."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "else"; // untranslated +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "else if"; // untranslated +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "kung"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "kung ang value ay true, gagawin ang do statements."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Kung ang value ay true, gagawin ang unang block ng do statements. Kung hindi, gagawin ang pangalawang block ng statement."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "gawin"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "ulitin %1 beses"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "gumawa ng ilang pangungusap ng ilang ulit."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "ulitin hanggang"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "ulitin habang"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Habang ang value ay false, gagawin ang ibang statements."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Habang ang value ay true, gagawin ang ibang statements."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Delete all %1 blocks?"; // untranslated +Blockly.Msg["DELETE_BLOCK"] = "burahin ang bloke"; +Blockly.Msg["DELETE_VARIABLE"] = "Delete the '%1' variable"; // untranslated +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg["DELETE_X_BLOCKS"] = "burahin %1 ng bloke"; +Blockly.Msg["DISABLE_BLOCK"] = "Ipangwalang bisa ang Block"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Kaparehas"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +Blockly.Msg["ENABLE_BLOCK"] = "Bigyan ng bisa ang Block"; +Blockly.Msg["EXPAND_ALL"] = "Palawakin ang Blocks"; +Blockly.Msg["EXPAND_BLOCK"] = "Palawakin ang Block"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Panlabas na Inputs"; +Blockly.Msg["HELP"] = "Tulong"; +Blockly.Msg["INLINE_INPUTS"] = "Inline na Inputs"; +Blockly.Msg["IOS_CANCEL"] = "Cancel"; // untranslated +Blockly.Msg["IOS_ERROR"] = "Error"; // untranslated +Blockly.Msg["IOS_OK"] = "OK"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Add Input"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INPUTS"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Add"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Add Variable"; // untranslated +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Delete"; // untranslated +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "You can't use an empty variable name."; // untranslated +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Rename"; // untranslated +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Variable name"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "Gumawa ng walang laman na list"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Ibabalik ang list, na may haba na 0, nag lalaman ng walang data records"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "list"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Magdagdag, mag tanggal or mag ayos ng sections para muling maayos ang listahan ng block."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "gumawa ng list kasama"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Mag dagdag ng item sa list."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Gumawa ng list na may kahit anong number ng items."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "Una"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# mula katapusan"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; +Blockly.Msg["LISTS_GET_INDEX_GET"] = "kunin"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "kunin at tanggalin"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "huli"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "nang hindi pinipili"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "tanggalin"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Ibalik ang unang item sa list."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Ibalik ang item sa itinakdang posisyon sa list."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Ibalik ang huling item sa list."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Nag babalik ng hindi pinipiling item sa list."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Nag tatanggal at nag babalik ng mga unang item sa list."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Nag tatanggal at nag babalik ng mga items sa tinukoy na posisyon sa list."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Nag tatanggal at nag babalik ng huling item sa list."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Nag tatanggal at nag babalik ng mga hindi pinipiling item sa list."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Nag tatanggal ng unang item sa list."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Nag tatanggal ng item sa tinukoy na posisyon sa list."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Nag tatanggal ng huling item sa list."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Nag tatanggal ng item mula sa walang pinipiling list."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "mula # hanggang huli"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "mula #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "hanggang huli"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "pag kuha ng sub-list mula sa una"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "pag kuha ng sub-list mula sa # mula huli"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "pag kuha ng sub-list mula #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Gumagawa ng kopya ng tinukoy na bahagi ng list."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 ay ang huling item."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 ay ang unang item."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "Hanapin ang unang pangyayari ng item"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "hanapin ang huling pangyayari ng item"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Pagbalik ng index ng una/huli pangyayari ng item sa list. Pagbalik ng %1 kung ang item ay hindi makita."; +Blockly.Msg["LISTS_INLIST"] = "sa list"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 ay walang laman"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Nagbabalik ng true kung ang list ay walang laman."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "haba ng %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Pag balik ng haba ng list."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "pag gawa ng list kasama ng item %1 inuulit %2 beses"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Pag gawa ng list na binubuo ng binigay na value at inulit na tinuloy na bilang ng beses."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "gaya ng"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "isingit sa"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Nag singit ng item sa simula ng list."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Nag singit ng item sa tinukoy na posistion sa list."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Idagdag ang item sa huli ng isang list."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Isingit ang item ng walang pinipili sa isang list."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Pag set ng unang item sa isang list."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Pag set ng item sa tinukoy na position sa isang list."; +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 +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"] = "mali"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Nag babalik ng true or false."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "tama"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Nag babalik ng true kung ang pinasok ay parehong magkatumbas."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Nagbabalik ng true kung ang unang pinasok ay mas malaki kaysa pangalawang pinasok."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Nag babalik ng true kung ang unang pinasok ay mas malaki or katumbas ng pangalawang pinasok."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Nag babalik ng true kung ang unang pinasok ay maliit kaysa sa pangalawang pinasok."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Nag babalik ng true kung ang unang pinasok ay maliit sa o katumbas sa pangalawang pinasok."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Return true if both inputs are not equal to each other."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // 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 +Blockly.Msg["LOGIC_NULL"] = "blangko"; +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"] = "at"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "o"; +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"; // untranslated +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "kung mali"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "kung tama"; +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"] = "Return the sum of the two numbers."; // untranslated +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"] = "Return the product of the two numbers."; // untranslated +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Return the first number raised to the power of the second number."; // untranslated +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated +Blockly.Msg["MATH_CHANGE_TITLE"] = "baguhin %1 by %2"; +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 +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // 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"] = "is divisible by"; // untranslated +Blockly.Msg["MATH_IS_EVEN"] = "is even"; // untranslated +Blockly.Msg["MATH_IS_NEGATIVE"] = "ay negatibo"; +Blockly.Msg["MATH_IS_ODD"] = "is odd"; // untranslated +Blockly.Msg["MATH_IS_POSITIVE"] = "ay positibo"; +Blockly.Msg["MATH_IS_PRIME"] = "is prime"; // untranslated +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"] = "is whole"; // untranslated +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"] = "A number."; // untranslated +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "average of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "max of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "median of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "min of list"; // untranslated +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"] = "Return the largest number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Return the median number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Return the smallest number in the list."; // untranslated +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/Square_root"; // untranslated +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absolute"; // untranslated +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "square root"; // untranslated +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"] = "Return the natural logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Return the base 10 logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Return the negation of a number."; // untranslated +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_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"; // untranslated +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["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "Create variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE_TITLE"] = "New variable name:"; // untranslated +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // 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"] = "Create '%1'"; // untranslated +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/Subroutine"; // 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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "return"; // untranslated +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"] = "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"] = "Remove Comment"; // untranslated +Blockly.Msg["RENAME_VARIABLE"] = "Rename variable..."; // untranslated +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Rename all '%1' variables to:"; // untranslated +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "to %1 append text %2"; // 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"] = "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"] = "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_LAST"] = "get last letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "get random letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returns the letter at the specified position."; // untranslated +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Add an item to the text."; // untranslated +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"] = "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_OPERATOR_FIRST"] = "find first occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "find last occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "in text %1 %2 %3"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 is empty"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Returns true if the provided text is empty."; // untranslated +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"] = "print %1"; // untranslated +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_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // 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"] = "Today"; // untranslated +Blockly.Msg["UNDO"] = "Undo"; // untranslated +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // untranslated +Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "item"; // untranslated +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["VARIABLE_ALREADY_EXISTS"] = "A variable named '%1' already exists."; // untranslated +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/tlh.js b/js/msg/js/tlh.js new file mode 100644 index 0000000..5054a93 --- /dev/null +++ b/js/msg/js/tlh.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "QInHom chel"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "choH:"; +Blockly.Msg["CLEAN_UP"] = "ngoghmeyvaD tlhegh rurmoH"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "ngoghmey DejmoH"; +Blockly.Msg["COLLAPSE_BLOCK"] = "ngogh DejmoH"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "rItlh wa'"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "rItlh cha'"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "'ar"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "DuD"; +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"] = "Choose a colour from the palette."; // untranslated +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "rItlh vISaHbe'"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Choose a colour at random."; // untranslated +Blockly.Msg["COLOUR_RGB_BLUE"] = "chal rItlh"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "tI rItlh"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "'Iw rItlh"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "rItlh wIv"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Create a colour with the specified amount of red, green, and blue. All values must be between 0 and 100."; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "gho Haw'"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "gho taHqa'"; +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"] = "yIqIm! ghoDaq neH ngoghvam lo'laH vay'."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "ngIq Doch %1 ngaSbogh tetlh %2 nuDDI'"; +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"] = "togh %1 mung %2 ghoch %3 Do %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 +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"] = "pagh"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "pagh teHchugh"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "teHchugh"; +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"; // untranslated +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "ruch"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "%1-logh qaSmoH"; +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"] = "teHpa' qaSmoH"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "teHtaHvIS qaSmoH"; +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"] = "Hoch %1 ngoghmey Qaw'?"; +Blockly.Msg["DELETE_BLOCK"] = "ngogh Qaw'"; +Blockly.Msg["DELETE_VARIABLE"] = "Delete the '%1' variable"; // untranslated +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg["DELETE_X_BLOCKS"] = "%1 ngoghmey Qaw'"; +Blockly.Msg["DISABLE_BLOCK"] = "ngogh Qotlh"; +Blockly.Msg["DUPLICATE_BLOCK"] = "velqa' chenmoH"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +Blockly.Msg["ENABLE_BLOCK"] = "ngogh QotlhHa'"; +Blockly.Msg["EXPAND_ALL"] = "ngoghmey DejHa'moH"; +Blockly.Msg["EXPAND_BLOCK"] = "ngogh DejHa'moH"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Hur rar"; +Blockly.Msg["HELP"] = "QaH"; +Blockly.Msg["INLINE_INPUTS"] = "qoD rar"; +Blockly.Msg["IOS_CANCEL"] = "Cancel"; // untranslated +Blockly.Msg["IOS_ERROR"] = "Error"; // untranslated +Blockly.Msg["IOS_OK"] = "OK"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Add Input"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INPUTS"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Add"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Add Variable"; // untranslated +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Delete"; // untranslated +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "You can't use an empty variable name."; // untranslated +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Rename"; // untranslated +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Variable name"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "tetlh chIm"; +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"] = "tetlh"; +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"] = "tetlh ghom"; +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"] = "wa'DIch"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# Qav"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; +Blockly.Msg["LISTS_GET_INDEX_GET"] = "Suq"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "Suq vaj pej"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "Qav"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "Sahbe'"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "pej"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Returns the first item in a list."; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Returns the item at the specified position in a list."; // 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"] = "Removes and returns the item at the specified position in a list."; // 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"] = "Removes the item at the specified position in a list."; // 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"] = "mojaQ # Qav"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "mojaQ #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "mojaQ Qav"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "tetlhHom moHaq wa'DIch"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "tetlhHom moHaq # Qav"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "tetlhHom moHaq #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = "Suq"; +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Creates a copy of the specified portion of a list."; // untranslated +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 is the last item."; // untranslated +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 is the first item."; // untranslated +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "Doch sam wa'DIch"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "Doch sam Qav"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; // untranslated +Blockly.Msg["LISTS_INLIST"] = "tetlhDaq"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 chIm'a'"; +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"] = "chuq %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"] = "tetlh ghom %2 Dochmey %1 pus"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Creates a list consisting of the given value repeated the specified number of times."; // untranslated +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "Dos"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "lIH"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "choH"; +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"] = "Inserts the item at the specified position in a list."; // 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"] = "Sets the item at the specified position in a list."; // 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"] = "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"] = "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 +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "teH"; +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_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "yoymoH %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Returns true if the input is false. Returns false if the input is true."; // untranslated +Blockly.Msg["LOGIC_NULL"] = "paghna'"; +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"] = "'ej"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "qoj"; +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"] = "chov"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "teHbe'chugh"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "teHchugh"; +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"] = "+"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Return the sum of the two numbers."; // untranslated +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"] = "Return the product of the two numbers."; // untranslated +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Return the first number raised to the power of the second number."; // untranslated +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated +Blockly.Msg["MATH_CHANGE_TITLE"] = "choH %1 chel %2"; +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 +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "jon %1 bIng %2 Dung %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Constrain a number to be between the specified limits (inclusive)."; // untranslated +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "wav'a'"; +Blockly.Msg["MATH_IS_EVEN"] = "lang'a' mI'"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "bIng pagh"; +Blockly.Msg["MATH_IS_ODD"] = "ror'a' mI'"; +Blockly.Msg["MATH_IS_POSITIVE"] = "Dung pagh"; +Blockly.Msg["MATH_IS_PRIME"] = "potlh'a' mI'"; +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"] = "ngoHlaHbe''a'"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated +Blockly.Msg["MATH_MODULO_TITLE"] = "ratlwI' SIm %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Return the remainder from dividing the two numbers."; // untranslated +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; // untranslated +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "A number."; // untranslated +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "beQwI' SIm tetlh"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "tInwI''a' SIm tetlh"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "beQwI'botlh SIm tetlh"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "machwI''a' SIm tetlh"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "beQwI' motlh SIm tetlh"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "SaHbe' SIm tetlh"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "motlhbe'wI' SIm tetlh"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "chelwI' SIm tetlh"; +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"] = "Return the largest number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Return the median number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Return the smallest number in the list."; // untranslated +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"] = "^"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "mI'HomSaHbe'"; +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"] = "ngoH mI'SaHbe' bIng %1 Dung %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"] = "ngoH"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "bIng ngoH"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "Dung ngoH"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Round a number up or down."; // untranslated +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; // untranslated +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "Dung pagh choH"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "cha'DIch wav"; +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"] = "Return the natural logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Return the base 10 logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Return the negation of a number."; // untranslated +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_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_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["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "lIw chu'..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "lIw chu' pong:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "mu'tlhegh chaw'"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "qel:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +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"] = "mIw yIDel..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "mIw"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "ruch"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Creates a function with no output."; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "chegh"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Creates a function with an output."; // untranslated +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "ghuHmoHna': qelwI' cha'logh chen."; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "mIwna' wew"; +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"] = "ghoHmoHna': ngoghvam ngaSbe' mIwDaq."; +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:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "chel %1 ghItlh %2"; +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"] = "machchoH"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "DojchoH"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "tInchoH"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Return a copy of the text in a different case."; // untranslated +Blockly.Msg["TEXT_CHARAT_FIRST"] = "mu'Hom wa'DIch"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "mu'Hom # Qav"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "mu'Hom #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "mu'Hom Qav"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "mu'Hom SaHbe'"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = "Suq"; +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returns the letter at the specified position."; // untranslated +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Add an item to the text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "ghom"; +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"] = "mojaq mu'Hom # Qav"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "mojaq mu'Hom #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "mojaq mu'Hom Qav"; +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"] = "ghItlhDaq"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "ghItlhHom moHaq mu'Hom wa'DIch"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "ghItlhHom moHaq mu'Hom # Qav"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "ghItlhHom moHaq mu'Hom #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = "Suq"; +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_OPERATOR_FIRST"] = "ghItlh wa'DIch Sam"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "ghItlh Qav Sam"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "ghItlhDaq %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 chIm'a'"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Returns true if the provided text is empty."; // untranslated +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "ghItlh ghom"; +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"] = "chuq %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"] = "maq %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"] = "mI' tlhob 'ej maq"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "ghItln tlhob 'ej maq"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // 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"] = "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"] = "DaHjaj"; +Blockly.Msg["UNDO"] = "vangHa'"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // untranslated +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 +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Returns the value of this variable."; // untranslated +Blockly.Msg["VARIABLES_SET"] = "choH %1 %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "chel 'Suq %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["VARIABLE_ALREADY_EXISTS"] = "A variable named '%1' already exists."; // untranslated +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/tr.js b/js/msg/js/tr.js new file mode 100644 index 0000000..a4c7eb4 --- /dev/null +++ b/js/msg/js/tr.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Yorum Ekle"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "'%1' değişkeni, '%2' fonksiyonunun tanımının bir parçası olduğu için silinemez"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Değeri değiştir:"; +Blockly.Msg["CLEAN_UP"] = "Blokları Temizle"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Daraltılmış bloklar uyarı içerir."; +Blockly.Msg["COLLAPSE_ALL"] = "Blokları Daralt"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Bloğu Daralt"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "1. renk"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "2. renk"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg["COLOUR_BLEND_RATIO"] = "oran"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "karıştır"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Verilen bir orana (0.0 - 1.0) bağlı olarak iki rengi karıştırır."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://tr.wikipedia.org/wiki/Renk"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Paletten bir renk seç."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "rastgele renk"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Rastgele bir renk seç."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "mavi"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "yeşil"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg["COLOUR_RGB_RED"] = "kırmızı"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "renk değerleri"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Kırmızı, yeşil ve mavinin belirli miktarıyla bir renk oluştur. Tüm değerler 0 ile 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öngüden çık"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "döngünün sonraki adımından devam et"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "İçeren döngüden çık."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Bu döngünün geri kalanını atlayın ve sonraki adım ile devam edin."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Uyarı: Bu blok sadece bir döngü içinde kullanılabilir."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +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"] = "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 +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "If bloğuna ekle, kaldır veya yeniden düzenleme yap."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "değilse"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "değilse eğer"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "eğer"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Eğer değişken true, yani gerçekleşmiş ise ardından gelen işlemi yerine getir."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Eğer değişken true, yani gerçekleşiyor ise ilk bloktaki işlemleri yerine getir. Aksi halde ikinci bloktaki işlemleri yerine getir."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Eğer ilk değişken true, yani koşul gerçekleşmiş ise ilk blok içerisindeki işlemi gerçekleştir. Eğer ikinci değişken true ise, ikinci bloktaki işlemi gerçekleştir."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Eğer ilk değer true, yani olumlu ise, ilk bloktaki işlemi gerçekleştir. İlk değer true değil ama ikinci değer true ise, ikinci bloktaki işlemi gerçekleştir. Eğer değerlerin hiçbiri true değil ise son bloktaki işlemi gerçekleştir."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://tr.wikipedia.org/wiki/For_döngüsü"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "yap"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "%1 kez tekrarla"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Bazı işlemleri birkaç kez yap."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "kadar tekrarla"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "tekrar ederken"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Bir değer yanlış olduğunda bazı beyanlarda bulun."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Bir değer doğru olduğunda bazı beyanlarda bulun."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Tüm %1 blokları silinsin mi?"; +Blockly.Msg["DELETE_BLOCK"] = "Bloğu Sil"; +Blockly.Msg["DELETE_VARIABLE"] = "'%1' değişkenini silmek istiyor musunuz?"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "'%2' değişkeninin %1 kullanımını silmek istiyor musunuz?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "%1 Bloğunu Sil"; +Blockly.Msg["DISABLE_BLOCK"] = "Bloğu Devre Dışı Bırak"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Yinelenen"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Yinelenen Yorum"; +Blockly.Msg["ENABLE_BLOCK"] = "Bloğu Etkinleştir"; +Blockly.Msg["EXPAND_ALL"] = "Blokları Genişlet"; +Blockly.Msg["EXPAND_BLOCK"] = "Bloğu Genişlet"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Harici Girişler"; +Blockly.Msg["HELP"] = "Yardım"; +Blockly.Msg["INLINE_INPUTS"] = "Satır içi Girişler"; +Blockly.Msg["IOS_CANCEL"] = "İptal"; +Blockly.Msg["IOS_ERROR"] = "Hata"; +Blockly.Msg["IOS_OK"] = "Tamam"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Giriş Ekle"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Açıklamalara izin ver"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Bu fonksiyonda mükerrer girdi tanımlı."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "GİRİŞLER"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Ekle"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Değişken Ekle"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Sil"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Değişken adı kısmı boş bırakılamaz."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Yeniden adlandır"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Değişken adı"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "boş liste oluştur"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Veri kaydı içermeyen 0 uzunluğunda bir liste döndürür"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "liste"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Bu liste bloğunu yeniden yapılandırmak için bölüm ekleyin, kaldırın veya yeniden sıralayın."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "ile liste oluştur"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Listeye bir öğe ekleyin."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "İstediğiniz sayıda öğe içeren bir liste oluşturun."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "ilk"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# sonundan"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "# Kare"; +Blockly.Msg["LISTS_GET_INDEX_GET"] = "al"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "al ve kaldır"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "son"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "rastgele"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "kaldır"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Listedeki ilk öğeyi döndürür."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Listede belirtilen konumda bulunan öğeyi döndürür."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Listedeki son öğeyi döndürür."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Listedeki rastgele bir öğeyi döndürür."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Listedeki ilk öğeyi kaldırır ve döndürür."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Öğeyi bir listede belirtilen konumda kaldırır ve döndürür."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Listedeki son öğeyi kaldırır ve döndürür."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Listedeki rastgele bir öğeyi kaldırır ve döndürür."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Listedeki ilk öğeyi kaldırır."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Listede belirtilen konumda bulunan öğeyi kaldırır."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Listedeki son öğeyi kaldırır."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Listedeki rastgele bir öğeyi kaldırır."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "sonuna kadar #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "#"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "sona"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "ilk önce alt listeyi al"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "# listesinden alt listeyi al"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "# listesinden alt liste al"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Listenin belirtilen bölümünün bir kopyasını oluşturur."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 son öğedir."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 ilk öğedir."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "öğenin ilk oluşumunu 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 tekrarlamasını bul"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Listedeki öğenin ilk/son oluşumunun dizinini döndürür. Öğe bulunmazsa %1 değerini 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ş"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Liste boşsa true değerini döndürür."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "%1 uzunluğu"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Bir listenin uzunluğunu döndürür."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "%1 tekrarlanan %2 öğeyle liste oluştur"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Belirtilen sayıda tekrarlanan belirli bir değerden oluşan bir liste oluşturur."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "%1 ters çevirin"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Listenin bir kopyasını ters çevirin."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "olarak"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "yerleştir"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "ayarla"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Öğeyi listenin başına ekler."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Öğeyi bir listede belirtilen konuma ekler."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Öğeyi listenin sonuna ekleyin."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Öğeyi bir listeye rastgele ekler."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Listedeki ilk öğeyi ayarlar."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Öğeyi bir listede belirtilen konuma ayarlar."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Listedeki son öğeyi ayarlar."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Listede rastgele bir öğe ayarlar."; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "artan"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "azalan"; +Blockly.Msg["LISTS_SORT_TITLE"] = "sıra %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Listenin bir kopyasını sıralayın."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alfabetik, görmezden gelin"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "sayısal"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alfabetik"; +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"] = "metinden liste yap"; +Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "listeden metin yap"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Metin listesini bir sınırlayıcı ile ayrılmış tek bir metinde birleştirin."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Metni, her bir sınırlayıcıyı kırarak bir metin listesine bölün."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "sınırlayıcı ile"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "false"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "True veya false değerini döndürür."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "true"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://tr.wikipedia.org/wiki/Eşitsizlikler"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Her iki giriş de birbirine eşitse true değerini döndürün."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "İlk giriş ikinci girişten büyükse true değerini döndürün."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "İlk giriş ikinci girişten büyük veya ona eşitse true değerini döndürün."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "İlk giriş ikinci girişten küçükse true değerini döndürün."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "İlk giriş ikinci girişten küçük veya ona eşitse true değerini döndürün."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Her iki giriş de birbirine eşit değilse true değerini döndürün."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "%1 değil"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Giriş yanlışsa true değerini döndürür. Giriş doğruysa false değerini döndürür."; +Blockly.Msg["LOGIC_NULL"] = "boş"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Boş değerini döndürür."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "ve"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "veya"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Her iki giriş de doğruysa true döndür."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Girişlerden en az biri doğru olduğunda true değerini döndürün."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "deneme"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "if false"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "if true"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "'test' durumunu kontrol edin. Koşul true olursa, 'if true' değerini döndürür; aksi takdirde 'if false' değerini döndürür."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://tr.wikipedia.org/wiki/Aritmetik"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "İki sayının toplamını döndürün."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "İki sayının bölümünü döndürün."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "İki sayının farkını döndürün."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "İki sayının çarpımını döndürün."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Yükseltilen ilk sayıyı ikinci sayının gücüne döndürün."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://tr.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2, X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "-180'den 180'e derece cinsinden nokta (X, Y) arktanjantını döndürün."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://tr.wikipedia.org/wiki/Programlama_deyimi#Sayacı_artırma"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "%1 %2 göre değiştir"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "'%1' değişkenine bir sayı ekle."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://tr.wikipedia.org/wiki/Matematiksel_sabit"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Ortak sabitlerden birini döndür: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (sonsuzluk)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "%1 en düşük %2 en yüksek %3 ile sınırla"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Bir sayıyı belirtilen sınırlar arasında (dahil) ile sınırlandırın."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "bölünebilir"; +Blockly.Msg["MATH_IS_EVEN"] = "çift"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "negatif"; +Blockly.Msg["MATH_IS_ODD"] = "tek"; +Blockly.Msg["MATH_IS_POSITIVE"] = "pozitif"; +Blockly.Msg["MATH_IS_PRIME"] = "asal"; +Blockly.Msg["MATH_IS_TOOLTIP"] = "Bir sayının çift, tek, asal, bütün, pozitif, negatif veya belirli bir sayıya bölünebilir olup olmadığını kontrol edin. True veya false değerini döndürür."; +Blockly.Msg["MATH_IS_WHOLE"] = "bütün"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://tr.wikipedia.org/wiki/Modulo_işlemi"; +Blockly.Msg["MATH_MODULO_TITLE"] = "%1 ÷ %2 geri kalan kısım"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Kalanı iki sayıyı bölmekten döndürün."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "x"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://tr.wikipedia.org/wiki/Numara"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Sayı."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "liste ortalaması"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "maksimum liste"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "listenin medyanı"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "listenin en küçüğü"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "liste modları"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "listenin rastgele öğesi"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "listenin standart sapması"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "listenin toplamı"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Listedeki sayısal değerlerin ortalamasını (aritmetik ortalama) döndürün."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Listedeki en büyük sayıyı döndürün."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Listeden ortanca numarayı döndürün."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Listedeki en küçük sayıyı döndür."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Listedeki en yaygın öğenin bir listesini döndürür."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Listeden rastgele bir öğe döndürün."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Listenin standart sapmasını döndürün."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Listedeki tüm sayıların toplamını döndürün."; +Blockly.Msg["MATH_POWER_SYMBOL"] = "üst alma"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://tr.wikipedia.org/wiki/Rastgele_sayı_üretimi"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "rastgele kesir"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "0.0 (dahil) ve 1.0 (hariç) arasında rastgele bir kesir döndürün."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://tr.wikipedia.org/wiki/Rastgele_sayı_üretimi"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "%1 ile %2 rastgele tam sayı üretin"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Belirtilen iki sınır arasında rastgele bir tamsayı döndürün."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://tr.wikipedia.org/wiki/Yuvarlatma"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "yuvarla"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "aşağı yuvarla"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "yukarı yuvarla"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Bir sayıyı yukarı veya aşağı yuvarlayın."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://tr.wikipedia.org/wiki/Karekök"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "kesin"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "kare kök"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Bir sayının mutlak değerini döndürür."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "E'yi bir sayının gücüne döndür."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Bir sayının doğal logaritmasını döndür."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Bir sayının 10 logaritmasını geri döndür."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Bir sayının reddini döndür."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "10'u sayının gücüne döndür."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Bir sayının karekökünü döndürür."; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "tire"; +Blockly.Msg["MATH_TRIG_ACOS"] = "akosünüs"; +Blockly.Msg["MATH_TRIG_ASIN"] = "asinüs"; +Blockly.Msg["MATH_TRIG_ATAN"] = "atanjant"; +Blockly.Msg["MATH_TRIG_COS"] = "kosünüs"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://tr.wikipedia.org/wiki/Trigonometrik_fonksiyonlar"; +Blockly.Msg["MATH_TRIG_SIN"] = "Sinüs"; +Blockly.Msg["MATH_TRIG_TAN"] = "tanjant"; +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Bir sayının arkosinini döndürün."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Bir sayının ark sinüsünü döndürün."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Bir sayının arktanjantını döndürün."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Bir derecenin kosinüsünü döndürün (radyan değil)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Sinüsü bir derece döndürün (radyan değil)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Bir derecenin tanjantını döndürün (radyan değil)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Renk değişkeni oluştur..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Sayı değişkeni oluştur..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Dizi değişkeni oluştur..."; +Blockly.Msg["NEW_VARIABLE"] = "Değişken oluştur..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Yeni değişken ismi:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Yeni değişken tipi:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "ifadelere izin ver"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "ile:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Alt program"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Kullanıcı tanımlı '%1' işlevini çalıştırın."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Alt program"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Kullanıcı tanımlı '%1' işlevini çalıştırın ve çıkışını kullanın."; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "ile:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "'%1' oluştur"; +Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Bu işlevi açıklayın..."; +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"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "e"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Çıkışı olmayan bir işlev oluşturur."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "dönüş"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Çıkışa sahip bir işlev oluşturur."; +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Uyarı: Bu işlev yinelenen parametrelere sahiptir."; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Vurgulama işlevi tanımı"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Bir değer true ise, ikinci bir değer döndürün."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Uyarı: Bu blok yalnızca bir işlev tanımı içinde kullanılabilir."; +Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "giriş adı:"; +Blockly.Msg["PROCEDURES_MUTATORARG_TOOLTIP"] = "İşleve bir giriş ekleyin."; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TITLE"] = "girişler"; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TOOLTIP"] = "Bu işleve giriş ekleyin, kaldırın veya 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şkenini yeniden adlandır:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "%1 için %2 metnini ekle."; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "'%1' değişkenine bir metin ekleyin."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "küçük harfe"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "Başlık Vakasına"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "ÜST DURUMA"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Metnin bir kopyasını farklı bir durumda döndürün."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "ilk harfini al"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "# sona harfleri al"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "# harfini al"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "son harfi al"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "rastgele harf al"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; +Blockly.Msg["TEXT_CHARAT_TITLE"] = "%1 içinde %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Belirtilen konumdaki harfi döndürür."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "%1 içinde %2 say."; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Bazı metnin başka bir metnin içinde kaç kez oluştuğunu sayın."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Metne bir öğe ekleyin."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "katıl"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Bu metin bloğunu yeniden yapılandırmak için bölüm ekleyin, kaldırın veya yeniden sıralayın."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "en başından # harfi"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "# harfe"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "son harfe"; +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"] = "metinde"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "ilk harfinden alt dize al"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "# harfinden alt dize al"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "# harfinden alt dize al"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Metnin belirli bir bölümünü döndürür."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "metnin ilk oluşumunu bul"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "metnin son tekrarlamasını bul"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "%1 metni içinde %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "İkinci metindeki ilk metnin ilk/son oluşumunun dizinini döndürür. Metin bulunmazsa %1 değerini döndürür."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 boş"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Sağlanan metin boşsa true değerini döndürür."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "ile metin oluştur"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "İstediğiniz sayıda öğeyi birleştirerek bir metin parçası oluşturun."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "%1 uzunluğu"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Sağlanan metindeki harflerin (boşluklar dahil) sayısını döndürür."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "%1 yaz"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Belirtilen metni, sayıyı veya başka bir değeri yazdırın."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Bir numara için kullanıcı sor."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Bazı metinler için kullanıcı sor."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "mesaj içeren numara istemi"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "mesaj içeren metin istemi"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "%1 yerine %3 içindeki %2 ile değiştir"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Bazı metnin tüm tekrarlarını başka bir metnin içinde değiştirin."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "%1 ters çevirin"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Metindeki karakterlerin sırasını tersine çevirir."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://tr.wikipedia.org/wiki/Dize_(bilgisayar_bilimi)"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Bir harf, kelime veya metin satırı."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "her iki tarafından da kırpın"; +Blockly.Msg["TEXT_TRIM_OPERATOR_LEFT"] = "sol tarafındaki boşlukları kırpın"; +Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "sağ tarafındaki boşlukları kırp"; +Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "Bir veya her iki uçtan boşluklar kaldırılmış olarak metnin bir kopyasını döndürün."; +Blockly.Msg["TODAY"] = "Bugün"; +Blockly.Msg["UNDO"] = "Geri al"; +Blockly.Msg["UNNAMED_KEY"] = "isimsiz"; +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 +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Bu değişkenin değerini döndürür."; +Blockly.Msg["VARIABLES_SET"] = "%1 %2 ayarla"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "'get %1' oluştur"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Bu değişkeni girişe eşit olacak şekilde ayarlar."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "'%1' isimli değişken adı zaten var."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "'%1' isimli değişken '%2' tipli başka bir değişkende tanımlı."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Çalışma Alanı"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Bir şeyler söyle..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/ug-arab.js b/js/msg/js/ug-arab.js new file mode 100644 index 0000000..203e8d7 --- /dev/null +++ b/js/msg/js/ug-arab.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "ئىزاھات قوشۇش"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "قىممەت ئۆزگەرتىش:"; +Blockly.Msg["CLEAN_UP"] = "بۆلەكنى رەتلەش"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "نىسبەت"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "ئارىلاش"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Blends two colours together with a given ratio (0.0 - 1.0)."; // untranslated +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://zh.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"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "قىزىل"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "رەڭگى"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Create a colour with the specified amount of red, green, and blue. All values must be between 0 and 100."; // untranslated +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"] = "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"] = "بۇ بىلمەيمىز جۈملە بۆلىكى قوشۇلۇپ بىر if شەرتى ."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "ئەڭ ئاخىرقى قوشۇش ، ھەممە ئەھۋالنى ئۆز ئىچىگە ئالىدۇ بايرىمىدا بىلمەيمىز ifپارچىلىرى ."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "كۆپۈيۈپ كىتىدۇ، ئۆچۈرۈش ياكى قايتا تىزىلغان بايرام « if ( سۆزىنىڭ پارچە قايتىدىن تەقسىملەش ."; +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://zh.wikipedia.org/wiki/Forئايلىنىش"; +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"] = "ھەممىنى ئۆچۈرۈش %1 پارچىمۇ؟"; +Blockly.Msg["DELETE_BLOCK"] = "بۆلەك ئۆچۈرۈش"; +Blockly.Msg["DELETE_VARIABLE"] = "“%1” ئۆزگەرگۈچى مىقدارنى ئۆچۈرۈش"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "ئۆچۈرۈش “%2” ئۆزگەرگۈچى مىقدار%1 ئىشلىتىلىش ئورنى بارمۇ؟"; +Blockly.Msg["DELETE_X_BLOCKS"] = "بۆلەك %1 نى ئۆچۈرۈش"; +Blockly.Msg["DISABLE_BLOCK"] = "چەكلەنگەن بۆلەك"; +Blockly.Msg["DUPLICATE_BLOCK"] = "كۆچۈرۈش"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +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["IOS_CANCEL"] = "ۋاز كەچ"; +Blockly.Msg["IOS_ERROR"] = "خاتالىق"; +Blockly.Msg["IOS_OK"] = "ماقۇل"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ كىرگۈزۈپ قوشۇش"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "كېلىشىمگە قوشۇلۇش"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "بۇنىڭدا مەزمۇننى قايتا كىرگۈزۈش ئىقتىدارى بار ."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "كىرگۈزۈش"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "قوشۇش"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ ئۆزگەرگۈچى مىقدار قوشۇش"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "ئۆچۈرۈش"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "سىز ئۆزگەرگۈچى مىقدار نامى ئىشلىتىشكە بولمايدۇ ."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "ئىسىم ئۆزگەرتىش"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "ئۆزگەرگۈچى مىقدارنىڭ نامى"; +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"] = "list"; // untranslated +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"] = "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"] = "# from end"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_GET"] = "قولغا كەلتۈرۈش"; +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"] = "Returns the item at the specified position in a list."; // 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"] = "Removes and returns the item at the specified position in a list."; // 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"] = "Removes the item at the specified position in a list."; // 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_FROM_END_TOOLTIP"] = "%1 is the last item."; // untranslated +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 is the first item."; // 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 %1 if item is not found."; // untranslated +Blockly.Msg["LISTS_INLIST"] = "in list"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 is empty"; // untranslated +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_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "as"; // untranslated +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"] = "Inserts the item at the specified position in a list."; // 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"] = "Sets the item at the specified position in a list."; // 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"] = "يۇقىرىغا"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "تۆۋەنگە"; +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"] = "ھەرب بويىچە تىزىل، چوڭ كىچىك يېزىلىش ھېساپ قىلىنمايدۇ"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "سان بويىچە تىزىل"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = " ھەرپ بويىچە تىزىل"; +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://zh.wikipedia.org/wiki/ تەڭ ئەمەس"; +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"] = "Returns true if the input is false. Returns false if the input is true."; // untranslated +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"] = "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"] = "سىناق"; +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://zh.wikipedia.org/wiki/ئارىفمېتىكىلىق"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Return the sum of the two numbers."; // untranslated +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"] = "Return the product of the two numbers."; // untranslated +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Return the first number raised to the power of the second number."; // untranslated +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://zh.wikipedia.org/wiقوشۇش"; +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://zh.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_(graphics)"; // 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://zh.wikipedia.org/wiki/مودېل ھېسابى"; +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://zh.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"] = "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"] = "Return the largest number in the list."; // untranslated +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://zh.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"] = "Round a number up or down."; // untranslated +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://zh.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"] = "Return the natural logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Return the base 10 logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Return the negation of a number."; // untranslated +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_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://zh.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["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "ئۆزگەرگۈچى مىقدار ... قۇرۇش"; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "يېڭى ئۆزگەرگۈچى مىقدار نامى:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // 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"] = "Create '%1'"; // untranslated +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/Subroutine"; // 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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "return"; // untranslated +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"] = "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"] = "بارلىق بۆلەك “%1\" ئۆزگەرگۈچى مىقدار قايتا ناملىنىپ :"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "to %1 append text %2"; // 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"] = "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"] = "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_LAST"] = "get last letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "get random letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returns the letter at the specified position."; // untranslated +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // 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_OPERATOR_FIRST"] = "find first occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "find last occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "in text %1 %2 %3"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 is empty"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Returns true if the provided text is empty."; // untranslated +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"] = "print %1"; // untranslated +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_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // 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"] = "يېنىۋال"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // 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["VARIABLE_ALREADY_EXISTS"] = "ئىسم مەۋجۇت “%1” ئۆزگەرگۈچى"; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "ئىسىملىك“%1” ئۆزگەرگۈچى مىقدار مەۋجۇت بولۇپ تۇرىدۇ ، لېكىن يەنە بىر ئۆزگەرگۈچى مىقدار تىپى بولۇش سۈپىتى بىلەن “%2” مەۋجۇت ."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/uk.js b/js/msg/js/uk.js new file mode 100644 index 0000000..2a2e151 --- /dev/null +++ b/js/msg/js/uk.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Додати коментар"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Неможливо видалити змінну '%1', тому що це частина визначення функції '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Змінити значення:"; +Blockly.Msg["CLEAN_UP"] = "Очистити блоки"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Звернуті блоки містять попередження."; +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/"; +Blockly.Msg["COLOUR_BLEND_RATIO"] = "співвідношення"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "змішати"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Змішує два кольори разом у вказаному співвідношені (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://uk.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"; +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"] = "рахувати з %1 від %2 до %3 через %4"; +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://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"; +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_VARIABLE"] = "Вилучити змінну '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Вилучити %1 використання змінної '%2'?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Видалити %1 блоків"; +Blockly.Msg["DISABLE_BLOCK"] = "Вимкнути блок"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Дублювати"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Дублювати примітку"; +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["IOS_CANCEL"] = "Скасувати"; +Blockly.Msg["IOS_ERROR"] = "Помилка"; +Blockly.Msg["IOS_OK"] = "Готово"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Додати вхідну змінну"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Дозволити оператори"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "У цієї функції є вхідні змінні, що дублюються."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "ВХОДИ"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Додати"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Додати змінну"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Видалити"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Ви не можете використовувати порожню назву змінної."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Перейменувати"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Назва змінної"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +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_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"] = "створити список з"; +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"] = "# з кінця"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; +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"] = "-ий."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Повертає перший елемент списку."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Повертає елемент у заданій позиції у списку."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Повертає останній елемент списку."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Повертає випадковий елемент списку."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Видаляє і повертає перший елемент списку."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Видаляє і повертає елемент у заданій позиції у списку."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Видаляє і повертає останній елемент списку."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Видаляє і повертає випадковий елемент списоку."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Вилучає перший елемент списку."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Вилучає зі списку елемент у вказаній позиції."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Вилучає останній елемент списку."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Вилучає випадковий елемент списку."; +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"] = "отримати вкладений список з першого"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "отримати вкладений список від # з кінця"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "отримати вкладений список з #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = "символу."; +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Створює копію вказаної частини списку."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 - це останній елемент."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 - це перший елемент."; +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"] = "Повертає індекс першого/останнього входження елемента у списку. Повертає %1, якщо елемент не знайдено."; +Blockly.Msg["LISTS_INLIST"] = "у списку"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 є порожнім"; +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"] = "Повертає довжину списку."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "створити список з елемента %1 повтореного %2 разів"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Створює список, що складається з заданого значення повтореного задану кількість разів."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "розвернути %1"; +Blockly.Msg["LISTS_REVERSE_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_SET"] = "встановити"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Вставляє елемент на початок списку."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Вставка елемента у вказану позицію списку."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Додає елемент у кінці списку."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Випадковим чином вставляє елемент у список."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Задає перший елемент списку."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Задає елемент списку у вказаній позиції."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "за зростанням"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "за спаданням"; +Blockly.Msg["LISTS_SORT_TITLE"] = "сортувати %3 %1 %2"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Сортувати копію списку."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "за абеткою, ігноруючи регістр"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "як числа"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "за абеткою"; +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"] = "зробити зі списку текст"; +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"] = "Повертає значення істина або хибність."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "істина"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://uk.wikipedia.org/wiki/Нерівність"; +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"; +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:"; +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://uk.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_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 по X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Повертає арктангенс точки (X, Y) у градусах від -180 до 180."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.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://uk.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_(graphics)"; // 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://uk.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://uk.wikipedia.org/wiki/Число"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Число."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = "http://www.mapleprimes.com/questions/100441-Applying-Function-To-List-Of-Numbers"; +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://uk.wikipedia.org/wiki/Генерація_випадкових_чисел"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "випадковий дріб"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Повертає випадковий дріб від 0,0 (включно) та 1.0 (не включно)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://uk.wikipedia.org/wiki/Генерація_випадкових_чисел"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "випадкове ціле число від %1 до %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Повертає випадкове ціле число між двома заданими межами включно."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://uk.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://uk.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"] = "Повертає e у степені."; +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://uk.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["NEW_COLOUR_VARIABLE"] = "Створити колірну змінну..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Створити числову змінну..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Створити рядкову змінну..."; +Blockly.Msg["NEW_VARIABLE"] = "Створити змінну..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Нова назва змінної:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Тип нової змінної:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = "-ий."; +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "дозволити дії"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "з:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://uk.wikipedia.org/wiki/Підпрограма"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Запустити користувацьку функцію \"%1\"."; +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"] = "Опишіть цю функцію..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = "блок тексту"; +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://uk.wikipedia.org/wiki/Підпрограма"; +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "щось зробити"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "до"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Створює функцію без виводу."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://uk.wikipedia.org/wiki/Підпрограма"; +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"; +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\" до:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "до %1 додати текст %2"; +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"] = "Великі Перші Букви"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "до ВЕРХНЬОГО регістру"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "В іншому випадку повертає копію тексту."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "отримати перший символ"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "отримати символ # з кінця"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "отримати символ #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; +Blockly.Msg["TEXT_CHARAT_LAST"] = "отримати останній символ"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "отримати випадковий символ"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = "-ий."; +Blockly.Msg["TEXT_CHARAT_TITLE"] = "з тексту %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Повертає символ у зазначеній позиції."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "кількість %1 в %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Підраховує, скільки разів деякий текст з'являється в іншому тексті."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Додати елемент до тексту."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "приєднати"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Додайте, вилучіть або змініть порядок секцій для переналаштування текстового блоку."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "до символу # з кінця"; +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"] = "отримати підрядок від першого символу"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "отримати підрядок від символу # з кінця"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "отримати підрядок від символу #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = "-ого."; +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Повертає заданий фрагмент тексту."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "знайти перше входження тексту"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "знайти останнє входження тексту"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "у тексті %1 %2 %3."; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Повертає індекс першого/останнього входження першого тексту в другий. Повертає %1, якщо текст не знайдено."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 є порожнім"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Повертає істину, якщо вказаний текст порожній."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_8.html"; +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"] = "Надрукувати заданий текст, числа або інші значення."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Запитати у користувача число."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Запитати у користувача деякий текст."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "запит числа з повідомленням"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "запит тексту з повідомленням"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "замінити %1 на %2 в %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Замінює всі входження деякого тексту іншим текстом."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "розвернути %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Змінює на протилежний порядок символів у тексті."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://uk.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_LEFT"] = "вилучити пропуски з лівого боку"; +Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "вилучити пропуски з правого боку"; +Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "Повертає копію тексту з вилученими пропусками з одного або обох кінців."; +Blockly.Msg["TODAY"] = "Сьогодні"; +Blockly.Msg["UNDO"] = "Скасувати"; +Blockly.Msg["UNNAMED_KEY"] = "без назви"; +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_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["VARIABLE_ALREADY_EXISTS"] = "Змінна з назвою '%1' вже існує."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Змінна з назвою '%1' вже існує в іншому типі: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Робоча область Blockly"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Скажіть щось..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/ur.js b/js/msg/js/ur.js new file mode 100644 index 0000000..0218c54 --- /dev/null +++ b/js/msg/js/ur.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "کمنٹ کریں"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "متغیر '٪ 1' کو حذف نہیں کر سکتا کیونکہ یہ فنکشن کی تعریف کا حصہ ہے '٪ 2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "ویلیو تبدیل کریں:"; +Blockly.Msg["CLEAN_UP"] = "بلاکس صاف کریں"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "ریشیو"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "مرکب"; +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"] = "https://www.december.com/html/spec/colorpercompact.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"] = "continue with next iteration of loop"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "مشتمل لوپ کے باہر توڑ."; +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"] = "انتباہ: اس بلاک کو صرف لوپ میں استعمال کیا جاسکتا ہے۔"; +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"] = "%1 سے %2 سے %3 تک %4 کے ساتھ گنتی کریں"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "کیا چر '%1' ابتدا عدد سے اختتام عدد تک मानों کو لیتا ہے، निर्दिष्ट अंतराल کے تحت گنتی کرتا ہے، اور निर्दिष्ट रुकावटों کو کرتا ہے۔"; +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"] = "اگر ایک ویلیو صحیح ہے، تو کچھ سٹیٹمنٹ کریں"; +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"] = "کچھ جملوں کو کہیں مرتبہ کریں۔"; +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_VARIABLE"] = "'٪ 1' متغیر کو حذف کریں"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "'٪ 2' متغیر کے٪ 1 استعمال کو حذف کریں؟"; +Blockly.Msg["DELETE_X_BLOCKS"] = "%1 بلاکوں کو حذف کریں"; +Blockly.Msg["DISABLE_BLOCK"] = "بلاک کو غیرفعال کریں"; +Blockly.Msg["DUPLICATE_BLOCK"] = "ڈپلیکیٹ"; +Blockly.Msg["DUPLICATE_COMMENT"] = " ہو بہو تبصرہ"; +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["IOS_CANCEL"] = "Cancel"; // untranslated +Blockly.Msg["IOS_ERROR"] = "Error"; // untranslated +Blockly.Msg["IOS_OK"] = "OK"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Add Input"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "INPUTS"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Add"; // untranslated +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Add Variable"; // untranslated +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Delete"; // untranslated +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "You can't use an empty variable name."; // untranslated +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Rename"; // untranslated +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Variable name"; // untranslated +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"] = "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"] = "پہلے آئٹم کو فہرست میں لوٹائے"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Returns the item at the specified position in a list."; // 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"] = "Removes and returns the item at the specified position in a list."; // 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"] = "Removes the item at the specified position in a list."; // 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_FROM_END_TOOLTIP"] = "%1 is the last item."; // untranslated +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 is the first item."; // 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 %1 if item is not found."; // untranslated +Blockly.Msg["LISTS_INLIST"] = "فہرست میں"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 is empty"; // untranslated +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_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "Inserts the item at the specified position in a list."; // 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"] = "فہرست میں پہلا آئٹم کا تعین کریں"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Sets the item at the specified position in a list."; // 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"] = "Returns either true or false."; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "سچ"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Return true if both inputs equal each other."; // 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_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_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"] = "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"] = "ٹیسٹ"; +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"] = "Return the sum of the two numbers."; // untranslated +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"] = "Return the product of the two numbers."; // untranslated +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Return the first number raised to the power of the second number."; // untranslated +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +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"] = "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 +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // 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"] = "is divisible by"; // untranslated +Blockly.Msg["MATH_IS_EVEN"] = "is even"; // untranslated +Blockly.Msg["MATH_IS_NEGATIVE"] = "is negative"; // untranslated +Blockly.Msg["MATH_IS_ODD"] = "is odd"; // untranslated +Blockly.Msg["MATH_IS_POSITIVE"] = "is positive"; // untranslated +Blockly.Msg["MATH_IS_PRIME"] = "is prime"; // untranslated +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"] = "is whole"; // untranslated +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"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "ایک نمبر."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "average of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "max of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "median of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "min of list"; // untranslated +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"] = "Return the largest number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Return the median number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Return the smallest number in the list."; // untranslated +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/Square_root"; // untranslated +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"] = "Return the natural logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Return the base 10 logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Return the negation of a number."; // untranslated +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_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"; // untranslated +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["NEW_COLOUR_VARIABLE"] = "رنگ متغیر بنائیں"; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "عدد متغیر بناییں"; +Blockly.Msg["NEW_STRING_VARIABLE"] = "متغیر بنائیں String"; +Blockly.Msg["NEW_VARIABLE"] = "متغیر بنائیں"; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "نیا ویریابل نام:"; +Blockly.Msg["NEW_VARIABLE_TYPE_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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // 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"] = "Create '%1'"; // untranslated +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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "کچھ کرو"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "کو"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "بغیر آوٹ پٹ کا فنکشن بنائیں"; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "واپس آ جائیں"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "بغیر آوٹ پٹ کا فنکشن بنائیں"; +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"] = "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"] = "تمام %1 متغیروں کو دوبارہ نام دے:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "to %1 append text %2"; // 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"] = "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"] = "get first letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "get letter # from end"; // untranslated +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_LAST"] = "get last letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "get random letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returns the letter at the specified position."; // untranslated +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Add an item to the text."; // untranslated +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"] = "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_OPERATOR_FIRST"] = "find first occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "find last occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "in text %1 %2 %3"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 is empty"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Returns true if the provided text is empty."; // untranslated +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"] = "print %1"; // untranslated +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_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // 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"] = "کیا ہوا کام کینسل کرے"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // 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["VARIABLE_ALREADY_EXISTS"] = "ایک متغیر نام '٪ 1' پہلے سے ہی موجود ہے."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "ایک متغیر نام '٪ 1' کسی دوسرے قسم کے لئے پہلے ہی موجود ہے: '٪ 2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/vi.js b/js/msg/js/vi.js new file mode 100644 index 0000000..d8dac9c --- /dev/null +++ b/js/msg/js/vi.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Thêm Chú Giải"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Không thể xóa giá trị '%1' vì nó được bao gồm trong định nghĩa của chức năng '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Thay giá trị thành:"; +Blockly.Msg["CLEAN_UP"] = "Sắp xếp lại các khối"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Các khối bị sập có chứa cảnh báo."; +Blockly.Msg["COLLAPSE_ALL"] = "Thu Nhỏ Mọi Mảnh"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Thu Nhỏ Mảnh"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "màu 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "màu 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "tỉ lệ"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "pha"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Pha hai màu với nhau theo tỉ lệ (0 - 100)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://vi.wikipedia.org/wiki/M%C3%A0u_s%E1%BA%AFc"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Chọn một màu từ bảng màu."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "màu bất kỳ"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "chọn một màu bất kỳ."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "màu xanh dương"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "màu xanh lá cây"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "màu đỏ"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "tạo màu từ"; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "thoát"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "sang lần lặp tiếp theo"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Thoát khỏi vòng lặp hiện tại."; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Chú ý: Mảnh này chỉ có thế dùng trong các vòng lặp."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "với mỗi thành phần %1 trong danh sách %2"; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "đếm theo %1 từ %2 đến %3 mỗi lần thêm %4"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Cho biến '%1' lấy các giá trị từ số bắt đầu đến số kết thúc, đếm theo khoảng thời gian đã chỉ định và thực hiện các khối được chỉ định."; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Thêm một điều kiện vào mảnh nếu."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Cuối cùng, khi không điều kiện nào đúng."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "nếu không"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "nếu không nếu"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "nếu"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Nếu điều kiện đúng, thực hiện các lệnh."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "thực hiện"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "lặp lại %1 lần"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Thực hiện các lệnh vài lần."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "lặp lại cho đến khi"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "lặp lại trong khi"; +Blockly.Msg["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."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Miễn là điều kiện còn đúng, thì thực hiện các lệnh."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Xóa hết %1 mảnh?"; +Blockly.Msg["DELETE_BLOCK"] = "Xóa Mảnh Này"; +Blockly.Msg["DELETE_VARIABLE"] = "Xóa giá trị '%1'"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Xóa %1 lần dùng của giá trị '%2'?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Xóa %1 Mảnh"; +Blockly.Msg["DISABLE_BLOCK"] = "Ngưng Tác Dụng"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Tạo Bản Sao"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Bình luận trùng"; +Blockly.Msg["ENABLE_BLOCK"] = "Phục Hồi Tác Dụng"; +Blockly.Msg["EXPAND_ALL"] = "Mở Lớn Mọi Mảnh"; +Blockly.Msg["EXPAND_BLOCK"] = "Mở Lớn Mảnh"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Chỗ Gắn Bên Ngoài"; +Blockly.Msg["HELP"] = "Trợ Giúp"; +Blockly.Msg["INLINE_INPUTS"] = "Chỗ Gắn Cùng Dòng"; +Blockly.Msg["IOS_CANCEL"] = "Hủy bỏ"; +Blockly.Msg["IOS_ERROR"] = "Lỗi"; +Blockly.Msg["IOS_OK"] = "Đồng ý"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Thêm đầu vào"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Cho phép báo cáo"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Hàm này có chứa các input trùng nhau."; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "NHẬP VÀO"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Thêm"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Thêm biến"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Xóa"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "Bạn không thể không nhập tên biến."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Đổi tên"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Tên biến"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "tạo danh sách trống"; +Blockly.Msg["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ả"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "danh sách"; +Blockly.Msg["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."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "tạo danh sách gồm"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Thêm vật vào danh sách."; +Blockly.Msg["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ỳ."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "đầu tiên"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "(đếm từ cuối) thứ"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "thứ"; +Blockly.Msg["LISTS_GET_INDEX_GET"] = "lấy thành tố"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "lấy và xóa thành tố"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "cuối cùng"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "bất kỳ"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "xóa thành tố"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Hoàn trả thành tố đầu tiên trong danh sách."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Hoàn trả thành tố trong danh sách ở vị trí ấn định."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Hoàn trả thành tố cuối cùng trong danh sách."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Hoàn trả một thành tố bất kỳ trong danh sách."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Hoàn trả và xóa thành tố đầu tiên trong danh sách."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Hoàn trả và xóa thành tố trong danh sách ở vị trí ấn định."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Hoàn trả và xóa thành tố cuối cùng trong danh sách."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Hoàn trả và xóa mộtthành tố bất kỳ trong danh sách."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Xóa thành tố đầu tiên trong danh sách."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Xóa thành tố trong danh sách ở vị trí ấn định."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Xóa thành tố cuối cùng trong danh sách."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Xóa thành tố bất kỳ trong danh sách."; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "đến (đếm từ cuối) thứ"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "đến thứ"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "đến cuối cùng"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "lấy một danh sách con từ đầu tiên"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "lấy một danh sách con từ (đếm từ cuối) từ vị trí thứ"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "lấy một danh sách con từ vị trí thứ"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Lấy một mảng của danh sách này để tạo danh sách con."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 là thành tố cuối cùng."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 là thành tố đầu tiên."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "tìm sự có mặt đầu tiên của vật"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "tìm sự có mặt cuối cùng của vật"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Hoàn trả vị trí xuất hiện đầu tiên/cuối cùng của vật trong danh sách. Nếu không tìm thấy thì hoàn trả số %1."; +Blockly.Msg["LISTS_INLIST"] = "trong dánh sách"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 trống rỗng"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Hoàn trả “đúng\" nếu danh sách không có thành tử nào."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "độ dài của %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Hoàn trả độ dài của một danh sách."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "tạo danh sách gồm một vật %1 lặp lại %2 lần"; +Blockly.Msg["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."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "đảo ngược %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Đảo ngược bản sao chép của một danh sách."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "giá trị"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "chèn vào vị trí"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "đặt"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Chèn vật vào đầu danh sách."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Chèn vật vào danh sách theo vị trí ấn định."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Gắn thêm vật vào cuối danh sách."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Gắn chèn vật vào danh sách ở vị trí ngẫu nhiên."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Đặt giá trị của thành tố đầu tiên trong danh sách."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Đặt giá trị của thành tố ở vị trí ấn định trong một danh sách."; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "tăng dần"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "giảm dần"; +Blockly.Msg["LISTS_SORT_TITLE"] = "sắp xếp %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Sắp xếp một bản sao của một danh sách."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "chữ cái, không phân biệt hoa/thường"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "số"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "chữ cái"; +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"] = "tạo danh sách từ văn bản"; +Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "tạo văn bản từ danh sách"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Liên kết một danh sách các văn bản vào một văn bản, cách nhau bằng dấu phân cách."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Tách văn bản thành một danh sách các văn bản nhỏ, ngắt bởi các ký tự phân cách."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "với ký tự phân cách"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "sai"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Hoàn trả \"đúng\" hoặc \"sai\"."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "đúng"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://vi.wikipedia.org/wiki/B%E1%BA%A5t_%C4%91%E1%BA%B3ng_th%E1%BB%A9c"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Hoàn trả giá trị \"đúng\" (true) nếu giá trị hai đầu vào bằng nhau."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["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."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Hoàn trả giá trị \"đúng\" (true) nếu giá trị hai đầu vào không bằng nhau."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "không %1"; +Blockly.Msg["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."; +Blockly.Msg["LOGIC_NULL"] = "trống không"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Hoàn trả trống không."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "và"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "hoặc"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Hoàn trả \"đúng\" (true) nếu cả hai đầu vào đều đúng."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Hoàn trả \"đúng\" (true) nếu ít nhất một trong hai đầu vào đúng."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "kiểm tra"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "nếu sai"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "nếu đúng"; +Blockly.Msg["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\"."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://vi.wikipedia.org/wiki/S%E1%BB%91_h%E1%BB%8Dc"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Hoàn trả tổng của hai con số."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Hoàn trả thương của hai con số."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Hoàn trả hiệu của hai con số."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Hoàn trả tích của hai con số."; +Blockly.Msg["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ũ."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 của X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Trả về arctangent của điểm (X, Y) trong khoảng từ -180 độ đến 180 độ."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://vi.wikipedia.org/wiki/Ph%C3%A9p_c%E1%BB%99ng"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "cộng vào %1 giá trị %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Cộng số đầu vào vào biến \"%1\"."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["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)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "giới hạn %1 không dưới %2 không hơn %3"; +Blockly.Msg["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."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "chia hết cho"; +Blockly.Msg["MATH_IS_EVEN"] = "là số chẵn"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "là số âm"; +Blockly.Msg["MATH_IS_ODD"] = "là số lẻ"; +Blockly.Msg["MATH_IS_POSITIVE"] = "là số dương"; +Blockly.Msg["MATH_IS_PRIME"] = "là số nguyên tố"; +Blockly.Msg["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."; +Blockly.Msg["MATH_IS_WHOLE"] = "là số nguyên"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "số dư của %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Chia số thứ nhất cho số thứ hai rồi hoàn trả số dư từ."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://vi.wikipedia.org/wiki/S%E1%BB%91"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Một con số."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "giá trị trung bình của một danh sách"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "số lớn nhât của một danh sách"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "số trung vị của một danh sách"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "số nhỏ nhất của một danh sách"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "các mode của một danh sách"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "một số bất kỳ của một danh sách"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "độ lệch chuẩn của một danh sách"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "tổng của một danh sách"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Hoàn trả giá trị trung bình từ của danh sách số."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Hoàn trả số lớn nhất trong tất cả các số trong danh sách."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Hoàn trả số trung vị của danh sách số."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Hoàn trả số nhỏ nhất trong tất cả các số trong danh sách."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Hoàn trả các số có mặt nhiều nhất trong danh sách."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Hoàn trả một số bất kỳ từ các số trong danh sách."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Hoàn trả độ lệch chuẩn của danh sách số."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Hoàn trả tổng số của tất cả các số trong danh sách."; +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"] = "phân số bất kỳ"; +Blockly.Msg["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."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "Một số nguyên bất kỳ từ %1 đến %2"; +Blockly.Msg["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."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "làm tròn"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "làm tròn xuống"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "làm tròn lên"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Làm tròn lên hoặc tròn xuống số đầu vào."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://vi.wikipedia.org/wiki/C%C4%83n_b%E1%BA%ADc_hai"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "giá trị tuyệt đối"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "căn bật hai"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Hoàn trả giá trị tuyệt đối của số đầu vào."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Hoàn trả lũy thừa của số e với số mũ đầu vào."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Hoàn trả lôgarit tự nhiên của số đầu vào."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Hoàn trả lôgarit cơ số 10 của số đầu vào."; +Blockly.Msg["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."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Hoàn trả lũy thừa của số 10 với số mũ đầu vào."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Hoàn trả căn bật hai của số đầu vào."; +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://vi.wikipedia.org/wiki/H%C3%A0m_l%C6%B0%E1%BB%A3ng_gi%C3%A1c"; +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Hoàn trả Arccos của một góc (theo độ)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Hoàn trả Arcsin của một góc (theo độ)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Hoàn trả Arctang của một góc (theo độ)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Hoàn trả Cos của một góc (theo độ)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Hoàn trả Sin của một góc (theo độ)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Hoàn trả Tang của một góc (theo độ)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Tạo một giá trị màu sắc..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Tạo một giá trị số..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Tạo một giá trị dạng chuỗi..."; +Blockly.Msg["NEW_VARIABLE"] = "Tạo biến..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Tên của biến mới:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Kiểu giá trị mới:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "cho phép báo cáo"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "với:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://vi.wikipedia.org/wiki/Ch%C6%B0%C6%A1ng_tr%C3%ACnh_con"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Chạy một thủ tục không có giá trị hoàn trả."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://vi.wikipedia.org/wiki/Ch%C6%B0%C6%A1ng_tr%C3%ACnh_con"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Chạy một thủ tục có giá trị hoàn trả."; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "với:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "Tạo mảnh \"thực hiện %1\""; +Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Mô tả hàm này..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "làm gì đó"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "thủ tục để"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Một thủ tục không có giá trị hoàn trả."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "hoàn trả"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Một thủ tục có giá trị hoàn trả."; +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Chú ý: Thủ tục này có lặp lại tên các tham số."; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Làm nổi bật thủ tục"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Khi điều kiện đúng thì hoàn trả một giá trị."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Chú ý: Mảnh này chỉ có thể dùng trong một thủ tục."; +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"] = "Làm lại"; +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ả các biến \"%1\" thành:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "ở cuối %1 thêm văn bản %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Thêm một mảng văn bản vào biến \"%1\"."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "thành chữ thường"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "thành Chữ In Đầu Mỗi Từ"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "thành CHỮ IN HOA"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Hoàn trả văn bản sau khi chuyển đổi chữ in hoa hay thường."; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "lấy ký tự đầu tiên"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "lấy từ phía cuối, ký tự thứ"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "lấy ký tự thứ"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "lấy ký tự cuối cùng"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "lấy ký tự bất kỳ"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "trong văn bản %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Hoàn trả ký tự ở vị trí đặt ra."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "đến %1 trong %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Đếm số lần một đoạn văn bản xuất hiện trong một đoạn văn bản khác."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "thêm vật mới vào văn bản."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "kết nối"; +Blockly.Msg["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."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "đến từ phía cuối, ký tự thứ"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "đến ký tự thứ"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "đến ký tự cuối cùng"; +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"] = "trong văn bản"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "lấy từ ký tự đầu tiên"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "lấy từ phía cuối, ký tự thứ"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "lấy từ ký tự thứ"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Hoàn trả một mảng ký tự ấn định từ trong văn bản."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "tìm sự có mặt đầu tiên của"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "tìm sự có mặt cuối cùng của"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "trong văn bản %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Hoàn trả vị trí xuất hiện đầu/cuối của văn bản thứ nhất trong văn bản thứ hai. Nếu không tìm thấy thì hoàn trả số %1."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 trống không"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Hoàn trả “đúng nếu văn bản không có ký tự nào."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = ""; +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "tạo văn bản từ"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Tạo một văn bản từ các thành phần."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "độ dài của %1"; +Blockly.Msg["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."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "in lên màng hình %1"; +Blockly.Msg["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."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Xin người dùng nhập vào một con số."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Xin người dùng nhập vào một văn bản."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "Xin người dùng nhập vào con số với dòng hướng dẫn"; +Blockly.Msg["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"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "thay thế %1 bằng %2 trong %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Thay thế tất cả các lần xuất hiện của văn bản bằng văn bản khác."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "đảo ngược %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Đảo ngược thứ tự của các chữ cái trong văn bản."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/string_(computer_science)"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Một ký tự, một từ, hay một dòng."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "cắt các không gian từ cả hai mặt của"; +Blockly.Msg["TEXT_TRIM_OPERATOR_LEFT"] = "cắt các không gian từ bên trái của"; +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"] = "Hôm nay"; +Blockly.Msg["UNDO"] = "Hoàn tác"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // 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 +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Hoàn trả giá trị của."; +Blockly.Msg["VARIABLES_SET"] = "cho %1 bằng %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Tạo mảnh \"lấy %1\""; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Đặt giá trị của biến này thành..."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Một biến có tên '%1' đã tồn tại."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Giá trị '%1' đã tồn tại dưới dạng: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Hãy nói gì đó..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/xmf.js b/js/msg/js/xmf.js new file mode 100644 index 0000000..4fd6ea0 --- /dev/null +++ b/js/msg/js/xmf.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "კომენტარიშ გეძინა"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "შანულობაშ თირუა:"; +Blockly.Msg["CLEAN_UP"] = "ბლოკეფიშ გოუქვაფა"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // 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://xmf.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"] = "https://www.december.com/html/spec/colorpercompact.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"] = "Skip the rest of this loop, and continue with the next iteration."; // untranslated +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_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"] = "მათირეფონი '%1'-ის მითმურჩქინანს შანულობას მოჩამილი ბიჯგეფით დუდშე ბოლოშა დო მეწურაფილ ზოჯუეფს არსულენს."; +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"] = "პიჯალეფი ნანდული ქორე-და, ზოჯუეფს არსულენს."; +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://ru.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_VARIABLE"] = "'%1' მათირეფონიშ ლასუა"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "'%2' მათირეფონიშ გჷმორინაფა %1 ბლასათო?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "%1 ბლოკიშ ლასუა"; +Blockly.Msg["DISABLE_BLOCK"] = "ბლოკიშ თიშუა"; +Blockly.Msg["DUPLICATE_BLOCK"] = "კოპირაფა"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +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["IOS_CANCEL"] = "გოუქვაფა"; +Blockly.Msg["IOS_ERROR"] = "ჩილათა"; +Blockly.Msg["IOS_OK"] = "OK"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Add Input"; // untranslated +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Allow statements"; // untranslated +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "This function has duplicate inputs."; // untranslated +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "მიშულა"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "გეძინა"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Add Variable"; // untranslated +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "ლასუა"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "You can't use an empty variable name."; // untranslated +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "ჯოხოშ თირუა"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Variable name"; // untranslated +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"] = "list"; // untranslated +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"] = "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"] = "first"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# from end"; // untranslated +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"] = "last"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "random"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "remove"; // untranslated +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"] = "Returns the item at the specified position in a list."; // 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"] = "Removes and returns the item at the specified position in a list."; // 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"] = "Removes the item at the specified position in a list."; // 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_FROM_END_TOOLTIP"] = "%1 is the last item."; // untranslated +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 is the first item."; // 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 %1 if item is not found."; // untranslated +Blockly.Msg["LISTS_INLIST"] = "in list"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 ცარიელი რე"; +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_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // 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"] = "as"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "insert at"; // untranslated +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"] = "Inserts the item at the specified position in a list."; // 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"] = "Sets the item at the specified position in a list."; // 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"] = "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_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 +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"] = "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"; // untranslated +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "if false"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "if true"; // untranslated +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://xmf.wikipedia.org/wiki/არითმეტიკა"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Return the sum of the two numbers."; // untranslated +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"] = "Return the product of the two numbers."; // untranslated +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Return the first number raised to the power of the second number."; // untranslated +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +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"] = "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 +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // 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"] = "is divisible by"; // untranslated +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://xmf.wikipedia.org/wiki/რიცხუ"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "რიცხუ."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "average of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "max of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "median of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "min of list"; // untranslated +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"] = "Return the largest number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Return the median number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Return the smallest number in the list."; // untranslated +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/Square_root"; // untranslated +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"] = "Return the natural logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Return the base 10 logarithm of a number."; // untranslated +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Return the negation of a number."; // untranslated +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_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"; // untranslated +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["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "აკოქიმინი მათირეფონი..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "ახალი მათირეფონიშ ჯოხო:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // 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"] = "Create '%1'"; // untranslated +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/Subroutine"; // 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/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "return"; // untranslated +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"] = "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"] = "არძა მათირეფონი '%1' ჯოხოშ თირუა -შა:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "to %1 append text %2"; // 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"] = "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"] = "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_LAST"] = "get last letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "get random letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returns the letter at the specified position."; // untranslated +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Add an item to the text."; // untranslated +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"] = "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_OPERATOR_FIRST"] = "find first occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "find last occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "in text %1 %2 %3"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 is empty"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Returns true if the provided text is empty."; // untranslated +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"] = "print %1"; // untranslated +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_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // 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"] = "გოუქვაფა"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // 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["VARIABLE_ALREADY_EXISTS"] = "მათირეფონი ჯოხოთი '%1' უკვე არსენებს."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/yo.js b/js/msg/js/yo.js new file mode 100644 index 0000000..968cf26 --- /dev/null +++ b/js/msg/js/yo.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "Ṣe afikun ọrọ iwoye"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "E ko lee paa Oniruuru rẹ ' %1' nitori wipe o je ara itumọ isise eto yi '%2'"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "Ṣe ayipada iye:"; +Blockly.Msg["CLEAN_UP"] = "Nu Bulọọku kuro"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "Bi awọn Bulọọku ṣubu"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Bi Bulọọku ṣubu"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "awọ 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "awọ 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "ipin"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "apapọ"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Da awo meji papo pelu ipin (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Yan awọ kan lati inu patako awọ."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "awọ àrìnàkò"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Yan awọ kan ni ọna àrìnàkò."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "alawọ omi aro"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "alawọ ewe"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "awọ pupu"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "awọ pelu:"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Ṣe idasile awọ kan pelu iye awọ pupu, alawọ ewe, ati alawọ omi aro. Gbogbo iye re gbọdọ je laarin 0 and 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"] = "ya kuro ninu lupu"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "beere pelu aṣiṣe lupu"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Ya kuro ninu akojọ lupu."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Ṣe afoda awon lupu to ku yii, kii o si tesiwaju pelu awon aṣiṣe lupu."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Ikilo: Bulọọku yii se lo ninu aṣiṣe lupu yii nikan."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "fun nigba kọọkan %1 ni akojọ %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Fun nkan kọọkan ninu akojọ kan, ṣe eto oriṢiriṢi '%1' si nkan naa, ki o si tun koodu naa ṣe."; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "iyipada %1 lati %2 si %3 fifi kun %4"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Ni awon oriṣiriṣi '%1' ṣe imulo lori iye kọọkan lati ori nọmba tio beere titi de eyin to pari nọmba, kaa ni pase aarin kan pato. Tun koodu yi se nigba kọọkan:"; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Ṣe afikun si ipo yii bi bulọọku."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Ṣe afikun ipari, mu-gbogbo ipo si bulọọku."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Ṣe afikun, se ayọkuro, tabi se a tun beere abala yii lati se a tun gbejade bulọọku yii."; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "bibẹẹkọ"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "bibẹẹkọ bi"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "bi"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Bi iye yii ba je otito, lẹyinna ṣe awọn alaye."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Bi iye yii ba je otito, lẹyinna ṣe alaye bulọọku akọkọ. Bibẹẹkọ, ṣe alaye akọkọ bulọọku keji."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Bi iye akọkọ yii ba je otito, lẹyinna ṣe alaye bulọọku akọkọ. Bibẹẹkọ, Bi iye keji yii ba je otito, ṣe alaye akọkọ bulọọku keji."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Bi iye akọkọ yii ba je otito, lẹyinna ṣe alaye bulọọku akọkọ. Bi iye keji yii ba je otito, ṣe alaye akọkọ bulọọku keji. Bi eyikeyi iye naa ko ba je otito, ṣe alaye akọkọ bulọọku ti o gbeyin."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "ṣe"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "Iye igba %1 ti tun ṣe"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Ṣe awon alaye ni igba pupo."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "tun ṣe titi ti"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "tun ṣe nigbati"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Nigbati awon iye kan ba iro, tun awon koodu kan ṣe."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Nigbati iye kan ba je otito, tun awon koodu kan ṣe."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Paa gbogbo %1 bulọọku rẹ?"; +Blockly.Msg["DELETE_BLOCK"] = "Paa Bulọọku rẹ"; +Blockly.Msg["DELETE_VARIABLE"] = "Paa awon '%1' Oniruuru rẹ"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Paa %1 lilo '%2' oniruuru rẹ?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "Paa %1 awọn Bulọọku rẹ"; +Blockly.Msg["DISABLE_BLOCK"] = "Sọ Bulọọku di alaiṣiṣẹ"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Ṣe ẹẹda"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Ṣe ẹẹda afikun ọrọ iwoye"; +Blockly.Msg["ENABLE_BLOCK"] = "Muu Bulọọku ṣiṣẹ"; +Blockly.Msg["EXPAND_ALL"] = "Fẹ awọn Bulọọku"; +Blockly.Msg["EXPAND_BLOCK"] = "Fẹ Bulọọku"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Awon afikun okeere"; +Blockly.Msg["HELP"] = "Iranwọ"; +Blockly.Msg["INLINE_INPUTS"] = "Afiku tẹle n tẹle"; +Blockly.Msg["IOS_CANCEL"] = "Fagilee"; +Blockly.Msg["IOS_ERROR"] = "Aṣiṣe"; +Blockly.Msg["IOS_OK"] = "O DARA"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ Fi afikun sii"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "Gba koodu laaye"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "Awon afikun okeere"; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "SII"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "Ìròpọ̀"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ Ṣe afikun orisirisi"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "Paarẹ"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "O ko le lo oruko orisirisi ti o sofo."; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "Àtúnṣọlọ́rúkọ"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "Oruko orisirisi"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "Ṣẹda akojọ aṣayan tio ṣofo"; +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Da akojọ pada, ti gigun 0, ko ni awon akosile alaye"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "akojọ"; +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Fikun, yọ, tabi yọ, tunṣe awọn apakan lati akojọ bulooku yii."; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "ṣẹda akojọ"; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Fi nkan kun akojọ."; +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Ṣẹda akojọ pẹlu nọmba eyikeyi ti awọn akojo."; +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "àkọ́kọ́"; +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# lati opin"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_GET"] = "gba"; +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "gba ati yọ"; +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "tógbẹ̀yìn"; +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "àrìnàkò"; +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "yọ"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Da akojọ akọkọ pada."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Returns the item at the specified position in a list."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Da akojọ ti o kẹhin pada."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Da ohun àrìnàkò kan pada ninu akojọ"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Yọ ki o si da akojọ kuro ni akọkọ pada."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Yọ ki o si da akojọ naa pada kuro ni ipo kan pato ti o wa."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Yọ ki o si da akojọ ti o kẹhin pada"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Yọ ki o si da akojọ ti o kẹhin àrìnàkò pada"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Da akojọ akọkọ pada."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Yọ ki o si da akojọ naa pada kuro ni ipo kan pato ti o wa."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Da akojọ ti o kẹhin pada."; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Da ohun àrìnàkò kan pada ninu akojọ"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "sii # lati opin"; +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "sii #"; +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "sii opin"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "gba ipin -akojọ lati akọkọ"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "gba ipin -akojọ lati # lati opin"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "gba ipin -akojọ lati #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Ṣẹda ẹda ti apa kan ti o wa ninu akojọ."; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 jẹ ohun ti o kẹhin."; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 jẹ ohun akọkọ."; +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "wa awon nkan akọkọ ti o sele"; +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"] = "wa iṣẹlẹ ti o kẹhin ti akojọ"; +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Da atọka ti akọkọ / iṣẹlẹ to kẹhin ti akojọ. Da %1 akojọ pada ti o ko ba ri."; +Blockly.Msg["LISTS_INLIST"] = "ni akojọ"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 je ofo"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Da otitọ pada nigbati akojọ ba ṣofo."; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "gigun ti %1"; +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Da gigun ti akojo pada."; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "ṣẹda akojọ pẹlu nkan %1 tun ṣe %2 igba"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Ṣẹda akojọ kan ti o wa fun iye tun nọmba kan pato ti akoko ti a ti yan."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "Ṣe iyipada %1"; +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Ṣe iyipada ẹda ti akojọ kan."; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "bii"; +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "fi sii ni"; +Blockly.Msg["LISTS_SET_INDEX_SET"] = "ṣeto"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Fi ohun kan sii ni ibẹrẹ akojọ."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Fi ohun kan sii ipo kan pato ti a ti yan ni akojọ."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Fi ohun kan kun si opin akojọ."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Fi ohun kan kun si àrìnàkò akojọ."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Fi ohun kan sii ni ibẹrẹ akojọ."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Ṣeto ohun akọkọ sii ipo kan pato ti a ti yan ni akojọ."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Fi ohun kan kun si opin akojọ."; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Fi ohun kan kun si àrìnàkò akojọ."; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "si oke"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "si isalẹ"; +Blockly.Msg["LISTS_SORT_TITLE"] = "to %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "To ẹda akojọ lẹsẹẹsẹ."; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "awon alfabeti, fojufo irufe"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "awọn nọmba"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "awon alfabeti"; +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"] = "ṣe akojọ lati inu ọrọ"; +Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "ṣe ọrọ lati akojọ"; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Darapọ mọ akojọ awọn ọrọ sinu ọrọ kan, ti a pin nipase delimita."; +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Pin ọrọ sinu akojọ awọn ọrọ kan, fọ ni dẹlimita kọọkan."; +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "pẹlu dẹlimita"; +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "irọ"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Da pada bi o je otito tabi iro."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "otitọ"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Da otito pada b iafikun mejeji ba dogba bakanna."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Da otito pada bi afikun akooko ba tobi ju afiku keji lo."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Da otito pada bi afikun akooko ba tobi ju tabi dogba pelu afiku keji lo."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Da otito pada bi afikun akooko ba kere ju afiku keji lo."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Da otito pada bi afikun akooko ba kere ju tabi dogba pelu afiku keji lo."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Da otito pada bi afikun mejeji ko ba dogba bakanna."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "kii ṣe %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Da otitọ pada bi afikun ba je irọ. Da iro pada bi afikun ba je otito."; +Blockly.Msg["LOGIC_NULL"] = "ofo"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Da ofo pada."; +Blockly.Msg["LOGIC_OPERATION_AND"] = "ati"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "tabi"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Da otito pada bi afikun mejeji ba je otito."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Da otitọ pada bi o kere ju afikun kan ba je otito."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "idanwo"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "bi irọ"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "bi otitọ"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Ṣe ayewo ipo naa ni 'idanwo'. Bi ipo nab a je otito, Da pada 'bi otito' iye; bibẹẹkọ da pada 'bi iro' iye."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://yo.wikipedia.org/wiki/Ìṣírò"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Da apapo awọn nọmba meji pada."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Da adarọ iye ti awọn nọmba meji pada."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Da iyatọ awọn nọmba meji naa pada."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Da abajade awọn nọmba meji naa pada."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Da nọmba akọkọ ti a gbe si agbara ti nọmba keji pada."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 X:%1 Y:%2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Da ojuami arctangent pada (X, Y) ni awon digiri lati -180 si 180."; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_TITLE"] = "iyipada %1 nipasẹ %2"; +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Se afiku si nọmba orisirisi '%1'."; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Da ọkan ninu awọn aiyipada ti o wọpọ pada: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (ailopin)."; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "atokọ %1 kukuru %2 giga %3"; +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Ṣe atokọ nọmba laarin awọn nọmba kukuru ati giga. (ini afikun)."; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "je sisee pin pẹlu"; +Blockly.Msg["MATH_IS_EVEN"] = "je se e pin"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "je ai dara"; +Blockly.Msg["MATH_IS_ODD"] = "je ai se e pin"; +Blockly.Msg["MATH_IS_POSITIVE"] = "je di dara"; +Blockly.Msg["MATH_IS_PRIME"] = "je nọ́mbà àkọ́kọ́"; +Blockly.Msg["MATH_IS_TOOLTIP"] = "Ṣe ayẹwo boya nọmba jẹ eyi to se pin, ai se pin, akori, odidi, ti o dara, ti ko dara, tabi ti o ba se e pin pelu nọmba kan. Pada otitọ tabi irọ."; +Blockly.Msg["MATH_IS_WHOLE"] = "je odidi"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_TITLE"] = "iyokù %1 ÷ %2"; +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Da iyokù lati pinpin awọn nọmba meji pada."; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://yo.wikipedia.org/wiki/Nọ́mbà"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Nọ́mbà kan."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "idameji akojọ"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "akojọ ti o pọ ju"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "agbedemeji akojọ"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "akojọ ti o kere ju"; +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "awọn ipo ti akojọ"; +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "àrìnàkò nkan ti akojọ"; +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "iṣiro deede ti akojọ"; +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "apao akojọ"; +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Da idameji pada (ipin isiro) ti awọn nọmba iye inu akojọ."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Da nọmba ti o tobi julọ ninu akojọ pada."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Da agbedemeji nọmba inu akojọ pada."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Da nọmba ti o kere julọ ninu akojọ pada."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Da akojọ ti eyi ti o wọpọ julọ ninu akojọ."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Da àrìnàkò ida ipilẹ nkan lati inu akojọ."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Da iṣiro deede ti akojọ pada."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Da apapo gbogbo awọn nọmba inu akojọ pada."; +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"] = "oniruru ipin"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Da àrìnàkò ida pada laarin 0.0 (ini afikun) ati 1.0 (iyasọtọ)."; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "oniruru abala lati %1 si %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Da àrìnàkò abala laarin awon opin pato meji pada, ini afikun."; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "pa ju de"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "pa ju de si isalẹ"; +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "pa ju de soke"; +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Pa oju nọmba de soke tabi si isalẹ."; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://yo.wikipedia.org/wiki/Gb%C3%B2ngb%C3%B2_al%C3%A1gb%C3%A1ram%C3%A9j%C3%AC"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "patapata"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "Ipilẹ onihamẹrin"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Da iye patapata ti nọmba kan pada."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Da e pada si agbara ti nọmba kan."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Da lọgaridimu adayeba ti nọmba kan pada."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Da ipilẹ 10 lọgaridimu nọmba kan pada."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Da ilodisi ti nọmba kan pada"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Da 10 pada si agbara nọmba kan."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Da Ipilẹ onihamẹrin nọmba kan pada."; +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"] = "Da arccosine ti digiri pada."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Da arcsine ti digiri pada."; +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Da arctangent ti digiri pada."; +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Da cosine ti digiri pada (kii ṣe Radian)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Da sine ti digiri pada (kii ṣe Radian)."; +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Da tangent ti digiri pada (kii ṣe Radian)."; +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Ṣe idasile awọ oniruuru..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Ṣe idasile nọ́mbà oniruru..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Ṣe idasile asopọ oniruru..."; +Blockly.Msg["NEW_VARIABLE"] = "Ṣe idasile oniruuru..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "Orukọ oniruuru tuntun:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Iru oniruuru tuntun:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "gba alaye laaye"; +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "pẹlu:"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Ṣe ṣalaye-iṣẹ ti olumulo '%1'."; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Ṣe ṣalaye-iṣẹ ti olumulo '%1' kii o sii lo iṣagbejade rẹ."; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "pẹlu:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "Ṣe idasile '%1'"; +Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Ṣe apejuwe iṣẹ yii..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "Ṣe awon alaye ni igba pupo."; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "sii"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Ṣẹda iṣẹ kan lai si iṣagbejade."; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "tun tẹ"; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Ṣẹda iṣẹ pẹlu iṣagbejade kan."; +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Ikilo: Isẹ yii ni awọn ẹda odiwọn."; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Ṣafihan iṣẹ isọtunmọ"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Ti iye ba jẹ otitọ, lẹhinna da iye keji pada."; +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Ikilo: Bulọọki yii le ṣee lo nikan laarin itumọ iṣẹ kan"; +Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "igbewọle orukọ:"; +Blockly.Msg["PROCEDURES_MUTATORARG_TOOLTIP"] = "Ṣe afikun kan sii igbewọle si iṣẹ yii."; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TITLE"] = "igbewọle"; +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TOOLTIP"] = "Fikun, yọ kuro, tabi tun beere awọn igbewọle si iṣẹ yii."; +Blockly.Msg["REDO"] = "Tun ṣe"; +Blockly.Msg["REMOVE_COMMENT"] = "Yọ afikun ọrọ iwoye"; +Blockly.Msg["RENAME_VARIABLE"] = "Tun orukọ oniruuru kọ..."; +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Tun orukọ gbogbo '%1' v oniruru kọ si:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "si %1 fikun ọrọ %2"; +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Ṣe afikun awon ọrọ oniruru '%1'."; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "si alfabeti kekere"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "si Alfabeti Aarin"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "si ALFABETI NLA"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "aa <-> AA"; +Blockly.Msg["TEXT_CHARAT_FIRST"] = "gba lẹta akọkọ"; +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "gba lẹta # lati opin"; +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "gba lẹta #"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "gba lẹta ti o kẹhin"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "gba lẹta àrìnàkò"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "ninu %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Da lẹta naa pada si ipo ti a ti sọ tẹlẹ."; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "ka %1 ni %2"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Ka iye igba diẹ ninu awọn ọrọ kan waye laarin awọn ọrọ miiran."; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Ṣe afikun nkan si ọrọ naa."; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "darapọ"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Fikun, yọ kuro, tabi ṣe atunṣe awọn apakan lati se atunkọ ọrọ bulooku yii."; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "si lẹta # lati opin"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "si lẹta #"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "si lẹta kẹhin"; +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"] = "ninu"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "gba substring lati lẹta akọkọ"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "gba substring lati lẹta # lati opin"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "gba substring lati lẹta #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Da ipin kan pato ti ọrọ naa pada."; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "wa isele akọkọ ti o wa ninu ọrọ"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "wa isele igbeyin ti o wa ninu ọrọ"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "ninu %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Da atọka ti akọkọ / iṣẹlẹ to kẹhin ti akojọ. Da %1 akojọ pada ti o ko ba ri."; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 je isofo"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Da otitọ pada ti ọrọ ti a pese ba ṣofo."; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "ṣẹ ẹda ọrọ pẹlu"; +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Ṣẹda ọrọ kan nipa ṣiṣepọ gbogbo awọn ohun kan."; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "Gigun ti %1"; +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Da nọmba awọn lẹta pada (pẹlu awọn alafo) ninu ọrọ ti a pese."; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "tẹ ọrọ %1"; +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Tẹ ọrọ kan pato, nọmba tabi iye awon miiran."; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Kiakia fun olumulo fun nọmba."; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Kiakia fun olumulo fun awon ifiranṣẹ."; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "kiakia fun nọmba pẹlu ifiranṣẹ"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "kiakia fun ọrọ pẹlu ifiranṣẹ"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "Ṣe iropọ %1 pelu %2 in %3"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Ṣe iropo gbogbo awọn iṣẹlẹ ti o sele ninu awọn ọrọ laarin awọn ọrọ miiran."; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "Ṣe iyipada %1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Ṣe iyipada aṣẹ awọn ohun kikọ inu ọrọ naa."; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Lẹta, ọrọ, tabi ila ọrọ."; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "ge awọn alafo lati awọn igun mejeji ti"; +Blockly.Msg["TEXT_TRIM_OPERATOR_LEFT"] = "ge awọn alafo lati apa osi ti"; +Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "ge awọn alafo lati apa otun ti"; +Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "Da ẹda ti ọrọ naa pada pẹlu awọn alafo miiran ti o kuro lati ọkan tabi awọn opin mejeeji."; +Blockly.Msg["TODAY"] = "Loni"; +Blockly.Msg["UNDO"] = "Maa ṣe"; +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // untranslated +Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "nkan"; +Blockly.Msg["VARIABLES_GET_CREATE_SET"] = "Ṣe idasile 'ṣeto %1'"; +Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Da iye orisirisi yii pada."; +Blockly.Msg["VARIABLES_SET"] = "ṣeto %1 sii %2"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Ṣe idasile 'gba %1'"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Ṣeto oniruru yii lati je bakanna sii igbasilẹ."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Oniruuru ti a darukọ '%1' ti wa tẹlẹtẹlẹ."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Oniruuru ti a darukọ '%1' ti wa tẹlẹtẹlẹ fun iru miran: '%2'."; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Sọ nkankan..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/zh-hans.js b/js/msg/js/zh-hans.js new file mode 100644 index 0000000..aa03e14 --- /dev/null +++ b/js/msg/js/zh-hans.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "添加注释"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "不能删除变量“%1”,因为它是函数“%2”定义的一部分"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "更改值:"; +Blockly.Msg["CLEAN_UP"] = "整理块"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "已收起的信息块内包含警告。"; +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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "比例"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "混合"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "把两种颜色以一个给定的比例(0.0-1.0)进行混合。"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://zh.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"] = "https://www.december.com/html/spec/colorpercompact.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"] = "为列表 %2 里的每一项 %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记录从开始数值到终止数值之间的数值,数值按指定间隔增加,并执行指定的块。"; +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "在这个if语句块中增加一个条件。"; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "在这个if语句块中添加一个最终的,包括所有其余情况的条件。"; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "增加、删除或重新排列各节来重新配置这个if语句块。"; +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://zh.wikipedia.org/wiki/For循环"; +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_VARIABLE"] = "删除变量“%1”"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "要删除对变量“%2”的%1个引用吗?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "删除 %1 个块"; +Blockly.Msg["DISABLE_BLOCK"] = "禁用块"; +Blockly.Msg["DUPLICATE_BLOCK"] = "复制"; +Blockly.Msg["DUPLICATE_COMMENT"] = "复制注释"; +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["IOS_CANCEL"] = "取消"; +Blockly.Msg["IOS_ERROR"] = "错误"; +Blockly.Msg["IOS_OK"] = "确定"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+添加输入"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "允许的语句"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "这个函数有多个输入。"; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "输入"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "添加"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+添加变量"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "删除"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "你不能使用空白的变量名。"; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "重命名"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "变量名"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +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_TOOLTIP"] = "增加、删除或重新排列各部分以此重新配置这个列表块。"; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "建立列表从"; +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"] = "倒数第#"; +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; +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"] = "-"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "返回列表中的第一项。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "返回在列表中的指定位置的项。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "返回列表中的最后一项。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "返回列表中的随机一项。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "移除并返回列表中的第一项。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "移除并返回列表中的指定位置的项。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "移除并返回列表中的最后一项。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "移除并返回列表中的随机一项。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "移除列表中的第一项"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "移除在列表中的指定位置的项。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "移除列表中的最后一项"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "删除列表中的随机一项。"; +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"] = "获取子列表从第一个"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "获取子列表从最后一个#"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "获取子列表从#"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = "-"; +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "复制列表中指定的部分。"; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1是最后一项。"; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1是第一项。"; +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"] = "返回在列表中的第一/最后一个匹配项的索引值。如果找不到项目则返回%1。"; +Blockly.Msg["LISTS_INLIST"] = "在列表中"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1是空的"; +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"] = "返回列表的长度。"; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "建立列表使用项 %1 重复 %2 次"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "建立包含指定重复次数的值的列表。"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "倒转%1"; +Blockly.Msg["LISTS_REVERSE_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_SET"] = "设置"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "在列表的起始处添加该项。"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "插入在列表中指定位置的项。"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "在列表的末尾处添加该项。"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "在列表的随机位置插入该项。"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "设置列表中的第一项。"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "设置在列表中指定位置的项。"; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "升序"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "降序"; +Blockly.Msg["LISTS_SORT_TITLE"] = "排序%1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "排序一个列表的拷贝。"; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "按字母排序,忽略大小写"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "按数字排序"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "按字母排序"; +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_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://zh.wikipedia.org/wiki/不等"; +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"; +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://zh.wikipedia.org/wiki/条件运算符"; +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://zh.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_ATAN2_HELPURL"] = "https://zh.wikipedia.org/wiki/反正切2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "点(x:%1,y:%2)的方位角"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "返回点(X,Y)的反正切值,范围为-180到180度。"; +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_CONSTANT_HELPURL"] = "https://zh.wikipedia.org/wiki/数学常数"; +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "返回一个常见常量:π (3.141…)、e (2.718…)、φ (1.618…)、平方根 (1.414…)、开平方根 (0.707…)或∞ (无限大)。"; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // 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://zh.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://zh.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://zh.wikipedia.org/wiki/随机数生成器"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "随机小数"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "返回一个介于0.0到1.0之间(含边界)的随机数。"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://zh.wikipedia.org/wiki/随机数生成器"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "从 %1 到 %2 范围内的随机整数"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "返回一个限制在两个指定数值的范围(含边界)之间的随机整数。"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://zh.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://zh.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"] = "返回一个数值的e次幂。"; +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"] = "返回一个数值的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://zh.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["NEW_COLOUR_VARIABLE"] = "创建颜色变量..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "创建数字变量..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "创建字符串变量..."; +Blockly.Msg["NEW_VARIABLE"] = "创建变量..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "新变量的名称:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "新变量的类型:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = "-"; +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”。"; +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"] = "描述该功能..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = "-"; +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://zh.wikipedia.org/wiki/子程序"; +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "做点什么"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "至"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "创建一个不带输出值的函数。"; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://zh.wikipedia.org/wiki/子程序"; +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"; +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”变量重命名为:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "向%1附加文本%2"; +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"] = "转为首字母大写"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "转为大写"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "用不同的大小写模式复制并返回这段文字。"; +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_LAST"] = "寻找最后一个字母"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "寻找随机的字母"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = "-"; +Blockly.Msg["TEXT_CHARAT_TITLE"] = "在文本%1 里 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "返回位于指定位置的字母。"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "计算%1在%2里出现的次数"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "计算在一段文本中,某个部分文本重复出现了多少次。"; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "将一个项添加到文本中。"; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "加入"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "添加、移除或重新排列各节来重新配置这个文本块。"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "到最后一个字符#"; +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"] = "取得子串自第一个字符"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "取得子串自倒数#"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "取得子串自#"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = "-"; +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "返回文本中指定的一部分。"; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "寻找第一次出现的文本"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "寻找最后一次出现的文本"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "在文本 %1 里 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "返回第一个文本段在第二个文本段中的第一/最后一个匹配项的起始位置。如果未找到,则返回%1。"; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1是空的"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "如果给定的文本为空,则返回真。"; +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"] = "输出指定的文字、数字或其他值。"; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "要求用户输入数字。"; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "要求用户输入一些文本。"; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "要求输入数字,并显示提示消息"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "要求输入文本,并显示提示消息"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "在%3中,将%1替换为%2"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "在一段文本中,将出现过的某部分文本都替换掉。"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "翻转文本%1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "将文本中各个字符的顺序倒转。"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://zh.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_LEFT"] = "消除其左侧的空白"; +Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "消除其右侧的空白"; +Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "从某一端或同时从两端删除多余的空白,并返回这段文字的一个副本。"; +Blockly.Msg["TODAY"] = "今天"; +Blockly.Msg["UNDO"] = "撤销"; +Blockly.Msg["UNNAMED_KEY"] = "匿名"; +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_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["VARIABLE_ALREADY_EXISTS"] = "名字叫“%1”的变量已经存在了。"; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "名字叫“%1”的变量已经有了另一个类型:“%2”。"; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly工作区"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "说点什么..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/js/zh-hant.js b/js/msg/js/zh-hant.js new file mode 100644 index 0000000..530a038 --- /dev/null +++ b/js/msg/js/zh-hant.js @@ -0,0 +1,434 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +Blockly.Msg["ADD_COMMENT"] = "加入註解"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "無法刪除變數「%1」,因為這是功能「%2」定義的一部份內容"; +Blockly.Msg["CHANGE_VALUE_TITLE"] = "修改值:"; +Blockly.Msg["CLEAN_UP"] = "整理積木"; +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "收合含有警告的區塊。"; +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"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "比例"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "混合"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "用一個給定的比率(0.0-1.0)混合兩種顏色。"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://zh.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"] = "https://www.december.com/html/spec/colorpercompact.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"] = "為列表 %2 裡的每一項 %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」的值,按指定的時間間隔,執行指定的區塊。"; +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"] = "當值為 true 時,執行一些陳述式。"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "當值為 true 時,執行第一個陳述式。否則,執行第二個陳述式。"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "如果第一個值為 true,則執行第一個陳述式。否則,當第二個值為 true 時,則執行第二個陳述式。"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "如果第一個值為 true,則執行第一個陳述式。否則當第二個值為 true 時,則執行第二個陳述式。如果前幾個敘述都不為 ture,則執行最後一個陳述式。"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://zh.wikipedia.org/wiki/For迴圈"; +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"] = "當值為 false 時,執行一些陳述式。"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "當值為 true 時,執行一些陳述式。"; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "刪除全部 %1 個區塊?"; +Blockly.Msg["DELETE_BLOCK"] = "刪除區塊"; +Blockly.Msg["DELETE_VARIABLE"] = "刪除變數「%1」"; +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "刪除使用%1次的「%2」變數?"; +Blockly.Msg["DELETE_X_BLOCKS"] = "刪除%1個積木"; +Blockly.Msg["DISABLE_BLOCK"] = "停用區塊"; +Blockly.Msg["DUPLICATE_BLOCK"] = "複製"; +Blockly.Msg["DUPLICATE_COMMENT"] = "複製註解"; +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["IOS_CANCEL"] = "取消"; +Blockly.Msg["IOS_ERROR"] = "錯誤"; +Blockly.Msg["IOS_OK"] = "確定"; +Blockly.Msg["IOS_PROCEDURES_ADD_INPUT"] = "+ 添加輸入"; +Blockly.Msg["IOS_PROCEDURES_ALLOW_STATEMENTS"] = "允許加入陳述式"; +Blockly.Msg["IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR"] = "此功能有多個輸入內容。"; +Blockly.Msg["IOS_PROCEDURES_INPUTS"] = "輸入"; +Blockly.Msg["IOS_VARIABLES_ADD_BUTTON"] = "添加"; +Blockly.Msg["IOS_VARIABLES_ADD_VARIABLE"] = "+ 添加變數"; +Blockly.Msg["IOS_VARIABLES_DELETE_BUTTON"] = "刪除"; +Blockly.Msg["IOS_VARIABLES_EMPTY_NAME_ERROR"] = "您不能使用空的變數名稱。"; +Blockly.Msg["IOS_VARIABLES_RENAME_BUTTON"] = "重新命名"; +Blockly.Msg["IOS_VARIABLES_VARIABLE_NAME"] = "變數名稱"; +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_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"] = "使用這些值建立清單"; +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"] = "倒數第 # 筆"; +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"] = "返回清單中的第一個項目。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "返回在清單中指定位置的項目。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "返回清單中的最後一個項目。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "返回清單中隨機一個項目。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "移除並返回清單中的第一個項目。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "移除並返回清單中的指定位置的項目。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "移除並返回清單中的最後一個項目。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "移除並返回清單中的隨機項目。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "移除清單中的第一個項目。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "移除在清單中指定位置的項目。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "移除清單中的最後一個項目。"; +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "移除清單中隨機一個項目。"; +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"] = "取得子清單 從 最前面"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "取得子清單 從 # 倒數"; +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "取得子清單 從 #"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "複製清單中指定的部分。"; +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 是最後一個項目。"; +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 是第一個項目。"; +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"] = "在清單中檢索是否有包含項目,如果有,返回從頭/倒數算起的索引值。如果沒有則返回 %1。"; +Blockly.Msg["LISTS_INLIST"] = "自清單"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 值為空"; +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "如果該清單為空,則返回 true。"; +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"] = "返回清單的長度(項目數)。"; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "建立清單使用項目 %1 重複 %2 次"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "建立一個清單,項目中包含指定重複次數的值。"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "反轉%1"; +Blockly.Msg["LISTS_REVERSE_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_SET"] = "設定"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "添加一個項目到清單中的第一個位置。"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "添加一個項目到清單中的指定位置。"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "添加一個項目到清單中的最後一個位置。"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "添加一個項目到清單中的隨機位置。"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "設定清單中的第一個項目。"; +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "設定清單中指定位置的項目。"; +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"; +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "升序"; +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "降序"; +Blockly.Msg["LISTS_SORT_TITLE"] = "排列 %1 %2 %3"; +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "排序清單的複製內容。"; +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "依字母排序,忽略大小寫"; +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "依數字"; +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "依字母"; +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"] = "從清單拆出文本"; +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"] = "返回真或假。"; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "真"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://zh.wikipedia.org/wiki/不等"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "如果這兩個輸入區塊的結果相等,返回 true。"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "如果第一個輸入結果大於第二個,返回 true。"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "如果第一個輸入結果大於或等於第二個,返回 true。"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "如果第一個輸入結果比第二個小,返回 true。"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "如果第一個輸入結果小於或等於第二個,返回 true。"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "如果這兩個輸入區塊的結果不相等,返回 true。"; +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"] = "如果輸入結果是 false,則返回 true。如果輸入結果是 true,則返回 false。"; +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"] = "如果兩個輸入結果都為 true,則返回 true。"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "如果至少一個輸入結果為 true,返回 true。"; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "測試"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://zh.wikipedia.org/wiki/條件運算符"; +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://zh.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_ATAN2_HELPURL"] = "https://zh.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_TITLE"] = "X:%1 Y:%2 的 Atan2"; +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "回傳點(X,Y)從 -180 至 180 度的反正切值。"; +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_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_(graphics)"; // 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"] = "如果數字是偶數,奇數,非負整數,正數、 負數,或如果它是可被某數字整除,則返回 true 或 false。"; +Blockly.Msg["MATH_IS_WHOLE"] = "是整數"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://zh.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://zh.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://zh.wikipedia.org/wiki/隨機數生成器"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "隨機取分數"; +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "在 0.0(包含)和 1.0(不包含)之間隨機取一個數。"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://zh.wikipedia.org/wiki/隨機數生成器"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "隨機取數 %1 到 %2"; +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "在指定二個數之間隨機取一個數(包含)。"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://zh.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://zh.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"] = "返回指定數字指數的e的冪次。"; +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://zh.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["NEW_COLOUR_VARIABLE"] = "建立顏色變數……"; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "建立數值變數……"; +Blockly.Msg["NEW_STRING_VARIABLE"] = "建立字串變數……"; +Blockly.Msg["NEW_VARIABLE"] = "建立變數…"; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "新變數名稱:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "新變數類型:"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // 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」。"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://zh.wikipedia.org/wiki/%E5%AD%90%E7%A8%8B%E5%BA%8F"; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "執行使用者定義的函式「%1」,並使用它的回傳值。"; +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "與:"; +Blockly.Msg["PROCEDURES_CREATE_DO"] = "建立「%1」"; +Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "描述此函式..."; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://zh.wikipedia.org/wiki/子程式"; +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "做些什麼"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "到"; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "創建一個無回傳值的函式。"; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://zh.wikipedia.org/wiki/子程式"; +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_TOOLTIP"] = "如果值為 true,則返回第二個值。"; +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」變數重新命名為:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "至 %1 套用文字 %2"; +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"] = "轉成 英文首字大寫"; +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "轉成 英文大寫"; +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "使用不同的大小寫複製這段文字。"; +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_LAST"] = "取得 最後一個字元"; +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "取得 任意字元"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "在文字 %1 %2"; +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "返回位於指定位置的字元。"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "在%2計算%1"; +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "計算某些文字在內容裡的出現次數。"; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "添加一個項目到字串中。"; +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "加入"; +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "添加、刪除或重新排列各部份以重新配置這個文字區塊。"; +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "到 倒數第 # 個字元"; +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"] = "取得 第一個字元"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "取得 倒數第 # 個字元"; +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "取得 字元 #"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "返回指定的部分文字。"; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "從 最前面 索引字串"; +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "從 最後面 索引字串"; +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "在文字 %1 %2 %3"; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "在字串1中檢索是否有包含字串2,如果有,返回從頭/倒數算起的索引值。如果沒有則返回 %1。"; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 為空"; +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "如果提供的字串為空,則返回 true。"; +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"] = "輸出指定的文字、 數字或其他值。"; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "輸入數字"; +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "輸入文字"; +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "輸入 數字 並顯示提示訊息"; +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "輸入 文字 並顯示提示訊息"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "在%3以%2取代%1"; +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "取代在內容裡的全部某些文字。"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "反轉%1"; +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "反轉排序在文字裡的字元。"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://zh.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_LEFT"] = "消除左側空格"; +Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "消除右側空格"; +Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "複製這段文字,同時刪除兩端多餘的空格。"; +Blockly.Msg["TODAY"] = "今天"; +Blockly.Msg["UNDO"] = "還原"; +Blockly.Msg["UNNAMED_KEY"] = "未命名"; +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_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["VARIABLE_ALREADY_EXISTS"] = "已存在變數「%1」。"; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "已存在名為「%1」,且用於其它類型「%2」的變數。"; +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly工作區"; +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "來說些事情..."; +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +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["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/js/msg/json/ab.json b/js/msg/json/ab.json new file mode 100644 index 0000000..98771d4 --- /dev/null +++ b/js/msg/json/ab.json @@ -0,0 +1,231 @@ +{ + "@metadata": { + "authors": [ + "Абухба Андрей", + "Андрей" + ] + }, + "VARIABLES_DEFAULT_NAME": "аелемент", + "TODAY": "Иахьа", + "DUPLICATE_BLOCK": "Акопиа ахыхтәуп", + "ADD_COMMENT": "Иацҵатәуп ахцәажәара", + "REMOVE_COMMENT": "Ианыхтәуп ахцәажәара", + "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": "Ацхыраара", + "UNDO": "Иаҟәыхтәуп", + "REDO": "Аиҭаҟаҵара", + "CHANGE_VALUE_TITLE": "Ишәыҧсах аҵакы", + "RENAME_VARIABLE": "Аҽеиҭак ахьӡ ҧсахтәуп", + "RENAME_VARIABLE_TITLE": "Аҽеиҭакқәа'%1' зегь рыхьӡ ҧсахтәуп аҟны:", + "NEW_VARIABLE": "Иаҧҵатәуп аҽеиҭак", + "NEW_VARIABLE_TITLE": "Аҽеиҭак ахьӡ ҿыц:", + "VARIABLE_ALREADY_EXISTS": "Аҽеиҭак ахьӡ '%1' змоу ыҟоуп.", + "DELETE_VARIABLE": "Ианыхтәуп аҽеиҭак '%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_BLEND_TITLE": "еилаҵатәуп", + "COLOUR_BLEND_COLOUR1": "аҧштәы 1", + "COLOUR_BLEND_COLOUR2": "аҧштәы 2", + "COLOUR_BLEND_RATIO": "аҧштәы 1 ахәҭа", + "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_TITLE": "ацикл %1 ала %2 инаркны %3 рҟынӡа ашьаҿа %4", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "ацикл иҭыҵтәуп", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "ииастәуп ацикл анаҩстәи ашьаҿахьы", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Иааннакылоит абри ацикл.", + "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": "Иацнаҵоит аҭагыазаашьа аблок \"акәзар\" ахь", + "IOS_OK": "OK", + "IOS_CANCEL": "Аҟәыхра", + "IOS_ERROR": "Агха", + "IOS_PROCEDURES_INPUTS": "Аҭаларҭа", + "IOS_PROCEDURES_ADD_INPUT": "+ Иацҵатәуп аҭагаларатә ҽеиҭак", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Аоператорқәа азин рыҭара", + "IOS_VARIABLES_ADD_VARIABLE": "+ Иацҵатәуп аҽеиҭак", + "IOS_VARIABLES_ADD_BUTTON": "Иацҵатәуп", + "IOS_VARIABLES_RENAME_BUTTON": "Ахьӡ аҧсахра", + "IOS_VARIABLES_DELETE_BUTTON": "Ианыхтәуп", + "IOS_VARIABLES_VARIABLE_NAME": "Аҽеиҭак ахьӡ", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Шәара ишәылшом аҽеиҭак азы иҭацәу ахьӡ ахархәара", + "LOGIC_COMPARE_HELPURL": "https://ru.wikipedia.org/wiki/Аиҟарамра", + "LOGIC_COMPARE_TOOLTIP_EQ": "Иҳанаҭоит иҵоуроу аҵакы, иҭагалақәоу еиҟаразар.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Иҳанаҭоит иҵоуроу аҵакы, иҭагалақәоу еиҟарамзар.", + "LOGIC_COMPARE_TOOLTIP_LT": "Иҳанаҭоит иҵоуроу аҵакы, актәи иҭагалоу аҩбатәи аасҭа еиҵазар.", + "LOGIC_COMPARE_TOOLTIP_LTE": "Иҳанаҭоит аҵакы аиаша, актәи иҭагалоу аҩбатәи аасҭа еиҵазар ма иаҟаразар.", + "LOGIC_COMPARE_TOOLTIP_GT": "Иҳанаҭоит аҵакы аиаша, актәи иҭагалоу аҩбатәи аасҭа еиҳазар.", + "LOGIC_COMPARE_TOOLTIP_GTE": "Иҳанаҭоит аҵакы аиаша, актәи иҭагалоу аҩбатәи аасҭа еиҳазар ма иаҟаразар.", + "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://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_SINGLE_OP_ABSOLUTE": "амодуль", + "MATH_SINGLE_TOOLTIP_ABS": "Иҳанаҭоит ахыҧхьаӡара амодуль.", + "MATH_SINGLE_TOOLTIP_NEG": "Иҳанаҭоит иаҿагыло ахыҧхьаӡара.", + "MATH_SINGLE_TOOLTIP_LN": "Иҳанаҭоит ахыҧхьаӡара иҧсабаратәу алагорифм.", + "MATH_SINGLE_TOOLTIP_LOG10": "Иҳанаҭоит ахыҧхьаӡара ажәабатә логари̓фм", + "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_CHANGE_TITLE": "иеизырҳатәуп %1 %2 рыла", + "MATH_CHANGE_TOOLTIP": "Иацнаҵоит ахыҧхьаӡара аҽеиҭак'%1' ахь.", + "MATH_ROUND_HELPURL": "https://ru.wikipedia.org/wiki/Ахыркәшара", + "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_OPERATOR_RANDOM": "ахьӡынҵа иарбанзаалакь аелемент", + "MATH_ONLIST_TOOLTIP_RANDOM": "Иҳанаҭоит ахьӡынҵа аҟны иарбанзаалакь елементк.", + "MATH_MODULO_HELPURL": "https://ru.wikipedia.org/wiki/Ашара_цәынхала", + "MATH_MODULO_TITLE": "ацәынха %1 : %2", + "MATH_MODULO_TOOLTIP": "Иҳанаҭоит ацәынха ҩ-хыҧхьаӡарак ршараан.", + "MATH_RANDOM_INT_TITLE": "иарбанзаалакь еибгоу ахыҧхьаӡара %1 инаркны %2 нӡа", + "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_CREATE_JOIN_TITLE_JOIN": "иеиҧшьтәуп", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Иацҵатәуп аелемент атеқст ахь.", + "TEXT_APPEND_TITLE": "%1 ахьы иацҵатәуп атеқст %2", + "TEXT_APPEND_TOOLTIP": "Иацҵатәуп атеқст аҽеиҭак «%1» ахь.", + "TEXT_LENGTH_TITLE": "аура %1", + "TEXT_LENGTH_TOOLTIP": "Иҳанаҭоит асимволқәа рхыҧхьаӡара (апробелқәа алаҵаны) иҟоу атеқст аҟны.", + "TEXT_ISEMPTY_TITLE": "%1 ҭацәуп", + "TEXT_ISEMPTY_TOOLTIP": "Иҳанаҭоит аҵакы аиаша, иҟоу атеқст ҭацәызар.", + "TEXT_INDEXOF_TITLE": "атеқст %1 %2 %3 аҟны", + "TEXT_CHARAT_TITLE": "атеқст %1 %2 аҟны", + "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_END_FROM_START": "анбан № ала", + "TEXT_GET_SUBSTRING_END_LAST": "аҵыхәтәантәи анбан ала", + "TEXT_PRINT_TITLE": "икьыҧхьтәуп %1", + "TEXT_PRINT_TOOLTIP": "Иакьыҧхьуеит атеқст, ахыҧхьаӡара ма даҽа обиеқтк.", + "TEXT_REPLACE_MESSAGE0": "иҧсахтәуп %1 %2 ала %3 аҟны", + "LISTS_CREATE_EMPTY_TITLE": "иаҧцатәуп иҭацәу ахьӡынҵа", + "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_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_INDEX_FROM_START_TOOLTIP": "%1 - актәи аелемент.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 - аҵыхәтәантәи аелемент.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Иҳанаҭоит ахьӡынҵа актәи аелемент.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Иҳанаҭоит ахьӡынҵа аҵыхәтәантәи аелемент.", + "LISTS_GET_INDEX_TOOLTIP_GET_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_INSERT": "ибжьаргылатәуп", + "LISTS_SET_INDEX_INPUT_TO": "=", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Иацнаҵоит аелемент ахьӡынҵа анҵәамҭахь.", + "LISTS_GET_SUBLIST_END_FROM_START": "№ ала", + "LISTS_SORT_TITLE": "еилыҧшаатәуп %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Еилыҧшаатәуп ахьӡынҵа акопиа.", + "LISTS_SORT_ORDER_ASCENDING": "еиҵоу-еиҳауала", + "LISTS_SORT_ORDER_DESCENDING": "еиҳау-еиҵоуала", + "LISTS_SORT_TYPE_NUMERIC": "ахыҧхьаӡаратәи", + "LISTS_SORT_TYPE_TEXT": "алфавитла", + "LISTS_SPLIT_TEXT_FROM_LIST": "еизгатәуп атеқст ахьӡынҵа аҟынтәи", + "VARIABLES_GET_TOOLTIP": "Иҳанаҭоит аҽеиҭак аҵакы.", + "VARIABLES_GET_CREATE_SET": "Иаҧҵатәуп аблок \"иаҭатәуп\" %1 азы", + "VARIABLES_SET": "иаҭатәуп %1 = %2", + "PROCEDURES_DEFNORETURN_TITLE": "азы", + "PROCEDURES_DEFNORETURN_PROCEDURE": "иҟаҵатәуп џьара акы", + "PROCEDURES_BEFORE_PARAMS": "аҟынтәи:", + "PROCEDURES_CALL_BEFORE_PARAMS": "аҟынтәи:", + "PROCEDURES_DEFNORETURN_TOOLTIP": "Иаҧнаҵоит апроцедура, аҵакы ҳазымҭо.", + "PROCEDURES_DEFNORETURN_COMMENT": "Абри афункциа ахҳәа азыҟашәҵа...", + "PROCEDURES_DEFRETURN_RETURN": "ирхынҳәтәуп", + "PROCEDURES_DEFRETURN_TOOLTIP": "Иаҧнаҵоит апроцедура, аҵакы ҳазҭо.", + "PROCEDURES_ALLOW_STATEMENTS": "Аоператорқәа азин рыҭара", + "PROCEDURES_CALLNORETURN_HELPURL": "https://ru.wikipedia.org/wiki/Ацхыраагӡатә программа", + "PROCEDURES_CALLRETURN_HELPURL": "https://ru.wikipedia.org/wiki/Ацхыраагӡатә программа", + "PROCEDURES_MUTATORCONTAINER_TITLE": "апараметрқәа", + "PROCEDURES_MUTATORARG_TITLE": "апараметр ахьӡ:", + "PROCEDURES_CREATE_DO": "Иаҧҵатәуп ааҧхьара'%1'", + "PROCEDURES_IFRETURN_TOOLTIP": "Актәи аҵакы иашазар, иҳанаҭоит аҩбатәи аҵакы.", + "PROCEDURES_IFRETURN_WARNING": "Агәаҽанҵара: Ари аблок ахархәара ауеит афункциа аҧҵара аҟны." +} diff --git a/js/msg/json/ar.json b/js/msg/json/ar.json new file mode 100644 index 0000000..0d059ac --- /dev/null +++ b/js/msg/json/ar.json @@ -0,0 +1,373 @@ +{ + "@metadata": { + "authors": [ + "Meno25", + "Test Create account", + "아라", + "Diyariq", + "محمد أحمد عبد الفتاح", + "Moud hosny", + "ديفيد", + "Samir", + "Mido", + "DonAdnan" + ] + }, + "VARIABLES_DEFAULT_NAME": "البند", + "UNNAMED_KEY": "غير مسمى", + "TODAY": "اليوم", + "DUPLICATE_BLOCK": "مكرر", + "ADD_COMMENT": "أضف تعليقًا", + "REMOVE_COMMENT": "أزل التعليق", + "DUPLICATE_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": "مساعدة", + "UNDO": "رجوع", + "REDO": "إعادة", + "CHANGE_VALUE_TITLE": "تغيير قيمة:", + "RENAME_VARIABLE": "إعادة تسمية المتغير...", + "RENAME_VARIABLE_TITLE": "إعادة تسمية كافة المتغيرات '%1' إلى:", + "NEW_VARIABLE": "إنشاء متغير...", + "NEW_STRING_VARIABLE": "انشاء متغير نصي...", + "NEW_NUMBER_VARIABLE": "انشاء متغير رقمي...", + "NEW_COLOUR_VARIABLE": "انشاء متغير لوني...", + "NEW_VARIABLE_TYPE_TITLE": "نوع متغير جديد:", + "NEW_VARIABLE_TITLE": "اسم المتغير الجديد:", + "VARIABLE_ALREADY_EXISTS": "المتغير '%1' موجود بالفعل", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "متغير بأسم '%1' معرف من نوع اخر : '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "حذف%1 1 استخدامات المتغير '%2'؟", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "لايمكن حذف متغير \"%1\" بسبب انه جزء من الدالة \"%2\"", + "DELETE_VARIABLE": "حذف المتغير %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": "أضف شرط \"نهاية، إجمع\" إلى القطعة الشرطية \"إذا\".", + "IOS_OK": "أوافق", + "IOS_CANCEL": "إلغاء", + "IOS_ERROR": "خطأ", + "IOS_PROCEDURES_INPUTS": "المدخلات", + "IOS_PROCEDURES_ADD_INPUT": "+اضافة ادخال", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "العبارات المسموحة", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "هذه الدالة لها مدخلات مكررة.", + "IOS_VARIABLES_ADD_VARIABLE": "+اضف متغير", + "IOS_VARIABLES_ADD_BUTTON": "أضف", + "IOS_VARIABLES_RENAME_BUTTON": "أعد التسمية", + "IOS_VARIABLES_DELETE_BUTTON": "احذف", + "IOS_VARIABLES_VARIABLE_NAME": "اسم المتغير", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "لا يمكنك استخدام اسم متغير فارغ.", + "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://ar.wikipedia.org/wiki/%D8%B9%D8%AF%D8%AF", + "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 (خارجيا).", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 من X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "عودة قوس ظل النقطة (س، ص) بالدرجات من -180 إلى 180.", + "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_TITLE": "إلى %1 إلصق نص %2", + "TEXT_APPEND_TOOLTIP": "إلصق جزءا من النص إلى متغير '%1'.", + "TEXT_LENGTH_TITLE": "طول %1", + "TEXT_LENGTH_TOOLTIP": "تقوم بإرجاع عدد الاحرف (بما في ذلك الفراغات) في النص المقدم.", + "TEXT_ISEMPTY_TITLE": "%1 فارغ", + "TEXT_ISEMPTY_TOOLTIP": "يرجع \"صحيح\" إذا كان النص المقدم فارغ.", + "TEXT_INDEXOF_TOOLTIP": "تقوم بإرجاع مؤشر التواجد الأول/الأخير للنص الأول في النص الثاني. تقوم بإرجاع %1 إذا لم يتم العثور على النص.", + "TEXT_INDEXOF_TITLE": "في النص %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "ابحث عن التواجد الأول للنص", + "TEXT_INDEXOF_OPERATOR_LAST": "ابحث عن التواجد الأخير للنص", + "TEXT_CHARAT_TITLE": "في النص %1 %2", + "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": "انتظر ادخال المستخدم لنص ما.", + "TEXT_COUNT_MESSAGE0": "العدد %1 في %2", + "TEXT_COUNT_TOOLTIP": "احسب كم عدد بعض النصوص تتكرر ضمن نص اخر.", + "TEXT_REPLACE_MESSAGE0": "بدل %1 ب %2 في %3", + "TEXT_REPLACE_TOOLTIP": "استبدل جميع حالات حدوث بعض النصوص داخل نص آخر.", + "TEXT_REVERSE_MESSAGE0": "عكس %1", + "TEXT_REVERSE_TOOLTIP": "يعكس ترتيب حروف النص", + "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": "تقوم بإرجاع مؤشر التواجد الأول/الأخير في القائمة. تقوم بإرجاع %1 إذا لم يتم العثور على النص.", + "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_INDEX_FROM_START_TOOLTIP": "%1 هو العنصر الأول.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 هو العنصر الأخير.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "يقوم بإرجاع العنصر في الموضع المحدد في قائمة ما.", + "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": "يزيل ويقوم بإرجاع العنصر في الموضع المحدد في قائمة ما.", + "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": "يزيل العنصر الموجود في الموضع المحدد في قائمة ما.", + "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": "يحدد العنصر في الموضع المحدد في قائمة ما.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "يحدد العنصر الأول في قائمة.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "يحدد العنصر الأخير في قائمة.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "يحدد عنصرا عشوائيا في قائمة.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "يقوم بإدخال العنصر في الموضع المحدد في قائمة ما.", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "رتب %1 %2 %3", + "LISTS_SORT_TOOLTIP": "فرز نسخة من القائمة.", + "LISTS_SORT_ORDER_ASCENDING": "تصاعديا", + "LISTS_SORT_ORDER_DESCENDING": "تنازليا", + "LISTS_SORT_TYPE_NUMERIC": "رقمي", + "LISTS_SORT_TYPE_TEXT": "أبجديًا", + "LISTS_SORT_TYPE_IGNORECASE": "أبجديا، وتجاهل الحالة", + "LISTS_SPLIT_LIST_FROM_TEXT": "إعداد قائمة من النصوص", + "LISTS_SPLIT_TEXT_FROM_LIST": "إعداد نص من القائمة", + "LISTS_SPLIT_WITH_DELIMITER": "مع محدد", + "LISTS_SPLIT_TOOLTIP_SPLIT": "تقسيم النص إلى قائمة من النصوص، وكسر في كل محدد", + "LISTS_SPLIT_TOOLTIP_JOIN": "ضم قائمة النصوص في نص واحد، مفصولة بواسطة محدد.", + "LISTS_REVERSE_MESSAGE0": "عكس %1", + "LISTS_REVERSE_TOOLTIP": "عكس نسخة من القائمة.", + "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/Subroutine", + "PROCEDURES_DEFNORETURN_TITLE": "إلى", + "PROCEDURES_DEFNORETURN_PROCEDURE": "القيام بشيء ما", + "PROCEDURES_BEFORE_PARAMS": "مع:", + "PROCEDURES_CALL_BEFORE_PARAMS": "مع:", + "PROCEDURES_DEFNORETURN_TOOLTIP": "انشئ دالة بدون مخرجات .", + "PROCEDURES_DEFNORETURN_COMMENT": "صف هذه الوظيفة...", + "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_DEFRETURN_RETURN": "يرجع", + "PROCEDURES_DEFRETURN_TOOLTIP": "انشئ دالة مع المخرجات.", + "PROCEDURES_ALLOW_STATEMENTS": "اسمح بالبيانات", + "PROCEDURES_DEF_DUPLICATE_WARNING": "تحذير: هذه الدالة تحتوي على معلمات مكررة.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLNORETURN_TOOLTIP": "تشغيل الدالة المعرفة من قبل المستخدم '%1'.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "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": "تحذير:هذه القطعة تستخدم فقط داخل تعريف دالة.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "قل شيئا...", + "WORKSPACE_ARIA_LABEL": "مساحة عمل بلوكلي", + "COLLAPSED_WARNINGS_WARNING": "الكتل المطوية تحتوي على تحذيرات." +} diff --git a/js/msg/json/az.json b/js/msg/json/az.json new file mode 100644 index 0000000..6bfec57 --- /dev/null +++ b/js/msg/json/az.json @@ -0,0 +1,358 @@ +{ + "@metadata": { + "authors": [ + "Cekli829", + "AZISS", + "Masalli qasimli", + "Adil" + ] + }, + "VARIABLES_DEFAULT_NAME": "element", + "TODAY": "Bugün", + "DUPLICATE_BLOCK": "Dublikat", + "ADD_COMMENT": "Şərh əlavə et", + "REMOVE_COMMENT": "Şərhi sil", + "DUPLICATE_COMMENT": "Şərhin nüsxəsini yarat", + "EXTERNAL_INPUTS": "Xarici girişlər", + "INLINE_INPUTS": "Sətiriçi girişlər", + "DELETE_BLOCK": "Bloku sil", + "DELETE_X_BLOCKS": "%1 bloku sil", + "DELETE_ALL_BLOCKS": "Bütün %1 blok silinsin?", + "CLEAN_UP": "Blokları təmizlə", + "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", + "UNDO": "Geri", + "REDO": "İrəli", + "CHANGE_VALUE_TITLE": "Qiyməti dəyiş:", + "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ş:", + "NEW_VARIABLE": "Yeni dəyişən...", + "NEW_STRING_VARIABLE": "Yeni sətir dəyişəni...", + "NEW_NUMBER_VARIABLE": "Yeni rəqəm dəyişəni...", + "NEW_COLOUR_VARIABLE": "Yeni rəng dəyişəni...", + "NEW_VARIABLE_TYPE_TITLE": "Yeni dəyişənin tipi:", + "NEW_VARIABLE_TITLE": "Yeni dəyişənin adı:", + "VARIABLE_ALREADY_EXISTS": "'%1' adlı dəyişən artıq mövcuddur.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "'%1' adlı dəyişən artıq '%2': tipində istifadə edilir .", + "DELETE_VARIABLE_CONFIRMATION": "'%2' dəyişəninin %1 istifadəsini silək?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "'%1' dəyişənini silmək mümkün deyil, çünki o '%2' funksiyasının təyin hissəsidir", + "DELETE_VARIABLE": "'%1' adlı dəyişəni sil", + "COLOUR_PICKER_HELPURL": "https://az.wikipedia.org/wiki/Rəng", + "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ənglə", + "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_HELPURL": "https://az.wikipedia.org/wiki/For_loop", + "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.", + "IOS_OK": "OK", + "IOS_CANCEL": "Ləğv et", + "IOS_ERROR": "Xəta", + "IOS_PROCEDURES_INPUTS": "GİRİŞ", + "IOS_PROCEDURES_ADD_INPUT": "+ Giriş əlavə et", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Operatorlara icazə", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Bu funksiyada təkrarlanan giriş dəyişənləri vardır.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Dəyişən əlavə et", + "IOS_VARIABLES_ADD_BUTTON": "Əlavə et", + "IOS_VARIABLES_RENAME_BUTTON": "Adını dəyiş", + "IOS_VARIABLES_DELETE_BUTTON": "Sil", + "IOS_VARIABLES_VARIABLE_NAME": "Dəyişənin adı", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Adsız dəyişən istifadə edə bilməzsiniz.", + "LOGIC_COMPARE_HELPURL": "https://az.wikipedia.org/wiki/bərabərsizlik_(riyazi)", + "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 \"səhf\" cavabını qaytarır.", + "LOGIC_BOOLEAN_TRUE": "doğru", + "LOGIC_BOOLEAN_FALSE": "səhf", + "LOGIC_BOOLEAN_TOOLTIP": "\"doğru\" və ya \"səhf\" 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 səhfdirsə", + "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_HELPURL": "https://az.wikipedia.org/wiki/Ədəd", + "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_HELPURL": "https://az.wikipedia.org/wiki/Kvadrat_kökləri", + "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_HELPURL": "https://az.wikipedia.org/wiki/Triqonometrik_funksiyalar", + "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_HELPURL": "https://az.wikipedia.org/wiki/Riyazi_sabitlə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üsbə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_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", + "MATH_CHANGE_TITLE": "dəyiş: %1 buna: %2", + "MATH_CHANGE_TOOLTIP": "'%1' dəyişəninin üzərinə bir ədəd artır.", + "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", + "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_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", + "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_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "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_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "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.", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TOOLTIP": "(X,Y) nöqtələrinin -180 - 180 dərəcədə arktangensini hesabla.", + "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", + "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_TITLE": "bu mətnin sonuna: %1 bu mətni əlavə et: %2", + "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ə, %1 qaytarır.", + "TEXT_INDEXOF_TITLE": "mətndə %1 %2 %3", + "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_TITLE": "mətndə %1 %2", + "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.", + "TEXT_COUNT_MESSAGE0": "%2 içindən %1 sayını hesabla", + "TEXT_COUNT_TOOLTIP": "Hesablayaq, mətnin bu hissəsi başqa mətndə neçə dəfə rast gəlinir.", + "TEXT_REPLACE_MESSAGE0": "%3 -də %1 əvəz et %2", + "TEXT_REPLACE_TOOLTIP": "Bütün uyğunluqlu bəzi mətnlərin digər bəzi mətnlərə dəyişdirilməsi.", + "TEXT_REVERSE_MESSAGE0": "əksinə dəyiş %1", + "TEXT_REVERSE_TOOLTIP": "Mətndəki simvolların ardıcıllığını əksinə dəyiş.", + "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": "Elementin siyahıda ilk/son rastlaşma indeksini qaytarır. Əgər siyahıda mətn tapılmadısa, %1 qaytarılır.", + "LISTS_GET_INDEX_GET": "götür", + "LISTS_GET_INDEX_GET_REMOVE": "götür və sil", + "LISTS_GET_INDEX_REMOVE": "yığışdır", + "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_INDEX_FROM_START_TOOLTIP": "%1 ilk elementdir.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 son elementdir.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Siyahıdan təyin olunmuş indeksli elementi qaytarır.", + "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": "Siyahıdan təyin olunmuş indeksli elementi silir və qaytarır.", + "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": "Siyahıdan təyin olunmuş indeksli elementi silir.", + "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": "Siyahının göstərilən yerdəki elementini təyin edir.", + "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": "Elementi siyahıda göstərilən yerə daxil edir.", + "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.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "%1 %2 %3 sortlaşdır", + "LISTS_SORT_TOOLTIP": "Siyahının nüsxəsini sortlaşdır.", + "LISTS_SORT_ORDER_ASCENDING": "artan üzrə", + "LISTS_SORT_ORDER_DESCENDING": "azalan üzrə", + "LISTS_SORT_TYPE_NUMERIC": "say üzrə", + "LISTS_SORT_TYPE_TEXT": "əlifba üzrə", + "LISTS_SORT_TYPE_IGNORECASE": "əlifba üzrə, registrı nəzərə almadan", + "LISTS_SPLIT_LIST_FROM_TEXT": "mətndən siyahı düzəlt", + "LISTS_SPLIT_TEXT_FROM_LIST": "siyahıdan mətn düzəlt", + "LISTS_SPLIT_WITH_DELIMITER": "ayırıcıyla", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Mətni ayırıcılara görə bölərək mətnlər siyahısı yaradır.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Mətnlər siyahısından ayırıcılarla birgə bir mətn yaradır.", + "LISTS_REVERSE_MESSAGE0": "əksinə dəyiş %1", + "LISTS_REVERSE_TOOLTIP": "Siyahının nüsxəsini əksinə dəyiş.", + "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_DEFNORETURN_COMMENT": "Bu funksiyanı təsvir et", + "PROCEDURES_DEFRETURN_RETURN": "qaytar", + "PROCEDURES_DEFRETURN_TOOLTIP": "Nəticəsi olan funksiya yaradır.", + "PROCEDURES_ALLOW_STATEMENTS": "operatorlara icazə", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Xəbərdarlıq: Bu funksiyanın təkrar olunmuş parametrləri var.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Yaradılmış '%1' funksiyasını çalışdır.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLRETURN_TOOLTIP": "Yaradılmış '%1' funksiyasını çalışdır və nəticəni istifadə et.", + "PROCEDURES_MUTATORCONTAINER_TITLE": "girişlər", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Bu funksiyanın giriş parametrləri üçün əlavə et, sil, və ya yenilə.", + "PROCEDURES_MUTATORARG_TITLE": "Giriş adı:", + "PROCEDURES_MUTATORARG_TOOLTIP": "Funksiyaya giriş parametrləri əlavə et.", + "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.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Buraya nə isə yaz..." +} diff --git a/js/msg/json/ba.json b/js/msg/json/ba.json new file mode 100644 index 0000000..7a99558 --- /dev/null +++ b/js/msg/json/ba.json @@ -0,0 +1,208 @@ +{ + "@metadata": { + "authors": [ + "Alfiya55", + "Ләйсән", + "Айсар", + "Кутлубаева Кунсулу Закиевна", + "Азат Хәлилов", + "Танзиля Кутлугильдина" + ] + }, + "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": "Ярҙам", + "UNDO": "Кире алырға", + "REDO": "документтарҙы үҙгәртергә", + "CHANGE_VALUE_TITLE": "Мәғәнәне үҙгәртегеҙ:", + "RENAME_VARIABLE": "Үҙгәреүсәндең исемен алмаштырырға...", + "RENAME_VARIABLE_TITLE": "Бөтә '%1' үҙгәреүсәндәрҙең исемен ошолай алмаштырырға:", + "NEW_VARIABLE": "Яңы үҙгәреүсән...", + "NEW_VARIABLE_TITLE": "Яңы үҙгәреүсәндең исеме:", + "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": "1-се төҫ", + "COLOUR_BLEND_COLOUR2": "2-се төҫ", + "COLOUR_BLEND_RATIO": "1-се төҫтөң өлөшө", + "COLOUR_BLEND_TOOLTIP": "Ике төҫтө бирелгән нисбәттә болғата (0.0 - 1.0).", + "CONTROLS_REPEAT_HELPURL": "https://en.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_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_(математика)", + "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://ba.wikipedia.org/wiki/Һан", + "MATH_NUMBER_TOOLTIP": "Рәт.", + "MATH_ARITHMETIC_HELPURL": "https://ba.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://ba.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://ba..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://ba.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://ba.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", + "MATH_CHANGE_TITLE": "%1 тан %2 ҡа арттырырға", + "MATH_CHANGE_TOOLTIP": "Үҙгәреүсән һанға өҫтәй '%1'.", + "MATH_ROUND_HELPURL": "https://ba.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://ba.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://ba.wikipedia.org/wiki/Ялған осраҡлы_һандар_генераторы", + "MATH_RANDOM_INT_TITLE": "%1-ҙән %2-гә тиклем осраҡлы бөтөн һан", + "MATH_RANDOM_INT_TOOLTIP": "Ике бирелгән һан араһындағы (үҙҙәрен дә индереп) осраҡлы һанды күрһәтә.", + "MATH_RANDOM_FLOAT_HELPURL": "https://ba.wikipedia.org/wiki/Ялған осраҡлы_һандар_генераторы", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "0 (үҙен дә индереп) һәм 1 араһындағы осраҡлы һан", + "TEXT_TEXT_TOOLTIP": "Текстың хәрефе, һүҙе йәки юлы.", + "TEXT_JOIN_TITLE_CREATEWITH": "текст төҙөргә", + "TEXT_JOIN_TOOLTIP": "Элементтарҙың теләһә күпме һанын берләштереп текст фрагментын булдыра.", + "TEXT_CREATE_JOIN_TITLE_JOIN": "ҡушылығыҙ", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Текстҡа элемент өҫтәү.", + "TEXT_APPEND_TOOLTIP": "Үҙгәреүсән «%1»-гә текст өҫтәргә.", + "TEXT_LENGTH_TITLE": "оҙонлоғо %1", + "TEXT_LENGTH_TOOLTIP": "Бирелгән текстағы символдар һанын (буш урындар менән бергә) кире ҡайтара.", + "TEXT_ISEMPTY_TITLE": "%1 буш", + "TEXT_INDEXOF_TITLE": "текстҡа %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "текстың тәүге инеүен табырға", + "TEXT_INDEXOF_OPERATOR_LAST": "Текстың һуңғы инеүен табырға", + "TEXT_CHARAT_FROM_START": "хат алырға #", + "TEXT_CHARAT_FROM_END": "№ хәрефен аҙаҡтан алырға", + "TEXT_CHARAT_FIRST": "тәүге хәрефте алырға", + "TEXT_CHARAT_LAST": "һуңғы хәрефте алырға", + "TEXT_CHARAT_RANDOM": "осраҡлы хәрефте алырға", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "текста", + "TEXT_GET_SUBSTRING_END_FROM_START": "# хатҡа", + "TEXT_GET_SUBSTRING_END_LAST": "һуңғы хәрефкә тиклем", + "TEXT_PRINT_TITLE": "%1 баҫтырырға", + "LISTS_CREATE_WITH_INPUT_WITH": "менән исемлек төҙөргә", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "исемлек", + "LISTS_LENGTH_TITLE": "оҙонлоғо %1", + "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_SET": "йыйылма", + "LISTS_SET_INDEX_INSERT": "өҫтәп ҡуйырға", + "LISTS_SET_INDEX_INPUT_TO": "кеүек", + "PROCEDURES_DEFRETURN_RETURN": "кире ҡайтарыу", + "PROCEDURES_MUTATORCONTAINER_TITLE": "инеү", + "PROCEDURES_MUTATORARG_TITLE": "инеү исеме:", + "PROCEDURES_CREATE_DO": "'%1' төҙөргә" +} diff --git a/js/msg/json/bcc.json b/js/msg/json/bcc.json new file mode 100644 index 0000000..9a13638 --- /dev/null +++ b/js/msg/json/bcc.json @@ -0,0 +1,288 @@ +{ + "@metadata": { + "authors": [ + "Baloch Afghanistan", + "Sultanselim baloch" + ] + }, + "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": "کومک", + "CHANGE_VALUE_TITLE": "تغییر مقدار:", + "RENAME_VARIABLE": "تغییر نام متغیر...", + "RENAME_VARIABLE_TITLE": "تغییر نام همهٔ متغیرهای «%1» به:", + "NEW_VARIABLE": "متغیر تازه...", + "NEW_VARIABLE_TITLE": "نام متغیر تازه:", + "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_TITLE": "به %1 الحاق متن %2", + "TEXT_APPEND_TOOLTIP": "الحاق متنی به متغیر «%1».", + "TEXT_LENGTH_TITLE": "طول %1", + "TEXT_LENGTH_TOOLTIP": "بازگرداندن عددی از حروف (شامل فاصله‌ها) در متن فراهم‌شده.", + "TEXT_ISEMPTY_TITLE": "%1 خالی است", + "TEXT_ISEMPTY_TOOLTIP": "اضافه‌کردن صحیح اگر متن فراهم‌شده خالی است.", + "TEXT_INDEXOF_TOOLTIP": "شاخصی از اولین آخرین رخ‌داد متن اول در متن دوم بر می‌گرداند. اگر متن یافت نشد %1 باز می‌گرداند.", + "TEXT_INDEXOF_TITLE": "در متن %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "اولین رخداد متن را بیاب", + "TEXT_INDEXOF_OPERATOR_LAST": "آخرین رخداد متن را بیاب", + "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": "شاخصی از اولین/آخرین رخ‌داد مورد در فهرست را بر می‌گرداند. %1 بر می‌گرداند اگر متن موجود نبود.", + "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_INDEX_FROM_START_TOOLTIP": "%1 اولین مورد است.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 آخرین مورد است.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "موردی در محل مشخص‌شده بر می‌گرداند.", + "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": "مورد در محل مشخص‌شده در فهرست را حذف و بر می‌گرداند.", + "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": "مورد مشخص‌شده در موقعیت مشخص در یک فهرست را حذف و بر می‌گرداند.", + "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": "مورد مشخص‌شده در یک فهرست را قرار می‌دهد.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "اولین مورد در یک فهرست را تعیین می‌کند.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "آخرین مورد در یک فهرست را تعیین می‌کند.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "یک مورد تصادفی در یک فهرست را تعیین می‌کند.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "موردی در موقعیت مشخص‌شده در یک فهرست اضافه می‌کند.", + "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/js/msg/json/be-tarask.json b/js/msg/json/be-tarask.json new file mode 100644 index 0000000..b90be5b --- /dev/null +++ b/js/msg/json/be-tarask.json @@ -0,0 +1,353 @@ +{ + "@metadata": { + "authors": [ + "Renessaince", + "Jim-by", + "Red Winged Duck", + "Nerogaf" + ] + }, + "VARIABLES_DEFAULT_NAME": "аб’ект", + "UNNAMED_KEY": "безназоўны", + "TODAY": "Сёньня", + "DUPLICATE_BLOCK": "Капіяваць", + "ADD_COMMENT": "Дадаць камэнтар", + "REMOVE_COMMENT": "Выдаліць камэнтар", + "DUPLICATE_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": "Дапамога", + "UNDO": "Скасаваць", + "REDO": "Паўтарыць", + "CHANGE_VALUE_TITLE": "Зьмяніць значэньне:", + "RENAME_VARIABLE": "Перайменаваць зьменную…", + "RENAME_VARIABLE_TITLE": "Перайменаваць усе назвы зьменных '%1' на:", + "NEW_VARIABLE": "Стварыць зьменную…", + "NEW_STRING_VARIABLE": "Стварыць радковую зьменную…", + "NEW_NUMBER_VARIABLE": "Стварыць лікавую зьменную…", + "NEW_COLOUR_VARIABLE": "Стварыць зьменную колеру…", + "NEW_VARIABLE_TYPE_TITLE": "Новы тып зьменнай:", + "NEW_VARIABLE_TITLE": "Імя новай зьменнай:", + "VARIABLE_ALREADY_EXISTS": "Зьменная з назвай «%1» ужо існуе.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Зьменная з назвай «%1» ужо існуе зь іншым тыпам: «%2».", + "DELETE_VARIABLE_CONFIRMATION": "Выдаліць %1 выкарыстаньняў зьменнай «%2»?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Немагчыма выдаліць зьменную «%1», таму што яна зьяўляецца часткай вызначэньня функцыі «%2»", + "DELETE_VARIABLE": "Выдаліць зьменную «%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": "Дадаць заключную ўмову для ўсіх астатніх варыянтаў блёку «калі».", + "IOS_OK": "Добра", + "IOS_CANCEL": "Адмяніць", + "IOS_ERROR": "Памылка", + "IOS_PROCEDURES_INPUTS": "УВАХОДНЫЯ ЗЬВЕСТКІ", + "IOS_PROCEDURES_ADD_INPUT": "+ Дадаць уваходныя зьвесткі", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Дазволіць сьцьверджаньні", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Уваходныя зьвесткі гэтай функцыі дублююцца.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Дадаць зьменную", + "IOS_VARIABLES_ADD_BUTTON": "Дадаць", + "IOS_VARIABLES_RENAME_BUTTON": "Перайменаваць", + "IOS_VARIABLES_DELETE_BUTTON": "Выдаліць", + "IOS_VARIABLES_VARIABLE_NAME": "Назва зьменнай", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Вы ня можаце выкарыстоўваць пустую назву зьменнай.", + "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.", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 ад X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "Вяртае арктангенс пункту (X, Y) у градусах ад -180 да 180.", + "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_TITLE": "да %1 дадаць тэкст %2", + "TEXT_APPEND_TOOLTIP": "Дадаць які-небудзь тэкст да зьменнай '%1'.", + "TEXT_LENGTH_TITLE": "даўжыня %1", + "TEXT_LENGTH_TOOLTIP": "Вяртае колькасьць літараў (у тым ліку прабелы) у пададзеным тэксьце.", + "TEXT_ISEMPTY_TITLE": "%1 пусты", + "TEXT_ISEMPTY_TOOLTIP": "Вяртае значэньне ісьціна, калі тэкст пусты.", + "TEXT_INDEXOF_TOOLTIP": "Вяртае індэкс першага/апошняга ўваходжаньня першага тэксту ў другі тэкст. Вяртае %1, калі тэкст ня знойдзены.", + "TEXT_INDEXOF_TITLE": "у тэксьце %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "знайсьці першае ўваходжаньне тэксту", + "TEXT_INDEXOF_OPERATOR_LAST": "знайсьці апошняе ўваходжаньне тэксту", + "TEXT_CHARAT_TITLE": "у тэксьце %1 %2", + "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": "Запытаць у карыстальніка тэкст.", + "TEXT_COUNT_MESSAGE0": "падлічыць %1 сярод %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Падлічвае колькі разоў нейкі тэкст сустракаецца ўнутры нейкага іншага тэксту.", + "TEXT_REPLACE_MESSAGE0": "замяніць %1 на %2 у %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "Замяняе ўсе выпадкі нейкага тэксту на іншы тэкст.", + "TEXT_REVERSE_MESSAGE0": "адваротна %1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "Мяняе парадак сымбаляў у тэксьце на адваротны.", + "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": "Вяртае індэкс першага/апошняга ўваходжаньня элемэнту ў сьпіс. Вяртае %1, калі элемэнт ня знойдзены.", + "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_INDEX_FROM_START_TOOLTIP": "№%1 — першы элемэнт.", + "LISTS_INDEX_FROM_END_TOOLTIP": "№%1 — апошні элемэнт.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Вяртае элемэнт у пазначанай пазыцыі ў сьпісе.", + "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": "Выдаляе і вяртае элемэнт у пазначанай пазыцыі ў сьпісе.", + "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": "Выдаляе элемэнт у пазначанай пазыцыі ў сьпісе.", + "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": "Задае элемэнт у пазначанай пазыцыі ў сьпісе.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Задае першы элемэнт у сьпісе.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Задае апошні элемэнт у сьпісе.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Задае выпадковы элемэнт у сьпісе.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Устаўляе элемэнт у пазначанай пазыцыі ў сьпісе.", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "сартаваць %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Сартаваць копію сьпісу.", + "LISTS_SORT_ORDER_ASCENDING": "па павелічэньні", + "LISTS_SORT_ORDER_DESCENDING": "па зьмяншэньні", + "LISTS_SORT_TYPE_NUMERIC": "як лікі", + "LISTS_SORT_TYPE_TEXT": "паводле альфабэту", + "LISTS_SORT_TYPE_IGNORECASE": "паводле альфабэту, ігнараваць рэгістар", + "LISTS_SPLIT_LIST_FROM_TEXT": "стварыць сьпіс з тэксту", + "LISTS_SPLIT_TEXT_FROM_LIST": "стварыць тэкст са сьпісу", + "LISTS_SPLIT_WITH_DELIMITER": "з падзяляльнікам", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Падзяліць тэкст у сьпіс тэкстаў, па падзяляльніках.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Аб’ядноўвае сьпіс тэкстаў у адзін тэкст па падзяляльніках.", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "адваротна %1", + "LISTS_REVERSE_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_DEFNORETURN_COMMENT": "Апішыце гэтую функцыю…", + "PROCEDURES_DEFRETURN_RETURN": "вярнуць", + "PROCEDURES_DEFRETURN_TOOLTIP": "Стварае функцыю з вынікам.", + "PROCEDURES_ALLOW_STATEMENTS": "дазволіць зацьвярджэньне", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Увага: гэтая функцыя мае парамэтры-дублікаты.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Запусьціць функцыю вызначаную карыстальнікам '%1'.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "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_HELPURL": "http://c2.com/cgi/wiki?GuardClause", + "PROCEDURES_IFRETURN_WARNING": "Папярэджаньне: гэты блёк можа выкарыстоўвацца толькі ў вызначанай функцыі.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Напішыце што-небудзь…", + "WORKSPACE_ARIA_LABEL": "Працоўная прастора Blockly", + "COLLAPSED_WARNINGS_WARNING": "Згорнутыя блёкі ўтрымліваюць папярэджаньні." +} diff --git a/js/msg/json/be.json b/js/msg/json/be.json new file mode 100644 index 0000000..9758945 --- /dev/null +++ b/js/msg/json/be.json @@ -0,0 +1,333 @@ +{ + "@metadata": { + "authors": [ + "SimondR" + ] + }, + "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": "Даведка", + "UNDO": "Адкаціць", + "REDO": "Паўтарыць", + "CHANGE_VALUE_TITLE": "Змяніць значэння:", + "RENAME_VARIABLE": "Перайменаваць пераменную...", + "RENAME_VARIABLE_TITLE": "Перайменаваць усе пераменныя '%1' да:", + "NEW_VARIABLE": "Стварыць пераменную...", + "NEW_VARIABLE_TITLE": "Новая назва пераменнай:", + "VARIABLE_ALREADY_EXISTS": "Пераменная з назвай '%1' ужо існуе.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Назва пераменнай '%1' ужо выкарыстоўваецца іншай пераменнай тыпу '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Выдаліць %1 выкарыстання пераменнай '%2'?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Немагчыма выдаліць пераменную '%1', паколькі яна з'яўляецца часткай вызначэння функцыі '%2'", + "DELETE_VARIABLE": "Выдаліць пераменную '%1'", + "COLOUR_PICKER_HELPURL": "https://be.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://be.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": "Дадаць канчатковую, ўсёабдымную ўмову ў блок 'калі'.", + "IOS_OK": "Добра", + "IOS_CANCEL": "Адмяніць", + "IOS_ERROR": "Памылка", + "IOS_PROCEDURES_INPUTS": "УВАХОД", + "IOS_PROCEDURES_ADD_INPUT": "+ Дадаць уваходную пераменную", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Дазволіць аператары", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "У гэтай функцыі ёсць уваходныя пераменныя, якія дубліруюцца.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Дадаць пераменную", + "IOS_VARIABLES_ADD_BUTTON": "Дадаць", + "IOS_VARIABLES_RENAME_BUTTON": "Перайменаваць", + "IOS_VARIABLES_DELETE_BUTTON": "Выдаліць", + "IOS_VARIABLES_VARIABLE_NAME": "Назва пераменнай", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Вы не можаце выкарыстоўваць пустое імя пераменнай.", + "LOGIC_COMPARE_HELPURL": "https://be.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://be.wikipedia.org/wiki/Лік", + "MATH_NUMBER_TOOLTIP": "Лік.", + "MATH_ARITHMETIC_HELPURL": "https://be.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://be.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://be.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://be.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://be.wikipedia.org/wiki/Ідыёма (праграмаванне)", + "MATH_CHANGE_TITLE": "павялічыць %1 на %2", + "MATH_CHANGE_TOOLTIP": "Дадае лік да пераменнай '%1'.", + "MATH_ROUND_HELPURL": "https://be.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://be.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://be.wikipedia.org/wiki/Генератар_псевдослучайных_лікаў", + "MATH_RANDOM_INT_TITLE": "выпадковы цэлы лік ад %1 для %2", + "MATH_RANDOM_INT_TOOLTIP": "Вяртае выпадковы лік паміж двума зададзенымі межамі (уключаючы і іх).", + "MATH_RANDOM_FLOAT_HELPURL": "https://be.wikipedia.org/wiki/Генератар_псевдослучайных_лікаў", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "выпадковы лік ад 0 (уключна) да 1", + "MATH_RANDOM_FLOAT_TOOLTIP": "Вяртае выпадковы лік ад 0.0 (уключна) да 1.0.", + "TEXT_TEXT_HELPURL": "https://be.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_TITLE": "да %1 дадаць тэкст %2", + "TEXT_APPEND_TOOLTIP": "Дадаць тэкст да пераменнай '%1'.", + "TEXT_LENGTH_TITLE": "даўжыня %1", + "TEXT_LENGTH_TOOLTIP": "Вяртае колькасць сімвалаў (уключаючы прабелы) у зададзеным тэксце.", + "TEXT_ISEMPTY_TITLE": "%1 пусты", + "TEXT_ISEMPTY_TOOLTIP": "Вяртае значэнне ісціна, калі пададзены тэкст пусты.", + "TEXT_INDEXOF_TOOLTIP": "Вяртае нумар пазіцыі першага/апошняга ўваходжання першага тэксту ў другім. Вяртае %1, калі тэкст не знойдзены.", + "TEXT_INDEXOF_TITLE": "у тэксце %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "знайсці першае ўваходжанне тэксту", + "TEXT_INDEXOF_OPERATOR_LAST": "знайсці апошняе ўваходжанне тэксту", + "TEXT_CHARAT_TITLE": "у тэксце %1 %2", + "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": "Запытаць у карыстальніка тэкст.", + "TEXT_COUNT_MESSAGE0": "падлічыць колькасць %1 у %2", + "TEXT_COUNT_TOOLTIP": "Падлічыць колькі разоў урывак тэксту з'яўляецца ў іншым тэксце.", + "TEXT_REPLACE_MESSAGE0": "замяніць %1 на %2 у %3", + "TEXT_REPLACE_TOOLTIP": "Замяніць усе ўваходжанні некаторага тэксту іншым тэкстам.", + "TEXT_REVERSE_MESSAGE0": "змяніць парадак на зваротны %1", + "TEXT_REVERSE_TOOLTIP": "Мяняе парадак знакаў у тэксце на адваротны.", + "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": "Вяртае нумар пазіцыі першага/апошняга ўваходжання элемента ў спісе. Вяртае %1, калі элемент не знойдзены.", + "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_INDEX_FROM_START_TOOLTIP": "%1 - першы элемент.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 - апошні элемент.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Вяртае элемент ва ўказанай пазіцыі спіса.", + "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": "Выдаляе і вяртае элемент ва ўказанай пазіцыі спіса.", + "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": "Видаляє элемент ва ўказанай пазіцыі спіса.", + "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": "Прысабечвае значэнне элемента ва ўказанай пазіцыі спіса.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Прысабечвае значэнне элемента спісу.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Прысабечвае значэнне элемента спісу.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Прысабечвае значэнне элемента спісу.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Устаўляе элемент ва ўказанай пазіцыі спіса.", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "сартаваць %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Сартаваць копію спісу.", + "LISTS_SORT_ORDER_ASCENDING": "па ўзрастанню", + "LISTS_SORT_ORDER_DESCENDING": "па спаданню", + "LISTS_SORT_TYPE_NUMERIC": "лікавая", + "LISTS_SORT_TYPE_TEXT": "па алфавіце", + "LISTS_SORT_TYPE_IGNORECASE": "па алфавіце, без уліку рэгістра", + "LISTS_SPLIT_LIST_FROM_TEXT": "зрабіць спіс з тэксту", + "LISTS_SPLIT_TEXT_FROM_LIST": "сабраць тэкст са спісу", + "LISTS_SPLIT_WITH_DELIMITER": "з падзельнікам", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Разбівае тэкст у спіс тэкстаў па падзельнікам.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Злучае спіс тэкстаў у адзін тэкст з падзельнікамі.", + "LISTS_REVERSE_MESSAGE0": "змяніць парадак на зваротны %1", + "LISTS_REVERSE_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_DEFNORETURN_COMMENT": "Апішыце гэтую функцыю...", + "PROCEDURES_DEFRETURN_RETURN": "вярнуць", + "PROCEDURES_DEFRETURN_TOOLTIP": "Стварыць працэдуру, якая вяртае значэнне.", + "PROCEDURES_ALLOW_STATEMENTS": "дазволіць аператары", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Папярэджанне: гэтая функцыя мае паўтаральныя параметры.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://be.wikipedia.org/wiki/Падпраграма", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Выконвае вызначаную карыстальнікам працэдуру '%1'.", + "PROCEDURES_CALLRETURN_HELPURL": "https://be.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/js/msg/json/bg.json b/js/msg/json/bg.json new file mode 100644 index 0000000..c0da91d --- /dev/null +++ b/js/msg/json/bg.json @@ -0,0 +1,357 @@ +{ + "@metadata": { + "authors": [ + "Gkostov", + "Vodnokon4e", + "Alpinistbg", + "Miroslav35232", + "StanProg", + "ShockD", + "InsomniHat", + "Vlad5250" + ] + }, + "VARIABLES_DEFAULT_NAME": "елемент", + "UNNAMED_KEY": "без име", + "TODAY": "Днес", + "DUPLICATE_BLOCK": "Копирай", + "ADD_COMMENT": "Добави коментар", + "REMOVE_COMMENT": "Премахни коментар", + "DUPLICATE_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": "Помощ", + "UNDO": "Отмяна", + "REDO": "Повторение", + "CHANGE_VALUE_TITLE": "Промени стойността:", + "RENAME_VARIABLE": "Преименувай променливата...", + "RENAME_VARIABLE_TITLE": "Преименувай всички '%1' променливи на:", + "NEW_VARIABLE": "Създаване на променлива...", + "NEW_STRING_VARIABLE": "Създаване на низова променлива...", + "NEW_NUMBER_VARIABLE": "Създаване на числова променлива...", + "NEW_COLOUR_VARIABLE": "Създаване на цветова променлива...", + "NEW_VARIABLE_TYPE_TITLE": "Тип на новата променлива:", + "NEW_VARIABLE_TITLE": "Ново име на променливата:", + "VARIABLE_ALREADY_EXISTS": "Променлива с име '%1' вече съществува.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Променлива с име '%1' вече съществува за друг тип: '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Изтриване на %1 използване на променлива '%2'?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Променливата '%1' не може да бъде изтрита, защото е част от определението на функцията '%2'", + "DELETE_VARIABLE": "Изтриване на променливата \"%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": "Добави окончателно, прихващащо всички останали случаи условие към блок „ако“.", + "IOS_OK": "Добре", + "IOS_CANCEL": "Отказ", + "IOS_ERROR": "Грешка", + "IOS_PROCEDURES_INPUTS": "Входни данни", + "IOS_PROCEDURES_ADD_INPUT": "+ Добавяне на данни", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Позволи твърденията", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Тази функция има дублирани входни данни.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Добавяне на променлива", + "IOS_VARIABLES_ADD_BUTTON": "Добавяне", + "IOS_VARIABLES_RENAME_BUTTON": "Преименуване", + "IOS_VARIABLES_DELETE_BUTTON": "Изтриване", + "IOS_VARIABLES_VARIABLE_NAME": "Име на променливата", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Не може да използвате празно име за променлива", + "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 (без да го включва)", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 от X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "Връща аркустангенс на точка (X, Y) в градуси от -180 до 180.", + "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_TITLE": "добавете текст %2 към %1", + "TEXT_APPEND_TOOLTIP": "Добави текст към променливата „%1“.", + "TEXT_LENGTH_TITLE": "дължината на %1", + "TEXT_LENGTH_TOOLTIP": "Връща броя на символите (включително и интервалите) в текста.", + "TEXT_ISEMPTY_TITLE": "%1 е празен", + "TEXT_ISEMPTY_TOOLTIP": "Връща вярно, ако текста е празен.", + "TEXT_INDEXOF_TOOLTIP": "Връща индекса на първото/последното срещане на първия текст във втория текст. Връща %1, ако текстът не е намерен.", + "TEXT_INDEXOF_TITLE": "в текст %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "намери първата поява на текста", + "TEXT_INDEXOF_OPERATOR_LAST": "намери последната поява на текста", + "TEXT_CHARAT_TITLE": "в текст %1 %2", + "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": "Питай потребителя за текст.", + "TEXT_COUNT_MESSAGE0": "пресмята броя на %1 в %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Преброй колко пъти даден текст се среща в друг текст.", + "TEXT_REPLACE_MESSAGE0": "замяна на %1 с %2 в %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "Замени всички появи на даден текст в друг текст.", + "TEXT_REVERSE_MESSAGE0": "промени реда на обратно %1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "Промени реда на знаците в текста на обратно.", + "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": "Връща индекса на първото/последното появяване на елемента в списъка. Връща %1, ако елементът не е намерен.", + "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_INDEX_FROM_START_TOOLTIP": "%1 е първият елемент.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 е последният елемент.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Връща елемента на определената позиция в списък.", + "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": "Премахва и връща елемента на определена позиция в списък.", + "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": "Премахва елемент на определена позиция от списък.", + "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": "Променя елемента на определена позиция в списък.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Променя първия елемент в списък.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Променя последния елемент в списък.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Променя случаен елемент от списък.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Вмъква елемент на определена позиция в списък.", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "сортиране по %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Подреди копие на списъка.", + "LISTS_SORT_ORDER_ASCENDING": "възходящо", + "LISTS_SORT_ORDER_DESCENDING": "низходящо", + "LISTS_SORT_TYPE_NUMERIC": "в числов ред", + "LISTS_SORT_TYPE_TEXT": "по азбучен ред", + "LISTS_SORT_TYPE_IGNORECASE": "по азбучен ред, без отчитане на малки и главни букви", + "LISTS_SPLIT_LIST_FROM_TEXT": "Направи списък от текст", + "LISTS_SPLIT_TEXT_FROM_LIST": "направи текст от списък", + "LISTS_SPLIT_WITH_DELIMITER": "с разделител", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Разделя текст в списък на текстове, по всеки разделител.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Събира списък от текстове в един текст, раделени с разделител.", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "промени реда на обратно %1", + "LISTS_REVERSE_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_DEFNORETURN_COMMENT": "Опишете тази функция...", + "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_HELPURL": "http://c2.com/cgi/wiki?GuardClause", + "PROCEDURES_IFRETURN_WARNING": "Предупреждение: Този блок може да се използва само във функция.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Коментирайте нещо...", + "WORKSPACE_ARIA_LABEL": "Работна област на Blockly", + "COLLAPSED_WARNINGS_WARNING": "Свитите блокове съдържат предупреждения." +} diff --git a/js/msg/json/bn.json b/js/msg/json/bn.json new file mode 100644 index 0000000..38618aa --- /dev/null +++ b/js/msg/json/bn.json @@ -0,0 +1,195 @@ +{ + "@metadata": { + "authors": [ + "Aftabuzzaman", + "Rakibul", + "Tauhid16", + "MasterMinhaz", + "এম আবু সাঈদ", + "Rasal Lia", + "আফতাবুজ্জামান" + ] + }, + "VARIABLES_DEFAULT_NAME": "পদ", + "UNNAMED_KEY": "নামহীন", + "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": "সাহায্য", + "UNDO": "পূর্বাবস্থা", + "REDO": "পুনরায় করুন", + "CHANGE_VALUE_TITLE": "মান পরিবর্তন করুন:", + "RENAME_VARIABLE": "চলকের নাম পরিবর্তন...", + "RENAME_VARIABLE_TITLE": "'%1' চলকগুলোর নতুন নাম দিন:", + "NEW_VARIABLE": "চলক তৈরি করুন...", + "NEW_VARIABLE_TITLE": "নতুন চলকের নাম:", + "VARIABLE_ALREADY_EXISTS": "'%1' নামের চলক পূর্ব থেকে অাছে।", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "'%1' নামের চলক '%2' ধরনের চলকের জন্য পূর্ব থেকেই অাছে।", + "DELETE_VARIABLE_CONFIRMATION": "'%2' চলকের '%1'টি ব্যবহার অপসারণ করবেন?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "'%1' চলক অপসারণ করা যাবে না কারণ এটি '%2' কার্যপ্রণালীর সংজ্ঞার অংশ", + "DELETE_VARIABLE": "'%1' চলকটি অপসারণ করুন", + "COLOUR_PICKER_HELPURL": "https://bn.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": "রং ১", + "COLOUR_BLEND_COLOUR2": "রং ২", + "COLOUR_BLEND_RATIO": "অনুপাত", + "COLOUR_BLEND_TOOLTIP": "প্রদত্ত অনুপাত(০.০ - ১.০) অনুসারে দুটি রং একসাথে মিশ্রিত করুন।", + "CONTROLS_REPEAT_HELPURL": "https://bn.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 %4 দিয়ে %2 থেকে %3", + "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_MSG_IF": "যদি", + "CONTROLS_IF_MSG_ELSEIF": "নতুবা যদি", + "CONTROLS_IF_MSG_ELSE": "নতুবা", + "CONTROLS_IF_ELSEIF_TOOLTIP": "যদি নামক ব্লক এ একটি শর্ত যোগ করুন।", + "IOS_OK": "ঠিক আছে", + "IOS_CANCEL": "বাতিল", + "IOS_ERROR": "ত্রুটি", + "IOS_VARIABLES_ADD_BUTTON": "যোগ", + "IOS_VARIABLES_RENAME_BUTTON": "পুনরায় শুরু", + "IOS_VARIABLES_DELETE_BUTTON": "অপসারণ", + "IOS_VARIABLES_VARIABLE_NAME": "চলকের নাম", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "অাপনি চলকের নাম খালি রাখতে পারেননা।", + "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": "%2 দ্বারা %1 পরিবর্তন", + "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_LENGTH_TITLE": "%1-এর দৈর্ঘ্য", + "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 মুদ্রণ করুন", + "TEXT_REVERSE_MESSAGE0": "%1 উল্টান", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "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_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_SPLIT_LIST_FROM_TEXT": "লিখা থেকে তালিকা তৈরি করুন", + "LISTS_SPLIT_TEXT_FROM_LIST": "তালিকা থেকে লিখা তৈরি করুন", + "LISTS_REVERSE_TOOLTIP": "একটি তালিকার একটি অনুলিপি উল্টান", + "VARIABLES_SET_CREATE_GET": "'%1 নিন' তৈরি করুন", + "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/js/msg/json/br.json b/js/msg/json/br.json new file mode 100644 index 0000000..2d8c073 --- /dev/null +++ b/js/msg/json/br.json @@ -0,0 +1,353 @@ +{ + "@metadata": { + "authors": [ + "Fohanno", + "Y-M D", + "Gwenn-Ael", + "Fulup", + "Vicng" + ] + }, + "VARIABLES_DEFAULT_NAME": "elfenn", + "TODAY": "Hiziv", + "DUPLICATE_BLOCK": "Eiladuriñ", + "ADD_COMMENT": "Ouzhpennañ un evezhiadenn", + "REMOVE_COMMENT": "Lemel an evezhiadenn kuit", + "DUPLICATE_COMMENT": "Eiladiñ an eilenn", + "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 ?", + "CLEAN_UP": "Naetaat ar bloc'hoù", + "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", + "UNDO": "Dizober", + "REDO": "Adober", + "CHANGE_VALUE_TITLE": "Kemmañ an dalvoudenn :", + "RENAME_VARIABLE": "Adenvel an argemmenn...", + "RENAME_VARIABLE_TITLE": "Adenvel an holl argemmennoù '%1' e :", + "NEW_VARIABLE": "Krouiñ un argemmenn nevez...", + "NEW_STRING_VARIABLE": "Krouiñ un argemmenn chadenn...", + "NEW_NUMBER_VARIABLE": "Krouiñ un argemm niver...", + "NEW_COLOUR_VARIABLE": "Krouiñ un argemmenn liv...", + "NEW_VARIABLE_TYPE_TITLE": "Doare nevez a argemm:", + "NEW_VARIABLE_TITLE": "Anv an argemmenn nevez :", + "VARIABLE_ALREADY_EXISTS": "Un argemmenn anvet '%1' zo anezhi dija.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Un argemenn anvet '%1' zo c'hoazh evit un argemenn all eus ar seurt : '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Lemel %1 implij eus an argemm '%2' ?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Ne ch'aller ket dilemel an argemmenn \"%1\" dre m'eo lod eus dielfennadur an arc'hwel \"%2\"", + "DELETE_VARIABLE": "Lemel an argemm '%1'", + "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.", + "IOS_OK": "Mat eo", + "IOS_CANCEL": "Nullañ", + "IOS_ERROR": "Fazi", + "IOS_PROCEDURES_INPUTS": "MONEDOÙ", + "IOS_PROCEDURES_ADD_INPUT": "+ Ouzhpennañ ur moned", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Urzhioù aotreet", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "An arc'hwel-mañ en deus monedoù eiladet.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Ouzhpennañ un argemmenn", + "IOS_VARIABLES_ADD_BUTTON": "Ouzhpennañ", + "IOS_VARIABLES_RENAME_BUTTON": "Adenvel", + "IOS_VARIABLES_DELETE_BUTTON": "Diverkañ", + "IOS_VARIABLES_VARIABLE_NAME": "Anv an argemmenn", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Ne c'hallit ket implijout un anv argemmenn c'houllo.", + "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 argemmenn '%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).", + "MATH_ATAN2_HELPURL": "https://fr.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 eus X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "Adkas a ra ark tangent ar poent (X, Y) e derezioù etre -180 ha 180", + "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_TITLE": "Ouzhpennañ an destenn %2 da %1", + "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ñ %1 ma n'eo ket kavet ar chadenn.", + "TEXT_INDEXOF_TITLE": "en destenn %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "kavout reveziadenn gentañ an destenn", + "TEXT_INDEXOF_OPERATOR_LAST": "kavout reveziadenn diwezhañ an destenn", + "TEXT_CHARAT_TITLE": "en destenn %1 %2", + "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.", + "TEXT_COUNT_MESSAGE0": "niver %1 war %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Kontañ pet gwech e c'hoarvez un destenn bennak en un destenn bennak all.", + "TEXT_REPLACE_MESSAGE0": "erlec'hiañ %1 gant %2 e %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "Erlec'hiañ holl reveziadennoù un destenn bennak gant un destenn all.", + "TEXT_REVERSE_MESSAGE0": "eilpennañ %1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "Eilpennañ urzh an arouezennoù en destenn.", + "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 %2 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ñ %1 ma n'eo ket kavet an destenn.", + "LISTS_GET_INDEX_GET": "tapout", + "LISTS_GET_INDEX_GET_REMOVE": "tapout ha lemel", + "LISTS_GET_INDEX_REMOVE": "lemel", + "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_INDEX_FROM_START_TOOLTIP": "%1 eo an elfenn gentañ.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 eo an elfenn gentañ.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Distreiñ an elfenn el lec'h meneget en ul listenn.", + "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": "Lemel ha distreiñ a ra an elfenn el lec'h meneget en ul listenn.", + "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": "Lemel a ra an elfenn el lec'h meneget en ul listenn.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Lemel a ra an elfenn gentañ en ul listenn.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Lemel 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": "Termenañ a ra an elfenn el lec'h meneget en ul listenn.", + "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": "Ensoc'hañ a ra an elfenn el lec'h meneget en ul listenn.", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", + "LISTS_SORT_TITLE": "Rummañ%1,%2,%3", + "LISTS_SORT_TOOLTIP": "Rummañ un eilenn eus ar roll", + "LISTS_SORT_ORDER_ASCENDING": "war gresk", + "LISTS_SORT_ORDER_DESCENDING": "war zigresk", + "LISTS_SORT_TYPE_NUMERIC": "niverel", + "LISTS_SORT_TYPE_TEXT": "Dre urzh al lizherenneg", + "LISTS_SORT_TYPE_IGNORECASE": "Dre urzh al lizherenneg, hep derc'hel kont eus an direnneg", + "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", + "LISTS_SPLIT_LIST_FROM_TEXT": "Krouiñ ul listenn diwar an destenn", + "LISTS_SPLIT_TEXT_FROM_LIST": "Krouiñ un destenn diwar al listenn", + "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.", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "eilpennañ %1", + "LISTS_REVERSE_TOOLTIP": "Eilpennañ un eilskrid eus ur roll.", + "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_DEFNORETURN_COMMENT": "Deskrivañ an arc'hwel-mañ...", + "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/Subroutine", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Seveniñ an arc'hwel '%1' termenet gant an implijer.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "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.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Lavaret un dra bennak...", + "COLLAPSED_WARNINGS_WARNING": "Kemennoù-diwall zo er bloc'hadoù pleget." +} diff --git a/js/msg/json/ca.json b/js/msg/json/ca.json new file mode 100644 index 0000000..bfa0663 --- /dev/null +++ b/js/msg/json/ca.json @@ -0,0 +1,323 @@ +{ + "@metadata": { + "authors": [ + "Alvaro Vidal-Abarca", + "Espertus", + "Hiperpobla", + "Jaumeortola", + "Fitoschido", + "Quel.soler", + "Micobu" + ] + }, + "VARIABLES_DEFAULT_NAME": "element", + "TODAY": "Avui", + "DUPLICATE_BLOCK": "Duplica", + "ADD_COMMENT": "Afegeix un comentari", + "REMOVE_COMMENT": "Elimina el comentari", + "DUPLICATE_COMMENT": "Comentari duplicat", + "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?", + "CLEAN_UP": "Netejar 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", + "UNDO": "Desfer", + "REDO": "Refer", + "CHANGE_VALUE_TITLE": "Canvia valor:", + "RENAME_VARIABLE": "Reanomena variable...", + "RENAME_VARIABLE_TITLE": "Reanomena totes les variables '%1' a:", + "NEW_VARIABLE": "Crea una variable…", + "NEW_STRING_VARIABLE": "Crear variable de cadena…", + "NEW_NUMBER_VARIABLE": "Crea variable numèrica...", + "NEW_COLOUR_VARIABLE": "Crear variable de color...", + "NEW_VARIABLE_TYPE_TITLE": "Nou tipus de variable:", + "NEW_VARIABLE_TITLE": "Nou nom de variable:", + "VARIABLE_ALREADY_EXISTS": "Ja existeix una variable anomenada '%1'.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Una variable anomenada '%1' ja existeix per al tipus '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Esborrar '%1' crides de la variable '%2'?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "No podem esborrar la variable '%1' perquè forma part de la definició de la funció '%2'", + "DELETE_VARIABLE": "Esborrar la variable '%1'", + "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'intèrval 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'.", + "IOS_OK": "D'acord", + "IOS_CANCEL": "Cancel·lar", + "IOS_ERROR": "Error", + "IOS_PROCEDURES_INPUTS": "ENTRADES", + "IOS_PROCEDURES_ADD_INPUT": "+ Afegeix Entrada", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Permetre instruccions", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Aquesta funció té entrades duplicades.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Afegeix Variable", + "IOS_VARIABLES_ADD_BUTTON": "Afegir", + "IOS_VARIABLES_RENAME_BUTTON": "Reanomena", + "IOS_VARIABLES_DELETE_BUTTON": "Esborrar", + "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_TITLE": "a %1 afegir text %2", + "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 %1 si no es troba el text.", + "TEXT_INDEXOF_TITLE": "en el text %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "trobar la primera aparició del text", + "TEXT_INDEXOF_OPERATOR_LAST": "trobar l'última aparició del 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 %1 si no s'hi troba el text.", + "LISTS_GET_INDEX_GET": "recupera", + "LISTS_GET_INDEX_GET_REMOVE": "recupera i esborra", + "LISTS_GET_INDEX_REMOVE": "esborra", + "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_INDEX_FROM_START_TOOLTIP": "%1 és el primer element.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 és l'últim element.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Retorna l'element de la posició especificada a la llista.", + "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": "Esborra i retorna l'element de la posició especificada de la llista.", + "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": "Esborra l'element de la posició especificada de la llista.", + "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": "Modifica l'element de la posició especificada d'una llista.", + "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": "Insereix l'element a la posició especificada d'una llista.", + "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.", + "LISTS_SORT_TYPE_TEXT": "alfabètic", + "LISTS_SPLIT_WITH_DELIMITER": "amb delimitador", + "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_DEFNORETURN_COMMENT": "Descriure aquesta funció...", + "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ó.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Digues alguna cosa..." +} diff --git a/js/msg/json/constants.json b/js/msg/json/constants.json new file mode 100644 index 0000000..f2801d3 --- /dev/null +++ b/js/msg/json/constants.json @@ -0,0 +1 @@ +{"MATH_HUE": "230", "LOOPS_HUE": "120", "LISTS_HUE": "260", "LOGIC_HUE": "210", "VARIABLES_HUE": "330", "TEXTS_HUE": "160", "PROCEDURES_HUE": "290", "COLOUR_HUE": "20", "VARIABLES_DYNAMIC_HUE": "310"} \ No newline at end of file diff --git a/js/msg/json/cs.json b/js/msg/json/cs.json new file mode 100644 index 0000000..a106a53 --- /dev/null +++ b/js/msg/json/cs.json @@ -0,0 +1,342 @@ +{ + "@metadata": { + "authors": [ + "Chmee2", + "Rosnicka.kacka", + "Matěj Grabovský", + "Espertus", + "Utar", + "Clon", + "Koo6", + "Vtmarvin", + "Dvorapa", + "Dita", + "Ilimanaq29", + "Patriccck" + ] + }, + "VARIABLES_DEFAULT_NAME": "položka", + "TODAY": "Dnes", + "DUPLICATE_BLOCK": "Duplikovat", + "ADD_COMMENT": "Přidat komentář", + "REMOVE_COMMENT": "Odstranit komentář", + "EXTERNAL_INPUTS": "vnější vstupy", + "INLINE_INPUTS": "Vložené vstupy", + "DELETE_BLOCK": "Smazat blok", + "DELETE_X_BLOCKS": "Smazat %1 bloků", + "DELETE_ALL_BLOCKS": "Smazat všech %1 bloků?", + "CLEAN_UP": "Uspořádat bloky", + "COLLAPSE_BLOCK": "Sbalit blok", + "COLLAPSE_ALL": "Sbalit bloky", + "EXPAND_BLOCK": "Rozbalit blok", + "EXPAND_ALL": "Rozbalit bloky", + "DISABLE_BLOCK": "Deaktivovat blok", + "ENABLE_BLOCK": "Povolit blok", + "HELP": "Nápověda", + "UNDO": "Zpět", + "REDO": "Znovu", + "CHANGE_VALUE_TITLE": "Změnit hodnotu:", + "RENAME_VARIABLE": "Přejmenovat proměnnou...", + "RENAME_VARIABLE_TITLE": "Přejmenuj všech '%1' proměnných na:", + "NEW_VARIABLE": "Vytvořte proměnnou...", + "NEW_STRING_VARIABLE": "Vytvořit řetězcovou proměnnou...", + "NEW_NUMBER_VARIABLE": "Vytvořit číselnou proměnnou...", + "NEW_COLOUR_VARIABLE": "Vytvořit barvu proměnné...", + "NEW_VARIABLE_TYPE_TITLE": "Nový typ proměnné:", + "NEW_VARIABLE_TITLE": "Nový název proměnné:", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Proměnná pojmenovaná jako '%1' již existuje pro jiný typ: '%2'.", + "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": "obarvěte barvou", + "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_pro", + "CONTROLS_REPEAT_TITLE": "opakuj %1 krát", + "CONTROLS_REPEAT_INPUT_DO": "dě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í s 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": "vyskočit ze smyčky", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "pokračuj dalším opakováním smyčky", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Vyskoč z vnitřní smyčky.", + "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\".", + "IOS_ERROR": "Chyba", + "IOS_PROCEDURES_INPUTS": "vstupy", + "IOS_VARIABLES_ADD_BUTTON": "Přidat", + "IOS_VARIABLES_RENAME_BUTTON": "Přejmenovat", + "IOS_VARIABLES_DELETE_BUTTON": "Smazat", + "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": "ne %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": "prázdný", + "LOGIC_NULL_TOOLTIP": "Vrátí prázdnou hodnotu", + "LOGIC_TERNARY_HELPURL": "https://cs.wikipedia.org/wiki/Ternární operátor (programování)", + "LOGIC_TERNARY_CONDITION": "test", + "LOGIC_TERNARY_IF_TRUE": "pokud pravda", + "LOGIC_TERNARY_IF_FALSE": "pokud 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í hodnota", + "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://en.wikipedia.org/wiki/Trigonometric_functions", + "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í arkus sinus čísla.", + "MATH_TRIG_TOOLTIP_ACOS": "Vrátí arkus kosinus čísla.", + "MATH_TRIG_TOOLTIP_ATAN": "Vrátí arkus tangens čí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 ∞ (nekonečno).", + "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é číslem", + "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://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", + "MATH_CHANGE_TITLE": "zaměň %1 za %2", + "MATH_CHANGE_TOOLTIP": "Přičti číslo k proměnné '%1'.", + "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", + "MATH_ROUND_TOOLTIP": "Zaokrouhlit číslo nahoru nebo dolů.", + "MATH_ROUND_OPERATOR_ROUND": "zaokrouhlit", + "MATH_ROUND_OPERATOR_ROUNDUP": "zaokrouhlit nahoru", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "zaokrouhlit dolů", + "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_TITLE": "do %1 přidat text %2", + "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, vypíše %1.", + "TEXT_INDEXOF_TITLE": "v textu %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "najít první výskyt textu", + "TEXT_INDEXOF_OPERATOR_LAST": "najít poslední výskyt 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 %2 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í %1, pokud položka nebyla nalezena.", + "LISTS_GET_INDEX_GET": "získat", + "LISTS_GET_INDEX_GET_REMOVE": "získat a odstranit", + "LISTS_GET_INDEX_REMOVE": "odstranit", + "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_INDEX_FROM_START_TOOLTIP": "%1 je první položka.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 je poslední položka.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Získá položku z určené pozice v seznamu.", + "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": "Odstraní a získá položku z určené pozice v seznamu.", + "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": "Odebere položku na konkrétním místě v seznamu.", + "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": "Nastaví položku na konkrétní místo v seznamu.", + "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": "Vloží položku na určenou pozici v seznamu.", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "seřadit %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Seřadit kopii seznamu.", + "LISTS_SORT_ORDER_ASCENDING": "vzestupně", + "LISTS_SORT_ORDER_DESCENDING": "sestupně", + "LISTS_SORT_TYPE_NUMERIC": "číselné", + "LISTS_SORT_TYPE_TEXT": "abecedně", + "LISTS_SORT_TYPE_IGNORECASE": "abecedně, na velikosti písmen nezáleží", + "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_HELPURL": "https://cs.wikipedia.org/w/index.php?title=Funkce_(programování)", + "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_DEFNORETURN_COMMENT": "Popište tuto funkci...", + "PROCEDURES_DEFRETURN_HELPURL": "https://cs.wikipedia.org/w/index.php?title=Funkce_(programování)", + "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/Podprogram", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Spustí uživatelem definovanou funkci '%1'.", + "PROCEDURES_CALLRETURN_HELPURL": "https://cs.wikipedia.org/wiki/Podprogram", + "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_HELPURL": "http://c2.com/cgi/wiki?GuardClause", + "PROCEDURES_IFRETURN_WARNING": "Varování: Tento blok může být použit pouze uvnitř definici funkce." +} diff --git a/js/msg/json/da.json b/js/msg/json/da.json new file mode 100644 index 0000000..2de937d --- /dev/null +++ b/js/msg/json/da.json @@ -0,0 +1,351 @@ +{ + "@metadata": { + "authors": [ + "Christian List", + "RickiRunge", + "MGA73", + "Mads Haupt", + "Tjernobyl", + "Joedalton", + "Saederup92", + "JonNPoulsen" + ] + }, + "VARIABLES_DEFAULT_NAME": "element", + "UNNAMED_KEY": "unavngivet", + "TODAY": "I dag", + "DUPLICATE_BLOCK": "Duplikér", + "ADD_COMMENT": "Tilføj Kommentar", + "REMOVE_COMMENT": "Fjern Kommentar", + "DUPLICATE_COMMENT": "Duplikér 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", + "UNDO": "Fortryd", + "REDO": "Omgør", + "CHANGE_VALUE_TITLE": "Skift værdi:", + "RENAME_VARIABLE": "Omdøb variabel...", + "RENAME_VARIABLE_TITLE": "Omdøb alle '%1' variabler til:", + "NEW_VARIABLE": "Opret variabel ...", + "NEW_STRING_VARIABLE": "Opret strengvariabel ...", + "NEW_NUMBER_VARIABLE": "Opret nummervariabel ...", + "NEW_COLOUR_VARIABLE": "Opret farvevariabel ...", + "NEW_VARIABLE_TYPE_TITLE": "Ny variabeltype:", + "NEW_VARIABLE_TITLE": "Navn til den nye variabel:", + "VARIABLE_ALREADY_EXISTS": "En variabel med navnet »%1« findes allerede.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "En variabel med navnet »%1« findes allerede for en anden type: »%2«.", + "DELETE_VARIABLE_CONFIRMATION": "Slet %1's brug af variablen »%2«?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Kan ikke slette variablen »%1« da den er en del af definitionen af funktionen »%2«", + "DELETE_VARIABLE": "Slet variablen »%1«", + "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.", + "IOS_OK": "O.k.", + "IOS_CANCEL": "Annuller", + "IOS_ERROR": "Fejl", + "IOS_PROCEDURES_INPUTS": "INDDATA", + "IOS_PROCEDURES_ADD_INPUT": "+ Tilføj inddata", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Tillad udsagn", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Denne funktion har duplikerede inddata.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Tilføj variabel", + "IOS_VARIABLES_ADD_BUTTON": "Tilføj", + "IOS_VARIABLES_RENAME_BUTTON": "Omdøb", + "IOS_VARIABLES_DELETE_BUTTON": "Slet", + "IOS_VARIABLES_VARIABLE_NAME": "Variabelnavn", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Du kan ikke bruge et tomt variabelnavn.", + "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).", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 af X:%1 Y:%2", + "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_TITLE": "til %1 tilføj tekst %2", + "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 %1, hvis teksten ikke kan findes.", + "TEXT_INDEXOF_TITLE": "i tekst %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "find første forekomst af teksten", + "TEXT_INDEXOF_OPERATOR_LAST": "find sidste forekomst af teksten", + "TEXT_CHARAT_TITLE": "i tekst %1 %2", + "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", + "TEXT_COUNT_MESSAGE0": "tæl %1 i %2", + "TEXT_COUNT_TOOLTIP": "Tæl hvor mange gange noget tekst fremgår i en anden tekst.", + "TEXT_REPLACE_MESSAGE0": "erstat %1 med %2 i %3", + "TEXT_REPLACE_TOOLTIP": "Erstat alle forekomster af noget tekst i en anden tekst.", + "TEXT_REVERSE_MESSAGE0": "vend %1 om", + "TEXT_REVERSE_TOOLTIP": "Vender rækkefølgen om for tegnene i teksten.", + "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 %1, 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_INDEX_FROM_START_TOOLTIP": "%1 er det første element.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 er det sidste element.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Returnerer elementet på den angivne position på en liste.", + "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": "Fjerner og returnerer elementet på den angivne position på en liste.", + "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": "Fjerner elementet på den angivne position på en liste.", + "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": "Sætter elementet på den angivne position i en liste.", + "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": "Indsætter elementet på den angivne position i en liste.", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "sorter %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Sorter en kopi af en liste.", + "LISTS_SORT_ORDER_ASCENDING": "stigende", + "LISTS_SORT_ORDER_DESCENDING": "faldende", + "LISTS_SORT_TYPE_NUMERIC": "nummerorden", + "LISTS_SORT_TYPE_TEXT": "alfabetisk", + "LISTS_SORT_TYPE_IGNORECASE": "alfabetisk, ignorer store/små bogstaver", + "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.", + "LISTS_REVERSE_MESSAGE0": "vend %1 om", + "LISTS_REVERSE_TOOLTIP": "Vend en kopi af en liste om.", + "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_DEFNORETURN_COMMENT": "Beskriv denne funktion...", + "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://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Kør den brugerdefinerede funktion '%1'.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "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_HELPURL": "http://c2.com/cgi/wiki?GuardClause", + "PROCEDURES_IFRETURN_WARNING": "Advarsel: Denne blok kan kun anvendes inden for en funktionsdefinition.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Sig noget ..." +} diff --git a/js/msg/json/de.json b/js/msg/json/de.json new file mode 100644 index 0000000..14e38db --- /dev/null +++ b/js/msg/json/de.json @@ -0,0 +1,387 @@ +{ + "@metadata": { + "authors": [ + "Metalhead64", + "M165437", + "Dan-yell", + "아라", + "Octycs", + "Cvanca", + "THINK", + "Zgtm", + "Sushi" + ] + }, + "VARIABLES_DEFAULT_NAME": "Element", + "TODAY": "Heute", + "DUPLICATE_BLOCK": "Kopieren", + "ADD_COMMENT": "Kommentar hinzufügen", + "REMOVE_COMMENT": "Kommentar entfernen", + "DUPLICATE_COMMENT": "Kommentar kopieren", + "EXTERNAL_INPUTS": "externe Eingänge", + "INLINE_INPUTS": "interne Eingänge", + "DELETE_BLOCK": "Baustein löschen", + "DELETE_X_BLOCKS": "%1 Bausteine löschen", + "DELETE_ALL_BLOCKS": "Alle %1 Bausteine löschen?", + "CLEAN_UP": "Bausteine aufräumen", + "COLLAPSE_BLOCK": "Baustein zusammenfalten", + "COLLAPSE_ALL": "Alle Bausteine zusammenfalten", + "EXPAND_BLOCK": "Baustein entfalten", + "EXPAND_ALL": "Alle Bausteine entfalten", + "DISABLE_BLOCK": "Baustein deaktivieren", + "ENABLE_BLOCK": "Baustein aktivieren", + "HELP": "Hilfe", + "UNDO": "Rückgängig", + "REDO": "Wiederholen", + "CHANGE_VALUE_TITLE": "Wert ändern:", + "RENAME_VARIABLE": "Variable umbenennen …", + "RENAME_VARIABLE_TITLE": "Alle \"%1\" Variablen umbenennen in:", + "NEW_VARIABLE": "Variable erstellen …", + "NEW_STRING_VARIABLE": "Zeichenfolgenvariable erstellen …", + "NEW_NUMBER_VARIABLE": "Zahlenvariable erstellen …", + "NEW_COLOUR_VARIABLE": "Farbvariable erstellen …", + "NEW_VARIABLE_TYPE_TITLE": "Neuer Variablentyp:", + "NEW_VARIABLE_TITLE": "Name der neuen Variable:", + "VARIABLE_ALREADY_EXISTS": "Eine Variable namens „%1“ ist bereits vorhanden.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Eine Variable namens „%1“ ist bereits für einen anderen Typ vorhanden: „%2“.", + "DELETE_VARIABLE_CONFIRMATION": "%1 Verwendungen der Variable „%2“ löschen?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Die Variable „%1“ kann nicht gelöscht werden, da sie Teil der Definition der Funktion „%2“ ist.", + "DELETE_VARIABLE": "Die Variable „%1“ löschen", + "COLOUR_PICKER_HELPURL": "https://de.wikipedia.org/wiki/Farbe", + "COLOUR_PICKER_TOOLTIP": "Wählt eine Farbe aus der Palette aus.", + "COLOUR_RANDOM_TITLE": "zufällige Farbe", + "COLOUR_RANDOM_TOOLTIP": "Erzeugt eine Farbe nach dem Zufallsprinzip.", + "COLOUR_RGB_HELPURL": "https://www.december.com/html/spec/colorpercompact.html", + "COLOUR_RGB_TITLE": "Farbe aus", + "COLOUR_RGB_RED": "rot", + "COLOUR_RGB_GREEN": "grün", + "COLOUR_RGB_BLUE": "blau", + "COLOUR_RGB_TOOLTIP": "Erzeugt eine Farbe mit selbst definierten Rot-, Grün- und Blauwerten. Alle Werte müssen zwischen 0 und 100 liegen.", + "COLOUR_BLEND_HELPURL": "https://meyerweb.com/eric/tools/color-blend/#:::rgbp", + "COLOUR_BLEND_TITLE": "mische", + "COLOUR_BLEND_COLOUR1": "Farbe 1", + "COLOUR_BLEND_COLOUR2": "und Farbe 2", + "COLOUR_BLEND_RATIO": "im Verhältnis", + "COLOUR_BLEND_TOOLTIP": "Vermischt 2 Farben mit konfigurierbarem Farbverhältnis (0.0 - 1.0).", + "CONTROLS_REPEAT_HELPURL": "https://de.wikipedia.org/wiki/For-Schleife", + "CONTROLS_REPEAT_TITLE": "wiederhole %1 mal:", + "CONTROLS_REPEAT_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ührt Anweisungen aus solange die Bedingung wahr ist.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Führt Anweisungen aus solange die Bedingung unwahr ist.", + "CONTROLS_FOR_HELPURL": "https://de.wikipedia.org/wiki/For-Schleife", + "CONTROLS_FOR_TOOLTIP": "Zählt die Variable \"%1\" von einem Startwert bis zu einem Endwert und führt für jeden Wert eine Anweisung aus.", + "CONTROLS_FOR_TITLE": "zähle %1 von %2 bis %3 in Schritten von %4", + "CONTROLS_FOREACH_HELPURL": "https://de.wikipedia.org/wiki/For-Schleife", + "CONTROLS_FOREACH_TITLE": "für jeden Wert %1 aus der Liste %2", + "CONTROLS_FOREACH_TOOLTIP": "Führt eine Anweisung für jeden Wert in der Liste aus und setzt dabei die Variable \"%1\" auf den aktuellen Listenwert.", + "CONTROLS_FLOW_STATEMENTS_HELPURL": "https://de.wikipedia.org/wiki/Kontrollstruktur", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "die Schleife abbrechen", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "sofort mit nächstem Schleifendurchlauf fortfahren", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Die umgebende Schleife beenden.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Diese Anweisung abbrechen und mit dem nächsten Schleifendurchlauf fortfahren.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Warnung: Dieser Baustein kann nur in einer Schleife verwendet werden.", + "CONTROLS_IF_TOOLTIP_1": "Führt eine Anweisung aus, falls eine Bedingung wahr ist.", + "CONTROLS_IF_TOOLTIP_2": "Führt die erste Anweisung aus, falls eine Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus.", + "CONTROLS_IF_TOOLTIP_3": "Führt die erste Anweisung aus, falls die erste Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus, falls die zweite Bedingung wahr ist.", + "CONTROLS_IF_TOOLTIP_4": "Führe die erste Anweisung aus, falls die erste Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus, falls die zweite Bedingung wahr ist. Führt die dritte Anweisung aus, falls keine der beiden Bedingungen wahr ist", + "CONTROLS_IF_MSG_IF": "falls", + "CONTROLS_IF_MSG_ELSEIF": "sonst falls", + "CONTROLS_IF_MSG_ELSE": "sonst", + "CONTROLS_IF_IF_TOOLTIP": "Hinzufügen, entfernen oder sortieren von Sektionen", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Eine weitere Bedingung hinzufügen.", + "CONTROLS_IF_ELSE_TOOLTIP": "Eine sonst-Bedingung hinzufügen. Führt eine Anweisung aus, falls keine Bedingung zutrifft.", + "IOS_OK": "OK", + "IOS_CANCEL": "Abbrechen", + "IOS_ERROR": "Fehler", + "IOS_PROCEDURES_INPUTS": "PARAMETER", + "IOS_PROCEDURES_ADD_INPUT": "+ Parameter hinzufügen", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Anweisungen erlauben", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Diese Funktion hat doppelte Parameter.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Variable hinzufügen", + "IOS_VARIABLES_ADD_BUTTON": "Hinzufügen", + "IOS_VARIABLES_RENAME_BUTTON": "Umbenennen", + "IOS_VARIABLES_DELETE_BUTTON": "Löschen", + "IOS_VARIABLES_VARIABLE_NAME": "Name der Variable", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Du kannst keinen leeren Variablennamen verwenden.", + "LOGIC_COMPARE_HELPURL": "https://de.wikipedia.org/wiki/Vergleich_%28Zahlen%29", + "LOGIC_COMPARE_TOOLTIP_EQ": "Ist wahr, falls beide Werte gleich sind.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Ist wahr, falls beide Werte unterschiedlich sind.", + "LOGIC_COMPARE_TOOLTIP_LT": "Ist wahr, falls der erste Wert kleiner als der zweite Wert ist.", + "LOGIC_COMPARE_TOOLTIP_LTE": "Ist wahr, falls der erste Wert kleiner als oder gleich groß wie der zweite Wert ist.", + "LOGIC_COMPARE_TOOLTIP_GT": "Ist wahr, falls der erste Wert größer als der zweite Wert ist.", + "LOGIC_COMPARE_TOOLTIP_GTE": "Ist wahr, falls der erste Wert größer als oder gleich groß wie der zweite Wert ist.", + "LOGIC_OPERATION_TOOLTIP_AND": "Ist wahr, falls beide Werte wahr sind.", + "LOGIC_OPERATION_AND": "und", + "LOGIC_OPERATION_TOOLTIP_OR": "Ist wahr, falls einer der beiden Werte wahr ist.", + "LOGIC_OPERATION_OR": "oder", + "LOGIC_NEGATE_TITLE": "nicht %1", + "LOGIC_NEGATE_TOOLTIP": "Ist wahr, falls der Eingabewert unwahr ist. Ist unwahr, falls der Eingabewert wahr ist.", + "LOGIC_BOOLEAN_TRUE": "wahr", + "LOGIC_BOOLEAN_FALSE": "falsch", + "LOGIC_BOOLEAN_TOOLTIP": "Ist entweder wahr oder falsch", + "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": "prüfe", + "LOGIC_TERNARY_IF_TRUE": "falls wahr", + "LOGIC_TERNARY_IF_FALSE": "falls falsch", + "LOGIC_TERNARY_TOOLTIP": "Überprüft eine Bedingung \"prüfe\". Falls die Bedingung wahr ist, wird der \"falls wahr\" Wert zurückgegeben, andernfalls der \"falls unwahr\" Wert", + "MATH_NUMBER_HELPURL": "https://de.wikipedia.org/wiki/Zahl", + "MATH_NUMBER_TOOLTIP": "Eine Zahl.", + "MATH_ARITHMETIC_HELPURL": "https://de.wikipedia.org/wiki/Grundrechenart", + "MATH_ARITHMETIC_TOOLTIP_ADD": "Ist die Summe zweier Zahlen.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "Ist die Differenz zweier Zahlen.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Ist das Produkt zweier Zahlen.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Ist der Quotient zweier Zahlen.", + "MATH_ARITHMETIC_TOOLTIP_POWER": "Ist die erste Zahl potenziert mit der zweiten Zahl.", + "MATH_SINGLE_HELPURL": "https://de.wikipedia.org/wiki/Quadratwurzel", + "MATH_SINGLE_OP_ROOT": "Quadratwurzel", + "MATH_SINGLE_TOOLTIP_ROOT": "Ist die Quadratwurzel einer Zahl.", + "MATH_SINGLE_OP_ABSOLUTE": "Betrag", + "MATH_SINGLE_TOOLTIP_ABS": "Ist der Betrag einer Zahl.", + "MATH_SINGLE_TOOLTIP_NEG": "Negiert eine Zahl.", + "MATH_SINGLE_TOOLTIP_LN": "Ist der natürliche Logarithmus einer Zahl.", + "MATH_SINGLE_TOOLTIP_LOG10": "Ist der dekadische Logarithmus einer Zahl.", + "MATH_SINGLE_TOOLTIP_EXP": "Ist Wert der Exponentialfunktion einer Zahl.", + "MATH_SINGLE_TOOLTIP_POW10": "Rechnet 10 hoch eine Zahl.", + "MATH_TRIG_HELPURL": "https://de.wikipedia.org/wiki/Trigonometrie", + "MATH_TRIG_TOOLTIP_SIN": "Ist der Sinus des Winkels (nicht Radiant).", + "MATH_TRIG_TOOLTIP_COS": "Ist der Kosinus des Winkels.", + "MATH_TRIG_TOOLTIP_TAN": "Ist der Tangens des Winkels (nicht Radiant).", + "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 oder falsch 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 eine Zahl zu \"%1\".", + "MATH_ROUND_HELPURL": "https://de.wikipedia.org/wiki/Runden", + "MATH_ROUND_TOOLTIP": "Eine Zahl auf- oder abrunden.", + "MATH_ROUND_OPERATOR_ROUND": "runde", + "MATH_ROUND_OPERATOR_ROUNDUP": "runde auf", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "runde ab", + "MATH_ONLIST_HELPURL": "http://www.sysplus.ch/einstieg.php?links=menu&seite=4125&grad=Crash&prog=Excel", + "MATH_ONLIST_OPERATOR_SUM": "Summe über die Liste", + "MATH_ONLIST_TOOLTIP_SUM": "Ist die Summe aller Zahlen in einer Liste.", + "MATH_ONLIST_OPERATOR_MIN": "Minimalwert der Liste", + "MATH_ONLIST_TOOLTIP_MIN": "Ist die kleinste Zahl in einer Liste.", + "MATH_ONLIST_OPERATOR_MAX": "Maximalwert der Liste", + "MATH_ONLIST_TOOLTIP_MAX": "Ist die größte Zahl in einer Liste.", + "MATH_ONLIST_OPERATOR_AVERAGE": "Mittelwert der Liste", + "MATH_ONLIST_TOOLTIP_AVERAGE": "Ist der Durchschnittswert aller Zahlen in einer Liste.", + "MATH_ONLIST_OPERATOR_MEDIAN": "Median der Liste", + "MATH_ONLIST_TOOLTIP_MEDIAN": "Ist der Median aller Zahlen in einer Liste.", + "MATH_ONLIST_OPERATOR_MODE": "am häufigsten in der Liste", + "MATH_ONLIST_TOOLTIP_MODE": "Findet die Werte mit dem häufigstem Vorkommen in der Liste.", + "MATH_ONLIST_OPERATOR_STD_DEV": "Standardabweichung der Liste", + "MATH_ONLIST_TOOLTIP_STD_DEV": "Ist die Standardabweichung aller Werte in der Liste.", + "MATH_ONLIST_OPERATOR_RANDOM": "Zufallswert aus der Liste", + "MATH_ONLIST_TOOLTIP_RANDOM": "Gibt einen zufälligen Wert aus der Liste zurück.", + "MATH_MODULO_HELPURL": "https://de.wikipedia.org/wiki/Modulo", + "MATH_MODULO_TITLE": "Rest von %1 ÷ %2", + "MATH_MODULO_TOOLTIP": "Der Rest nach einer Division.", + "MATH_CONSTRAIN_TITLE": "begrenze %1 zwischen %2 und %3", + "MATH_CONSTRAIN_TOOLTIP": "Begrenzt eine Zahl auf den Wertebereich zwischen zwei anderen Zahlen (inklusiv).", + "MATH_RANDOM_INT_HELPURL": "https://de.wikipedia.org/wiki/Zufallszahlen", + "MATH_RANDOM_INT_TITLE": "ganzzahlige Zufallszahl zwischen %1 und %2", + "MATH_RANDOM_INT_TOOLTIP": "Erzeugt eine ganzzahlige Zufallszahl zwischen zwei Zahlen (inklusiv).", + "MATH_RANDOM_FLOAT_HELPURL": "https://de.wikipedia.org/wiki/Zufallszahlen", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "Zufallszahl (0.0 - 1.0)", + "MATH_RANDOM_FLOAT_TOOLTIP": "Erzeugt eine Zufallszahl zwischen 0.0 (inklusiv) und 1.0 (exklusiv).", + "MATH_ATAN2_HELPURL": "https://de.wikipedia.org/wiki/Arctan2", + "MATH_ATAN2_TITLE": "atan2 von X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "Gibt den Arkustangens des Punktes (X, Y) in Grad von -180 bis 180 zurück.", + "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_TITLE": "zu %1 Text %2 anhängen", + "TEXT_APPEND_TOOLTIP": "Text an die Variable \"%1\" anhängen.", + "TEXT_LENGTH_TITLE": "Länge von %1", + "TEXT_LENGTH_TOOLTIP": "Die Anzahl von Zeichen in einem Text (inkl. Leerzeichen).", + "TEXT_ISEMPTY_TITLE": "%1 ist leer", + "TEXT_ISEMPTY_TOOLTIP": "Ist wahr, falls der Text keine Zeichen enthält.", + "TEXT_INDEXOF_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", + "TEXT_INDEXOF_TOOLTIP": "Findet das erste / letzte Auftreten eines Suchbegriffs in einem Text. Gibt die Position des Begriffs zurück oder %1 falls der Suchbegriff nicht gefunden wurde.", + "TEXT_INDEXOF_TITLE": "im Text %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "suche erstes Auftreten des Begriffs", + "TEXT_INDEXOF_OPERATOR_LAST": "suche letztes Auftreten des Begriffs", + "TEXT_CHARAT_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", + "TEXT_CHARAT_TITLE": "im Text %1 %2", + "TEXT_CHARAT_FROM_START": "nimm", + "TEXT_CHARAT_FROM_END": "nimm von hinten", + "TEXT_CHARAT_FIRST": "nimm ersten", + "TEXT_CHARAT_LAST": "nimm letzten", + "TEXT_CHARAT_RANDOM": "nimm zufälligen", + "TEXT_CHARAT_TAIL": "Buchstaben", + "TEXT_CHARAT_TOOLTIP": "Extrahiert einen Buchstaben von einer bestimmten Position.", + "TEXT_GET_SUBSTRING_TOOLTIP": "Gibt den angegebenen Textabschnitt zurück.", + "TEXT_GET_SUBSTRING_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "im Text", + "TEXT_GET_SUBSTRING_START_FROM_START": "nimm Teil ab", + "TEXT_GET_SUBSTRING_START_FROM_END": "nimm Teil ab von hinten", + "TEXT_GET_SUBSTRING_START_FIRST": "nimm Teil ab erster", + "TEXT_GET_SUBSTRING_END_FROM_START": "bis", + "TEXT_GET_SUBSTRING_END_FROM_END": "bis von hinten", + "TEXT_GET_SUBSTRING_END_LAST": "bis letzter", + "TEXT_GET_SUBSTRING_TAIL": "Buchstabe", + "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": "wandel um in GROSSBUCHSTABEN", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "wandel um in kleinbuchstaben", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "wandel um in Substantive", + "TEXT_TRIM_TOOLTIP": "Entfernt Leerzeichen vom Anfang und / oder Ende eines Textes.", + "TEXT_TRIM_OPERATOR_BOTH": "entferne Leerzeichen vom Anfang und vom Ende (links und rechts)", + "TEXT_TRIM_OPERATOR_LEFT": "entferne Leerzeichen vom Anfang (links)", + "TEXT_TRIM_OPERATOR_RIGHT": "entferne Leerzeichen vom Ende (rechts)", + "TEXT_PRINT_TITLE": "gib aus %1", + "TEXT_PRINT_TOOLTIP": "Gibt den Text aus.", + "TEXT_PROMPT_TYPE_TEXT": "frage nach Text mit Hinweis", + "TEXT_PROMPT_TYPE_NUMBER": "frage nach Zahl mit Hinweis", + "TEXT_PROMPT_TOOLTIP_NUMBER": "Fragt den Benutzer nach einer Zahl.", + "TEXT_PROMPT_TOOLTIP_TEXT": "Fragt den Benutzer nach einem Text.", + "TEXT_COUNT_MESSAGE0": "zähle %1 in %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Zähle, wie oft ein Text innerhalb eines anderen Textes vorkommt.", + "TEXT_REPLACE_MESSAGE0": "ersetze %1 durch %2 in %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "Ersetze alle Vorkommen eines Textes innerhalb eines anderen Textes.", + "TEXT_REVERSE_MESSAGE0": "kehre %1 um", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "Kehre die Reihenfolge der Zeichen im Text um.", + "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 Liste aus den angegebenen Elementen.", + "LISTS_CREATE_WITH_INPUT_WITH": "erzeuge Liste mit", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "Liste", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Hinzufügen, entfernen und sortieren von Elementen.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Ein Element zur Liste hinzufügen.", + "LISTS_REPEAT_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", + "LISTS_REPEAT_TOOLTIP": "Erzeugt eine Liste mit einer variablen Anzahl von Elementen", + "LISTS_REPEAT_TITLE": "erzeuge Liste mit %2 mal dem Element %1​", + "LISTS_LENGTH_TITLE": "Länge von %1", + "LISTS_LENGTH_TOOLTIP": "Die Anzahl von Elementen in der Liste.", + "LISTS_ISEMPTY_TITLE": "%1 ist leer", + "LISTS_ISEMPTY_TOOLTIP": "Ist wahr, falls die Liste leer ist.", + "LISTS_INLIST": "in der Liste", + "LISTS_INDEX_OF_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", + "LISTS_INDEX_OF_FIRST": "suche erstes Auftreten von", + "LISTS_INDEX_OF_LAST": "suche letztes Auftreten von", + "LISTS_INDEX_OF_TOOLTIP": "Sucht die Position (Index) eines Elementes in der Liste. Gibt %1 zurück, falls kein Element gefunden wurde.", + "LISTS_GET_INDEX_GET": "nimm", + "LISTS_GET_INDEX_GET_REMOVE": "nimm und entferne", + "LISTS_GET_INDEX_REMOVE": "entferne", + "LISTS_GET_INDEX_FROM_START": "das", + "LISTS_GET_INDEX_FROM_END": "von hinten das", + "LISTS_GET_INDEX_FIRST": "Erste", + "LISTS_GET_INDEX_LAST": "Letzte", + "LISTS_GET_INDEX_RANDOM": "Zufällig", + "LISTS_GET_INDEX_TAIL": "Element", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 ist das erste Element.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 ist das letzte Element.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Extrahiert das Element an der angegebenen Position in der Liste.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Extrahiert das erste Element aus der Liste.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Extrahiert das letzte Element aus der Liste.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Extrahiert ein zufälliges Element aus der Liste.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Extrahiert und entfernt das Element an der angegebenen Position aus der Liste.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Extrahiert und entfernt das erste Element aus der Liste.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Extrahiert und entfernt das letzte Element aus der Liste.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Extrahiert und entfernt ein zufälliges Element aus der Liste.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Entfernt das Element an der angegebenen Position aus der Liste.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Entfernt das erste Element aus der Liste.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Entfernt das letzte Element aus der Liste.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Entfernt ein zufälliges Element aus der Liste.", + "LISTS_SET_INDEX_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", + "LISTS_SET_INDEX_SET": "setze für", + "LISTS_SET_INDEX_INSERT": "füge als", + "LISTS_SET_INDEX_INPUT_TO": "ein", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Setzt das Element an der angegebenen Position in der Liste.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Setzt das erste Element in der Liste.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Setzt das letzte Element in die Liste.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Setzt ein zufälliges Element in der Liste.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Fügt das Element an der angegebenen Position in die Liste ein.", + "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": "nimm Teilliste ab", + "LISTS_GET_SUBLIST_START_FROM_END": "nimm Teilliste ab von hinten", + "LISTS_GET_SUBLIST_START_FIRST": "nimm Teilliste ab erstes", + "LISTS_GET_SUBLIST_END_FROM_START": "bis", + "LISTS_GET_SUBLIST_END_FROM_END": "bis von hinten", + "LISTS_GET_SUBLIST_END_LAST": "bis letztes", + "LISTS_GET_SUBLIST_TAIL": "Element", + "LISTS_GET_SUBLIST_TOOLTIP": "Erstellt eine Kopie mit dem angegebenen Abschnitt der Liste.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "%1 %2 %3 sortieren", + "LISTS_SORT_TOOLTIP": "Eine Kopie einer Liste sortieren.", + "LISTS_SORT_ORDER_ASCENDING": "aufsteigend", + "LISTS_SORT_ORDER_DESCENDING": "absteigend", + "LISTS_SORT_TYPE_NUMERIC": "numerisch", + "LISTS_SORT_TYPE_TEXT": "alphabetisch", + "LISTS_SORT_TYPE_IGNORECASE": "alphabetisch, Großschreibung ignorieren", + "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", + "LISTS_SPLIT_LIST_FROM_TEXT": "Liste aus Text erstellen", + "LISTS_SPLIT_TEXT_FROM_LIST": "Text aus Liste erstellen", + "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.", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "kehre %1 um", + "LISTS_REVERSE_TOOLTIP": "Kehre eine Kopie einer Liste um.", + "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": "setze %1 auf %2", + "VARIABLES_SET_TOOLTIP": "Setzt den Wert einer Variable.", + "VARIABLES_SET_CREATE_GET": "Erzeuge \"Lese %1\"", + "PROCEDURES_DEFNORETURN_HELPURL": "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29", + "PROCEDURES_DEFNORETURN_TITLE": "nach", + "PROCEDURES_DEFNORETURN_PROCEDURE": "etwas tun", + "PROCEDURES_BEFORE_PARAMS": "mit:", + "PROCEDURES_CALL_BEFORE_PARAMS": "mit:", + "PROCEDURES_DEFNORETURN_DO": "", + "PROCEDURES_DEFNORETURN_TOOLTIP": "Ein Funktionsblock ohne Rückgabewert.", + "PROCEDURES_DEFNORETURN_COMMENT": "Beschreibe diese Funktion …", + "PROCEDURES_DEFRETURN_HELPURL": "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29", + "PROCEDURES_DEFRETURN_RETURN": "gib zurück", + "PROCEDURES_DEFRETURN_TOOLTIP": "Ein Funktionsblock mit Rückgabewert.", + "PROCEDURES_ALLOW_STATEMENTS": "Anweisungen erlauben", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Warnung: Dieser Funktionsblock hat zwei gleich benannte Parameter.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://de.wikipedia.org/wiki/Unterprogramm", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Rufe einen Funktionsblock ohne Rückgabewert auf.", + "PROCEDURES_CALLRETURN_HELPURL": "https://de.wikipedia.org/wiki/Unterprogramm", + "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": "Gibt den zweiten Wert zurück und verlässt die Funktion, falls der erste Wert wahr ist.", + "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", + "PROCEDURES_IFRETURN_WARNING": "Warnung: Dieser Block darf nur innerhalb eines Funktionsblocks genutzt werden.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Teile etwas mit…", + "COLLAPSED_WARNINGS_WARNING": "Eingeklappte Blöcke enthalten Warnungen." +} diff --git a/js/msg/json/diq.json b/js/msg/json/diq.json new file mode 100644 index 0000000..062285f --- /dev/null +++ b/js/msg/json/diq.json @@ -0,0 +1,234 @@ +{ + "@metadata": { + "authors": [ + "Kumkumuk", + "Marmase", + "Mirzali", + "Gırd", + "Orbot707" + ] + }, + "VARIABLES_DEFAULT_NAME": "unsur", + "UNNAMED_KEY": "bêname", + "TODAY": "Ewro", + "DUPLICATE_BLOCK": "Zewnc", + "ADD_COMMENT": "Tefsir cı ke", + "REMOVE_COMMENT": "Tefsiri Wedare", + "DUPLICATE_COMMENT": "Mışewreyo zewnc", + "EXTERNAL_INPUTS": "Cıkewtışê xarıciy", + "INLINE_INPUTS": "Cıkerdışê xomiyani", + "DELETE_BLOCK": "Bloki bestere", + "DELETE_X_BLOCKS": "%1 blokan bestere", + "DELETE_ALL_BLOCKS": "Pêro %1 bloki besteriyê?", + "CLEAN_UP": "Blokan pak ke", + "COLLAPSE_BLOCK": "Bloki teng ke", + "COLLAPSE_ALL": "Blokan teng ke", + "EXPAND_BLOCK": "Bloki hera ke", + "EXPAND_ALL": "Blokan hera ke", + "DISABLE_BLOCK": "Çengi devre ra vec", + "ENABLE_BLOCK": "Bloki feal ke", + "HELP": "Peşti", + "UNDO": "Peyser bıgê", + "REDO": "Newe ke", + "CHANGE_VALUE_TITLE": "Erci bıvurne:", + "RENAME_VARIABLE": "Vuriyayey fına name ke...", + "RENAME_VARIABLE_TITLE": "Pêro vırnayışê '%1' reyna name ke:", + "NEW_VARIABLE": "Vuriyayeyo bıvıraz...", + "NEW_STRING_VARIABLE": "Vurriyayoğê rêze vıraze...", + "NEW_NUMBER_VARIABLE": "Vurriyayoğê amari vıraze...", + "NEW_COLOUR_VARIABLE": "Vurriyayoğê rengi vıraze...", + "NEW_VARIABLE_TYPE_TITLE": "Tewrê vurriyayoğê neweyi:", + "NEW_VARIABLE_TITLE": "Tewrê vurriyayoğê neweyi:", + "VARIABLE_ALREADY_EXISTS": "Yew vırnayış be namey '%1' xora est.", + "DELETE_VARIABLE_CONFIRMATION": "%1 ke vırnayışê '%2'i gırweneno, besteriyo?", + "DELETE_VARIABLE": "Şıma vırnaoğê '%1'i besterê", + "COLOUR_PICKER_HELPURL": "https://diq.wikipedia.org/wiki/Reng", + "COLOUR_PICKER_TOOLTIP": "Şıma palet ra yew reng weçinê.", + "COLOUR_RANDOM_TITLE": "rengo rastameye", + "COLOUR_RANDOM_TOOLTIP": "Tesadufi yu ren bıweçin", + "COLOUR_RGB_TITLE": "komponentên rengan", + "COLOUR_RGB_RED": "sur", + "COLOUR_RGB_GREEN": "kıho", + "COLOUR_RGB_BLUE": "kewe", + "COLOUR_RGB_TOOLTIP": "Şıma renganê sûr, aşıl u kohoy ra rengê do spesifik vırazê. Gani ê pêro 0 u 100 miyan de bıbê.", + "COLOUR_BLEND_TITLE": "tewde", + "COLOUR_BLEND_COLOUR1": "reng 1", + "COLOUR_BLEND_COLOUR2": "reng 2", + "COLOUR_BLEND_RATIO": "nısbet", + "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", + "CONTROLS_REPEAT_TITLE": "%1 fıni tekrar ke", + "CONTROLS_REPEAT_INPUT_DO": "bıke", + "CONTROLS_REPEAT_TOOLTIP": "Şıma tayêna reyi akerdışi kerê.", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "Tekrar kerdış de", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "hend tekrar ke", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Yew erc raşto se yu beyanat bıd.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Yew erc xırabo se tay beyanati bıd", + "CONTROLS_FOREACH_TITLE": "Lista %2 de her item %1 rê", + "CONTROLS_FOREACH_TOOLTIP": "Yew lista de her item rê, varyansê '%1' itemi rê vırazê, u dıma tayê akerdışi (beyani) bıdê", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "Çerxen ra vec", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "Gama bin da çerxeni ra dewam ke", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Öujtewada çerxeni ra bıvıci", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Diqat: No bloke şeno teyna yew çerxiyayış miyan de bıgırweyo.", + "CONTROLS_IF_TOOLTIP_1": "Eger yew vaye raşto, o taw şıma tayê akerdışi kerê.", + "CONTROLS_IF_MSG_IF": "eke", + "CONTROLS_IF_MSG_ELSEIF": "eke nêyo", + "CONTROLS_IF_MSG_ELSE": "eke çıniyo", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Bloq da if'i rê yu şert dekerê de.", + "IOS_OK": "TEMAM", + "IOS_CANCEL": "Bıtexelne", + "IOS_ERROR": "Xeta", + "IOS_PROCEDURES_INPUTS": "BEYANİ", + "IOS_PROCEDURES_ADD_INPUT": "+ Beyan cı ke", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "İfade rê mısade bıde", + "IOS_VARIABLES_ADD_VARIABLE": "+ Vurnekari cı kerê", + "IOS_VARIABLES_ADD_BUTTON": "Cı ke", + "IOS_VARIABLES_RENAME_BUTTON": "Reyna name ke", + "IOS_VARIABLES_DELETE_BUTTON": "Bestere", + "IOS_VARIABLES_VARIABLE_NAME": "Namê vurriyayışi", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Heruna nameyê curnekari veng mevıradê.", + "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", + "LOGIC_COMPARE_TOOLTIP_EQ": "Debiyaye dı erci zey pêyêse ercê \"True\" dane.", + "LOGIC_OPERATION_TOOLTIP_AND": "Eger her dı cıkewtışi zi raştê, şıma ageyrê.", + "LOGIC_OPERATION_AND": "û", + "LOGIC_OPERATION_OR": "ya zi", + "LOGIC_NEGATE_TITLE": "%1 niyo", + "LOGIC_BOOLEAN_TRUE": "raşt", + "LOGIC_BOOLEAN_FALSE": "ğelet", + "LOGIC_BOOLEAN_TOOLTIP": "Raşt yana çep erc dano", + "LOGIC_NULL": "veng", + "LOGIC_NULL_TOOLTIP": "Veng çarneno ra.", + "LOGIC_TERNARY_CONDITION": "test", + "LOGIC_TERNARY_IF_TRUE": "eke raşto", + "LOGIC_TERNARY_IF_FALSE": "eke ğeleto", + "LOGIC_TERNARY_TOOLTIP": "Şerta'test'i test keno. Eger ke şert raşta se erca 'raşt'i çarneno, çepo se erca 'çep' çarneno.", + "MATH_NUMBER_HELPURL": "https://diq.wikipedia.org/wiki/Numre", + "MATH_NUMBER_TOOLTIP": "Yew numre.", + "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Aritmetik", + "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", + "MATH_SINGLE_OP_ROOT": "karekok", + "MATH_SINGLE_OP_ABSOLUTE": "mutlaq", + "MATH_SINGLE_TOOLTIP_NEG": "Nêrazibiyena yew amari açarne.", + "MATH_SINGLE_TOOLTIP_EXP": "E quwetê yew amar tadano.", + "MATH_SINGLE_TOOLTIP_POW10": "Quweta yew amariya 10ıne tade.", + "MATH_TRIG_HELPURL": "https://diq.wikipedia.org/wiki/Fonksiyonê_trigonometriye", + "MATH_TRIG_TOOLTIP_ASIN": "Arksinusê yew amari açarne.", + "MATH_TRIG_TOOLTIP_ACOS": "Arkkosinusê yew amari açarne.", + "MATH_TRIG_TOOLTIP_ATAN": "Arktangensê yew amari açarne.", + "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", + "MATH_CONSTANT_TOOLTIP": "Sabitanê wertağan ra yew açarne: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (bêpeyniye).", + "MATH_IS_EVEN": "zewnco", + "MATH_IS_ODD": "kıto", + "MATH_IS_PRIME": "bıngehên", + "MATH_IS_WHOLE": "tamo", + "MATH_IS_POSITIVE": "pozitifo", + "MATH_IS_NEGATIVE": "negatifo", + "MATH_IS_DIVISIBLE_BY": "Leteyêno", + "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", + "MATH_CHANGE_TITLE": "%2, keno %1 vurneno", + "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", + "MATH_ROUND_TOOLTIP": "Yu amorer loğê cêri yana cori ke", + "MATH_ROUND_OPERATOR_ROUND": "gılor ke", + "MATH_ROUND_OPERATOR_ROUNDUP": "Loğê cori ke", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "Loğê cêri ke", + "MATH_ONLIST_OPERATOR_SUM": "koma liste", + "MATH_ONLIST_OPERATOR_MIN": "Tewr qıcê lista", + "MATH_ONLIST_OPERATOR_MAX": "Tewr gırdê lista", + "MATH_ONLIST_OPERATOR_AVERAGE": "Averacê lista", + "MATH_ONLIST_OPERATOR_MEDIAN": "Wertey lista", + "MATH_ONLIST_OPERATOR_MODE": "listey modi", + "MATH_ONLIST_OPERATOR_RANDOM": "Raştamaye objeya lista", + "MATH_ONLIST_TOOLTIP_RANDOM": "Liste ra yew elemento rastameye açarne.", + "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", + "MATH_MODULO_TITLE": "%1 ÷ %2 ra menden", + "MATH_MODULO_TOOLTIP": "Mendeyan ra teqsimkerdışê dı amaran açarne.", + "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "Raştamaye nimande amor", + "MATH_ATAN2_HELPURL": "https://diq.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2, X:%1 Y:%2", + "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", + "TEXT_TEXT_TOOLTIP": "Yu herfa, satır yana çekuya metini", + "TEXT_JOIN_TITLE_CREATEWITH": "ya metin vıraz", + "TEXT_CREATE_JOIN_TITLE_JOIN": "gıre de", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Yew işaret nuşteyi ke.", + "TEXT_APPEND_TITLE": "rê %1 Metin dek %2", + "TEXT_LENGTH_TITLE": "dergiya %1", + "TEXT_ISEMPTY_TITLE": "%1 vengo", + "TEXT_INDEXOF_TITLE": "metın de %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "vıraştışê nuşteyê verêni bıvêne", + "TEXT_INDEXOF_OPERATOR_LAST": "vıraştışê nuşteyê verêni bıvêne", + "TEXT_CHARAT_TITLE": "metın de %1 %2", + "TEXT_CHARAT_FROM_START": "Herfa # bıgi", + "TEXT_CHARAT_FROM_END": "herfa # peyêne ra bıgê", + "TEXT_CHARAT_FIRST": "Herfa sıfti bıgi", + "TEXT_CHARAT_LAST": "herfa peyêne bıgê", + "TEXT_CHARAT_RANDOM": "Raştamaye yu herf bıgi", + "TEXT_CHARAT_TOOLTIP": "Şınasnaye pozisyon de yu herfer çerğ keno", + "TEXT_GET_SUBSTRING_TOOLTIP": "Tay letey metini çerğ keno", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "metın de", + "TEXT_GET_SUBSTRING_START_FROM_START": "rêza bınêne herfa # ra bıgê", + "TEXT_GET_SUBSTRING_START_FROM_END": "rêza bınêne herfa # peyêne ra bıgê", + "TEXT_GET_SUBSTRING_END_FROM_START": "heta herfa #", + "TEXT_GET_SUBSTRING_END_FROM_END": "heta herfa # peyêne", + "TEXT_GET_SUBSTRING_END_LAST": "heta herfa peyêne", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "HERFANÊ GIRDANA", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "Herfanê werdiyana", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "Ser herf gırd", + "TEXT_PRINT_TITLE": "%1 çap", + "TEXT_COUNT_MESSAGE0": "%1 miyan de %2 bımare", + "TEXT_REVERSE_MESSAGE0": "karakteranê %1 weçarne", + "LISTS_CREATE_EMPTY_TITLE": "lista venge vıraze", + "LISTS_CREATE_WITH_INPUT_WITH": "Liste ya vıraz", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "liste", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Yew işaret liste ke.", + "LISTS_LENGTH_TITLE": "dergiya %1", + "LISTS_LENGTH_TOOLTIP": "Derganiya yu lister dano.", + "LISTS_ISEMPTY_TITLE": "%1 vengo", + "LISTS_ISEMPTY_TOOLTIP": "Eger kı lista venga se raşt keno çerğ", + "LISTS_INLIST": "lista de", + "LISTS_INDEX_OF_FIRST": "vıraştışê işaretê verêni bıvêne", + "LISTS_INDEX_OF_LAST": "vıraştışê nuşteyê verêni bıvêne", + "LISTS_GET_INDEX_GET": "bıgê", + "LISTS_GET_INDEX_GET_REMOVE": "Bıgi u wedarne", + "LISTS_GET_INDEX_REMOVE": "wedare", + "LISTS_GET_INDEX_FROM_END": "# peyniye ra", + "LISTS_GET_INDEX_FIRST": "verên", + "LISTS_GET_INDEX_LAST": "peyên", + "LISTS_GET_INDEX_RANDOM": "raştameye", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 objeyo sıfteyên o", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 objeyo peyên o", + "LISTS_SET_INDEX_SET": "ca ke", + "LISTS_SET_INDEX_INSERT": "De fi", + "LISTS_SET_INDEX_INPUT_TO": "zey", + "LISTS_GET_SUBLIST_END_FROM_START": "#'ya", + "LISTS_GET_SUBLIST_END_FROM_END": "Peyni # ra hetana", + "LISTS_GET_SUBLIST_END_LAST": "Hetana pey", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "%1 %2 %3 weçine", + "LISTS_SORT_ORDER_ASCENDING": "zeydıyen", + "LISTS_SORT_ORDER_DESCENDING": "Kemeyen", + "LISTS_SORT_TYPE_NUMERIC": "Amoriyal", + "LISTS_SORT_TYPE_TEXT": "Alfabetik", + "LISTS_SPLIT_WITH_DELIMITER": "Hududoxi ya", + "LISTS_REVERSE_MESSAGE0": "%1 dimlaşt kerê", + "LISTS_REVERSE_TOOLTIP": "Yew kopyaya yew lista dimlaşt kerê.", + "VARIABLES_GET_CREATE_SET": "'%1 bınuse' vıraze", + "VARIABLES_SET": "%1 ra %2 rê eyar kerê", + "VARIABLES_SET_CREATE_GET": "'%1 bıwane' vıraze", + "PROCEDURES_DEFNORETURN_TITLE": "rê", + "PROCEDURES_DEFNORETURN_PROCEDURE": "Çıyê bık", + "PROCEDURES_BEFORE_PARAMS": "ebe:", + "PROCEDURES_CALL_BEFORE_PARAMS": "ebe:", + "PROCEDURES_DEFNORETURN_TOOLTIP": "Yew fonksiyono çap nêdate vırazeno", + "PROCEDURES_DEFNORETURN_COMMENT": "Nê fonksiyoni beyan ke...", + "PROCEDURES_DEFRETURN_RETURN": "peyser biya", + "PROCEDURES_DEFRETURN_TOOLTIP": "Yew fonksiyono çap daye vırazeno", + "PROCEDURES_ALLOW_STATEMENTS": "ifade rê mısade bıde", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Tembe: Nê fonksiyoni de parametreyê dıleti estê.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_MUTATORCONTAINER_TITLE": "cıkewtışi", + "PROCEDURES_MUTATORARG_TITLE": "namey cıkewtışi:", + "PROCEDURES_CREATE_DO": "'%1' vıraze", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Çiyê vace..." +} diff --git a/js/msg/json/dty.json b/js/msg/json/dty.json new file mode 100644 index 0000000..75ff112 --- /dev/null +++ b/js/msg/json/dty.json @@ -0,0 +1,107 @@ +{ + "@metadata": { + "authors": [ + "Nirajan pant", + "जनक राज भट्ट", + "राम प्रसाद जोशी" + ] + }, + "VARIABLES_DEFAULT_NAME": "वस्तु", + "TODAY": "आज", + "DUPLICATE_BLOCK": "कपी गर", + "ADD_COMMENT": "टिप्पणी थप्दे", + "REMOVE_COMMENT": "टिप्पणी हटाउन्या", + "DUPLICATE_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": "सहायता", + "UNDO": "रद्द गर्न्या", + "REDO": "पुन: कायम गद्दे", + "CHANGE_VALUE_TITLE": "मान बदल", + "RENAME_VARIABLE": "भेरिबललाई पुनः नामांकन गर...", + "RENAME_VARIABLE_TITLE": "सबै भेरिबलनका %1 नाम बदल्न्या:", + "NEW_VARIABLE": "भेरिएवल बना:", + "NEW_VARIABLE_TITLE": "नयाँ भेरिबलको नाम:", + "VARIABLE_ALREADY_EXISTS": "'%1' नाउँ अरियाऽ भेरिएबल पैली बठेइ छ।", + "DELETE_VARIABLE_CONFIRMATION": "'%2' भेरिएबला %1 प्रयोग मेट्ट्या?", + "DELETE_VARIABLE": "'%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/Color", + "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": "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": "गन्ती गर %1 देखी %2 %3 %4 सम्म", + "CONTROLS_FOREACH_TITLE": "%2 सूचीमी भयाः प्रत्येक आइटम %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": "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": "इफ", + "CONTROLS_IF_MSG_ELSEIF": "एल्स इफ", + "CONTROLS_IF_MSG_ELSE": "एल्स", + "CONTROLS_IF_IF_TOOLTIP": "Add, remove, or reorder sections to reconfigure this if block.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "यदि ब्लकमा एक शर्त जोडौं ।", + "CONTROLS_IF_ELSE_TOOLTIP": "Add a final, catch-all condition to the if block.", + "IOS_OK": "हुन्छ", + "IOS_CANCEL": "खारेजी", + "IOS_ERROR": "गल्ती", + "IOS_PROCEDURES_INPUTS": "इनपुटन", + "IOS_PROCEDURES_ADD_INPUT": "+ इनपुट थपः", + "IOS_VARIABLES_ADD_BUTTON": "जोड़ऽ", + "IOS_VARIABLES_RENAME_BUTTON": "पुनर्नामकरण", + "IOS_VARIABLES_DELETE_BUTTON": "मेटः", + "IOS_VARIABLES_VARIABLE_NAME": "चल(भेरिएबल) नाउँ", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "तम खाली चल नाउँ प्रयोग अरीनाइसक्दाः।", + "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_TOOLTIP": "इनपुट असत्य भयाले सन्य फिर्ता अरन्छ। इनपुट सत्य भयाले असत्य फिर्ता अरन्छ।", + "LOGIC_BOOLEAN_TRUE": "सत्य", + "LOGIC_BOOLEAN_FALSE": "असत्य", + "LOGIC_BOOLEAN_TOOLTIP": "सत्य या असत्य फिर्ता अरन्छ।", + "LOGIC_NULL": "शू्य", + "LOGIC_NULL_TOOLTIP": "शून्य फिर्ता अरन्छ।", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "केयि भँण..." +} diff --git a/js/msg/json/ee.json b/js/msg/json/ee.json new file mode 100644 index 0000000..c16f908 --- /dev/null +++ b/js/msg/json/ee.json @@ -0,0 +1,172 @@ +{ + "@metadata": { + "authors": [ + "Aguve", + "Apequm" + ] + }, + "VARIABLES_DEFAULT_NAME": "nu", + "TODAY": "Egbe", + "DUPLICATE_BLOCK": "Gbugbɔe Wɔ", + "ADD_COMMENT": "Ŋlɔ Numeɖeɖe", + "REMOVE_COMMENT": "Ɖe Numeɖeɖea Ɖa", + "DUPLICATE_COMMENT": "Kɔpi Numeɖeɖea", + "EXTERNAL_INPUTS": "Gotakpeɖeŋunuwo", + "INLINE_INPUTS": "Interdzikpeɖeŋuwo", + "DELETE_BLOCK": "Tutu Hatsotsoa", + "DELETE_X_BLOCKS": "Tutu Hatsotso %1", + "DELETE_ALL_BLOCKS": "Èdi be netutu nu %1 katã?", + "CLEAN_UP": "Tutu Nuawo", + "COLLAPSE_BLOCK": "Hatsotso Me Nuwo Nebu", + "COLLAPSE_ALL": "Hatsotsoawo Me Nuwo Nebu", + "EXPAND_BLOCK": "Hatsotsoa Me Nuwo Nedze", + "EXPAND_ALL": "Hatsotsoawo Me Nuwo Nedze", + "DISABLE_BLOCK": "Tsi Hatsotsoa", + "ENABLE_BLOCK": "Si Hatsotsoa", + "HELP": "Kpekpeɖeŋu", + "UNDO": "Gbugbɔe", + "REDO": "Trɔ Wɔe", + "CHANGE_VALUE_TITLE": "Trɔ nuŋlɔdzesiawo:", + "RENAME_VARIABLE": "Na ŋkɔ bubu nuŋlɔdzesi tɔtrɔa...", + "RENAME_VARIABLE_TITLE": "Na ŋkɔ bubu nuŋlɔdzesi tɔtrɔa '%1' yi:", + "NEW_VARIABLE": "Wɔ teaŋutrɔna...", + "NEW_STRING_VARIABLE": "Wɔ nya teaŋutrɔna...", + "NEW_NUMBER_VARIABLE": "Wɔ xexlẽdzesi teaŋutrɔna...", + "NEW_COLOUR_VARIABLE": "Wɔ amadede teaŋutrɔna...", + "NEW_VARIABLE_TYPE_TITLE": "Teaŋutrɔna ƒomevi yeye:", + "NEW_VARIABLE_TITLE": "Nuŋlɔdzesi tɔtrɔa yeye ƒe ŋkɔ:", + "VARIABLE_ALREADY_EXISTS": "Teaŋutrɔna si ŋkɔe nye '%1' li xoxo.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Teaŋutrɔna '%1' li xoxo eye wotsɔ ŋkɔ sia xoxo na bubu si nye: '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Netutu %1 ŋkɔ si nètsɔ na teaŋutrɔna '%2'?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Mate ŋu atutu teaŋutrɔna '%1' o elabe ewɔ akpa aɖe le teaŋutrɔna '%2' me.", + "DELETE_VARIABLE": "Tutu teaŋutrɔna '%1'", + "COLOUR_PICKER_HELPURL": "https://ee.wikipedia.org/wiki/Amadede", + "COLOUR_PICKER_TOOLTIP": "Tia amadede ɖeka le amadedetiaƒea.", + "COLOUR_RANDOM_TITLE": "amadede aɖe ko", + "COLOUR_RANDOM_TOOLTIP": "Tia amadede aɖe ko.", + "COLOUR_RGB_TITLE": "de amae kple", + "COLOUR_RGB_RED": "dzĩ", + "COLOUR_RGB_GREEN": "gbemumu", + "COLOUR_RGB_BLUE": "blɔ", + "COLOUR_RGB_TOOLTIP": "tsaka", + "COLOUR_BLEND_TITLE": "tsaka", + "COLOUR_BLEND_COLOUR1": "amedede 1", + "COLOUR_BLEND_COLOUR2": "amadede 2", + "COLOUR_BLEND_RATIO": "agbɔsɔsɔ", + "COLOUR_BLEND_TOOLTIP": "Tsaka amadede eve kple agbɔsɔsɔ si nye (0.0 - 1.0).", + "CONTROLS_REPEAT_HELPURL": "https://ee.wikipedia.org/wiki/Na_nogo", + "CONTROLS_REPEAT_TITLE": "Wɔe zi %1", + "CONTROLS_REPEAT_INPUT_DO": "wɔ", + "CONTROLS_REPEAT_TOOLTIP": "Gbugbɔ biabia aɖewo zi geɖe.", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "gbugbɔ wɔe ne", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "gbugbɔ wɔe va se ɖe", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Ne nyatakaka dea, ke wɔ biabia aɖewo.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Ne nyatakaka dea, ke wɔ biabia aɖewo.", + "CONTROLS_FOR_TOOLTIP": "Xexlẽdzesi tɔtrɔ '%1' nenye xexlẽdzesi si dze egɔme kple esiwo kplɔe ɖo va se ɖe mamlɛtɔ dzi, nebu dometsotso si wofia kple nyatakaka suetɔ siwo wofia asii.", + "CONTROLS_FOR_TITLE": "Xlẽ %1 tso %2 yi %3 to %4 dzi", + "CONTROLS_FOREACH_TITLE": "nu sia nu natso %2 me ayi %1 me", + "CONTROLS_FOREACH_TOOLTIP": "Tia teaŋutrɔna '%1' na nuawo dometɔ ɖe sia ɖe si li, eye nàŋlɔ gbedeasi aɖe.", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "Nedo le wɔtiaɖenua me", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "neyi edzi kple wɔtiaɖenua si kplɔe ɖo", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Nedo le wɔtiaɖenua si me wòlea me.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Neto wɔtiaɖenu sia susɔea ta wòayi bubu dzi.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Nuxlɔ̃ame: Wɔtiaɖenu me ko woate ŋu azã ƒuƒoƒo sia le.", + "CONTROLS_IF_TOOLTIP_1": "Ne asime aɖe le eme la, ke taɖodzinya aɖewo neva eme.", + "CONTROLS_IF_TOOLTIP_2": "Ne asime aɖe le eme la, ke taɖodzinyawo ƒe ƒuƒoƒo gbãtɔ neva eme. Ne menye nenem o la, ke taɖodzinyawo ƒe ƒuƒoƒo evelia neva eme.", + "CONTROLS_IF_TOOLTIP_3": "Ne asime gbãtɔe le eme la, ke taɖodzinyawo ƒe ƒuƒoƒo gbãtɔ neva eme. Gake ne asime eveliae le eme la, taɖodzinyawo ƒe ƒuƒoƒo evelia boŋ neva eme.", + "CONTROLS_IF_TOOLTIP_4": "Ne asime gbãtɔ le eme la, ke taɖodzinyawo ƒe ƒuƒoƒo gbãtɔ neva eme. Ke ne taɖodzinyawo ƒe ƒuƒoƒo evelia boŋue le eme la, taɖodzinyawo ƒe ƒuƒoƒo evelia neva eme. Ne taɖodzinya aɖeke mele eme o la,taɖodzinyawo ƒe ƒuƒoƒo mamlɛtɔ neva eme.", + "CONTROLS_IF_MSG_IF": "Ne", + "CONTROLS_IF_MSG_ELSEIF": "Ke boŋ ne", + "CONTROLS_IF_MSG_ELSE": "ke boŋ", + "CONTROLS_IF_IF_TOOLTIP": "Tsɔ kpee, ɖee le eme alo gbugbɔ akpawo ɖo nàtsɔ asi le ne ƒe ƒuƒoƒoa ŋu.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Tsɔ biabia aɖe kpe ne ƒuƒoƒo la.", + "CONTROLS_IF_ELSE_TOOLTIP": "Tsɔ lé wo katã ƒe ne ƒe ƒuƒoƒo kpe biabia mamlɛa.", + "IOS_OK": "YOO", + "IOS_CANCEL": "Natasii", + "IOS_ERROR": "Vodada", + "IOS_PROCEDURES_INPUTS": "NUDEMEWO", + "IOS_PROCEDURES_ADD_INPUT": "+ Tsɔ nu kpe Nudemea", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Ɖe mɔ ɖe taɖodzinyawo ŋu", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Nudeme evee le wɔƒe sia si.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Tsɔ nugba kpee", + "IOS_VARIABLES_ADD_BUTTON": "Tsɔ kpee", + "IOS_VARIABLES_RENAME_BUTTON": "Gbugbɔ na ŋkɔe", + "IOS_VARIABLES_DELETE_BUTTON": "Tutui", + "IOS_VARIABLES_VARIABLE_NAME": "Nugba ŋkɔ", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Màte ŋu azã nugba si mena ŋkɔe o.", + "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Masɔmasɔ_(akɔntabubu)", + "LOGIC_COMPARE_TOOLTIP_EQ": "Ŋuɖoɖoa nenye nyateƒe ne nudeme eveawo sɔ kple wo nɔewo.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Ŋuɖoɖoa nenye nyateƒe ne nudeme eveawo mesɔ kple wo nɔewo o.", + "LOGIC_COMPARE_TOOLTIP_LT": "Ŋuɖoɖoa nenye nyateƒe ne nudeme gbãtɔ mede evelia nu o.", + "LOGIC_COMPARE_TOOLTIP_LTE": "Ŋuɖoɖoa nenye nyateƒe ne nudeme gbãtɔ mede evelia nu o alo sɔ kplii.", + "LOGIC_COMPARE_TOOLTIP_GT": "Ŋuɖoɖoa nenye nyateƒe ne nudeme gbãtɔ lolo wu evelia.", + "LOGIC_COMPARE_TOOLTIP_GTE": "Ŋuɖoɖoa nenye nyateƒe ne nudeme gbãtɔ lolo wu evelia alo sɔ kplii.", + "LOGIC_OPERATION_TOOLTIP_AND": "Ŋuɖoɖoa nenye nyateƒe ne nudeme eveawo nye nyateƒe.", + "LOGIC_OPERATION_AND": "eye", + "LOGIC_OPERATION_TOOLTIP_OR": "Ŋuɖoɖoa nenye nyateƒe ne nudeme ɖeka teti nye nyateƒe.", + "LOGIC_OPERATION_OR": "alo", + "LOGIC_NEGATE_TITLE": "menye %1", + "LOGIC_NEGATE_TOOLTIP": "Ŋuɖoɖoa nenye nyateƒe ne nudemea menye nyateƒe o. Ŋuɖoɖoa nenye aʋatso ne nudemea nye nyateƒe.", + "LOGIC_BOOLEAN_TRUE": "dedia", + "LOGIC_BOOLEAN_FALSE": "mademadea", + "LOGIC_BOOLEAN_TOOLTIP": "Nefia dedia alo mademadea.", + "LOGIC_NULL": "ɖeke o", + "LOGIC_NULL_TOOLTIP": "Mekpɔ ɖeke o.", + "LOGIC_TERNARY_CONDITION": "dodokpɔ", + "LOGIC_TERNARY_IF_TRUE": "nenye nyuitɔ", + "LOGIC_TERNARY_IF_FALSE": "nenye dedietɔ", + "LOGIC_TERNARY_TOOLTIP": "Kpɔ nu si dze le \"dodokpɔ\" me. Ne dediae dze la, tia \"ne dedia\"; ke ne manyomanyotɔe la, tia \"ne mademadea.\"", + "MATH_NUMBER_HELPURL": "https://ee.wikipedia.org/wiki/Xexlẽdzesi", + "MATH_NUMBER_TOOLTIP": "Xexlẽdzesi aɖe", + "MATH_ARITHMETIC_HELPURL": "https://ee.wikipedia.org/wiki/Xexlẽdzesibubu", + "MATH_ARITHMETIC_TOOLTIP_ADD": "Bu xexlẽdzesi evea ƒoƒo ƒu ƒe akɔnta.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "Bu xexlẽdzesi ɖeka ɖeɖe le evelia me ƒe akɔnta.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Bu xexlẽdzesi gbãtɔ teƒe evelia ƒe akɔnta.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Bu xexlẽdzesi ɖeka mama ɖe xexlẽdzesi evelia me ƒe akɔnta.", + "MATH_ARITHMETIC_TOOLTIP_POWER": "Na be xexlẽdzesi gbãtɔ nadzi eɖokui ɖe edzi zigbɔzi xexlẽdzesi evelia.", + "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/dzidziɖedzi_eɖokui zigbɔzi eve", + "MATH_SINGLE_OP_ROOT": "eƒe teƒe eve", + "MATH_SINGLE_TOOLTIP_ROOT": "Xexlẽdzesia nedzi ɖe edzi teƒe eɖokui", + "MATH_SINGLE_OP_ABSOLUTE": "xexlẽ blibo", + "MATH_SINGLE_TOOLTIP_ABS": "Nena xexlẽdzesi aɖe nanye xexlẽ blibo.", + "MATH_SINGLE_TOOLTIP_NEG": "Nena xexlẽdzesi aɖe nanye xexlẽdzesi madenanekeo.", + "MATH_SINGLE_TOOLTIP_LN": "Xexlẽdzesia nedzi ɖe edzi eɖokui zigbzi e.", + "MATH_SINGLE_TOOLTIP_LOG10": "Nebu zigbɔzi neni 10-teƒe-10 awɔ xexlẽdzesia.", + "MATH_SINGLE_TOOLTIP_EXP": "Nebu e-teƒe-e zigbɔzi xexlẽdzesia.", + "MATH_SINGLE_TOOLTIP_POW10": " Nebu ewo-teƒe-ewo zigbɔzi xexlẽdzesia.", + "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", + "MATH_TRIG_TOOLTIP_SIN": "Nebu dzogɔe le digri me (menye radiã o).", + "MATH_IS_EVEN": "enye eve ƒomevi", + "MATH_IS_ODD": "enye etɔ̃ ƒomevi", + "MATH_IS_PRIME": " enye xexlẽme blibo", + "MATH_IS_WHOLE": "enye blibo", + "MATH_IS_POSITIVE": "enye xexlẽme ŋgɔgbeyitɔ", + "MATH_IS_NEGATIVE": "enye xexlẽme megbeyitɔ", + "MATH_IS_DIVISIBLE_BY": "woate ŋu amae ɖe", + "MATH_ONLIST_OPERATOR_MIN": "suetɔ le wo dome", + "MATH_ONLIST_TOOLTIP_MIN": "Neʋu suetɔ le nuwo dome.", + "MATH_ONLIST_OPERATOR_MAX": "gãtɔ le nuwo dome", + "MATH_ONLIST_TOOLTIP_MAX": "Neʋu xexlẽdzesi gãtɔ.", + "LISTS_ISEMPTY_TITLE": "%1 le ƒuƒlu", + "LISTS_GET_INDEX_REMOVE": "ɖee ɖa", + "LISTS_GET_INDEX_FROM_END": "# tso nuwuwu", + "LISTS_GET_INDEX_FIRST": "gbãtɔ", + "LISTS_GET_INDEX_LAST": "mamlɛtɔ", + "LISTS_GET_INDEX_RANDOM": "ɖe sia ɖe ko", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 nye nu gbãtɔ.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 nye nu mamlɛtɔ.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Aʋu nua le afi si wòle le nuwo dome.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Aʋu nu gbãtɔ.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Aʋu nu mamlɛtɔ.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Aʋu nu ɖe sia ɖe aɖe ko.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Aɖe nua ɖa eye wòaʋu nua le afi si wòle le nuawo dome.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Eɖea nu gbãtɔ ɖa eye eya kee gaʋua nu gbãtɔ.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Eɖea nu mamlɛtɔ ɖa eye eya kee gaʋua nu mamlɛtɔ.", + "LISTS_GET_SUBLIST_END_FROM_START": "yi #", + "LISTS_GET_SUBLIST_END_FROM_END": "yi # tso nuwuwu", + "LISTS_GET_SUBLIST_END_LAST": "yi mamlɛtɔ", + "LISTS_SORT_ORDER_ASCENDING": "dzi yim", + "LISTS_SORT_ORDER_DESCENDING": "ɖiɖim", + "PROCEDURES_BEFORE_PARAMS": "kple:", + "PROCEDURES_CALL_BEFORE_PARAMS": "kple:" +} diff --git a/js/msg/json/el.json b/js/msg/json/el.json new file mode 100644 index 0000000..bc3ac1f --- /dev/null +++ b/js/msg/json/el.json @@ -0,0 +1,382 @@ +{ + "@metadata": { + "authors": [ + "Azountas", + "Espertus", + "Evropi", + "Namatreasure", + "Sfyrakis", + "Glavkos", + "Gchr", + "아라", + "Geraki", + "Ανώνυμος Βικιπαιδιστής", + "GR", + "Stam.nikos", + "Themelis", + "KATRINE1992", + "Vicng", + "Nikosgranturismogt", + "Sarri.greek" + ] + }, + "VARIABLES_DEFAULT_NAME": "αντικείμενο", + "UNNAMED_KEY": "χωρίς όνομα", + "TODAY": "Σήμερα", + "DUPLICATE_BLOCK": "Διπλότυπο", + "ADD_COMMENT": "Πρόσθεσε Το Σχόλιο", + "REMOVE_COMMENT": "Αφαίρεσε Το Σχόλιο", + "DUPLICATE_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": "Βοήθεια", + "UNDO": "Αναίρεση", + "REDO": "Ακύρωση αναίρεσης", + "CHANGE_VALUE_TITLE": "Άλλαξε την τιμή:", + "RENAME_VARIABLE": "Μετονόμασε τη μεταβλητή...", + "RENAME_VARIABLE_TITLE": "Μετονόμασε όλες τις μεταβλητές «%1» σε:", + "NEW_VARIABLE": "Δημιουργήστε μεταβλητή", + "NEW_STRING_VARIABLE": "Δημιουργία μεταβλητή συμβολοσειράς...", + "NEW_NUMBER_VARIABLE": "Δημιουργία μεταβλητής αριθμού...", + "NEW_COLOUR_VARIABLE": "Δημιουργία μεταβλητής χρώματος...", + "NEW_VARIABLE_TYPE_TITLE": "Νέος τύπος μεταβλητής:", + "NEW_VARIABLE_TITLE": "Νέο όνομα μεταβλητής:", + "VARIABLE_ALREADY_EXISTS": "Η μεταβλητή με το όνομα \"%1\" υπάρχει ήδη", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Μια μεταβλητή με όνομα '%1' υπάρχει πάντα για έναν άλλο τύπο: '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Θέλετε να διαγράψετε το %1 που χρησιμοποιείτε της μεταβλητής '%2'?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Δεν μπορώ να διαγράψω την μεταβλητή '%1' διότι είναι μέρος του ορισμού της λειτουργίας '%2'", + "DELETE_VARIABLE": "Διαγράψτε την μεταβλητή '%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": "Προσθέτει μια τελική κατάσταση/συνθήκη, που πιάνει όλες τις άλλες περιπτώσεις, στο μπλοκ «εάν».", + "IOS_OK": "ΟΚ", + "IOS_CANCEL": "Ακυρώστε", + "IOS_ERROR": "Σφάλμα", + "IOS_PROCEDURES_INPUTS": "ΕΙΣΑΓΟΜΕΝΑ ΣΤΟΙΧΕΙΑ", + "IOS_PROCEDURES_ADD_INPUT": "Εισάγετε στοιχείο", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Να επιτρέπονται οι δηλώσεις", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Αυτή η παράμετρος απαιτεί διπλή εισαγωγή στοιχείων", + "IOS_VARIABLES_ADD_VARIABLE": "Προσθέσατε Μεταβλητή", + "IOS_VARIABLES_ADD_BUTTON": "Προσθήκη", + "IOS_VARIABLES_RENAME_BUTTON": "Αλλάξετε το όνομα του αρχείου", + "IOS_VARIABLES_DELETE_BUTTON": "Διαγραφή", + "IOS_VARIABLES_VARIABLE_NAME": "Όνομα μεταβλητής", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Δεν μπορείτε να χρησιμοποιήσετε μια μεταβλητή δίχως όνομα", + "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_TITLE": "έως %1 ανάθεσε κείμενο %2", + "TEXT_APPEND_TOOLTIP": "Αναθέτει κείμενο στη μεταβλητή «%1».", + "TEXT_LENGTH_TITLE": "το μήκος του %1", + "TEXT_LENGTH_TOOLTIP": "Επιστρέφει το πλήθος των γραμμάτων (συμπεριλαμβανομένων και των κενών διαστημάτων) στο παρεχόμενο κείμενο.", + "TEXT_ISEMPTY_TITLE": "το %1 είναι κενό", + "TEXT_ISEMPTY_TOOLTIP": "Επιστρέφει αληθής αν το παρεχόμενο κείμενο είναι κενό.", + "TEXT_INDEXOF_TOOLTIP": "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του πρώτου κειμένου στο δεύτερο κείμενο. Επιστρέφει τιμή %1, αν δε βρει το κείμενο.", + "TEXT_INDEXOF_TITLE": "στο κείμενο %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "βρες την πρώτη εμφάνιση του κειμένου", + "TEXT_INDEXOF_OPERATOR_LAST": "βρες την τελευταία εμφάνιση του κειμένου", + "TEXT_CHARAT_TITLE": "στο κείμενο %1 %2", + "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": "Δημιουργεί προτροπή για το χρήστη για να δώσει κάποιο κείμενο.", + "TEXT_COUNT_MESSAGE0": "αριθμός %1 σε %2", + "TEXT_COUNT_TOOLTIP": "Μετρά πόσες φορές κάποιο κείμενο εμφανίζεται μέσα σε ένα άλλο κείμενο.", + "TEXT_REPLACE_MESSAGE0": "αντικαταστήσετε το %1 με %2 σε %3", + "TEXT_REPLACE_TOOLTIP": "Αντικαταστήστε όλα τα ήδη υπάρχοντα στοιχεία μέρους του κειμένου με κάποιο άλλο κείμενο", + "TEXT_REVERSE_MESSAGE0": "ανάκληση %1", + "TEXT_REVERSE_TOOLTIP": "Αναγραμματισμός των χαρακτήρων του κειμένου", + "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": "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του στοιχείου στη λίστα. Επιστρέφει τιμή %1, αν το στοιχείο δεν βρεθεί.", + "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_INDEX_FROM_START_TOOLTIP": "Το %1 είναι το πρώτο στοιχείο.", + "LISTS_INDEX_FROM_END_TOOLTIP": "Το %1 είναι το τελευταίο στοιχείο.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Επιστρέφει το στοιχείο στην καθορισμένη θέση σε μια λίστα.", + "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": "Καταργεί και επιστρέφει το στοιχείο στην καθορισμένη θέση σε μια λίστα.", + "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": "Καταργεί το στοιχείο στην καθορισμένη θέση σε μια λίστα.", + "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": "Ορίζει το στοιχείο στην καθορισμένη θέση σε μια λίστα.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Ορίζει το πρώτο στοιχείο σε μια λίστα.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Ορίζει το τελευταίο στοιχείο σε μια λίστα.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Ορίζει ένα τυχαίο στοιχείο σε μια λίστα.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Εισάγει το στοιχείο στην καθορισμένη θέση σε μια λίστα.", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "επιλογή %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Επιλέξετε ένα αντίγραφο της λίστας.", + "LISTS_SORT_ORDER_ASCENDING": "Αύξουσα", + "LISTS_SORT_ORDER_DESCENDING": "Φθίνουσα", + "LISTS_SORT_TYPE_NUMERIC": "αριθμητικό", + "LISTS_SORT_TYPE_TEXT": "Αλφαβητικά", + "LISTS_SORT_TYPE_IGNORECASE": "αλφαβητικά, αγνοήστε το στοιχείο", + "LISTS_SPLIT_LIST_FROM_TEXT": "κάνετε λίστα από το κείμενο", + "LISTS_SPLIT_TEXT_FROM_LIST": "κάνετε κείμενο από τη λίστα", + "LISTS_SPLIT_WITH_DELIMITER": "με διαχωριστικό", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Διαίρεση του κειμένου σε μια λίστα κειμένων, με σπάσιμο σε κάθε διαχωριστικό.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Ενώστε μια λίστα κειμένων σε ένα κείμενο, που χωρίζονται από ένα διαχωριστικό.", + "LISTS_REVERSE_MESSAGE0": "ανάκληση %1", + "LISTS_REVERSE_TOOLTIP": "Α", + "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_DEFNORETURN_COMMENT": "Περιγράψετε αυτήν την ιδιότητα..", + "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_DEFRETURN_RETURN": "επέστρεψε", + "PROCEDURES_DEFRETURN_TOOLTIP": "Δημιουργεί μια συνάρτηση με μια έξοδο.", + "PROCEDURES_ALLOW_STATEMENTS": "να επιτρέπονται οι δηλώσεις", + "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": "Προειδοποίηση: Αυτό το μπλοκ μπορεί να χρησιμοποιηθεί μόνο στον ορισμό μιας συνάρτησης.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Πείτε κάτι...", + "WORKSPACE_ARIA_LABEL": "Χώρος εργασίας Blockly", + "COLLAPSED_WARNINGS_WARNING": "Υπάρχουν προειδοποιήσεις για συμπτυγμένα μπλοκ." +} diff --git a/js/msg/json/en-gb.json b/js/msg/json/en-gb.json new file mode 100644 index 0000000..42ca12b --- /dev/null +++ b/js/msg/json/en-gb.json @@ -0,0 +1,224 @@ +{ + "@metadata": { + "authors": [ + "Andibing", + "Codynguyen1116", + "Shirayuki", + "Aefgh39622" + ] + }, + "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", + "UNDO": "Undo", + "REDO": "Redo", + "CHANGE_VALUE_TITLE": "Change value:", + "RENAME_VARIABLE": "Rename variable...", + "RENAME_VARIABLE_TITLE": "Rename all '%1' variables to:", + "NEW_VARIABLE": "Create variable...", + "NEW_VARIABLE_TITLE": "New variable name:", + "VARIABLE_ALREADY_EXISTS": "A variable named '%1' already exists.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named '%1' already exists for another variable of type '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the '%2' variable?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable '%1' because it's part of the definition of the function '%2'", + "DELETE_VARIABLE": "Delete the '%1' variable", + "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Colour", + "COLOUR_PICKER_TOOLTIP": "Choose a colour from the palette.", + "COLOUR_RANDOM_TITLE": "random colour", + "COLOUR_RANDOM_TOOLTIP": "Choose a colour at random.", + "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_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_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_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_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_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_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.", + "IOS_OK": "OK", + "IOS_CANCEL": "Cancel", + "IOS_ERROR": "Error", + "IOS_PROCEDURES_INPUTS": "INPUTS", + "IOS_PROCEDURES_ADD_INPUT": "+ Add Input", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Allow statements", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "This function has duplicate inputs.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Add Variable", + "IOS_VARIABLES_ADD_BUTTON": "Add", + "IOS_VARIABLES_RENAME_BUTTON": "Rename", + "IOS_VARIABLES_DELETE_BUTTON": "Delete", + "IOS_VARIABLES_VARIABLE_NAME": "Variable name", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "You can't use an empty variable name.", + "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_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_TITLE": "not %1", + "LOGIC_NEGATE_TOOLTIP": "Returns true if the input is false. Returns false if the input is true.", + "LOGIC_BOOLEAN_TRUE": "true", + "LOGIC_BOOLEAN_FALSE": "false", + "LOGIC_BOOLEAN_TOOLTIP": "Returns either true or false.", + "LOGIC_NULL": "null", + "LOGIC_NULL_TOOLTIP": "Returns null.", + "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_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_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_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_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_TITLE": "to %1 append text %2", + "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 the first text in the second text. Returns %1 if text is not found.", + "TEXT_INDEXOF_TITLE": "in text %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "find first occurrence of text", + "TEXT_INDEXOF_OPERATOR_LAST": "find last occurrence of text", + "TEXT_CHARAT_TITLE": "in text %1 %2", + "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.", + "LISTS_SORT_ORDER_DESCENDING": "descendente" +} diff --git a/js/msg/json/en.json b/js/msg/json/en.json new file mode 100644 index 0000000..adc2092 --- /dev/null +++ b/js/msg/json/en.json @@ -0,0 +1,408 @@ +{ + "@metadata": { + "author": "Ellen Spertus ", + "lastupdated": "2020-01-23 14:59:14.637552", + "locale": "en", + "messagedocumentation" : "qqq" + }, + "VARIABLES_DEFAULT_NAME": "item", + "UNNAMED_KEY": "unnamed", + "TODAY": "Today", + "DUPLICATE_BLOCK": "Duplicate", + "ADD_COMMENT": "Add Comment", + "REMOVE_COMMENT": "Remove Comment", + "DUPLICATE_COMMENT": "Duplicate 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", + "UNDO": "Undo", + "REDO": "Redo", + "CHANGE_VALUE_TITLE": "Change value:", + "RENAME_VARIABLE": "Rename variable...", + "RENAME_VARIABLE_TITLE": "Rename all '%1' variables to:", + "NEW_VARIABLE": "Create variable...", + "NEW_STRING_VARIABLE": "Create string variable...", + "NEW_NUMBER_VARIABLE": "Create number variable...", + "NEW_COLOUR_VARIABLE": "Create colour variable...", + "NEW_VARIABLE_TYPE_TITLE": "New variable type:", + "NEW_VARIABLE_TITLE": "New variable name:", + "VARIABLE_ALREADY_EXISTS": "A variable named '%1' already exists.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "A variable named '%1' already exists for another type: '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Delete %1 uses of the '%2' variable?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Can't delete the variable '%1' because it's part of the definition of the function '%2'", + "DELETE_VARIABLE": "Delete the '%1' variable", + "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": "https://www.december.com/html/spec/colorpercompact.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": "https://meyerweb.com/eric/tools/color-blend/#:::rgbp", + "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.", + "IOS_OK": "OK", + "IOS_CANCEL": "Cancel", + "IOS_ERROR": "Error", + "IOS_PROCEDURES_INPUTS": "INPUTS", + "IOS_PROCEDURES_ADD_INPUT": "+ Add Input", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Allow statements", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "This function has duplicate inputs.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Add Variable", + "IOS_VARIABLES_ADD_BUTTON": "Add", + "IOS_VARIABLES_RENAME_BUTTON": "Rename", + "IOS_VARIABLES_DELETE_BUTTON": "Delete", + "IOS_VARIABLES_VARIABLE_NAME": "Variable name", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "You can't use an empty variable name.", + "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_(graphics)", + "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).", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 of X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "Return the arctangent of point (X, Y) in degrees from -180 to 180.", + "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_TITLE": "to %1 append text %2", + "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 %1 if text is not found.", + "TEXT_INDEXOF_TITLE": "in text %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "find first occurrence of text", + "TEXT_INDEXOF_OPERATOR_LAST": "find last occurrence of text", + "TEXT_CHARAT_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-text", + "TEXT_CHARAT_TITLE": "in text %1 %2", + "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.", + "TEXT_COUNT_MESSAGE0": "count %1 in %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Count how many times some text occurs within some other text.", + "TEXT_REPLACE_MESSAGE0": "replace %1 with %2 in %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "Replace all occurances of some text within some other text.", + "TEXT_REVERSE_MESSAGE0": "reverse %1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "Reverses the order of the characters in the 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 %1 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_INDEX_FROM_START_TOOLTIP": "%1 is the first item.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 is the last item.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Returns the item at the specified position in a list.", + "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": "Removes and returns the item at the specified position in a list.", + "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": "Removes the item at the specified position in a list.", + "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": "Sets the item at the specified position in a list.", + "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": "Inserts the item at the specified position in a list.", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "sort %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Sort a copy of a list.", + "LISTS_SORT_ORDER_ASCENDING": "ascending", + "LISTS_SORT_ORDER_DESCENDING": "descending", + "LISTS_SORT_TYPE_NUMERIC": "numeric", + "LISTS_SORT_TYPE_TEXT": "alphabetic", + "LISTS_SORT_TYPE_IGNORECASE": "alphabetic, ignore case", + "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.", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "reverse %1", + "LISTS_REVERSE_TOOLTIP": "Reverse a copy of a list.", + "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/Subroutine", + "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/Subroutine", + "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/Subroutine", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Run the user-defined function '%1'.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "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.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Say something...", + "WORKSPACE_ARIA_LABEL": "Blockly Workspace", + "COLLAPSED_WARNINGS_WARNING": "Collapsed blocks contain warnings." +} diff --git a/js/msg/json/eo.json b/js/msg/json/eo.json new file mode 100644 index 0000000..88565b0 --- /dev/null +++ b/js/msg/json/eo.json @@ -0,0 +1,350 @@ +{ + "@metadata": { + "authors": [ + "Etrapani", + "Ochilov", + "Orikrin1998", + "Robin van der Vliet", + "Cérilew", + "Mirin", + "Surfo" + ] + }, + "VARIABLES_DEFAULT_NAME": "elemento", + "UNNAMED_KEY": "nenomita", + "TODAY": "Hodiaŭ", + "DUPLICATE_BLOCK": "Duobligi", + "ADD_COMMENT": "Aldoni komenton", + "REMOVE_COMMENT": "Forigi komenton", + "DUPLICATE_COMMENT": "Duobligi Komenton", + "EXTERNAL_INPUTS": "Eksteraj eniroj", + "INLINE_INPUTS": "Entekstaj eniroj", + "DELETE_BLOCK": "Forigi blokon", + "DELETE_X_BLOCKS": "Forigi %1 blokojn", + "DELETE_ALL_BLOCKS": "Ĉu forigi ĉiujn %1 blokojn?", + "CLEAN_UP": "Purigi blokojn", + "COLLAPSE_BLOCK": "Faldi blokon", + "COLLAPSE_ALL": "Faldi blokojn", + "EXPAND_BLOCK": "Malfaldi blokon", + "EXPAND_ALL": "Malfaldi blokojn", + "DISABLE_BLOCK": "Malŝalti blokon", + "ENABLE_BLOCK": "Ŝalti blokon", + "HELP": "Helpo", + "UNDO": "Malfari", + "REDO": "Refari", + "CHANGE_VALUE_TITLE": "Ŝangi valoron:", + "RENAME_VARIABLE": "Renomi variablon...", + "RENAME_VARIABLE_TITLE": "Renomi ĉiujn '%1' variablojn kiel:", + "NEW_VARIABLE": "Nova variablo...", + "NEW_STRING_VARIABLE": "Krei signoĉenan variablon...", + "NEW_NUMBER_VARIABLE": "Krei nombran variablon...", + "NEW_COLOUR_VARIABLE": "Krei koloran variablon...", + "NEW_VARIABLE_TYPE_TITLE": "Tipo de nova variablo:", + "NEW_VARIABLE_TITLE": "Nova nomo de variablo:", + "VARIABLE_ALREADY_EXISTS": "Jam ekzistas variablo kun la nomo '%1'.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Jam ekzistas variablo kun la nomo '%1' por alia tipo: '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Ĉu forigi %1 uzojn de la variablo '%2'?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Ne povas forigi la variablon '%1' ĉar ĝi estas parto de la difino de la funkcio '%2'", + "DELETE_VARIABLE": "Forigi la variablon '%1'", + "COLOUR_PICKER_HELPURL": "https://eo.wikipedia.org/wiki/Koloro", + "COLOUR_PICKER_TOOLTIP": "Elekti koloron el la paletro.", + "COLOUR_RANDOM_TITLE": "hazarda koloro", + "COLOUR_RANDOM_TOOLTIP": "Elekti hazardan koloron.", + "COLOUR_RGB_TITLE": "kolorigi per", + "COLOUR_RGB_RED": "ruĝa", + "COLOUR_RGB_GREEN": "verda", + "COLOUR_RGB_BLUE": "blua", + "COLOUR_RGB_TOOLTIP": "Kreas koloron kun specifita kvanto de ruĝo, verdo, kaj bluo. Ĉiuj valoroj devas esti inter 0 kaj 100.", + "COLOUR_BLEND_TITLE": "miksi", + "COLOUR_BLEND_COLOUR1": "koloro 1", + "COLOUR_BLEND_COLOUR2": "koloro 2", + "COLOUR_BLEND_RATIO": "proporcio", + "COLOUR_BLEND_TOOLTIP": "Kunmiksas du kolorojn laŭ specifita proporcio (0,0 - 1,0).", + "CONTROLS_REPEAT_HELPURL": "https://eo.wikipedia.org/wiki/Iteracio", + "CONTROLS_REPEAT_TITLE": "ripeti %1 fojojn", + "CONTROLS_REPEAT_INPUT_DO": "fari", + "CONTROLS_REPEAT_TOOLTIP": "Plenumas kelkajn ordonojn plurfoje.", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "ripeti dum", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "ripeti ĝis", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Plenumi ordonojn dum la valoro egalas veron.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Plenumi ordonojn dum valoro egalas malvero.", + "CONTROLS_FOR_TOOLTIP": "Varias la variablon '%1', ekde la komenca nombro ĝis la fina nombro, laŭ la specifita diferenco; dume rulas la specifitajn blokojn.", + "CONTROLS_FOR_TITLE": "kalkuli kun variablo %1 ekde %2 ĝis %3 per diferenco %4", + "CONTROLS_FOREACH_TITLE": "por ĉiu elemento %1 en la listo %2", + "CONTROLS_FOREACH_TOOLTIP": "Pri ĉiu elemento en listo, difinas la variablon '%1' al la elemento, kaj faras kelkajn ordonojn.", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "eliri el la ciklo", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "daŭrigi je la venonta ripeto de la ciklo", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Eliri el la enhava ciklo.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Pretersalti la ceteron de tiu ĉi ciklo kaj daŭrigi je la venonta ripeto.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Averto: tiu ĉi bloko uzeblas nur ene de ciklo.", + "CONTROLS_IF_TOOLTIP_1": "Plenumi ordonojn se la valoro estas vero.", + "CONTROLS_IF_TOOLTIP_2": "Plenumi la unuan blokon de ordonoj se la valoro estas vero, se ne, la duan.", + "CONTROLS_IF_TOOLTIP_3": "Se la unua valoro estas vero, do faras la unuan blokon de ordonoj. Alie, se la dua valoro estas vero, do faras la duan blokon de ordonoj.", + "CONTROLS_IF_TOOLTIP_4": "Se la unua valoro estas vero, do faras la unuan blokon de ordonoj. Alie, se la dua valoro estas vero, do faras la duan blokon de ordonoj. Se neniu el la du valoroj estas vero, do faras la lastan blokon de ordonoj.", + "CONTROLS_IF_MSG_IF": "se", + "CONTROLS_IF_MSG_ELSEIF": "alie se", + "CONTROLS_IF_MSG_ELSE": "alie", + "CONTROLS_IF_IF_TOOLTIP": "Aldoni, forigi aŭ reorganizi partojn por reagordi la 'se'-blokon.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Aldoni kondiĉon al la bloko 'se'", + "CONTROLS_IF_ELSE_TOOLTIP": "Aldoni 'aliokaze' kondiĉon al la 'se' bloko.", + "IOS_OK": "Bone", + "IOS_CANCEL": "Nuligi", + "IOS_ERROR": "Eraro", + "IOS_PROCEDURES_INPUTS": "ENIROJ", + "IOS_PROCEDURES_ADD_INPUT": "+ Aldoni eniron", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Permesi ordonojn", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Ĉi tiu funkcio havas du samnomajn enirojn.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Aldoni Variablon", + "IOS_VARIABLES_ADD_BUTTON": "Aldoni", + "IOS_VARIABLES_RENAME_BUTTON": "Alinomigi", + "IOS_VARIABLES_DELETE_BUTTON": "Forigi", + "IOS_VARIABLES_VARIABLE_NAME": "Nomo de variablo", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "La nomo de la variablo devas esti ne malplena.", + "LOGIC_COMPARE_HELPURL": "https://eo.wikipedia.org/wiki/Neegala%C4%B5o_(pli_granda,_malpli_granda)", + "LOGIC_COMPARE_TOOLTIP_EQ": "Liveri veron, se la du eniroj egalas.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Liveri veron, se la du eniroj ne egalas.", + "LOGIC_COMPARE_TOOLTIP_LT": "Liveri veron, se la unua eniro estas pli malgranda ol la dua.", + "LOGIC_COMPARE_TOOLTIP_LTE": "Vero estos liverita, se la unua eniro estas pli eta aŭ egala al la dua.", + "LOGIC_COMPARE_TOOLTIP_GT": "Liveri veron, se la unua eniro estas pli granda ol la dua.", + "LOGIC_COMPARE_TOOLTIP_GTE": "Vero estos liverita, se la unua eniro estas pli granda aŭ egala al la dua.", + "LOGIC_OPERATION_TOOLTIP_AND": "Liveri veron, se la du eniroj egalas veron.", + "LOGIC_OPERATION_AND": "kaj", + "LOGIC_OPERATION_TOOLTIP_OR": "Liveri veron, se almenaŭ unu el la eniroj egalas veron.", + "LOGIC_OPERATION_OR": "aŭ", + "LOGIC_NEGATE_TITLE": "maligi %1", + "LOGIC_NEGATE_TOOLTIP": "Liveri veron, se la eniro egalas malveron. Liveri malveron, se la eniro egalas veron.", + "LOGIC_BOOLEAN_TRUE": "vera", + "LOGIC_BOOLEAN_FALSE": "falsa", + "LOGIC_BOOLEAN_TOOLTIP": "Liveri ĉu veron ĉu malveron.", + "LOGIC_NULL": "senvalora", + "LOGIC_NULL_TOOLTIP": "Liveras senvaloron.", + "LOGIC_TERNARY_CONDITION": "testi", + "LOGIC_TERNARY_IF_TRUE": "se estas vero", + "LOGIC_TERNARY_IF_FALSE": "se estas malvero", + "LOGIC_TERNARY_TOOLTIP": "Kontroli la kondiĉon en 'testo'. Se la kondiĉo egalas veron, liveri la valoron 'se estas vero', aliokaze liveri la valoron 'se estas malvero'.", + "MATH_NUMBER_HELPURL": "https://eo.wikipedia.org/wiki/Nombro", + "MATH_NUMBER_TOOLTIP": "Nombro.", + "MATH_ARITHMETIC_HELPURL": "https://eo.wikipedia.org/wiki/Aritmetiko", + "MATH_ARITHMETIC_TOOLTIP_ADD": "Liveri la sumon de la du nombroj.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "Liveri la diferencon inter la du nombroj.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "La produto de la du numeroj estos liverita.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Liveri la kvocienton de la du nombroj.", + "MATH_ARITHMETIC_TOOLTIP_POWER": "Livero la tian potencon de la unua nombro, kia la dua nombro estas", + "MATH_SINGLE_HELPURL": "https://eo.wikipedia.org/wiki/Kvadrata_radiko", + "MATH_SINGLE_OP_ROOT": "kvadrata radiko", + "MATH_SINGLE_TOOLTIP_ROOT": "Liveri la kvadratan radikon de nombro.", + "MATH_SINGLE_OP_ABSOLUTE": "absoluta", + "MATH_SINGLE_TOOLTIP_ABS": "Liveri la absolutan valoron de nombro.", + "MATH_SINGLE_TOOLTIP_NEG": "La negativigo de numero estos liverita.", + "MATH_SINGLE_TOOLTIP_LN": "Liveri la naturan logaritmon de nombro.", + "MATH_SINGLE_TOOLTIP_LOG10": "La dekbaza logaritmo de numero estos liverita.", + "MATH_SINGLE_TOOLTIP_EXP": "Liveri potencon de e.", + "MATH_SINGLE_TOOLTIP_POW10": "Liveri tian potencon de 10, kia la eniro estas.", + "MATH_TRIG_HELPURL": "https://eo.wikipedia.org/wiki/Trigonometria_funkcio", + "MATH_TRIG_TOOLTIP_SIN": "Liveras la sinuson de angulo en gradoj (ne radianoj).", + "MATH_TRIG_TOOLTIP_COS": "Liveras la kosinuson de angulo en gradoj (ne radianoj).", + "MATH_TRIG_TOOLTIP_TAN": "Liveras la tangenton de angulo en gradoj (ne radianoj).", + "MATH_TRIG_TOOLTIP_ASIN": "La sinusarko de nombro estos liverita.", + "MATH_TRIG_TOOLTIP_ACOS": "Liveras la arkokosinuson de nombro.", + "MATH_TRIG_TOOLTIP_ATAN": "La targentarko de nombro estos liverita.", + "MATH_CONSTANT_HELPURL": "https://eo.wikipedia.org/wiki/Matematika_konstanto", + "MATH_CONSTANT_TOOLTIP": "Liveras unu el la ofte uzataj konstantoj: π (3,141…), e (2,718…), φ (1,618…), √2 (1,414…), √½ (0,707…), aŭ ∞ (malfinio).", + "MATH_IS_EVEN": "estas para", + "MATH_IS_ODD": "estas nepara", + "MATH_IS_PRIME": "estas primo", + "MATH_IS_WHOLE": "estas entjero", + "MATH_IS_POSITIVE": "estas pozitiva", + "MATH_IS_NEGATIVE": "estas negativa", + "MATH_IS_DIVISIBLE_BY": "estas dividebla de", + "MATH_IS_TOOLTIP": "Vero aŭ malvero estos liverita, depende de la rezulto de kontrolo, ĉu nombro estas para, nepara, pozitiva, negativa, aŭ dividebla de iu nombro.", + "MATH_CHANGE_HELPURL": "https://eo.wikipedia.org/wiki/Kremento", + "MATH_CHANGE_TITLE": "krementi %1 per %2", + "MATH_CHANGE_TOOLTIP": "Aldoni nombron al variablo '%1'.", + "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", + "MATH_ROUND_TOOLTIP": "Rondigi nombroj, supren aŭ malsupren.", + "MATH_ROUND_OPERATOR_ROUND": "rondigi", + "MATH_ROUND_OPERATOR_ROUNDUP": "Rondigi supren", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "rondigi malsupren", + "MATH_ONLIST_OPERATOR_SUM": "sumo de listo", + "MATH_ONLIST_TOOLTIP_SUM": "Liveri la sumon de ĉiuj nombroj en la listo.", + "MATH_ONLIST_OPERATOR_MIN": "listminimumo", + "MATH_ONLIST_TOOLTIP_MIN": "Liveri la plej malgrandan nombron en la listo.", + "MATH_ONLIST_OPERATOR_MAX": "listmaksimumo", + "MATH_ONLIST_TOOLTIP_MAX": "Liveri la plej grandan nombron en la listo.", + "MATH_ONLIST_OPERATOR_AVERAGE": "listmezumo", + "MATH_ONLIST_TOOLTIP_AVERAGE": "Liveri la aritmetikan meznombron de la nombroj en la listo.", + "MATH_ONLIST_OPERATOR_MEDIAN": "mediano de listo", + "MATH_ONLIST_TOOLTIP_MEDIAN": "Liveras la medianan nombron en la listo.", + "MATH_ONLIST_OPERATOR_MODE": "modoj de listo", + "MATH_ONLIST_TOOLTIP_MODE": "Liveras liston de la plej ofta(j) elemento(j) en la listo.", + "MATH_ONLIST_OPERATOR_STD_DEV": "Norma devio de la listo", + "MATH_ONLIST_TOOLTIP_STD_DEV": "Liveri la norman devion de la listo.", + "MATH_ONLIST_OPERATOR_RANDOM": "hazarda elemento el la listo", + "MATH_ONLIST_TOOLTIP_RANDOM": "Liveri hazardan elementon el la listo.", + "MATH_MODULO_HELPURL": "https://eo.wikipedia.org/wiki/Resto", + "MATH_MODULO_TITLE": "resto de %1 ÷ %2", + "MATH_MODULO_TOOLTIP": "Liveri la reston de la divido de la du nombroj.", + "MATH_CONSTRAIN_TITLE": "limigi %1 inter %2 kaj %3", + "MATH_CONSTRAIN_TOOLTIP": "La nombro estos limigita tiel ke ĝi egalas la limojn aŭ troviĝas inter ili.", + "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_INT_TITLE": "hazarda entjero inter %1 kaj %2", + "MATH_RANDOM_INT_TOOLTIP": "Nombro estos hazarde liverita, tiel ke ĝi egalas la limojn aŭ troviĝas inter ili.", + "MATH_RANDOM_FLOAT_HELPURL": "https://eo.wikipedia.org/wiki/Hazardo", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "hazarda frakcio", + "MATH_RANDOM_FLOAT_TOOLTIP": "Liveras hazardan frakcion inter 0,0 (inkluzive) kaj 1,0 (ekskluzive).", + "MATH_ATAN2_HELPURL": "https://eo.wikipedia.org/wiki/Inversa_trigonometria_funkcio#Duargumenta_varianto_de_tangentarko", + "MATH_ATAN2_TITLE": "atan2 de X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "Liveras la arkotangenton de punkto (X, Y) en gradoj inter -180 kaj 180.", + "TEXT_TEXT_HELPURL": "https://eo.wikipedia.org/wiki/Signoĉeno", + "TEXT_TEXT_TOOLTIP": "Litero, vorto, aŭ linio da teksto.", + "TEXT_JOIN_TITLE_CREATEWITH": "krei tekston kun", + "TEXT_JOIN_TOOLTIP": "Krei pecon de teksto per kunigi ajnan nombron de eroj.", + "TEXT_CREATE_JOIN_TITLE_JOIN": "kunigi", + "TEXT_CREATE_JOIN_TOOLTIP": "Aldonu, forigu, aŭ reorganizu partojn por reagordi la tekstan blokon.", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Aldoni eron al la teksto.", + "TEXT_APPEND_TITLE": "al %1 postaldoni tekston %2", + "TEXT_APPEND_TOOLTIP": "Postapendi iom da teksto al variablo '%1'.", + "TEXT_LENGTH_TITLE": "longo de %1", + "TEXT_LENGTH_TOOLTIP": "Liveras la nombron de literoj (inkluzive de spacetoj) en la provizita teksto.", + "TEXT_ISEMPTY_TITLE": "%1 malplenas", + "TEXT_ISEMPTY_TOOLTIP": "Liveras veron, se la provizita teksto estas malplena.", + "TEXT_INDEXOF_TOOLTIP": "Liveras indekson de la unua/lasta okazo de la unua teksto en la dua teksto. Liveras %1 se la unua teksto ne okazas en la dua teksto.", + "TEXT_INDEXOF_TITLE": "en la teksto %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "trovi la unuan okazon de teksto", + "TEXT_INDEXOF_OPERATOR_LAST": "trovi la lastan okazon de teksto", + "TEXT_CHARAT_TITLE": "en la teksto %1, %2", + "TEXT_CHARAT_FROM_START": "akiri literon de numero", + "TEXT_CHARAT_FROM_END": "akiri literon de inversa numero", + "TEXT_CHARAT_FIRST": "akiri unuan literon", + "TEXT_CHARAT_LAST": "akiri lastan literon", + "TEXT_CHARAT_RANDOM": "akiri hazardan literon", + "TEXT_CHARAT_TOOLTIP": "Liveras literon ĉe specifita loko.", + "TEXT_GET_SUBSTRING_TOOLTIP": "Liveri specifitan parto de la teksto.", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "en la teksto", + "TEXT_GET_SUBSTRING_START_FROM_START": "akiri subsignoĉenon ekde litero de numero", + "TEXT_GET_SUBSTRING_START_FROM_END": "akiri subsignoĉenon ekde litero de inversa numero", + "TEXT_GET_SUBSTRING_START_FIRST": "akiri subsignoĉenon ekde la unua litero", + "TEXT_GET_SUBSTRING_END_FROM_START": "ĝis litero de numero", + "TEXT_GET_SUBSTRING_END_FROM_END": "ĝis litero de inversa numero", + "TEXT_GET_SUBSTRING_END_LAST": "ĝis lasta litero", + "TEXT_CHANGECASE_TOOLTIP": "Liveras kopion de la teksto je alia usklo.", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "MAJUSKLIGI", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "minuskligi", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "Nomuskligi", + "TEXT_TRIM_TOOLTIP": "Liveras kopion de teksto, de kies fino(j) spacetoj foriĝis.", + "TEXT_TRIM_OPERATOR_BOTH": "forigi spacetojn for de ambaŭ finoj de", + "TEXT_TRIM_OPERATOR_LEFT": "forigi spacetojn for de maldekstra fino de", + "TEXT_TRIM_OPERATOR_RIGHT": "forigi spacetojn for de dekstra fino de", + "TEXT_PRINT_TITLE": "presi %1", + "TEXT_PRINT_TOOLTIP": "Presi la specifitan tekston, nombron aŭ alian valoron.", + "TEXT_PROMPT_TYPE_TEXT": "ricevi tekston per mesaĝo", + "TEXT_PROMPT_TYPE_NUMBER": "ricevi nombron per mesaĝo", + "TEXT_PROMPT_TOOLTIP_NUMBER": "Peti nombron al uzanto.", + "TEXT_PROMPT_TOOLTIP_TEXT": "Peti tekston al uzanto.", + "TEXT_COUNT_MESSAGE0": "kalkuli la okazojn de %1 en %2", + "TEXT_COUNT_TOOLTIP": "Kalkuli kiomfoje iu teksto okazas en iu alia teksto.", + "TEXT_REPLACE_MESSAGE0": "anstataŭigi tekston %1 per %2 en %3", + "TEXT_REPLACE_TOOLTIP": "Anstataŭigi ĉiujn okazojn de iu teksto en alia teksto.", + "TEXT_REVERSE_MESSAGE0": "inversigi tekston %1", + "TEXT_REVERSE_TOOLTIP": "Inversigi la ordon de la skribsignoj en la teksto.", + "LISTS_CREATE_EMPTY_TITLE": "krei malplenan liston", + "LISTS_CREATE_EMPTY_TOOLTIP": "Liveri liston, de longo 0, sen datenaj rikordoj", + "LISTS_CREATE_WITH_TOOLTIP": "Krei liston kun ajna nombro de elementoj.", + "LISTS_CREATE_WITH_INPUT_WITH": "krei liston kun", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "listo", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Aldoni, forigi aŭ ordigi partojn por reagordi la listan blokon.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Aldoni elementon al la listo.", + "LISTS_REPEAT_TOOLTIP": "Listo kun la specifita nombro de elementoj, kiuj havos la donitan valoron, estos kreita.", + "LISTS_REPEAT_TITLE": "krei liston kun elemento %1 ripetita %2 fojojn", + "LISTS_LENGTH_TITLE": "longo de %1", + "LISTS_LENGTH_TOOLTIP": "Liveri la longon de listo.", + "LISTS_ISEMPTY_TITLE": "%1 malplenas", + "LISTS_ISEMPTY_TOOLTIP": "Liveri veron, se la listo malplenas.", + "LISTS_INLIST": "en la listo", + "LISTS_INDEX_OF_FIRST": "trovi la unuan aperon de elemento", + "LISTS_INDEX_OF_LAST": "trovi la lastan aperon de elemento", + "LISTS_INDEX_OF_TOOLTIP": "La indekso de la unua/lasta apero de la elemento en la listo estos liverita. %1 estos liverita se la elemento ne estas trovita.", + "LISTS_GET_INDEX_GET": "akiri", + "LISTS_GET_INDEX_GET_REMOVE": "akiri kaj forigi", + "LISTS_GET_INDEX_REMOVE": "forigi", + "LISTS_GET_INDEX_FROM_END": "#el la fino", + "LISTS_GET_INDEX_FIRST": "unuan", + "LISTS_GET_INDEX_LAST": "lastan", + "LISTS_GET_INDEX_RANDOM": "hazardan", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 estas la unua elemento.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 estas la lasta elemento.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Liveri la elementon ĉe la specifita pozicio en listo.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "La unua elemento en la listo esto liverita.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Liveri la lastan elementon en la listo.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Hazarda elemento en la listo estos liverita.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Liveri kaj forigi la elementon en la specifita pozicio de la listo.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "La unua elemento en la listo estos liverita kaj forigita.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Forigi kaj liveri la lastan elementon en listo.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Hazarda elemento en la listo estos liverita kaj forigita.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "La elemento en la specifita pozicio en la listo estos forigita.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "La unua elemento en la listo estos forigita.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "La lasta elemento en la listo estos forigita.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Hazarda elemento en la listo estos forigita.", + "LISTS_SET_INDEX_SET": "difini", + "LISTS_SET_INDEX_INSERT": "enmeti je", + "LISTS_SET_INDEX_INPUT_TO": "kiel", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Difinas la elementon ĉe la specifita pozicio en listo", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Difinas la unua elementon en listo.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Difinas la lastan elementon en listo.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Difinas hazardan elementon en listo.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Enigas la elementon ĉe specifita pozicio en listo.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Antaŭaldonas la elementon ĉe la komenco de listo.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Postaldonas la elementon ĉe la fino de listo.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Enigas la elementon hazarde en listo.", + "LISTS_GET_SUBLIST_START_FROM_START": "akiri subliston ekde elemento de numero", + "LISTS_GET_SUBLIST_START_FROM_END": "akiri subliston ekde elemento de inversa numero", + "LISTS_GET_SUBLIST_START_FIRST": "akiri subliston ekde la unua elemento", + "LISTS_GET_SUBLIST_END_FROM_START": "ĝis elemento de numero", + "LISTS_GET_SUBLIST_END_FROM_END": "ĝis elemento de inversa numero", + "LISTS_GET_SUBLIST_END_LAST": "ĝis la lasta elemento", + "LISTS_GET_SUBLIST_TOOLTIP": "Kreas kopion de la specifita parto de listo.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "ordigi %1 %2 liston %3", + "LISTS_SORT_TOOLTIP": "Ordigas kopion de listo.", + "LISTS_SORT_ORDER_ASCENDING": "kreskante", + "LISTS_SORT_ORDER_DESCENDING": "malkreskante", + "LISTS_SORT_TYPE_NUMERIC": "nombre", + "LISTS_SORT_TYPE_TEXT": "alfabete", + "LISTS_SORT_TYPE_IGNORECASE": "alfabete, ignorante usklon", + "LISTS_SPLIT_LIST_FROM_TEXT": "fari liston el teksto", + "LISTS_SPLIT_TEXT_FROM_LIST": "fari tekston el listo", + "LISTS_SPLIT_WITH_DELIMITER": "kun apartigilo", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Disdividas tekston en liston da tekstoj, laŭ apartigilo.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Kunigas liston de tekstoj en unu tekston, kun apartigilo inter la elementoj.", + "LISTS_REVERSE_MESSAGE0": "inversigi liston %1", + "LISTS_REVERSE_TOOLTIP": "Inversigi kopion de listo.", + "VARIABLES_GET_TOOLTIP": "Liveras la valoron de ĉi tiu variablo.", + "VARIABLES_GET_CREATE_SET": "Krei blokon 'difini variablon %1'", + "VARIABLES_SET": "difini %1 kiel %2", + "VARIABLES_SET_TOOLTIP": "Difinas ĉi tiun variablon kiel la eniron.", + "VARIABLES_SET_CREATE_GET": "Krei blokon 'akiri variablon %1'", + "PROCEDURES_DEFNORETURN_TITLE": "por", + "PROCEDURES_DEFNORETURN_PROCEDURE": "fari ion", + "PROCEDURES_BEFORE_PARAMS": "kun:", + "PROCEDURES_CALL_BEFORE_PARAMS": "kun:", + "PROCEDURES_DEFNORETURN_TOOLTIP": "Krei funkcion sen eliro.", + "PROCEDURES_DEFNORETURN_COMMENT": "Priskribi ĉi tiun funkcion...", + "PROCEDURES_DEFRETURN_RETURN": "liveri", + "PROCEDURES_DEFRETURN_TOOLTIP": "Krei funkcion kun unu eliro.", + "PROCEDURES_ALLOW_STATEMENTS": "permesi ordonojn", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Averto: la funkcio havas du parametrojn kun la sama nomo.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://eo.wikipedia.org/wiki/Subprogramo", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Ruli la uzanto-difinitan funkcion '%1'.", + "PROCEDURES_CALLRETURN_HELPURL": "https://eo.wikipedia.org/wiki/Subprogramo", + "PROCEDURES_CALLRETURN_TOOLTIP": "Ruli la uzanto-difinitan funkcion '%1' kaj uzi ĝian eliron.", + "PROCEDURES_MUTATORCONTAINER_TITLE": "eniroj", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Aldoni, forigi, aŭ reorganizi enirojn je ĉi tiu funkcio.", + "PROCEDURES_MUTATORARG_TITLE": "nomo de enigo:", + "PROCEDURES_MUTATORARG_TOOLTIP": "Aldoni eniron al la funkcio.", + "PROCEDURES_HIGHLIGHT_DEF": "Emfazi difinon de funkcio", + "PROCEDURES_CREATE_DO": "Krei '%1'", + "PROCEDURES_IFRETURN_TOOLTIP": "Se valoro estas vero, do liveras duan valoron.", + "PROCEDURES_IFRETURN_WARNING": "Averto: Ĉi tiu bloko estas uzebla nur en difino de funkcio.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Diru ion…", + "COLLAPSED_WARNINGS_WARNING": "Falditaj blokoj enhavas avertojn." +} diff --git a/js/msg/json/es.json b/js/msg/json/es.json new file mode 100644 index 0000000..4e0840d --- /dev/null +++ b/js/msg/json/es.json @@ -0,0 +1,365 @@ +{ + "@metadata": { + "authors": [ + "Fitoschido", + "VegaDark", + "WeSiToS", + "Macofe", + "Codynguyen1116", + "Indiralena", + "Rubentl134", + "Martineduardo", + "Julián L", + "Luisangelrg", + "MarcoAurelio", + "Ryo567", + "Harvest", + "Ktranz" + ] + }, + "VARIABLES_DEFAULT_NAME": "elemento", + "UNNAMED_KEY": "Sin nombre", + "TODAY": "Hoy", + "DUPLICATE_BLOCK": "Duplicar", + "ADD_COMMENT": "Añadir comentario", + "REMOVE_COMMENT": "Eliminar comentario", + "DUPLICATE_COMMENT": "Duplicar 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", + "UNDO": "Deshacer", + "REDO": "Rehacer", + "CHANGE_VALUE_TITLE": "Cambiar el valor:", + "RENAME_VARIABLE": "Cambiar nombre de variable…", + "RENAME_VARIABLE_TITLE": "Renombrar todas las variables «%1» a:", + "NEW_VARIABLE": "Crear variable…", + "NEW_STRING_VARIABLE": "Crear una cadena variable...", + "NEW_NUMBER_VARIABLE": "Crear una variable de número...", + "NEW_COLOUR_VARIABLE": "Crear una variable de color...", + "NEW_VARIABLE_TYPE_TITLE": "Nuevo tipo de variable:", + "NEW_VARIABLE_TITLE": "Nombre de variable nueva:", + "VARIABLE_ALREADY_EXISTS": "Ya existe una variable llamada '%1'.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Ya existe una variable nombrada '%1' para otra variable del tipo: '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "¿Borrar %1 usos de la variable '%2'?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "No se puede eliminar la variable '%1' porque es parte de la definición de la función '%2'", + "DELETE_VARIABLE": "Borrar la variable \"%1\"", + "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://en.wikipedia.org/wiki/For_loop", + "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": "Atención: este bloque puede usarse solamente 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.", + "IOS_OK": "Aceptar", + "IOS_CANCEL": "Cancelar", + "IOS_ERROR": "Error", + "IOS_PROCEDURES_INPUTS": "ENTRADAS", + "IOS_PROCEDURES_ADD_INPUT": "+ Añadir entrada", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Permitir declaraciones", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Esta función tiene entradas duplicadas.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Añadir variable", + "IOS_VARIABLES_ADD_BUTTON": "Añadir", + "IOS_VARIABLES_RENAME_BUTTON": "Renombrar", + "IOS_VARIABLES_DELETE_BUTTON": "Borrar", + "IOS_VARIABLES_VARIABLE_NAME": "Nombre de la variable", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "No puedes usar un nombre de variable vacío.", + "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": "añadir %2 a %1", + "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 al alza o a la baja.", + "MATH_ROUND_OPERATOR_ROUND": "redondear", + "MATH_ROUND_OPERATOR_ROUNDUP": "redondear al alza", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "redondear a la baja", + "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).", + "MATH_ATAN2_HELPURL": "https://es.wikipedia.org/wiki/Arcotangente_de_dos_par%C3%A1metros", + "MATH_ATAN2_TITLE": "Arcotangente de X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "Regresar el arcotangente del punto (X,Y) en grados de -180 a 180.", + "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_TITLE": "a %1 añade el texto %2", + "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 (espacios incluidos) del 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 %1 si el texto no se encuentra.", + "TEXT_INDEXOF_TITLE": "en el texto %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "encontrar la primera aparición del texto", + "TEXT_INDEXOF_OPERATOR_LAST": "encontrar la última aparición del texto", + "TEXT_CHARAT_TITLE": "en el texto %1 %2", + "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 tamaño 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.", + "TEXT_COUNT_MESSAGE0": "contar %1 en %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Cuantas veces aparece un texto dentro de otro texto.", + "TEXT_REPLACE_MESSAGE0": "reemplazar %1 con %2 en %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "Reemplazar todas las veces que un texto dentro de otro texto.", + "TEXT_REVERSE_MESSAGE0": "invertir %1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "Invierte el orden de los caracteres en el 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 %1 si el elemento no se encuentra.", + "LISTS_GET_INDEX_GET": "obtener", + "LISTS_GET_INDEX_GET_REMOVE": "obtener y eliminar", + "LISTS_GET_INDEX_REMOVE": "eliminar", + "LISTS_GET_INDEX_FROM_END": "# del final", + "LISTS_GET_INDEX_FIRST": "primero", + "LISTS_GET_INDEX_LAST": "último", + "LISTS_GET_INDEX_RANDOM": "aleatorio", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 es el primer elemento.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 es el último elemento.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Devuelve el elemento en la posición especificada en una lista.", + "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": "Elimina y devuelve el elemento en la posición especificada en una lista.", + "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": "Elimina el elemento en la posición especificada en una lista.", + "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": "Establece el elemento en la posición especificada en una lista.", + "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": "Inserta el elemento en la posición especificada en una lista.", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "orden %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Ordenar una copia de una lista.", + "LISTS_SORT_ORDER_ASCENDING": "ascendente", + "LISTS_SORT_ORDER_DESCENDING": "descendente", + "LISTS_SORT_TYPE_NUMERIC": "numérico", + "LISTS_SORT_TYPE_TEXT": "alfabético", + "LISTS_SORT_TYPE_IGNORECASE": "alfabético, ignorar mayúscula/minúscula", + "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.", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "invertir %1", + "LISTS_REVERSE_TOOLTIP": "Invertir una copia de una lista.", + "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_DEFNORETURN_COMMENT": "Describe esta función...", + "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.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Di algo…", + "WORKSPACE_ARIA_LABEL": "Espacio de trabajo de Blockly", + "COLLAPSED_WARNINGS_WARNING": "Bloques colapsados contienen advertencias." +} diff --git a/js/msg/json/et.json b/js/msg/json/et.json new file mode 100644 index 0000000..a2f11bc --- /dev/null +++ b/js/msg/json/et.json @@ -0,0 +1,341 @@ +{ + "@metadata": { + "authors": [ + "Aivarannamaa", + "Hasso", + "Puik", + "Ilmarine", + "Masavi" + ] + }, + "VARIABLES_DEFAULT_NAME": "objekt", + "TODAY": "Täna", + "DUPLICATE_BLOCK": "Tekita duplikaat", + "ADD_COMMENT": "Lisa kommentaar", + "REMOVE_COMMENT": "Eemalda kommentaar", + "DUPLICATE_COMMENT": "Dubleeri kommentaar", + "EXTERNAL_INPUTS": "Sisendid ploki taga", + "INLINE_INPUTS": "Sisendid ploki sees", + "DELETE_BLOCK": "Kustuta plokk", + "DELETE_X_BLOCKS": "Kustuta %1 plokki", + "DELETE_ALL_BLOCKS": "Kas kustutada kõik %1 plokki?", + "CLEAN_UP": "Korista plokid kokku", + "COLLAPSE_BLOCK": "Tõmba plokk kokku", + "COLLAPSE_ALL": "Tõmba plokid kokku", + "EXPAND_BLOCK": "Laota plokk laiali", + "EXPAND_ALL": "Laota plokid laiali", + "DISABLE_BLOCK": "Keela ploki kasutamine", + "ENABLE_BLOCK": "Luba ploki kasutamine", + "HELP": "Abi", + "UNDO": "Võta tagasi", + "REDO": "Tee uuesti", + "CHANGE_VALUE_TITLE": "Muuda väärtust:", + "RENAME_VARIABLE": "Nimeta muutuja ümber ...", + "RENAME_VARIABLE_TITLE": "Muutuja „%1“ uus nimi:", + "NEW_VARIABLE": "Uus muutuja ...", + "NEW_STRING_VARIABLE": "Loo muutuja sõnena...", + "NEW_NUMBER_VARIABLE": "Loo muutuja arvuna...", + "NEW_COLOUR_VARIABLE": "Loo muutuja värvina...", + "NEW_VARIABLE_TYPE_TITLE": "Uue muutuja tüüp:", + "NEW_VARIABLE_TITLE": "Uue muutuja nimi:", + "VARIABLE_ALREADY_EXISTS": "'%1'-nimeline muutuja on juba olemas.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Muutuja nimega '%1' juba eksisteerib teise tüübina: '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Kas kustutada %1 kohas kasutatav muutuja '%2'?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Muutujat '%1' ei saa kustutada, sest see on osa funktsiooni '%2' määratlusest", + "DELETE_VARIABLE": "Kustuta muutuja '%1'", + "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", + "COLOUR_PICKER_TOOLTIP": "Valitud värv paletist.", + "COLOUR_RANDOM_TITLE": "juhuslik värv", + "COLOUR_RANDOM_TOOLTIP": "Juhuslikult valitud värv.", + "COLOUR_RGB_TITLE": "segu", + "COLOUR_RGB_RED": "punasest", + "COLOUR_RGB_GREEN": "rohelisest", + "COLOUR_RGB_BLUE": "sinisest", + "COLOUR_RGB_TOOLTIP": "Tekitab värvi määratud hulgast punasest, rohelisest ja sinisest. Kõik väärtused peavad olema 0 ja 100 vahel.", + "COLOUR_BLEND_TITLE": "segu", + "COLOUR_BLEND_COLOUR1": "1. värvist", + "COLOUR_BLEND_COLOUR2": "2. värvist", + "COLOUR_BLEND_RATIO": "suhtega", + "COLOUR_BLEND_TOOLTIP": "Segab kaks värvi määratud suhtega (0.0 - 1.0) kokku.", + "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", + "CONTROLS_REPEAT_TITLE": "%1 korda", + "CONTROLS_REPEAT_INPUT_DO": "käivita", + "CONTROLS_REPEAT_TOOLTIP": "Plokis olevate käskude käivitamine määratud arv kordi.", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "seni kuni on", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "seni kuni pole", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Plokis olevaid käske korratakse seni kui avaldis on tõene.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Plokis olevaid käske korratakse seni kui avaldis pole tõene.", + "CONTROLS_FOR_TOOLTIP": "Annab muutujale '%1' väärtused ühest numbrist teiseni, muutes seda intervalli kaupa ja käivitab igal muudatusel ploki sees oleva koodi.", + "CONTROLS_FOR_TITLE": "loendus muutujaga %1 alates %2 kuni %3, %4 kaupa", + "CONTROLS_FOREACH_TITLE": "iga elemendiga %1 loendis %2", + "CONTROLS_FOREACH_TOOLTIP": "Iga elemendiga loendis anna muutujale '%1' elemendi väärtus ja kõivita plokis olevad käsud.", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "välju kordusest", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "katkesta see kordus ja liigu järgmisele", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Väljub kordusest ja liigub edasi korduse järel oleva koodi käivitamisele.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Katkestab korduses oleva koodi käivitamise ja käivitab järgmise korduse.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Hoiatus: Seda plokki saab kasutada ainult korduse sees.", + "CONTROLS_IF_TOOLTIP_1": "Kui avaldis on tõene, käivita ploki sees olevad käsud.", + "CONTROLS_IF_TOOLTIP_2": "Kui avaldis on tõene, käivita käsud esimesest plokist. Vastasel juhul käivita käsud teisest plokist.", + "CONTROLS_IF_TOOLTIP_3": "Kui esimene avaldis on tõene, käivita käsud esimesest plokist. Vastasel juhul, kui teine avaldis on tõene, käivita käsud teisest plokist.", + "CONTROLS_IF_TOOLTIP_4": "Kui esimene avaldis on tõene, käivita käsud esimesest plokist. Vastasel juhul, kui teine avaldis on tõene, käivita käsud teisest plokist. Kui ükski avaldistest pole tõene, käivita käsud viimasest plokist.", + "CONTROLS_IF_MSG_IF": "kui", + "CONTROLS_IF_MSG_ELSEIF": "vastasel juhul, kui", + "CONTROLS_IF_MSG_ELSE": "vastasel juhul", + "CONTROLS_IF_IF_TOOLTIP": "Selle „kui“ ploki muutmine sektsioonide lisamise, eemaldamise ja järjestamisega.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Lisab „kui“ plokile tingimuse.", + "CONTROLS_IF_ELSE_TOOLTIP": "Lisab „kui“ plokile lõpliku tingimuseta koodiploki.", + "IOS_OK": "OK", + "IOS_CANCEL": "Tühista", + "IOS_ERROR": "Viga", + "IOS_PROCEDURES_INPUTS": "SISEND", + "IOS_PROCEDURES_ADD_INPUT": "+ Lisa sisend", + "IOS_VARIABLES_ADD_VARIABLE": "+ Lisa muutuja", + "IOS_VARIABLES_ADD_BUTTON": "Lisa", + "IOS_VARIABLES_RENAME_BUTTON": "Nimeta ümber", + "IOS_VARIABLES_DELETE_BUTTON": "Kustuta", + "IOS_VARIABLES_VARIABLE_NAME": "Muutuja nimi", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Tühja muutuja nime ei saa kasutada.", + "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", + "LOGIC_COMPARE_TOOLTIP_EQ": "Tagastab „tõene“, kui avaldiste väärtused on võrdsed.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Tagastab „tõene“, kui avaldiste väärtused pole võrdsed.", + "LOGIC_COMPARE_TOOLTIP_LT": "Tagastab „tõene“, kui esimese avaldise väärtus on väiksem kui teise väärtus.", + "LOGIC_COMPARE_TOOLTIP_LTE": "Tagastab „tõene“, kui esimese avaldise väärtus on väiksem või võrdne teise väärtusega.", + "LOGIC_COMPARE_TOOLTIP_GT": "Tagastab „tõene“, kui esimese avaldise väärtus on suurem kui teise väärtus.", + "LOGIC_COMPARE_TOOLTIP_GTE": "Tagastab „tõene“, kui esimese avaldise väärtus on suurem või võrdne teise väärtusega.", + "LOGIC_OPERATION_TOOLTIP_AND": "Tagastab „tõene“, kui mõlemad avaldised on tõesed.", + "LOGIC_OPERATION_AND": "ja", + "LOGIC_OPERATION_TOOLTIP_OR": "Tagastab „tõene“, kui vähemalt üks avaldistest on tõene.", + "LOGIC_OPERATION_OR": "või", + "LOGIC_NEGATE_TITLE": "pole %1", + "LOGIC_NEGATE_TOOLTIP": "Tagastab „tõene“, kui avaldis on väär. Tagastab „väär“, kui avaldis on tõene.", + "LOGIC_BOOLEAN_TRUE": "tõene", + "LOGIC_BOOLEAN_FALSE": "väär", + "LOGIC_BOOLEAN_TOOLTIP": "Tagastab tõeväärtuse – kas „tõene“ või „väär“.", + "LOGIC_NULL": "null", + "LOGIC_NULL_TOOLTIP": "Tagastab nulli.", + "LOGIC_TERNARY_CONDITION": "tingimus", + "LOGIC_TERNARY_IF_TRUE": "kui tõene", + "LOGIC_TERNARY_IF_FALSE": "kui väär", + "LOGIC_TERNARY_TOOLTIP": "Kui tingimuse väärtus on tõene, tagastab „kui tõene“ väärtuse, vastasel juhul „kui väär“ väärtuse.", + "MATH_NUMBER_HELPURL": "https://et.wikipedia.org/wiki/Arv", + "MATH_NUMBER_TOOLTIP": "Arv.", + "MATH_ARITHMETIC_HELPURL": "https://et.wikipedia.org/wiki/Aritmeetika", + "MATH_ARITHMETIC_TOOLTIP_ADD": "Tagastab kahe arvu summa.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "Tagastab kahe arvu vahe.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Tagastab kahe arvu korrutise.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Tagastab kahe arvu jagatise.", + "MATH_ARITHMETIC_TOOLTIP_POWER": "Tagastab esimese arvu teise arvu astmes.", + "MATH_SINGLE_HELPURL": "https://et.wikipedia.org/wiki/Ruutjuur", + "MATH_SINGLE_OP_ROOT": "ruutjuur", + "MATH_SINGLE_TOOLTIP_ROOT": "Tagastab arvu ruutjuure.", + "MATH_SINGLE_OP_ABSOLUTE": "absoluutväärtus", + "MATH_SINGLE_TOOLTIP_ABS": "Tagastab arvu absoluutväärtuse.", + "MATH_SINGLE_TOOLTIP_NEG": "Tagastab arvu vastandväärtuse.", + "MATH_SINGLE_TOOLTIP_LN": "Tagastab arvu naturaallogaritmi.", + "MATH_SINGLE_TOOLTIP_LOG10": "Tagastab arvu kümnendlogaritm.", + "MATH_SINGLE_TOOLTIP_EXP": "Tagasta e arvu astmes.", + "MATH_SINGLE_TOOLTIP_POW10": "Tagastab 10 arvu astmes.", + "MATH_TRIG_HELPURL": "https://et.wikipedia.org/wiki/Trigonomeetrilised_funktsioonid", + "MATH_TRIG_TOOLTIP_SIN": "Tagastab arvu (kraadid) siinuse.", + "MATH_TRIG_TOOLTIP_COS": "Tagastab arvu (kraadid) kosiinuse.", + "MATH_TRIG_TOOLTIP_TAN": "Tagastab arvu (kraadid) tangensi.", + "MATH_TRIG_TOOLTIP_ASIN": "Tagastab arvu arkussiinuse.", + "MATH_TRIG_TOOLTIP_ACOS": "Tagastab arvu arkuskoosiinuse.", + "MATH_TRIG_TOOLTIP_ATAN": "Tagastab arvu arkustangensi.", + "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", + "MATH_CONSTANT_TOOLTIP": "Tagastab ühe konstantidest: π (3,141…), e (2,718…), φ (1.618…), √2) (1,414…), √½ (0,707…), või ∞ (infinity).", + "MATH_IS_EVEN": "on paarisarv", + "MATH_IS_ODD": "on paaritu arv", + "MATH_IS_PRIME": "on algarv", + "MATH_IS_WHOLE": "on täisarv", + "MATH_IS_POSITIVE": "on positiivne arv", + "MATH_IS_NEGATIVE": "on negatiivne arv", + "MATH_IS_DIVISIBLE_BY": "jagub arvuga", + "MATH_IS_TOOLTIP": "Kontrollib kas arv on paarisarv, paaritu arv, algarv, täisarv, positiivne, negatiivne või jagub kindla arvuga. Tagastab „tõene“ või „väär“.", + "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", + "MATH_CHANGE_TITLE": "muuda %1 %2 võrra", + "MATH_CHANGE_TOOLTIP": "Lisab arvu muutujale '%1'.", + "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", + "MATH_ROUND_TOOLTIP": "Ümardab arvu üles või alla.", + "MATH_ROUND_OPERATOR_ROUND": "ümarda", + "MATH_ROUND_OPERATOR_ROUNDUP": "ümarda üles", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "ümarda alla", + "MATH_ONLIST_OPERATOR_SUM": "loendi summa", + "MATH_ONLIST_TOOLTIP_SUM": "Tagastab kõigi loendis olevate arvude summa.", + "MATH_ONLIST_OPERATOR_MIN": "loendi miinimum", + "MATH_ONLIST_TOOLTIP_MIN": "Tagastab väikseima loendis oleva arvu.", + "MATH_ONLIST_OPERATOR_MAX": "loendi maksimum", + "MATH_ONLIST_TOOLTIP_MAX": "Tagastab suurima loendis oleva arvu.", + "MATH_ONLIST_OPERATOR_AVERAGE": "loendi keskmine", + "MATH_ONLIST_TOOLTIP_AVERAGE": "Tagastab loendis olevate arvväärtuste aritmeetilise keskmise.", + "MATH_ONLIST_OPERATOR_MEDIAN": "loendi mediaan", + "MATH_ONLIST_TOOLTIP_MEDIAN": "Return the median number in the list.", + "MATH_ONLIST_OPERATOR_MODE": "loendi moodid", + "MATH_ONLIST_TOOLTIP_MODE": "Tagastab loendi kõige sagedamini esinevate loendi liikmetega.", + "MATH_ONLIST_OPERATOR_STD_DEV": "loendi standardhälve", + "MATH_ONLIST_TOOLTIP_STD_DEV": "Tagastab loendi standardhälbe.", + "MATH_ONLIST_OPERATOR_RANDOM": "juhuslik element loendist", + "MATH_ONLIST_TOOLTIP_RANDOM": "Tagastab juhusliku elemendi loendist.", + "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", + "MATH_MODULO_TITLE": "%1 ÷ %2 jääk", + "MATH_MODULO_TOOLTIP": "Tagastab esimese numbri teisega jagamisel tekkiva jäägi.", + "MATH_CONSTRAIN_TITLE": "%1 piirang %2 ja %3 vahele", + "MATH_CONSTRAIN_TOOLTIP": "Piirab arvu väärtuse toodud piiridesse (piirarvud kaasa arvatud).", + "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_INT_TITLE": "juhuslik täisarv %1 ja %2 vahel", + "MATH_RANDOM_INT_TOOLTIP": "Tagastab juhusliku täisarvu toodud piiride vahel (piirarvud kaasa arvatud).", + "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "juhuslik murdosa", + "MATH_RANDOM_FLOAT_TOOLTIP": "Tagastab juhusliku murdosa 0.0 (kaasa arvatud) and 1.0 (välja arvatud) vahel.", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2(X:%1, Y:%2)", + "MATH_ATAN2_TOOLTIP": "Tagastab punkti (X, Y) arkustangentsit kraadides vahemikus -180 kuni 180.", + "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", + "TEXT_TEXT_TOOLTIP": "Täht, sõna või rida teksti.", + "TEXT_JOIN_TITLE_CREATEWITH": "tekita tekst", + "TEXT_JOIN_TOOLTIP": "Tekitab teksti ühendades mistahes arvu elemente.", + "TEXT_CREATE_JOIN_TITLE_JOIN": "ühenda", + "TEXT_CREATE_JOIN_TOOLTIP": "Tekstiploki muutmine sektsioonide lisamise, eemaldamise või järjestuse muutmisega.", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Objekti lisamine tekstile.", + "TEXT_APPEND_TITLE": "lisa muutuja %1 lõppu tekst %2", + "TEXT_APPEND_TOOLTIP": "Lisab teksti muutuja „%1“ väärtuse lõppu.", + "TEXT_LENGTH_TITLE": "%1 pikkus", + "TEXT_LENGTH_TOOLTIP": "Tagastab sümbolite aru (ka tühikud) toodud tekstis.", + "TEXT_ISEMPTY_TITLE": "%1 on tühi", + "TEXT_ISEMPTY_TOOLTIP": "Tagastab „tõene“, kui tekstis pole ühtegi sümbolit.", + "TEXT_INDEXOF_TOOLTIP": "Tagastab esimesest tekstist esimese/viimase leitud teise teksti asukoha (indeksi). Kui teksti ei leita, tagastab %1.", + "TEXT_INDEXOF_TITLE": "tekstist %1 %2 %3 asukoht", + "TEXT_INDEXOF_OPERATOR_FIRST": "esimese leitud tekstitüki", + "TEXT_INDEXOF_OPERATOR_LAST": "viimase leitud tekstitüki", + "TEXT_CHARAT_TITLE": "tekstis %1 %2", + "TEXT_CHARAT_FROM_START": "sümbol #", + "TEXT_CHARAT_FROM_END": "lõpust sümbol #", + "TEXT_CHARAT_FIRST": "esimene sümbol", + "TEXT_CHARAT_LAST": "viimane sümbol", + "TEXT_CHARAT_RANDOM": "juhuslik sümbol", + "TEXT_CHARAT_TOOLTIP": "Tagastab tekstis määratud asukohal oleva sümboli.", + "TEXT_GET_SUBSTRING_TOOLTIP": "Tagastab määratud tüki tekstist.", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "tekstist", + "TEXT_GET_SUBSTRING_START_FROM_START": "alates sümbolist #", + "TEXT_GET_SUBSTRING_START_FROM_END": "alates (lõpust) sümbolist #", + "TEXT_GET_SUBSTRING_START_FIRST": "alates esimesest sümbolist", + "TEXT_GET_SUBSTRING_END_FROM_START": "kuni sümbolini #", + "TEXT_GET_SUBSTRING_END_FROM_END": "kuni (lõpust) sümbolini #", + "TEXT_GET_SUBSTRING_END_LAST": "kuni viimase sümbolini", + "TEXT_CHANGECASE_TOOLTIP": "Tagastab muudetud tähesuurusega teksti koopia.", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "SUURTE TÄHTEDEGA", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "väikeste tähtedega", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "Suurte Esitähtedega", + "TEXT_TRIM_TOOLTIP": "Tagastab koopia tekstist, millel on tühikud ühelt või mõlemalt poolt eemaldatud.", + "TEXT_TRIM_OPERATOR_BOTH": "mõlemalt poolt eemaldatud tühikutega", + "TEXT_TRIM_OPERATOR_LEFT": "algusest eemaldatud tühikutega", + "TEXT_TRIM_OPERATOR_RIGHT": "lõpust eemaldatud tühikutega", + "TEXT_PRINT_TITLE": "trüki %1", + "TEXT_PRINT_TOOLTIP": "Trükib määratud teksti, numbri või mõne muu objekti väärtuse.", + "TEXT_PROMPT_TYPE_TEXT": "kasutajalt küsitud tekst teatega", + "TEXT_PROMPT_TYPE_NUMBER": "kasutajalt küsitud arv teatega", + "TEXT_PROMPT_TOOLTIP_NUMBER": "Küsib kasutajalt teadet näidates mingit arvu.", + "TEXT_PROMPT_TOOLTIP_TEXT": "Küsib kasutajalt teadet näidates mingit teksti.", + "TEXT_COUNT_MESSAGE0": "loenda %1 %2-ses", + "TEXT_COUNT_TOOLTIP": "Loenda, mitu korda mingi tekst esineb teise teksti sees.", + "TEXT_REPLACE_MESSAGE0": "asenda %1 %2-ga %3-s", + "TEXT_REPLACE_TOOLTIP": "Asenda mõne teksti esinemine mõnes muus tekstis.", + "TEXT_REVERSE_MESSAGE0": "ümberpöördud %1", + "LISTS_CREATE_EMPTY_TITLE": "tühi loend", + "LISTS_CREATE_EMPTY_TOOLTIP": "Tagastab loendi, mille pikkus on 0 ja milles pole ühtegi elementi.", + "LISTS_CREATE_WITH_TOOLTIP": "Tekitab mistahes arvust elementidest loendi.", + "LISTS_CREATE_WITH_INPUT_WITH": "uus loend", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "loend", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Loendiploki elementide lisamine, eemaldamine või järjestuse muutmine.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Elemendi lisamine loendisse.", + "LISTS_REPEAT_TOOLTIP": "Tekitab uue loendi, millesse lisatakse ühte elementi pikkusega määratud arv kordi.", + "LISTS_REPEAT_TITLE": "loend pikkusega %2 elemendist %1", + "LISTS_LENGTH_TITLE": "%1 pikkus", + "LISTS_LENGTH_TOOLTIP": "Tagastab loendi pikkuse.", + "LISTS_ISEMPTY_TITLE": "%1 on tühi", + "LISTS_ISEMPTY_TOOLTIP": "Tagastab „tõene“ kui loend on tühi.", + "LISTS_INLIST": "loendis", + "LISTS_INDEX_OF_FIRST": "esimene leitud", + "LISTS_INDEX_OF_LAST": "viimase leitud", + "LISTS_INDEX_OF_TOOLTIP": "Tagastab esimese/viimase loendist leitud objekti asukoha (objekti järjekorranumbri loendis). Kui objekti ei leita, tagastab %1.", + "LISTS_GET_INDEX_GET": "võetud", + "LISTS_GET_INDEX_GET_REMOVE": "võetud ja eemaldatud", + "LISTS_GET_INDEX_REMOVE": "eemalda", + "LISTS_GET_INDEX_FROM_START": "element #", + "LISTS_GET_INDEX_FROM_END": "element # (lõpust)", + "LISTS_GET_INDEX_FIRST": "esimene element", + "LISTS_GET_INDEX_LAST": "viimane element", + "LISTS_GET_INDEX_RANDOM": "juhuslik element", + "LISTS_INDEX_FROM_START_TOOLTIP": "Esimene element on %1.", + "LISTS_INDEX_FROM_END_TOOLTIP": "Viimane element on %1.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Tagastab loendis määratud asukohal oleva elemendi.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Tagastab loendi esimese elemendi.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Tagastab loendi viimase elemendi.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Tagastab loendi juhusliku elemendi.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Tagastab ja eemaldab loendist määratud asukohal oleva elemendi.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Tagastab ja eemaldab loendist esimese elemendi.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Tagastab ja eemaldab loendist viimase elemendi.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Tagastab ja eemaldab loendist juhusliku elemendi.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Eemaldab loendist määratud asukohal oleva elemendi.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Eemaldab loendist esimese elemendi.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Eemaldab loendist viimase elemendi.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Eemaldab loendist juhusliku elemendi.", + "LISTS_SET_INDEX_SET": "asenda", + "LISTS_SET_INDEX_INSERT": "lisa asukohale", + "LISTS_SET_INDEX_INPUT_TO": ", väärtus", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Asendab loendis määratud kohal oleva elemendi.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Asendab loendis esimese elemendi.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Asendab loendis viimase elemendi.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Asendab loendis juhusliku elemendi.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Lisab määratud asukohale loendis uue elemendi.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Lisab loendi algusesse uue elemendi.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Lisab loendi lõppu uue elemendi.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Lisab juhuslikule kohale loendis uue elemendi.", + "LISTS_GET_SUBLIST_START_FROM_START": "alamloend elemendist #", + "LISTS_GET_SUBLIST_START_FROM_END": "alamloend elemendist # (lõpust)", + "LISTS_GET_SUBLIST_START_FIRST": "alamloend algusest", + "LISTS_GET_SUBLIST_END_FROM_START": "elemendini #", + "LISTS_GET_SUBLIST_END_FROM_END": "elemendini # (lõpust)", + "LISTS_GET_SUBLIST_END_LAST": "lõpuni", + "LISTS_GET_SUBLIST_TOOLTIP": "Tekitab loendi määratud osast koopia.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "%1 %2 sorteeritud %3", + "LISTS_SORT_TOOLTIP": "Loendi koopia sorteerimine.", + "LISTS_SORT_ORDER_ASCENDING": "kasvavalt", + "LISTS_SORT_ORDER_DESCENDING": "kahanevalt", + "LISTS_SORT_TYPE_NUMERIC": "arvväärtuste järgi", + "LISTS_SORT_TYPE_TEXT": "tähestiku järgi", + "LISTS_SORT_TYPE_IGNORECASE": "tähestiku järgi (tähesuurust eirates)", + "LISTS_SPLIT_LIST_FROM_TEXT": "loend, tekitatud tekstist", + "LISTS_SPLIT_TEXT_FROM_LIST": "tekst, tekitatud loendist", + "LISTS_SPLIT_WITH_DELIMITER": "eraldajaga", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Tükeldab teksti eraldajade kohalt ja asetab tükid tekstide loendisse.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Ühendab tekstide loendis olevad tükid üheks tekstiks, asetades tükkide vahele eraldaja.", + "VARIABLES_GET_TOOLTIP": "Tagastab selle muutuja väärtuse.", + "VARIABLES_GET_CREATE_SET": "Tekita 'määra „%1“ väärtuseks' plokk", + "VARIABLES_SET": "määra %1 väärtuseks %2", + "VARIABLES_SET_TOOLTIP": "Määrab selle muutuja väärtuse võrdseks sisendi väärtusega.", + "VARIABLES_SET_CREATE_GET": "Tekita '„%1“ väärtus' plokk", + "PROCEDURES_DEFNORETURN_TITLE": "funktsioon", + "PROCEDURES_DEFNORETURN_PROCEDURE": "teeme midagi", + "PROCEDURES_BEFORE_PARAMS": "sisenditega:", + "PROCEDURES_CALL_BEFORE_PARAMS": "sisenditega:", + "PROCEDURES_DEFNORETURN_TOOLTIP": "Tekitab funktsiooni, mis ei tagasta midagi.", + "PROCEDURES_DEFNORETURN_COMMENT": "Funktsiooni kirjeldus ...", + "PROCEDURES_DEFRETURN_RETURN": "tagasta", + "PROCEDURES_DEFRETURN_TOOLTIP": "Tekitab funktsiooni, mis tagastab midagi.", + "PROCEDURES_ALLOW_STATEMENTS": "kood plokis", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Hoiatus: Sel funktsioonil on mitu sama nimega sisendit.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://et.wikipedia.org/wiki/Alamprogramm", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Käivitab kasutaja defineeritud funktsiooni '%1'.", + "PROCEDURES_CALLRETURN_HELPURL": "https://et.wikipedia.org/wiki/Alamprogramm", + "PROCEDURES_CALLRETURN_TOOLTIP": "Run the user-defined function '%1' and use its output.", + "PROCEDURES_MUTATORCONTAINER_TITLE": "sisendid", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Funktsiooni sisendite lisamine, eemaldamine või järjestuse muutmine.", + "PROCEDURES_MUTATORARG_TITLE": "sisend nimega:", + "PROCEDURES_MUTATORARG_TOOLTIP": "Lisab funktsioonile sisendi.", + "PROCEDURES_HIGHLIGHT_DEF": "Tõsta funktsiooni definitsioon esile", + "PROCEDURES_CREATE_DO": "Tekita '%1' plokk", + "PROCEDURES_IFRETURN_TOOLTIP": "Kui väärtus on tõene, tagastatakse teine väärtus.", + "PROCEDURES_IFRETURN_WARNING": "Hoiatus: Seda plokki saab kasutada ainult funktsiooni definitsioonis." +} diff --git a/js/msg/json/eu.json b/js/msg/json/eu.json new file mode 100644 index 0000000..6b679be --- /dev/null +++ b/js/msg/json/eu.json @@ -0,0 +1,232 @@ +{ + "@metadata": { + "authors": [ + "An13sa", + "Asieriko", + "Mikel Ibaiba", + "Subi", + "RFenichel", + "Amaia", + "EukeneFL", + "Abacus" + ] + }, + "VARIABLES_DEFAULT_NAME": "elementua", + "UNNAMED_KEY": "izenik gabe", + "TODAY": "Gaur", + "DUPLICATE_BLOCK": "Bikoiztu", + "ADD_COMMENT": "Iruzkina gehitu", + "REMOVE_COMMENT": "Iruzkina ezabatu", + "DUPLICATE_COMMENT": "Iruzkina bikoiztu", + "EXTERNAL_INPUTS": "Kanpoko sarrerak", + "INLINE_INPUTS": "Inpuntak Linean", + "DELETE_BLOCK": "Ezabatu blokea", + "DELETE_X_BLOCKS": "Ezabatu %1 bloke", + "DELETE_ALL_BLOCKS": "Ezabatu %1 blokeak?", + "CLEAN_UP": "Blokeak garbitu", + "COLLAPSE_BLOCK": "Blokea kolapsatu", + "COLLAPSE_ALL": "Blokeak kolapsatu", + "EXPAND_BLOCK": "Blokea Hedatu", + "EXPAND_ALL": "Blokeak Hedatu", + "DISABLE_BLOCK": "Ezgaitu blokea", + "ENABLE_BLOCK": "Gaitu blokea", + "HELP": "Laguntza", + "UNDO": "Desegin", + "REDO": "Berregin", + "CHANGE_VALUE_TITLE": "Aldatu balioa:", + "RENAME_VARIABLE": "Aldatu aldagaiaren izena...", + "RENAME_VARIABLE_TITLE": "Aldatu '%1' aldagai guztien izenak eta izen hau eman:", + "NEW_VARIABLE": "Aldagaia sortu...", + "NEW_STRING_VARIABLE": "Kate aldakorra sortu...", + "NEW_NUMBER_VARIABLE": "Zenbaki aldagaia sortu...", + "NEW_COLOUR_VARIABLE": "Kolore aldagaia sortu...", + "NEW_VARIABLE_TYPE_TITLE": "Aldagai mota berria:", + "NEW_VARIABLE_TITLE": "Aldagai berriaren izena:", + "VARIABLE_ALREADY_EXISTS": "%1 izeneko aldagaia dagoeneko existitzen da.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "%1 izeneko aldagaia dagoeneko existitzen da %2 motako beste aldagai batekin.", + "DELETE_VARIABLE_CONFIRMATION": "Ezabatu %2 aldagaiaren %1 erabilerak?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Ezin da '%1' aldagaia ezabatu '%2' funtzioaren definizioaren zati delako.", + "DELETE_VARIABLE": "%1 parametro izena ezabatu.", + "COLOUR_PICKER_HELPURL": "https://eu.wikipedia.org/wiki/Kolore", + "COLOUR_PICKER_TOOLTIP": "Hautatu kolore bat paletatik.", + "COLOUR_RANDOM_TITLE": "ausazko kolorea", + "COLOUR_RANDOM_TOOLTIP": "Aukeratu ausaz kolore bat.", + "COLOUR_RGB_TITLE": "colour with", + "COLOUR_RGB_RED": "gorria", + "COLOUR_RGB_GREEN": "berdea", + "COLOUR_RGB_BLUE": "urdina", + "COLOUR_RGB_TOOLTIP": "Sortu kolorea zehaztutako gorriz, berdearekin eta urdinekin. Balio guztiak 0 eta 100 artean egon behar dira.", + "COLOUR_BLEND_TITLE": "Nahastu", + "COLOUR_BLEND_COLOUR1": "1 Kolorea", + "COLOUR_BLEND_COLOUR2": "2 Kolorea", + "COLOUR_BLEND_RATIO": "Ratioa", + "COLOUR_BLEND_TOOLTIP": "Bi koloreko nahasketak erlazio jakin batekin nahasten ditu (0.0-1.0)", + "CONTROLS_REPEAT_HELPURL": "https://eu.wikipedia.org/wiki/For_begizta", + "CONTROLS_REPEAT_TITLE": "errepikatu %1 aldiz", + "CONTROLS_REPEAT_INPUT_DO": "egin", + "CONTROLS_REPEAT_TOOLTIP": "Adierazpen batzuk hainbat aldiz egin.", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "bitartean errepikatu", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "arte errepikatu", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Balorea egia den bitartean, egin adierazpen batzuk.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Balorea gezurra den bitartean, egin adierazpen batzuk.", + "CONTROLS_FOR_TOOLTIP": "%1 aldagaiak hasierako zenbakiaren eta amaierako zenbakirako balioak hartzen ditu, zehaztutako tartea zenbatzen du eta zehaztutako blokeak egin.", + "CONTROLS_FOR_TITLE": "%1 zenbatu %2-tik %3-ra %4-ra", + "CONTROLS_FOREACH_TITLE": "%1 elementu bakoitzeko %2 zerrendan", + "CONTROLS_FOREACH_TOOLTIP": "Zerrendako elementu bakoitzarentzat, ezarri %1 aldagaia elementura, eta egin adierazpen batzuk.", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "begizta eten", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "jarraitu hurrengo begizta iterazioarekin", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Agertzen den begiztatik ihes egin.", + "CONTROLS_IF_TOOLTIP_1": "Balorea egia den bitartean, egin adierazpen batzuk.", + "CONTROLS_IF_TOOLTIP_2": "Balorea egia bada, orduan egin ezazu lehenengo adierazpen blokea. Bestela, egin ezazu bigarren adierazpen blokea.", + "CONTROLS_IF_TOOLTIP_3": "Lehenengo balorea egia bada, orduan egin ezazu lehenengo adierazpen blokea. Bestela, bigarren balorea egia bada, egin ezazu bigarren adierazpen blokea.", + "CONTROLS_IF_TOOLTIP_4": "Lehenengo balorea egia bada, orduan egin ezazu lehenengo adierazpen blokea. Bestela, bigarren balorea egia bada, egin ezazu bigarren adierazpen blokea. Baloreetako bat ere ez bada egia, egin ezazu adierazpenen azkeneko blokea.", + "CONTROLS_IF_MSG_IF": "baldin eta", + "CONTROLS_IF_MSG_ELSEIF": "bestela baldin eta", + "CONTROLS_IF_MSG_ELSE": "bestela", + "CONTROLS_IF_IF_TOOLTIP": "Gehitu, ezabatu, ala berrantolatu aukeraketak \"ba\" bloke hau berrezartzeko.", + "IOS_OK": "Ados", + "IOS_CANCEL": "Utzi", + "IOS_ERROR": "Errorea", + "IOS_PROCEDURES_INPUTS": "SARRERAK", + "IOS_PROCEDURES_ADD_INPUT": "+ Gehitu sarrera", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Adierazpenak baimendu", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Funtzio honek errepikatutako sarrerak ditu.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Gehitu aldagaia", + "IOS_VARIABLES_ADD_BUTTON": "Gehitu", + "IOS_VARIABLES_RENAME_BUTTON": "Izena aldatu", + "IOS_VARIABLES_DELETE_BUTTON": "Ezabatu", + "IOS_VARIABLES_VARIABLE_NAME": "Aldagaiaren izena", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Ezin duzu aldagaiaren izen huts bat erabili.", + "LOGIC_COMPARE_HELPURL": "https://eu.wikipedia.org/wiki/Desberdintza", + "LOGIC_OPERATION_AND": "eta", + "LOGIC_OPERATION_OR": "edo", + "LOGIC_NEGATE_TITLE": "ez %1", + "LOGIC_BOOLEAN_TRUE": "egia", + "LOGIC_BOOLEAN_FALSE": "gezurra", + "LOGIC_NULL": "nulu", + "LOGIC_TERNARY_CONDITION": "Froga", + "LOGIC_TERNARY_IF_TRUE": "egia bada", + "LOGIC_TERNARY_IF_FALSE": "gezurra bada", + "MATH_NUMBER_HELPURL": "https://eu.wikipedia.org/wiki/Zenbaki", + "MATH_NUMBER_TOOLTIP": "Zenbaki bat.", + "MATH_ARITHMETIC_HELPURL": "https://eu.wikipedia.org/wiki/Aritmetika", + "MATH_ARITHMETIC_TOOLTIP_ADD": "Bi zenbakien batura ematen du.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "Bi zenbakien kendura ematen du.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Bi zenbakien biderkadura ematen du.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Bi zenbakien zatidura ematen du.", + "MATH_SINGLE_HELPURL": "https://eu.wikipedia.org/wiki/Erro_karratu", + "MATH_SINGLE_OP_ROOT": "erro karratua", + "MATH_SINGLE_TOOLTIP_ROOT": "Zenbaki baten erro karratua ematen du.", + "MATH_SINGLE_OP_ABSOLUTE": "absolutua", + "MATH_SINGLE_TOOLTIP_ABS": "Zenbaki baten balio absolutua ematen du.", + "MATH_SINGLE_TOOLTIP_LN": "Zenbaki baten logaritmo naturala ematen du.", + "MATH_TRIG_HELPURL": "https://eu.wikipedia.org/wiki/Funtzio_trigonometriko", + "MATH_TRIG_TOOLTIP_ASIN": "Zenbaki baten arku sinua ematen du.", + "MATH_TRIG_TOOLTIP_ACOS": "Zenbaki baten arku kosinua ematen du.", + "MATH_TRIG_TOOLTIP_ATAN": "Zenbaki baten arku tangentea ematen du.", + "MATH_CONSTANT_TOOLTIP": "Konstante ohikoenetako bat itzultzen du: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), edo ∞ (infinitua).", + "MATH_IS_EVEN": "bikoitia da", + "MATH_IS_ODD": "bakoitia da", + "MATH_IS_PRIME": "zenbaki lehena da", + "MATH_IS_WHOLE": "zenbaki osoa da", + "MATH_IS_POSITIVE": "positiboa da", + "MATH_IS_NEGATIVE": "negatiboa da", + "MATH_IS_DIVISIBLE_BY": "honakoaz zatigarria da", + "MATH_CHANGE_TITLE": "aldatu %1 %2(e)ra", + "MATH_CHANGE_TOOLTIP": "Gehitu zenbakia '%1' aldagaiari.", + "MATH_ROUND_HELPURL": "https://eu.wikipedia.org/wiki/Biribiltze", + "MATH_ROUND_TOOLTIP": "Zenbaki bat gehiagoz edo gutxiagoz biribildu.", + "MATH_ROUND_OPERATOR_ROUND": "biribildu", + "MATH_ROUND_OPERATOR_ROUNDUP": "gehiagoz biribildu", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "gutxiagoz biribildu", + "MATH_ONLIST_OPERATOR_SUM": "zerrendaren batura", + "MATH_ONLIST_TOOLTIP_SUM": "Eman zerrendako zenbaki guztien batura.", + "MATH_ONLIST_OPERATOR_MIN": "zerrendako minimoa", + "MATH_ONLIST_TOOLTIP_MIN": "Eman zerrendako zenbakirik txikiena.", + "MATH_ONLIST_OPERATOR_MAX": "zerrendako maximoa", + "MATH_ONLIST_TOOLTIP_MAX": "Eman zerrendako zenbakirik handiena.", + "MATH_ONLIST_OPERATOR_AVERAGE": "zerrendaren batazbestekoa", + "MATH_ONLIST_TOOLTIP_AVERAGE": "Zerrendako zenbakizko balioen batazbestekoa (aritmetikoa) itzultzen du.", + "MATH_ONLIST_OPERATOR_MEDIAN": "zerrendako mediana", + "MATH_ONLIST_TOOLTIP_MEDIAN": "Eman zerrendako zenbaki media.", + "MATH_ONLIST_OPERATOR_MODE": "zerrendako modak", + "MATH_ONLIST_TOOLTIP_MODE": "Bueltatu artikulurik ohikoenetarikoen zerrenda.", + "MATH_ONLIST_OPERATOR_STD_DEV": "zerrendako deribazio estandarra", + "MATH_ONLIST_OPERATOR_RANDOM": "zerrendako artikulu aleatorioa", + "MATH_ONLIST_TOOLTIP_RANDOM": "Itzuli zerrendako elementu aleatorioa.", + "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", + "MATH_MODULO_TITLE": "%1 ÷ %2(r)en oroigarria", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "zatiki aleatorioa", + "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", + "TEXT_TEXT_TOOLTIP": "Letra bat, hitza edo testuko lerroa.", + "TEXT_JOIN_TITLE_CREATEWITH": "Testua sortu hurrengoarekin", + "TEXT_CREATE_JOIN_TITLE_JOIN": "elkartu", + "TEXT_CREATE_JOIN_TOOLTIP": "Gehitu, ezabatu, ala berrantolatu aukeraketak testu bloke hau berrezartzeko.", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Gehitu artikulu bat testura.", + "TEXT_APPEND_TITLE": "%1tik testu atxikita %2", + "TEXT_LENGTH_TITLE": "%1(r)en luzeera", + "TEXT_ISEMPTY_TITLE": "%1 hutsik dago", + "TEXT_INDEXOF_TITLE": "testuan %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "bilatu testuaren lehenengo agerpena", + "TEXT_INDEXOF_OPERATOR_LAST": "bilatu testuaren azkenengo agerpena", + "TEXT_CHARAT_TITLE": "testuan %1 %2", + "TEXT_CHARAT_FROM_START": "hartu # letra", + "TEXT_CHARAT_FROM_END": "hartu # letra bukaeratik", + "TEXT_CHARAT_FIRST": "hartu lehenengo letra", + "TEXT_CHARAT_LAST": "hartu azkenengo letra", + "TEXT_CHARAT_RANDOM": "letra aleatorioa lortu", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "testuan", + "TEXT_PRINT_TITLE": "inprimatu %1", + "TEXT_PRINT_TOOLTIP": "zehaztutako testua, zenbakia edo bestelako balioa inprimatzen du.", + "TEXT_REVERSE_MESSAGE0": "%1(e)ri buelta eman", + "LISTS_CREATE_EMPTY_TITLE": "sortu zerrenda hutsa", + "LISTS_CREATE_EMPTY_TOOLTIP": "Zerrenda bat itzultzen du, 0 luzera duena, daturik gabekoa", + "LISTS_CREATE_WITH_INPUT_WITH": "Zerrenda sortu hurrengoarekin", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "zerrenda", + "LISTS_LENGTH_TITLE": "zerrendaren luzera", + "LISTS_LENGTH_TOOLTIP": "zerrendaren luzera itzultzen du", + "LISTS_ISEMPTY_TITLE": "%1 hutsik dago", + "LISTS_ISEMPTY_TOOLTIP": "egia itzultzen du zerrenda hutsik badago.", + "LISTS_INLIST": "zerrendan", + "LISTS_GET_INDEX_GET": "lortu", + "LISTS_GET_INDEX_GET_REMOVE": "lortu eta kendu", + "LISTS_GET_INDEX_REMOVE": "kendu", + "LISTS_GET_INDEX_FIRST": "lehena", + "LISTS_GET_INDEX_LAST": "azkena", + "LISTS_GET_INDEX_RANDOM": "ausazkoa", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 lehenengo artikulua da.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 azken artikulua da.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Artikulua zerrendako posizio zehatz batera bueltatzen du.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Lehenengo artikulua zerrendara bueltatzen du.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Azken artikulua zerrendara bueltatzen du.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Artikulu aleatorioa zerrendara bueltatzen du.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Artikulua zerrendako posizio zehatz batera kentzen eta bueltatzen du.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Lehenengo artikulua zerrendako posizio zehatz batera kentzen eta bueltatzen du.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Zerrendako azken artikulua kentzen eta bueltatzen du.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Artikulu aleatorio bat zerrendatik kentzen eta bueltatzen du.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Artikulua zerrendako posizio zehatz batetik kentzen du.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Lehenengo artikulua zerrendatik kentzen du.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Azken artikulua zerrendatik kentzen du.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Artikulu aleatorioa zerrendatik kentzen du.", + "LISTS_SET_INDEX_SET": "ezarri", + "LISTS_SET_INDEX_INPUT_TO": "honela", + "LISTS_SORT_ORDER_ASCENDING": "goranzkoa", + "LISTS_SORT_ORDER_DESCENDING": "beheranzkoa", + "LISTS_SORT_TYPE_NUMERIC": "Zenbakizkoa", + "LISTS_SORT_TYPE_TEXT": "Alfabetikoki", + "LISTS_SPLIT_LIST_FROM_TEXT": "Testuatik lista sortu", + "LISTS_SPLIT_TEXT_FROM_LIST": "listatik testua sortu", + "PROCEDURES_DEFNORETURN_TITLE": "honi", + "PROCEDURES_DEFNORETURN_PROCEDURE": "egin zerbait", + "PROCEDURES_BEFORE_PARAMS": "honekin", + "PROCEDURES_CALL_BEFORE_PARAMS": "honekin", + "PROCEDURES_DEFRETURN_RETURN": "itzuli", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Abisua: Funtzio honek parametro bikoiztuak dauzka.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Azpierrutina", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Azpierrutina", + "PROCEDURES_MUTATORCONTAINER_TITLE": "sarrerak", + "PROCEDURES_MUTATORARG_TITLE": "sarreraren izena:", + "PROCEDURES_CREATE_DO": "'%1' sortu", + "PROCEDURES_IFRETURN_TOOLTIP": "Balioa egiazkoa bada, orduan itzuli bigarren baliora.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Esan zerbait..." +} diff --git a/js/msg/json/fa.json b/js/msg/json/fa.json new file mode 100644 index 0000000..56c6cc1 --- /dev/null +++ b/js/msg/json/fa.json @@ -0,0 +1,347 @@ +{ + "@metadata": { + "authors": [ + "Ebraminio", + "Reza1615", + "Alirezaaa", + "Mehran", + "MohandesWiki", + "Dalba", + "Hamisun", + "Nhzandi", + "Arash.pt", + "Hossein.safavi" + ] + }, + "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": "راهنما", + "UNDO": "واگردانی", + "REDO": "انجام دوباره", + "CHANGE_VALUE_TITLE": "تغییر مقدار:", + "RENAME_VARIABLE": "تغییر نام متغیر...", + "RENAME_VARIABLE_TITLE": "تغییر نام همهٔ متغیرهای «%1» به:", + "NEW_VARIABLE": "ایجاد متغیر...", + "NEW_STRING_VARIABLE": "ساخت متغیر رشته...", + "NEW_NUMBER_VARIABLE": "ساخت متغیر عددی...", + "NEW_COLOUR_VARIABLE": "ساخت متغیر رنگ...", + "NEW_VARIABLE_TYPE_TITLE": "نوع متغیر جدید:", + "NEW_VARIABLE_TITLE": "نام متغیر تازه:", + "VARIABLE_ALREADY_EXISTS": "متغیری با نام '%1' هم اکنون وجود دارد", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "در حال حاضر یک متغیر با نام '%1' برای متغیر دیگری از نوع '%2' وجود دارد.", + "DELETE_VARIABLE_CONFIRMATION": "تعداد %1 استفاده از متغیر '%2' پاک شود؟", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "متغیر '%1' را نمی‌توان پاک کرد، زیرا جزیی از تعریف تابع '%2' می‌باشد", + "DELETE_VARIABLE": "متغیر '%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": "اضافه کردن نهایی، گرفتن همهٔ شرایط به بلوک اگر.", + "IOS_OK": "تأیید", + "IOS_CANCEL": "لغو", + "IOS_ERROR": "خطا", + "IOS_PROCEDURES_INPUTS": "ورودی‌ها", + "IOS_PROCEDURES_ADD_INPUT": "+ افزودن ورودی", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "اجازه اظهارات", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "این تابع دارای ورودی‌های تکراری است.", + "IOS_VARIABLES_ADD_VARIABLE": "+ افزودن متغیر", + "IOS_VARIABLES_ADD_BUTTON": "افزودن", + "IOS_VARIABLES_RENAME_BUTTON": "تغییر نام", + "IOS_VARIABLES_DELETE_BUTTON": "حذف", + "IOS_VARIABLES_VARIABLE_NAME": "نام متغیر", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "نام متغیر نمی‌تواند خالی باشد", + "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_TITLE": "به %1 الحاق متن %2", + "TEXT_APPEND_TOOLTIP": "الحاق متنی به متغیر «%1».", + "TEXT_LENGTH_TITLE": "طول %1", + "TEXT_LENGTH_TOOLTIP": "بازگرداندن عددی از حروف (شامل فاصله‌ها) در متن فراهم‌شده.", + "TEXT_ISEMPTY_TITLE": "%1 خالی است", + "TEXT_ISEMPTY_TOOLTIP": "اضافه کردن صحیح اگر متن فراهم‌شده خالی است.", + "TEXT_INDEXOF_TOOLTIP": "شاخصی از اولین آخرین رخ‌داد متن اول در متن دوم بر می‌گرداند. اگر متن یافت نشد %1 باز می‌گرداند.", + "TEXT_INDEXOF_TITLE": "در متن %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "اولین رخداد متن را بیاب", + "TEXT_INDEXOF_OPERATOR_LAST": "آخرین رخداد متن را بیاب", + "TEXT_CHARAT_TITLE": "در متن %1 %2", + "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": "اعلان برای کاربر برای یک متن.", + "TEXT_COUNT_MESSAGE0": "تعداد %1 را در %2 بشمار", + "TEXT_COUNT_TOOLTIP": "تعداد دفعاتی که یک متن درون یک متن دیگر تکرار شده است را برمی‌گرداند", + "TEXT_REPLACE_MESSAGE0": "درون %3، متن %1 را با %2 جایگزین کن", + "TEXT_REPLACE_TOOLTIP": "جایگزین کردن تمام مواردی که از متنی درون متن دیگر وجود دارد", + "TEXT_REVERSE_MESSAGE0": "معکوس %1", + "TEXT_REVERSE_TOOLTIP": "چینش کاراکترها درون متن را برعکس می‌کند", + "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": "شاخصی از اولین/آخرین رخ‌داد مورد در فهرست را بر می‌گرداند. %1 بر می‌گرداند اگر آیتم موجود نبود.", + "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_INDEX_FROM_START_TOOLTIP": "%1 اولین مورد است.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 آخرین مورد است.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "موردی در محل مشخص‌شده بر می‌گرداند.", + "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": "مورد در محل مشخص‌شده در فهرست را حذف و بر می‌گرداند.", + "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": "مورد مشخص‌شده در موقعیت مشخص در یک فهرست را حذف و بر می‌گرداند.", + "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": "مورد مشخص‌شده در یک فهرست را قرار می‌دهد.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "اولین مورد در یک فهرست را تعیین می‌کند.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "آخرین مورد در یک فهرست را تعیین می‌کند.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "یک مورد تصادفی در یک فهرست را تعیین می‌کند.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "موردی در موقعیت مشخص‌شده در یک فهرست اضافه می‌کند.", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "مرتب‌سازی%1 %2 %3", + "LISTS_SORT_TOOLTIP": "یک کپی از لیست را مرتب کنید.", + "LISTS_SORT_ORDER_ASCENDING": "صعودی", + "LISTS_SORT_ORDER_DESCENDING": "نزولی", + "LISTS_SORT_TYPE_NUMERIC": "عددی", + "LISTS_SORT_TYPE_TEXT": "حروفی ، الفبایی", + "LISTS_SORT_TYPE_IGNORECASE": "حروفی ، رد کردن مورد", + "LISTS_SPLIT_LIST_FROM_TEXT": "ایجاد فهرست از متن", + "LISTS_SPLIT_TEXT_FROM_LIST": "ایجاد متن از فهرست", + "LISTS_SPLIT_WITH_DELIMITER": "همراه جداساز", + "LISTS_SPLIT_TOOLTIP_SPLIT": "شکستن متن به فهرستی از متن‌ها، شکستن در محل جداکننده", + "LISTS_SPLIT_TOOLTIP_JOIN": "چسباندن یک فهرست از متن‌ها و تشکیل یک متن که با یک جداکننده جدا شده‌اند", + "LISTS_REVERSE_MESSAGE0": "معکوس %1", + "LISTS_REVERSE_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_DEFNORETURN_COMMENT": "توصیف این عملکرد...", + "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_(%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87)", + "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": "اخطار: این بلوک احتمالاً فقط داخل یک تابع استفاده می‌شود.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "یک چیزی بگو..." +} diff --git a/js/msg/json/fi.json b/js/msg/json/fi.json new file mode 100644 index 0000000..a05b714 --- /dev/null +++ b/js/msg/json/fi.json @@ -0,0 +1,370 @@ +{ + "@metadata": { + "authors": [ + "Nike", + "Silvonen", + "Espertus", + "Pettevi", + "McSalama", + "Espeox", + "SNuutti", + "PStudios", + "Mikahama", + "Pyscowicz", + "Pahkiqaz", + "Hopea", + "KK" + ] + }, + "VARIABLES_DEFAULT_NAME": "kohde", + "UNNAMED_KEY": "nimetön", + "TODAY": "Tänään", + "DUPLICATE_BLOCK": "Kaksoiskappale", + "ADD_COMMENT": "Lisää kommentti", + "REMOVE_COMMENT": "Poista kommentti", + "DUPLICATE_COMMENT": "Kahdenna kommentti", + "EXTERNAL_INPUTS": "Ulkoiset syötteet", + "INLINE_INPUTS": "Tuo syötteet", + "DELETE_BLOCK": "Poista lohko", + "DELETE_X_BLOCKS": "Poista %1 lohkoa", + "DELETE_ALL_BLOCKS": "Poistetaanko kaikki %1 lohkoa?", + "CLEAN_UP": "Siivoa lohkot", + "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", + "UNDO": "Kumoa", + "REDO": "Tee uudelleen", + "CHANGE_VALUE_TITLE": "Muuta arvoa:", + "RENAME_VARIABLE": "Nimeä uudelleen muuttuja...", + "RENAME_VARIABLE_TITLE": "Nimeä uudelleen kaikki '%1' muuttujaa:", + "NEW_VARIABLE": "Luo muuttuja...", + "NEW_STRING_VARIABLE": "Luo merkkijonomuuttuja...", + "NEW_NUMBER_VARIABLE": "Luo numeromuuttuja...", + "NEW_COLOUR_VARIABLE": "Luo värimuuttuja...", + "NEW_VARIABLE_TYPE_TITLE": "Uuden muuttujan tyyppi:", + "NEW_VARIABLE_TITLE": "Uuden muuttujan nimi:", + "VARIABLE_ALREADY_EXISTS": "Muuttuja nimeltään '%1' on jo olemassa.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Muuttuja nimeltä '%1' on jo olemassa toiselle tyypille: '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Poistetaanko %1 käyttöä muuttujalta '%2'?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Ei voida poistaa muuttujaa '%1' koska se on osa funktion määritelmää '%2'", + "DELETE_VARIABLE": "Poista muuttuja '%1'", + "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.", + "IOS_OK": "OK", + "IOS_CANCEL": "Peruuta", + "IOS_ERROR": "Virhe", + "IOS_PROCEDURES_INPUTS": "SYÖTTEET", + "IOS_PROCEDURES_ADD_INPUT": "+ Lisää syöte", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Salli lausekkeet", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Tällä toiminnolla on päällekkäisiä syötteitä.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Lisää muuttuja", + "IOS_VARIABLES_ADD_BUTTON": "Lisää", + "IOS_VARIABLES_RENAME_BUTTON": "Nimeä uudelleen", + "IOS_VARIABLES_DELETE_BUTTON": "Poista", + "IOS_VARIABLES_VARIABLE_NAME": "Muuttujan nimi", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Et voi käyttää tyhjää muuttujan nimeä.", + "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": "testi", + "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).", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan(X:%1,Y:%2)", + "MATH_ATAN2_TOOLTIP": "Palauta pisteen (X,Y) arkustangentti välillä -180–180.", + "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_TITLE": "muuttujaan %1 lisää teksti %2", + "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 %1 jos tekstiä ei löytynyt.", + "TEXT_INDEXOF_TITLE": "tekstissä %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "etsi ensimmäinen esiintymä merkkijonolle", + "TEXT_INDEXOF_OPERATOR_LAST": "etsi viimeinen esiintymä merkkijonolle", + "TEXT_CHARAT_TITLE": "tekstissä %1 %2", + "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 tai 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ä.", + "TEXT_COUNT_MESSAGE0": "laske määrä '%1' '%2' sisällä", + "TEXT_COUNT_TOOLTIP": "Laske kuinka monta kertaa jokin teksti esiintyy jossakin toisessa tekstissä.", + "TEXT_REPLACE_MESSAGE0": "Korvaa teksti %1 tekstillä %2 tekstissä %3", + "TEXT_REPLACE_TOOLTIP": "Korvaa tietyn tekstin ilmentymät tekstin sisällä.", + "TEXT_REVERSE_MESSAGE0": "%1 takaperin", + "TEXT_REVERSE_TOOLTIP": "Muuttaa tekstin kirjainten järjestyksen toisin päin.", + "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 listassa. Palauttaa %1 jos kohdetta 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_INDEX_FROM_START_TOOLTIP": "Numero %1 tarkoittaa listan ensimmäistä kohdetta.", + "LISTS_INDEX_FROM_END_TOOLTIP": "Numero %1 tarkoittaa listan viimeistä kohdetta.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Palauta kohde annetusta kohdasta listaa.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Palauta ensimmäinen kohde listalta.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Palauttaa listan viimeisen kohteen.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Palauttaa satunnaisen kohteen listalta.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Poistaa ja palauttaa kohteen listan annetusta kohdasta.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Poistaa ja palauttaa ensimmäisen kohteen listalta.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Poistaa ja palauttaa viimeisen kohteen listalta.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Poistaa ja palauttaa satunnaisen kohteen listalta.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Poistaa kohteen listalta annetusta kohtaa.", + "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": "Asettaa kohteen annettuun kohtaan listassa.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Asettaa listan ensimmäisen kohteen.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Asettaa listan viimeisen kohteen.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Asettaa satunnaisen kohteen listassa.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Lisää kohteen annettuun kohtaan listassa.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Lisää kohteen listan kärkeen.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Lisää kohteen listan loppuun.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Lisää kohteen satunnaiseen kohtaan listassa.", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "lajittele %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Lajittele kopio luettelosta.", + "LISTS_SORT_ORDER_ASCENDING": "nouseva", + "LISTS_SORT_ORDER_DESCENDING": "laskeva", + "LISTS_SORT_TYPE_NUMERIC": "numeerinen", + "LISTS_SORT_TYPE_TEXT": "aakkosjärjestys", + "LISTS_SORT_TYPE_IGNORECASE": "aakkosjärjestyksessä, välittämättä kirjainkoosta", + "LISTS_SPLIT_LIST_FROM_TEXT": "tee lista tekstistä", + "LISTS_SPLIT_TEXT_FROM_LIST": "tee listasta teksti", + "LISTS_SPLIT_WITH_DELIMITER": "erottimen kanssa", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Jaa teksti osiin erotinmerkin perusteella ja järjestä osat listaksi.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Yhdistä luettelon tekstit yhdeksi tekstiksi, erotettuina välimerkillä.", + "LISTS_REVERSE_MESSAGE0": "%1 takaperin", + "LISTS_REVERSE_TOOLTIP": "Palauta käännetty kopio listasta.", + "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_DEFNORETURN_COMMENT": "Kuvaile tämä funktio...", + "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_HELPURL": "http://c2.com/cgi/wiki?GuardClause", + "PROCEDURES_IFRETURN_WARNING": "Varoitus: tätä lohkoa voi käyttää vain funktion määrityksessä.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Sano jotakin...", + "COLLAPSED_WARNINGS_WARNING": "Supistetut lohkot sisältävät varoituksia." +} diff --git a/js/msg/json/fr.json b/js/msg/json/fr.json new file mode 100644 index 0000000..79f1763 --- /dev/null +++ b/js/msg/json/fr.json @@ -0,0 +1,372 @@ +{ + "@metadata": { + "authors": [ + "Espertus", + "Gomoko", + "ProfGra", + "Wladek92", + "Fredlefred", + "Grimault", + "Rixed", + "Frigory", + "Appr", + "Vexthedorito", + "Urhixidur", + "RoboErikG", + "Zarisi", + "Alacabe", + "Pititnatole", + "Verdy p", + "Thibaut120094" + ] + }, + "VARIABLES_DEFAULT_NAME": "élément", + "UNNAMED_KEY": "non nommé", + "TODAY": "Aujourd'hui", + "DUPLICATE_BLOCK": "Dupliquer", + "ADD_COMMENT": "Ajouter un commentaire", + "REMOVE_COMMENT": "Supprimer un commentaire", + "DUPLICATE_COMMENT": "Dupliquer le 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 ces %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", + "UNDO": "Annuler", + "REDO": "Refaire", + "CHANGE_VALUE_TITLE": "Modifier la valeur :", + "RENAME_VARIABLE": "Renommer la variable...", + "RENAME_VARIABLE_TITLE": "Renommer toutes les variables « %1 » en :", + "NEW_VARIABLE": "Créer une variable...", + "NEW_STRING_VARIABLE": "Créer une variable de chaîne...", + "NEW_NUMBER_VARIABLE": "Créer une variable numérique...", + "NEW_COLOUR_VARIABLE": "Créer une variable de couleur...", + "NEW_VARIABLE_TYPE_TITLE": "Nouveau type de variable :", + "NEW_VARIABLE_TITLE": "Nom de la nouvelle variable :", + "VARIABLE_ALREADY_EXISTS": "Une variable nommée « %1 » existe déjà.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Une variable nommée « %1 » existe déjà pour un autre type : « %2 ».", + "DELETE_VARIABLE_CONFIRMATION": "Supprimer %1 utilisations de la variable « %2 » ?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Impossible de supprimer la variable « %1 » parce qu’elle fait partie de la définition de la fonction « %2 »", + "DELETE_VARIABLE": "Supprimer la variable « %1 »", + "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": "colorier en", + "COLOUR_RGB_RED": "rouge", + "COLOUR_RGB_GREEN": "vert", + "COLOUR_RGB_BLUE": "bleu", + "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.", + "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": "taux", + "COLOUR_BLEND_TOOLTIP": "Mélange deux couleurs dans une proportion donnée (de 0.0 à 1.0).", + "CONTROLS_REPEAT_HELPURL": "https://fr.wikipedia.org/wiki/Boucle_for", + "CONTROLS_REPEAT_TITLE": "répéter %1 fois", + "CONTROLS_REPEAT_INPUT_DO": "faire", + "CONTROLS_REPEAT_TOOLTIP": "Exécuter des instructions 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 des instructions.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Tant qu’une valeur est fausse, alors exécuter des instructions.", + "CONTROLS_FOR_TOOLTIP": "Faire prendre successivement à la variable « %1 » les valeurs entre deux nombres de début et de fin par incrément du pas spécifié et exécuter les instructions spécifiées.", + "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 d’une liste, assigner la valeur de l’élément à la variable « %1 », puis exécuter des instructions.", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "quitter la boucle", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "passer à l’itération de boucle suivante", + "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 certaines instructions.", + "CONTROLS_IF_TOOLTIP_2": "Si une valeur est vraie, alors exécuter le premier bloc d’instructions. Sinon, exécuter le second bloc d’instructions.", + "CONTROLS_IF_TOOLTIP_3": "Si la première valeur est vraie, alors exécuter le premier bloc d’instructions. Sinon, si la seconde valeur est vraie, exécuter le second bloc d’instructions.", + "CONTROLS_IF_TOOLTIP_4": "Si la première valeur est vraie, alors exécuter le premier bloc d’instructions. Sinon, si la seconde valeur est vraie, exécuter le second bloc d’instruction. Si aucune des valeurs n’est vraie, exécuter le dernier bloc d’instruction.", + "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 conditionnel.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Ajouter une condition au bloc conditionnel.", + "CONTROLS_IF_ELSE_TOOLTIP": "Ajouter une condition finale déclenchée dans tous les autres cas au bloc conditionnel.", + "IOS_OK": "OK", + "IOS_CANCEL": "Annuler", + "IOS_ERROR": "Erreur", + "IOS_PROCEDURES_INPUTS": "ENTRÉES", + "IOS_PROCEDURES_ADD_INPUT": "+ Ajouter une entrée", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Instructions autorisées", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Cette fonction a des entrées dupliquées.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Ajouter une variable", + "IOS_VARIABLES_ADD_BUTTON": "Ajouter", + "IOS_VARIABLES_RENAME_BUTTON": "Renommer", + "IOS_VARIABLES_DELETE_BUTTON": "Supprimer", + "IOS_VARIABLES_VARIABLE_NAME": "Nom de la variable", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Vous ne pouvez pas utiliser un nom de variable vide.", + "LOGIC_COMPARE_HELPURL": "https://fr.wikipedia.org/wiki/In%C3%A9galit%C3%A9_(math%C3%A9matiques)", + "LOGIC_COMPARE_TOOLTIP_EQ": "Renvoyer vrai si les deux entrées sont égales.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Renvoyer vrai si les deux entrées sont différentes.", + "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 true si la première entrée est supérieure 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": "non %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 indiquée dans « test ». Si elle est vraie, renvoie la valeur « si vrai » ; sinon renvoie la valeur « si faux ».", + "MATH_NUMBER_HELPURL": "https://fr.wikipedia.org/wiki/Nombre", + "MATH_NUMBER_TOOLTIP": "Un nombre.", + "MATH_ARITHMETIC_HELPURL": "https://fr.wikipedia.org/wiki/Arithm%C3%A9tique", + "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://fr.wikipedia.org/wiki/Racine_carr%C3%A9e", + "MATH_SINGLE_OP_ROOT": "racine carrée", + "MATH_SINGLE_TOOLTIP_ROOT": "Renvoie la racine carrée d’un nombre.", + "MATH_SINGLE_OP_ABSOLUTE": "valeur absolue", + "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 décimal 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://fr.wikipedia.org/wiki/Fonction_trigonom%C3%A9trique", + "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://fr.wikipedia.org/wiki/Table_de_constantes_math%C3%A9matiques", + "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://fr.wikipedia.org/wiki/Idiome_de_programmation", + "MATH_CHANGE_TITLE": "incrémenter %1 de %2", + "MATH_CHANGE_TOOLTIP": "Ajouter un nombre à la variable « %1 ».", + "MATH_ROUND_HELPURL": "https://fr.wikipedia.org/wiki/Arrondi_(math%C3%A9matiques)", + "MATH_ROUND_TOOLTIP": "Arrondir un nombre au-dessus ou au-dessous.", + "MATH_ROUND_OPERATOR_ROUND": "arrondir", + "MATH_ROUND_OPERATOR_ROUNDUP": "arrondir par excès (à l’entier supérieur le plus proche)", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "arrondir par défaut (à l’entier inférieur le plus proche)", + "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 de la liste.", + "MATH_ONLIST_OPERATOR_MODE": "majoritaires de la liste", + "MATH_ONLIST_TOOLTIP_MODE": "Renvoyer une liste d’un ou plusieurs éléments les plus fréquents 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 au hasard dans la liste.", + "MATH_MODULO_HELPURL": "https://fr.wikipedia.org/wiki/Modulo_(op%C3%A9ration)", + "MATH_MODULO_TITLE": "reste de %1 ÷ %2", + "MATH_MODULO_TOOLTIP": "Renvoyer le reste de la division euclidienne des deux nombres.", + "MATH_CONSTRAIN_TITLE": "contraindre %1 entre %2 et %3", + "MATH_CONSTRAIN_TOOLTIP": "Contraindre un nombre à rester entre les limites spécifiées (incluses).", + "MATH_RANDOM_INT_HELPURL": "https://fr.wikipedia.org/wiki/G%C3%A9n%C3%A9rateur_de_nombres_al%C3%A9atoires", + "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://fr.wikipedia.org/wiki/G%C3%A9n%C3%A9rateur_de_nombres_al%C3%A9atoires", + "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).", + "MATH_ATAN2_HELPURL": "https://fr.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 de (X : %1 ; Y : %2)", + "MATH_ATAN2_TOOLTIP": "Renvoie l’arc-tangente du point (X, Y) en degrés entre -180 et 180.", + "TEXT_TEXT_HELPURL": "https://fr.wikipedia.org/wiki/Cha%C3%AEne_de_caract%C3%A8res", + "TEXT_TEXT_TOOLTIP": "Une lettre, un mot ou une ligne de texte.", + "TEXT_JOIN_TITLE_CREATEWITH": "créer un texte avec", + "TEXT_JOIN_TOOLTIP": "Créer un morceau de texte en joignant bout à bout et successivement un nombre quelconque d’éléments dans le même ordre.", + "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_TITLE": "ajouter le texte %2 à %1", + "TEXT_APPEND_TOOLTIP": "Ajouter du texte à la variable « %1 ».", + "TEXT_LENGTH_TITLE": "longueur de %1", + "TEXT_LENGTH_TOOLTIP": "Renvoie le nombre de lettres (chiffres, ponctuations, symboles et 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 %1 si la chaîne n’est pas trouvée.", + "TEXT_INDEXOF_TITLE": "%2 %3 dans le texte %1", + "TEXT_INDEXOF_OPERATOR_FIRST": "trouver la première occurrence de la chaîne", + "TEXT_INDEXOF_OPERATOR_LAST": "trouver la dernière occurrence du texte", + "TEXT_CHARAT_TITLE": "%2 dans le texte %1", + "TEXT_CHARAT_FROM_START": "obtenir la lettre nº", + "TEXT_CHARAT_FROM_END": "obtenir la lettre nº (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 nº", + "TEXT_GET_SUBSTRING_START_FROM_END": "obtenir la sous-chaîne depuis la lettre nº (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 nº", + "TEXT_GET_SUBSTRING_END_FROM_END": "jusqu’à la lettre nº (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 Capitale Initiale Pour Chaque Mot", + "TEXT_TRIM_TOOLTIP": "Renvoyer une copie du texte avec les espaces supprimés d’un ou des deux bouts.", + "TEXT_TRIM_OPERATOR_BOTH": "supprimer les espaces des deux côtés de", + "TEXT_TRIM_OPERATOR_LEFT": "supprimer les espaces du côté gauche de", + "TEXT_TRIM_OPERATOR_RIGHT": "supprimer les espaces du côté droit de", + "TEXT_PRINT_TITLE": "afficher %1", + "TEXT_PRINT_TOOLTIP": "Afficher le texte, le nombre ou une autre valeur spécifiée.", + "TEXT_PROMPT_TYPE_TEXT": "demander un texte avec un message", + "TEXT_PROMPT_TYPE_NUMBER": "demander un nombre avec un message", + "TEXT_PROMPT_TOOLTIP_NUMBER": "Demander un nombre à l’utilisateur.", + "TEXT_PROMPT_TOOLTIP_TEXT": "Demander un texte à l’utilisateur.", + "TEXT_COUNT_MESSAGE0": "nombre %1 sur %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Compter combien de fois un texte donné apparaît dans un autre.", + "TEXT_REPLACE_MESSAGE0": "remplacer %1 par %2 dans %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "Remplacer toutes les occurrences d’un texte par un autre.", + "TEXT_REVERSE_MESSAGE0": "renverser %1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "Renverse l’ordre des caractères dans le texte.", + "LISTS_CREATE_EMPTY_TITLE": "créer une liste vide", + "LISTS_CREATE_EMPTY_TOOLTIP": "Renvoyer une liste, de longueur 0, ne contenant aucun enregistrement de données", + "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 %1 si l’élément n’est pas trouvé.", + "LISTS_GET_INDEX_GET": "obtenir", + "LISTS_GET_INDEX_GET_REMOVE": "obtenir et supprimer", + "LISTS_GET_INDEX_REMOVE": "supprimer", + "LISTS_GET_INDEX_FROM_END": "n° depuis la fin", + "LISTS_GET_INDEX_FIRST": "premier", + "LISTS_GET_INDEX_LAST": "dernier", + "LISTS_GET_INDEX_RANDOM": "aléatoire", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 est le premier élément.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 est le dernier élément.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Renvoie l’élément à la position indiquée dans une liste.", + "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": "Supprime et renvoie l’élément à la position indiquée dans une liste.", + "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": "Supprime l’élément à la position indiquée dans une liste.", + "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": "Définit l’élément à la position indiquée dans une liste.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Définit le premier élément dans une liste.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Définit le dernier élément dans une liste.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Définit un élément au hasard dans une liste.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Insère l’élément à la position indiquée dans une liste.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Insère l’élément au début d’une liste.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Ajoute 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 le n°", + "LISTS_GET_SUBLIST_START_FROM_END": "obtenir la sous-liste depuis le n° depuis la fin", + "LISTS_GET_SUBLIST_START_FIRST": "obtenir la sous-liste depuis le début", + "LISTS_GET_SUBLIST_END_FROM_START": "jusqu’au n°", + "LISTS_GET_SUBLIST_END_FROM_END": "jusqu’au n° 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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "trier %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Trier une copie d’une liste.", + "LISTS_SORT_ORDER_ASCENDING": "croissant", + "LISTS_SORT_ORDER_DESCENDING": "décroissant", + "LISTS_SORT_TYPE_NUMERIC": "numérique", + "LISTS_SORT_TYPE_TEXT": "alphabétique", + "LISTS_SORT_TYPE_IGNORECASE": "alphabétique, en ignorant la casse", + "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 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 joignant par un séparateur.", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "inverser %1", + "LISTS_REVERSE_TOOLTIP": "Inverser la copie d’une liste.", + "VARIABLES_GET_TOOLTIP": "Renvoie la valeur de cette variable.", + "VARIABLES_GET_CREATE_SET": "Créer « définir %1 »", + "VARIABLES_SET": "définir %1 à %2", + "VARIABLES_SET_TOOLTIP": "Définit cette variable pour qu’elle soit égale à la valeur de l’entrée.", + "VARIABLES_SET_CREATE_GET": "Créer « obtenir %1 »", + "PROCEDURES_DEFNORETURN_TITLE": "pour", + "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_DEFNORETURN_COMMENT": "Décrivez cette fonction...", + "PROCEDURES_DEFRETURN_RETURN": "retourner", + "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": "https://fr.wikipedia.org/wiki/Sous-programme", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Exécuter la fonction « %1 » définie par l’utilisateur.", + "PROCEDURES_CALLRETURN_HELPURL": "https://fr.wikipedia.org/wiki/Sous-programme", + "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_HELPURL": "http://c2.com/cgi/wiki?GuardClause", + "PROCEDURES_IFRETURN_WARNING": "Attention : ce bloc pourrait n’être utilisé que dans une définition de fonction.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Expliquez quelque chose...", + "WORKSPACE_ARIA_LABEL": "Espace de travail de Blocky", + "COLLAPSED_WARNINGS_WARNING": "Les blocs repliés contiennent des avertissements." +} diff --git a/js/msg/json/gl.json b/js/msg/json/gl.json new file mode 100644 index 0000000..7fc26dd --- /dev/null +++ b/js/msg/json/gl.json @@ -0,0 +1,154 @@ +{ + "@metadata": { + "authors": [ + "Chairego apc", + "Elisardojm", + "Macofe", + "Navhy", + "Toliño", + "Iváns" + ] + }, + "VARIABLES_DEFAULT_NAME": "elemento", + "TODAY": "Hoxe", + "DUPLICATE_BLOCK": "Duplicar", + "ADD_COMMENT": "Engadir un comentario", + "REMOVE_COMMENT": "Eliminar o comentario", + "EXTERNAL_INPUTS": "Entradas externas", + "INLINE_INPUTS": "Entradas en liña", + "DELETE_BLOCK": "Borrar o bloque", + "DELETE_X_BLOCKS": "Borrar %1 bloques", + "DELETE_ALL_BLOCKS": "Queres eliminar os %1 bloques?", + "CLEAN_UP": "Limpar os bloques", + "COLLAPSE_BLOCK": "Contraer o bloque", + "COLLAPSE_ALL": "Contraer os bloques", + "EXPAND_BLOCK": "Expandir o bloque", + "EXPAND_ALL": "Expandir os bloques", + "DISABLE_BLOCK": "Desactivar o bloque", + "ENABLE_BLOCK": "Activar o bloque", + "HELP": "Axuda", + "UNDO": "Desfacer", + "REDO": "Refacer", + "CHANGE_VALUE_TITLE": "Cambiar o valor:", + "RENAME_VARIABLE": "Renomear a variable...", + "RENAME_VARIABLE_TITLE": "Renomear todas as variables \"%1\" a:", + "NEW_VARIABLE": "Crear a variable...", + "NEW_VARIABLE_TITLE": "Nome da nova variable:", + "COLOUR_PICKER_HELPURL": "https://gl.wikipedia.org/wiki/Cor", + "COLOUR_PICKER_TOOLTIP": "Escolle unha cor da paleta.", + "COLOUR_RANDOM_TITLE": "cor ó chou", + "COLOUR_RANDOM_TOOLTIP": "Escolle unha cor ao chou.", + "COLOUR_RGB_TITLE": "colorar con", + "COLOUR_RGB_RED": "vermello", + "COLOUR_RGB_GREEN": "verde", + "COLOUR_RGB_BLUE": "azul", + "COLOUR_BLEND_TITLE": "mesturar", + "COLOUR_BLEND_COLOUR1": "cor 1", + "COLOUR_BLEND_COLOUR2": "cor 2", + "COLOUR_BLEND_RATIO": "proporción", + "COLOUR_BLEND_TOOLTIP": "Mestura dúas cores ca proporción indicada (0.0 - 1.0).", + "CONTROLS_REPEAT_INPUT_DO": "facer", + "CONTROLS_REPEAT_TOOLTIP": "Faga algunhas instrucións varias veces.", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "repetir mentres", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "repetir ata", + "CONTROLS_IF_MSG_IF": "se", + "CONTROLS_IF_MSG_ELSEIF": "mais se", + "CONTROLS_IF_MSG_ELSE": "senón", + "IOS_OK": "Feito", + "IOS_CANCEL": "Cancelar", + "IOS_ERROR": "Erro", + "IOS_PROCEDURES_INPUTS": "ENTRADAS", + "IOS_PROCEDURES_ADD_INPUT": "+ Engadir entrada", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Permitir declaracións", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Esta función ten entradas duplicadas.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Engadir variábel", + "IOS_VARIABLES_ADD_BUTTON": "Engadir", + "IOS_VARIABLES_RENAME_BUTTON": "Renomear", + "IOS_VARIABLES_DELETE_BUTTON": "Eliminar", + "IOS_VARIABLES_VARIABLE_NAME": "Nome da variábel", + "LOGIC_OPERATION_AND": "e", + "LOGIC_OPERATION_OR": "ou", + "LOGIC_NEGATE_TITLE": "non %1", + "LOGIC_BOOLEAN_TRUE": "verdadeiro", + "LOGIC_BOOLEAN_FALSE": "falso", + "LOGIC_NULL": "nulo", + "LOGIC_NULL_TOOLTIP": "Retornar nulo.", + "LOGIC_TERNARY_CONDITION": "proba", + "LOGIC_TERNARY_IF_TRUE": "se verdadeiro", + "LOGIC_TERNARY_IF_FALSE": "se falso", + "MATH_NUMBER_TOOLTIP": "Un número.", + "MATH_ARITHMETIC_HELPURL": "https://gl.wikipedia.org/wiki/Aritmética", + "MATH_ARITHMETIC_TOOLTIP_ADD": "Retorna a suma de dous números.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "Retorna a diferenza de dous números.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Retorna o produto de dous números.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Retorna o cociente da división de dous números.", + "MATH_ARITHMETIC_TOOLTIP_POWER": "Retorna o primeiro número elevado á potencia do segundo número.", + "MATH_SINGLE_HELPURL": "https://gl.wikipedia.org/wiki/Raíz_cadrada", + "MATH_SINGLE_OP_ROOT": "raíz cadrada", + "MATH_SINGLE_TOOLTIP_ROOT": "Retorna a raíz cadrada dun número.", + "MATH_SINGLE_OP_ABSOLUTE": "absoluto", + "MATH_SINGLE_TOOLTIP_ABS": "Retorna o valor absoluto dun número.", + "MATH_SINGLE_TOOLTIP_NEG": "Retorna o oposto dun número.", + "MATH_SINGLE_TOOLTIP_LN": "Retorna o logarítmo natural dun número.", + "MATH_SINGLE_TOOLTIP_LOG10": "Retorna o logarítmo en base 10 dun número.", + "MATH_SINGLE_TOOLTIP_EXP": "Retorna o número e elevado á potencia dun número.", + "MATH_SINGLE_TOOLTIP_POW10": "Retorna 10 elevado á potencia dun número.", + "MATH_TRIG_HELPURL": "https://gl.m.wikipedia.org/wiki/Función_trigonométrica", + "MATH_TRIG_TOOLTIP_SIN": "Retorna o seno dun grao (non radiano).", + "MATH_TRIG_TOOLTIP_COS": "Retorna o coseno dun grao (non radiano).", + "MATH_TRIG_TOOLTIP_TAN": "Retorna a tanxente dun grao (non radiano).", + "MATH_TRIG_TOOLTIP_ASIN": "Retorna o arco seno dum número.", + "MATH_TRIG_TOOLTIP_ACOS": "Retorna o arco coseno dun número.", + "MATH_TRIG_TOOLTIP_ATAN": "Retorna o arco tanxente dun número.", + "MATH_CONSTANT_HELPURL": "https://gl.wikipedia.org/wiki/Constante_matemática", + "MATH_CONSTANT_TOOLTIP": "Retorna unha das constantes comúns: π (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": "é enteiro", + "MATH_IS_POSITIVE": "é positivo", + "MATH_IS_NEGATIVE": "é negativo", + "MATH_IS_DIVISIBLE_BY": "é divisíbel por", + "MATH_IS_TOOLTIP": "Verifica se un número é par, impar, primo, enteiro, positivo, negativo, ou se é divisíbel por outro número. Retorna verdadeiro ou falso.", + "MATH_CHANGE_TITLE": "mudar %1 por %2", + "MATH_CHANGE_TOOLTIP": "Suma un número á variábel '%1'.", + "MATH_ROUND_HELPURL": "https://gl.wikipedia.org/wiki/Arredondamento", + "MATH_ROUND_TOOLTIP": "Arredonda un número cara enriba ou cara abaixo.", + "MATH_ROUND_OPERATOR_ROUND": "arredonda", + "MATH_ROUND_OPERATOR_ROUNDUP": "arredonda cara arriba", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "arredonda cara abaixo", + "MATH_ONLIST_OPERATOR_SUM": "suma da listaxe", + "MATH_ONLIST_TOOLTIP_SUM": "Retorna a suma de tódolos números da listaxe.", + "MATH_ONLIST_OPERATOR_MIN": "menor dunha listaxe", + "MATH_ONLIST_TOOLTIP_MIN": "Retorna o menor número da listaxe.", + "MATH_ONLIST_OPERATOR_MAX": "maior dunha listaxe", + "MATH_ONLIST_TOOLTIP_MAX": "Retorna o maior número da listaxe", + "MATH_ONLIST_OPERATOR_AVERAGE": "media dunha listaxe", + "TEXT_CREATE_JOIN_TITLE_JOIN": "unir", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "no texto", + "TEXT_PRINT_TITLE": "imprime %1", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "listaxe", + "LISTS_ISEMPTY_TITLE": "%1 atópase baleira", + "LISTS_ISEMPTY_TOOLTIP": "Retona verdadeiro se a listaxe atópase baleira.", + "LISTS_INLIST": "na listaxe", + "LISTS_GET_INDEX_FIRST": "primeiro", + "LISTS_GET_INDEX_LAST": "derradeiro", + "LISTS_GET_INDEX_RANDOM": "ó chou", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 é o primeiro elemento.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 é o derradeiro elemento.", + "LISTS_SET_INDEX_SET": "definir", + "LISTS_SET_INDEX_INSERT": "inserir en", + "LISTS_SET_INDEX_INPUT_TO": "como", + "LISTS_SORT_TOOLTIP": "Ordear unha copia dunha listaxe.", + "LISTS_SORT_ORDER_ASCENDING": "ascendente", + "LISTS_SORT_ORDER_DESCENDING": "descendente", + "LISTS_SORT_TYPE_NUMERIC": "numérica", + "LISTS_SORT_TYPE_TEXT": "alfabética", + "LISTS_SORT_TYPE_IGNORECASE": "alfabética, iñorar maiúsculas/minúsculas", + "PROCEDURES_DEFNORETURN_TITLE": "cara", + "PROCEDURES_DEFNORETURN_PROCEDURE": "facer algo", + "PROCEDURES_BEFORE_PARAMS": "con:", + "PROCEDURES_CALL_BEFORE_PARAMS": "con:", + "PROCEDURES_DEFRETURN_RETURN": "retornar", + "PROCEDURES_MUTATORCONTAINER_TITLE": "entradas" +} diff --git a/js/msg/json/gor.json b/js/msg/json/gor.json new file mode 100644 index 0000000..214fdae --- /dev/null +++ b/js/msg/json/gor.json @@ -0,0 +1,94 @@ +{ + "@metadata": { + "authors": [ + "Lukman Tomayahu", + "Marwan Mohamad", + "Zhoelyakin", + "RFenichel" + ] + }, + "VARIABLES_DEFAULT_NAME": "item", + "TODAY": "Engontiye", + "DUPLICATE_BLOCK": "Duplikat", + "ADD_COMMENT": "Moduhenga tuladu", + "REMOVE_COMMENT": "Mohinggi tuladu", + "EXTERNAL_INPUTS": "tuwanga lonto eksternal", + "INLINE_INPUTS": "tuwanga lo inline", + "DELETE_BLOCK": "Moluluto Blok", + "DELETE_X_BLOCKS": "Moluluto %1 Blok", + "DELETE_ALL_BLOCKS": "Luluta nga'amila %1 blocks?", + "COLLAPSE_BLOCK": "Mohe'uto Blok", + "COLLAPSE_ALL": "Mohe'uto Blok", + "EXPAND_BLOCK": "Lolade Blok", + "EXPAND_ALL": "Lolade Blok", + "DISABLE_BLOCK": "Moberenti Blok", + "ENABLE_BLOCK": "Momulayi Blok", + "HELP": "Tuulungi", + "CHANGE_VALUE_TITLE": "Ubawa nilai", + "RENAME_VARIABLE": "Tangguli uulangi variabel", + "RENAME_VARIABLE_TITLE": "Tangguli uulangi nga'amila % variabel ode:", + "NEW_VARIABLE": "Variabel bohu...", + "NEW_VARIABLE_TITLE": "Tanggulo Variabel bohu", + "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Laku", + "COLOUR_PICKER_TOOLTIP": "Piliya laku lonto daputari lo laku", + "COLOUR_RANDOM_TITLE": "Laku acak", + "COLOUR_RANDOM_TOOLTIP": "Piliya laku acak", + "COLOUR_RGB_TITLE": "wolo laku", + "COLOUR_RGB_RED": "meela", + "COLOUR_RGB_GREEN": "moyidu", + "COLOUR_RGB_BLUE": "wahu'ente", + "COLOUR_RGB_TOOLTIP": "Pohutuwa laku wolo jumula u tilantu monto u meela, moyidu wawu wahu'ente. Nga'amila musi o woolota 0 wawu 100", + "COLOUR_BLEND_TITLE": "Ulawuwa", + "COLOUR_BLEND_COLOUR1": "laku 1", + "COLOUR_BLEND_COLOUR2": "laku 2", + "COLOUR_BLEND_RATIO": "rasio", + "COLOUR_BLEND_TOOLTIP": "Mongulawu dulo laku pe'eenta wolo rasio (0.0-1.0)", + "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", + "CONTROLS_REPEAT_TITLE": "ulangiya %1 kali", + "CONTROLS_REPEAT_INPUT_DO": "pohutuwa", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "Ulangiya wonu", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "ulangiya sambe", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Wonu nilai banari, pohutuwa po'ongoolo", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Wonu nilai diya banari, pohutuwa parenta", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "Mokaluwari lonto u'uulangiya", + "CONTROLS_IF_MSG_IF": "wonu", + "CONTROLS_IF_MSG_ELSEIF": "wonu uweewo", + "CONTROLS_IF_MSG_ELSE": "uweewo", + "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", + "LOGIC_OPERATION_AND": "wawu", + "LOGIC_OPERATION_OR": "meyalo", + "LOGIC_NEGATE_TITLE": "diila %1", + "LOGIC_BOOLEAN_TRUE": "banari", + "LOGIC_BOOLEAN_FALSE": "tala", + "LOGIC_NULL": "noolo", + "LOGIC_TERNARY_CONDITION": "yimontalo", + "LOGIC_TERNARY_IF_TRUE": "wonu banari", + "LOGIC_TERNARY_IF_FALSE": "wonu tala", + "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", + "MATH_NUMBER_TOOLTIP": "Noomoro", + "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", + "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", + "MATH_SINGLE_OP_ROOT": "akar pangkat dua", + "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", + "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).", + "TEXT_CREATE_JOIN_TITLE_JOIN": "wayito", + "TEXT_CREATE_JOIN_TOOLTIP": "Duhengi, yinggila, meyalo susungiya ulangi tuladu blok.", + "TEXT_LENGTH_TITLE": "haya'o lo %1", + "TEXT_ISEMPTY_TITLE": "%1 koosongi", + "TEXT_ISEMPTY_TOOLTIP": "Pohalinga banari wonu tuladu u sadi-sadia koosongi.", + "TEXT_INDEXOF_OPERATOR_FIRST": "lolohe u yilowali bohuliyo to delomo tuladu", + "TEXT_INDEXOF_OPERATOR_LAST": "lolohe u yilowali pulitiyo to delomo tuladu", + "TEXT_CHARAT_FROM_START": "hama hurupu #", + "TEXT_CHARAT_FROM_END": "hama hurupu # monto wuleya", + "TEXT_CHARAT_FIRST": "hama tulade bungaliyo", + "TEXT_CHARAT_LAST": "hama tulade pulitiyo", + "TEXT_CHARAT_RANDOM": "hama tulade ambulati", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "to delomo tuladu", + "TEXT_GET_SUBSTRING_END_FROM_START": "ode hurupu", + "TEXT_GET_SUBSTRING_END_FROM_END": "ode tuladu # monto wuleya", + "TEXT_GET_SUBSTRING_END_LAST": "to tulade pulitiyo", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "mowali HURUPU DAMANGO", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "mowali hurupu kiki'o", + "PROCEDURES_CREATE_DO": "Pohutu '%1'" +} diff --git a/js/msg/json/ha.json b/js/msg/json/ha.json new file mode 100644 index 0000000..eb1adad --- /dev/null +++ b/js/msg/json/ha.json @@ -0,0 +1,342 @@ +{ + "@metadata": { + "authors": [ + "Mapmeld" + ] + }, + "VARIABLES_DEFAULT_NAME": "waniabu", + "TODAY": "Yau", + "DUPLICATE_BLOCK": "Yi kwafi", + "ADD_COMMENT": "Daɗa Sharhi", + "REMOVE_COMMENT": "Cire Sharhi", + "DUPLICATE_COMMENT": "Kwafi Sharhi", + "EXTERNAL_INPUTS": "Bayanan Waje", + "INLINE_INPUTS": "Bayanai na Cikin layi", + "DELETE_BLOCK": "Goge Bulo", + "DELETE_X_BLOCKS": "Goge Bulo %1", + "DELETE_ALL_BLOCKS": "A goge duk bululluka %1?", + "CLEAN_UP": "A share Bululluka", + "COLLAPSE_BLOCK": "Rusa Bulo", + "COLLAPSE_ALL": "Rusa Bululluka", + "EXPAND_BLOCK": "Faɗaɗa Bulo", + "EXPAND_ALL": "Faɗaɗa Bulullaka", + "DISABLE_BLOCK": "Kashe Bulo", + "ENABLE_BLOCK": "Kunna Bulo", + "HELP": "Taimako", + "UNDO": "Fasa", + "REDO": "Sake", + "CHANGE_VALUE_TITLE": "Canza kima:", + "RENAME_VARIABLE": "Sake sunan siffa...", + "RENAME_VARIABLE_TITLE": "Sake sunnan duk siffofi '%1' zuwa:", + "NEW_VARIABLE": "Ƙirƙiri siffofi...", + "NEW_STRING_VARIABLE": "Ƙiriƙiri kalmar siffa...", + "NEW_NUMBER_VARIABLE": "Ƙirƙiri siffa ta lamba...", + "NEW_COLOUR_VARIABLE": "Ƙirƙiri siffa ta launi...", + "NEW_VARIABLE_TYPE_TITLE": "Irin sabuwar siffa:", + "NEW_VARIABLE_TITLE": "Sunan sabuwar siffa:", + "VARIABLE_ALREADY_EXISTS": "Tuni akwai sunnan siffa da aka kira '%1'.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Tuni akwai sunan siffa da aka kira '%1' domin wata iri ta: '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "A goge amfanunnukan %1 na siffar '%2'?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "An kasa goge siffa '%1' sabo da tana daga sashi na bayanin aikin '%2'", + "DELETE_VARIABLE": "A goge siffar '%1'", + "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", + "COLOUR_PICKER_TOOLTIP": "Zaɓi launi daga faifan launuka.", + "COLOUR_RANDOM_TITLE": "launuka da aka hargitsa", + "COLOUR_RANDOM_TOOLTIP": "Zaɓi launi daga wanɗanda aka hargitsa.", + "COLOUR_RGB_TITLE": "launi tare da", + "COLOUR_RGB_RED": "ja", + "COLOUR_RGB_GREEN": "kore", + "COLOUR_RGB_BLUE": "shuɗi", + "COLOUR_RGB_TOOLTIP": "Ƙirƙiri launi tare da wani yawa da aka fayyace na ja, kore, da shuɗi. Duk kimomin dole su zamo tsakanin 0 da 100.", + "COLOUR_BLEND_TITLE": "gauraya", + "COLOUR_BLEND_COLOUR1": "launi na 1", + "COLOUR_BLEND_COLOUR2": "launi na 2", + "COLOUR_BLEND_RATIO": "lissafi", + "COLOUR_BLEND_TOOLTIP": "Ana gauraya launuka biyu tare da wani lissafi da aka bayar (0.0 - 1.0).", + "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", + "CONTROLS_REPEAT_TITLE": "maimaita sau %1", + "CONTROLS_REPEAT_INPUT_DO": "yi", + "CONTROLS_REPEAT_TOOLTIP": "Yi wasu bayanai sau da dama.", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "maimaita yayin da", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "maimaita har sai", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Yayin da wata kima ta zama gaskiya, maimaita wasu lambobi.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Yayin da wata kima ta zama ƙarya, maimaita wasu lambobi.", + "CONTROLS_FOR_TOOLTIP": "Sami siffar '%1' ta ɗauki kowa ce kima daga lambar da aka fara da ita zuwa lambar da aka ƙare da ita, ana ƙirgawa daga wata tazara da aka fayyace. Maimaita wannan lamba a kowane lokaci:", + "CONTROLS_FOR_TITLE": "Ƙirga da %1 daga %2 zuwa %3 ƙara %4", + "CONTROLS_FOREACH_TITLE": "ga kowane abu %1 a cikin jeri %2", + "CONTROLS_FOREACH_TOOLTIP": "Ga kowane abu a jeri, saka siffar '%1' zuwa ga abin, sannan a maimaita wasu lambobin.", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "ɓalle daga cikin kewaye", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "fara da maimaitawa ta gaba ta kewaye", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "ɓalle daga kewaye wanda ya ƙunsa.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Tsallake sauran wannan kewaye, sannan kuma a ci gaba da maimaitawa ta gaba ta kewaye.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Gargaɗi: Wannan bulon za a iya amfani da shi ne kawai a wajen kewaye.", + "CONTROLS_IF_TOOLTIP_1": "Idan kima gaskiya ce, to a yi wasu maganganu.", + "CONTROLS_IF_TOOLTIP_2": "Idan kimar gaskiya ce, to a yi bulo na farko na maganganu. Idan ba haka ba, yi bulo na biyu na maganganu.", + "CONTROLS_IF_TOOLTIP_3": "Idan kimar farko gaskiya ce, to yi bulon farko na maganganun. In ba haka ba, idan kima ta biyu ce gaskiya, yi bolu na biyu na maganganun.", + "CONTROLS_IF_TOOLTIP_4": "Idan kimar farko gaskiya ce, to yi bulon farko na maganganun. In ba haka ba, idan kima ta biyu ce gaskiya, yi bolu na biyu na maganganun. Idan babu kimar da take gaskiya, yi bulo na ƙarshe na maganganun.", + "CONTROLS_IF_MSG_IF": "idan", + "CONTROLS_IF_MSG_ELSEIF": "wani idan", + "CONTROLS_IF_MSG_ELSE": "wani", + "CONTROLS_IF_IF_TOOLTIP": "Daɗa, cire, ko sake tsarin ɓangarori domin sake fasalin wannan idan bulo.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Daɗa sharaɗi zuwa idan bulo.", + "CONTROLS_IF_ELSE_TOOLTIP": "Daɗa na ƙarshe, sharaɗin kama-duk zuwa idan bulo.", + "IOS_OK": "TO", + "IOS_CANCEL": "Soke", + "IOS_ERROR": "Kuskure", + "IOS_PROCEDURES_INPUTS": "BAYANAI", + "IOS_PROCEDURES_ADD_INPUT": "+ Daɗa Bayani", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Bar lamba", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Wannan aikin yana da kwafin bayanai.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Daɗa Siffa", + "IOS_VARIABLES_ADD_BUTTON": "Daɗa", + "IOS_VARIABLES_RENAME_BUTTON": "Sake suna", + "IOS_VARIABLES_DELETE_BUTTON": "Goge", + "IOS_VARIABLES_VARIABLE_NAME": "Sunan siffa", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Ba za ka iya amfani da sunann siffa wanda ba komai ba.", + "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", + "LOGIC_COMPARE_TOOLTIP_EQ": "Koma gaskiya idan duk bayanan sun yi dai dai da juna.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Koma gaskiya idan duk bayanan ba su yi dai dai da juna ba.", + "LOGIC_COMPARE_TOOLTIP_LT": "Koma gaskiya idan bayanin farko ya fi na biyu ƙanƙanta.", + "LOGIC_COMPARE_TOOLTIP_LTE": "Koma gaskiya idan bayanin farko ya fi ƙanƙanta ko dai dai da bayani na biyu.", + "LOGIC_COMPARE_TOOLTIP_GT": "Koma gaskiya idan bayanin farko ya fi bayani na biyu yawa.", + "LOGIC_COMPARE_TOOLTIP_GTE": "Koma gaskiya idan bayanin farko ya fi ko ya yi dai dai da bayani na biyu.", + "LOGIC_OPERATION_TOOLTIP_AND": "Koma gaskiya idan duk bayanan gaskiya ne.", + "LOGIC_OPERATION_AND": "kuma", + "LOGIC_OPERATION_TOOLTIP_OR": "Koma gaskiya idan a ƙalla ɗayan bayanan gaskiya ne.", + "LOGIC_OPERATION_OR": "ko", + "LOGIC_NEGATE_TITLE": "ba %1", + "LOGIC_NEGATE_TOOLTIP": "Koma gaskiya idan bayanin ƙarya ne. Koma ƙarya idan bayanin gaskiya ne.", + "LOGIC_BOOLEAN_TRUE": "gaskiya", + "LOGIC_BOOLEAN_FALSE": "ƙarya", + "LOGIC_BOOLEAN_TOOLTIP": "Ya koma kodai gaskiya ko ƙarya.", + "LOGIC_NULL": "maras amfani", + "LOGIC_NULL_TOOLTIP": "Ya koma maras amfani.", + "LOGIC_TERNARY_CONDITION": "gwaji", + "LOGIC_TERNARY_IF_TRUE": "idan gaskiya ne", + "LOGIC_TERNARY_IF_FALSE": "idan ƙarya ne", + "LOGIC_TERNARY_TOOLTIP": "Duba sharaɗin a cikin 'gwaji'. Idan sharaɗin gaskiya ne, mayar da kimar 'idan gaskiya ne'; idan ba haka ba mayar da kimar 'idan ƙarya ne'.", + "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", + "MATH_NUMBER_TOOLTIP": "Lambda.", + "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", + "MATH_ARITHMETIC_TOOLTIP_ADD": "Dawo da jumlar lambobin guda biyu.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "Dawo da bambancin lambobin guda biyu.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Dawo da ruɓin lambobin guda biyu.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Dawo da sakamakon lambobin guda biyu bayan an raba su da juna.", + "MATH_ARITHMETIC_TOOLTIP_POWER": "Dawo da lambar farko wadda aka ɗaga ta zuwa ƙarfin lamba ta biyu.", + "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", + "MATH_SINGLE_OP_ROOT": "lamba da ta ruɓanya kanta", + "MATH_SINGLE_TOOLTIP_ROOT": "Dawo da wata lamba da ta ruɓanya kanta.", + "MATH_SINGLE_OP_ABSOLUTE": "cikakkiya", + "MATH_SINGLE_TOOLTIP_ABS": "Dawo da cikakkiyar kima na wata lamba.", + "MATH_SINGLE_TOOLTIP_NEG": "Dawo da kishiya na wata lamba.", + "MATH_SINGLE_TOOLTIP_LN": "Dawo da jerin lambobi da aka tara ko aka ɗebe.", + "MATH_SINGLE_TOOLTIP_LOG10": "Dawo da tushe 10 na jerin lambobi da aka tara ko aka ɗebe na wata lamba.", + "MATH_SINGLE_TOOLTIP_EXP": "Dawo da e zuwa ƙarfin wata lamba.", + "MATH_SINGLE_TOOLTIP_POW10": "Dawo da 10 zuwa ƙarfin wata lamba.", + "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", + "MATH_TRIG_TOOLTIP_SIN": "Dawo da sine na wani gwargwado (banda layin kusurwar waje).", + "MATH_TRIG_TOOLTIP_COS": "Dawo da cosine na wani gwargwado (banda layin kusurwar waje).", + "MATH_TRIG_TOOLTIP_TAN": "Dawo da tangent na wani gwargwado (banda layin kusurwar waje).", + "MATH_TRIG_TOOLTIP_ASIN": "Dawo da arcsine na wata lamba.", + "MATH_TRIG_TOOLTIP_ACOS": "Dawo da arccosine na wata lamba.", + "MATH_TRIG_TOOLTIP_ATAN": "Dawo da arctangent na wata lamba.", + "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", + "MATH_CONSTANT_TOOLTIP": "Dawo da ɗaya daga cikin sanannen zaunannen lissafi: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), ko ∞ (maras iyaka).", + "MATH_IS_EVEN": "lamba da za a iya rabawa da biyu", + "MATH_IS_ODD": "lamba ce da ba za a iya rabawa da biyu ba", + "MATH_IS_PRIME": "lamba ce da kawai za a iya rabawa da kanta", + "MATH_IS_WHOLE": "lamba ce cikakkiya", + "MATH_IS_POSITIVE": "lamba ce da tafi sufuli", + "MATH_IS_NEGATIVE": "lamba ce da bata kai sufuli ba", + "MATH_IS_DIVISIBLE_BY": "lamba ce da za a iya rabawa da", + "MATH_IS_TOOLTIP": "Duba idan lamba ce da za a iya rabawa da biyu, lamba wadda ba za a iya rabawa da biyu ba, lamba ce kawai da za a iya rabawa da kanta, lamba ce cikakkiya,lamba ce da tafi sufuli, lamba ce da bata kai sufuli ba, lamba ce da za a iya rabawa da wata lamba. Ta dawo da gaskiya ko ƙarya.", + "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", + "MATH_CHANGE_TITLE": "canza %1 da %2", + "MATH_CHANGE_TOOLTIP": "Daɗa wata lamba zuwa siffa '%1'.", + "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", + "MATH_ROUND_TOOLTIP": "Cika lamba sama ko ƙasa.", + "MATH_ROUND_OPERATOR_ROUND": "cika", + "MATH_ROUND_OPERATOR_ROUNDUP": "cika sama", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "cika ƙasa", + "MATH_ONLIST_OPERATOR_SUM": "jumlar jeri", + "MATH_ONLIST_TOOLTIP_SUM": "Dawo da jumlar duk lambobi na cikin jerin.", + "MATH_ONLIST_OPERATOR_MIN": "Taƙaicewa na jeri", + "MATH_ONLIST_TOOLTIP_MIN": "Dawo da lambobi ƙanana a cikin jerin.", + "MATH_ONLIST_OPERATOR_MAX": "cikakke na jeri", + "MATH_ONLIST_TOOLTIP_MAX": "Dawo da babbar lamba dake cikin jerin.", + "MATH_ONLIST_OPERATOR_AVERAGE": "Tsaka-tsaki na jeri", + "MATH_ONLIST_TOOLTIP_AVERAGE": "Dawo da tsaka-tsaki (matsakaicin lissafi) na kimar lambobi dake cikin jerin.", + "MATH_ONLIST_OPERATOR_MEDIAN": "tsakiyar jeri", + "MATH_ONLIST_TOOLTIP_MEDIAN": "Dawo da lambar tsakiya ta cikin jeri.", + "MATH_ONLIST_OPERATOR_MODE": "mai yawan bayyana na jeri", + "MATH_ONLIST_TOOLTIP_MODE": "Dawo da jeri na abubuwan da suka fi bayyana a cikin jeri.", + "MATH_ONLIST_OPERATOR_STD_DEV": "matakan bambance-bambance na jeri", + "MATH_ONLIST_TOOLTIP_STD_DEV": "Dawo da matakan bambance-bambance na jeri.", + "MATH_ONLIST_OPERATOR_RANDOM": "bazuwar kaya na jeri", + "MATH_ONLIST_TOOLTIP_RANDOM": "Dawo da bazuwar kaya daga jerin.", + "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", + "MATH_MODULO_TITLE": "saura daga raba %1 ÷ %2", + "MATH_MODULO_TOOLTIP": "Dawo da saura daga raba lambobin guda biyu.", + "MATH_CONSTRAIN_TITLE": "ƙarfi %1 ƙasa %2 sama %3", + "MATH_CONSTRAIN_TOOLTIP": "Tsare lamba tsakanin lambobi da aka fayyace masu ƙarama da babbar kima (haɗawa).", + "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_INT_TITLE": "bazuwar cikakkiyar lamba daga %1 zuwa %2", + "MATH_RANDOM_INT_TOOLTIP": "Dawo da bazuwar cikakkiyar lamba tsakanin wani gwargwado da aka fayyace, haɗawa.", + "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "ɓangare mai buzuwa", + "MATH_RANDOM_FLOAT_TOOLTIP": "Dawo da ɓangare mai bazuwa tsakanin 0.0 (haɗawa) da 1.0 (rabewa).", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 na X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "Dawo da arctangent na tsinin (X, Y) a gwargwado daga -180 zuwa 180.", + "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", + "TEXT_TEXT_TOOLTIP": "Harafi, kalma, ko layi na rubutu.", + "TEXT_JOIN_TITLE_CREATEWITH": "ƙirƙiri rubutu da", + "TEXT_JOIN_TOOLTIP": "Ƙirƙiri guntun rubutu ta haɗa kowace lamba ta kayayyaki.", + "TEXT_CREATE_JOIN_TITLE_JOIN": "haɗa", + "TEXT_CREATE_JOIN_TOOLTIP": "Daɗa, cire, ko sake tsarin ɓangarori domin sake fasalin wannan bulo na rubutu.", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Daɗa wani kaya zuwa ga rubutun.", + "TEXT_APPEND_TITLE": "zuwa %1 daɗa rubutu %2", + "TEXT_APPEND_TOOLTIP": "Daɗa wani rubutu zuwa siffa ta '%1'.", + "TEXT_LENGTH_TITLE": "tsawon %1", + "TEXT_LENGTH_TOOLTIP": "Ya dawo lamba ta haruffa (da ya haɗa da sarari) a cikin rubutun da aka bayar.", + "TEXT_ISEMPTY_TITLE": "%1 babu komai", + "TEXT_ISEMPTY_TOOLTIP": "Ya dawo gaskiya idan rubutun da aka bayar babu komai.", + "TEXT_INDEXOF_TOOLTIP": "nemo a cikin rubutu. Returns %1 if text is not found.", + "TEXT_INDEXOF_TITLE": "ta rubutu %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "nemo afkuwar farko ta rubutu", + "TEXT_INDEXOF_OPERATOR_LAST": "nemo afkuwar ƙarshe ta rubutu", + "TEXT_CHARAT_TITLE": "ta rubutu %1 %2", + "TEXT_CHARAT_FROM_START": "sami harafin #", + "TEXT_CHARAT_FROM_END": "sami harafin # daga ƙarshe", + "TEXT_CHARAT_FIRST": "sami harafin farko", + "TEXT_CHARAT_LAST": "sami harafin ƙarshe", + "TEXT_CHARAT_RANDOM": "sami harafi mai bazuwa", + "TEXT_CHARAT_TOOLTIP": "Ya dawo da harafi a gurbi da aka fayyace.", + "TEXT_GET_SUBSTRING_TOOLTIP": "Ya dawo da ɓangaren rubutu da aka fayyace.", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "ta rubutu", + "TEXT_GET_SUBSTRING_START_FROM_START": "sami sashin jumla daga harafin #", + "TEXT_GET_SUBSTRING_START_FROM_END": "sami sashin jumla daga harafin # daga ƙarshe", + "TEXT_GET_SUBSTRING_START_FIRST": "sami sashin jumla daga harafin farko", + "TEXT_GET_SUBSTRING_END_FROM_START": "zuwa harafin #", + "TEXT_GET_SUBSTRING_END_FROM_END": "zuwa harafin # daga ƙarshe", + "TEXT_GET_SUBSTRING_END_LAST": "zuwa harafi na ƙarshe", + "TEXT_CHANGECASE_TOOLTIP": "Return a copy of the text in a different case.", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "zuwa MANYAN BAƘAƘE", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "zuwa ƙananan baƙaƙe", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "zuwa Baƙaƙe Dake nuna Suna", + "TEXT_TRIM_TOOLTIP": "Dawo da kwafin rubutu tare da sauran sarari da aka cire daga ƙarshe ɗaya ko biyu.", + "TEXT_TRIM_OPERATOR_BOTH": "datse sarari daga ɓangarori guda biyu na", + "TEXT_TRIM_OPERATOR_LEFT": "datse sarari daga ɓangaren hagu na", + "TEXT_TRIM_OPERATOR_RIGHT": "datse sarari daga ɓangaren dama na", + "TEXT_PRINT_TITLE": "buga %1", + "TEXT_PRINT_TOOLTIP": "Buga rubutun da aka fayyace, lamba ko wata kima.", + "TEXT_PROMPT_TYPE_TEXT": "samo rubutu tare da saƙo", + "TEXT_PROMPT_TYPE_NUMBER": "samo lamba tare da saƙo", + "TEXT_PROMPT_TOOLTIP_NUMBER": "Samo wani mai amfani domin wata lamba.", + "TEXT_PROMPT_TOOLTIP_TEXT": "Samo wani mai amfani domin wani rubutu.", + "TEXT_COUNT_MESSAGE0": "ƙirga %1 a cikin %2", + "TEXT_COUNT_TOOLTIP": "Ƙirga sau nawa wani rubutu ya afku a cikin sauran wasu rubutu.", + "TEXT_REPLACE_MESSAGE0": "maye gurbin %1 da %2 a cikin %3", + "TEXT_REPLACE_TOOLTIP": "Maye gurbin duk afkuwa na wani rubutu a cikin wasu rubutu.", + "TEXT_REVERSE_MESSAGE0": "juya %1", + "TEXT_REVERSE_TOOLTIP": "Ya juya tsari na haruffa a cikin rubutu.", + "LISTS_CREATE_EMPTY_TITLE": "ƙirƙiri jeri wanda babu komai", + "LISTS_CREATE_EMPTY_TOOLTIP": "Ya dawo da jeri, na tsawon 0, wanda bai ƙunshi ajiye bayanai ba", + "LISTS_CREATE_WITH_TOOLTIP": "Ƙiƙiri jeri tare da kowace lamba na kayayyaki.", + "LISTS_CREATE_WITH_INPUT_WITH": "ƙirƙiri jeri", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "jeri", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Daɗa, cire, ko sake tsarin ɓangarori domin sake fasalin wannan bulo.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Daɗa wani kaya zuwa jerin.", + "LISTS_REPEAT_TOOLTIP": "Ya ƙirƙiri jeri da ya ƙunshi wata kima da aka bayar da aka maimaita yawan lambar da aka fayyace.", + "LISTS_REPEAT_TITLE": "ƙirƙiri jeri tare da wani abu %1 da aka maimaita sau %2", + "LISTS_LENGTH_TITLE": "tsawo na %1", + "LISTS_LENGTH_TOOLTIP": "Ya dawo da tsawon wani jeri.", + "LISTS_ISEMPTY_TITLE": "%1 babu komai", + "LISTS_ISEMPTY_TOOLTIP": "Ya dawo gaskiya idan jerin babu komai.", + "LISTS_INLIST": "a jeri", + "LISTS_INDEX_OF_FIRST": "nemo afkuwar farko daga wani abu", + "LISTS_INDEX_OF_LAST": "nemo afkuwar ƙarshe daga wani abu", + "LISTS_INDEX_OF_TOOLTIP": "Ya dawo da jeri na farkon/ƙarshen afkuwa na wani abu a cikin jerin. Ya dawo da %1 idan ba a sami wani abin ba.", + "LISTS_GET_INDEX_GET": "samowa", + "LISTS_GET_INDEX_GET_REMOVE": "samowa da cirewa", + "LISTS_GET_INDEX_REMOVE": "cire", + "LISTS_GET_INDEX_FROM_END": "# daga ƙarshe", + "LISTS_GET_INDEX_FIRST": "farko", + "LISTS_GET_INDEX_LAST": "ƙarshe", + "LISTS_GET_INDEX_RANDOM": "bazuwa", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 shine wani abu na farko.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 shine wani abu na ƙarshe.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Ya dawo da abin a wani gurbi da aka fayyace a cikin jeri.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Ya dawo da wani abu na farko a cikin jeri.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Ya dawo da wani abu na ƙarshe a cikin jeri.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Ya dawo da wani abu a cikin jeri.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Ya cire kuma ya dawo da abin a gurbin da aka fayyace a cikin jeri.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Ya cire kuma ya dawo da abin farko a cikin jeri.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Ya cire kuma ya dawo da abin ƙarshe a cikin jeri.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Ya cire kuma ya dawo abu mai bazuwa a cikin jeri.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Ya cire wani abin a wani gurbi da aka fayyace a cikin jeri.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Ya cire abin farko a cikin jeri.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Ya cire abin ƙarshe a cikin jeri.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Ya cire abu mai bazuwa a cikin jeri.", + "LISTS_SET_INDEX_SET": "shirya", + "LISTS_SET_INDEX_INSERT": "cusa a", + "LISTS_SET_INDEX_INPUT_TO": "a matsayin", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Ya shirya wani abin a wani gurbi da aka fayyace a cikin jeri.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Ya shirya abin farko a cikin jeri.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Ya shirya abin ƙarshe a cikin jeri.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Ya shirya abu mai bazuwa a cikin jeri.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Ya cusa wani abin a wani gurbi da aka fayyace a cikin jeri.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Ya cusa wani abin a farko na jeri.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Ya maƙala wani abin a ƙarshe na jeri.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Cusa wani abu ta hanyar bazawa a cikin jeri.", + "LISTS_GET_SUBLIST_START_FROM_START": "sami sashin jeri daga #", + "LISTS_GET_SUBLIST_START_FROM_END": "sami sashin jeri daga # daga ƙarshe", + "LISTS_GET_SUBLIST_START_FIRST": "sami sashin jeri daga farko", + "LISTS_GET_SUBLIST_END_FROM_START": "zuwa #", + "LISTS_GET_SUBLIST_END_FROM_END": "zuwa # daga ƙarshe", + "LISTS_GET_SUBLIST_END_LAST": "zuwa ƙarshe", + "LISTS_GET_SUBLIST_TOOLTIP": "Ƙirƙiri kwafi na ɓangaren da aka fayyace daga wani jeri.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "ware %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Ware kwafi na jeri.", + "LISTS_SORT_ORDER_ASCENDING": "hawa", + "LISTS_SORT_ORDER_DESCENDING": "sauka", + "LISTS_SORT_TYPE_NUMERIC": "na lamba", + "LISTS_SORT_TYPE_TEXT": "na haruffa", + "LISTS_SORT_TYPE_IGNORECASE": "na haruffa, a=A", + "LISTS_SPLIT_LIST_FROM_TEXT": "yi jeri daga rubutu", + "LISTS_SPLIT_TEXT_FROM_LIST": "yi rubutu daga jeri", + "LISTS_SPLIT_WITH_DELIMITER": "tare da mai raba kalmomi", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Tsaga rubutu zuwa jerin rubututtuka, a karya a kowane mai raba kalmomi.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Haɗa jerin rubututtuka zuwa rubutu guda ɗaya, a raba tare da mai raba rubutu.", + "LISTS_REVERSE_MESSAGE0": "juya %1", + "LISTS_REVERSE_TOOLTIP": "Sauya tsarin kwafi daga jeri.", + "VARIABLES_GET_TOOLTIP": "Ya dawo da kima na wannan siffa.", + "VARIABLES_GET_CREATE_SET": "Ƙirƙiri 'set %1'", + "VARIABLES_SET": "saita %1 zuwa %2", + "VARIABLES_SET_TOOLTIP": "Ya saita wannan siffa ta zama dai dai da bayanin.", + "VARIABLES_SET_CREATE_GET": "Ƙirƙiri 'get %1'", + "PROCEDURES_DEFNORETURN_TITLE": "da", + "PROCEDURES_DEFNORETURN_PROCEDURE": "yi", + "PROCEDURES_BEFORE_PARAMS": "tare da:", + "PROCEDURES_CALL_BEFORE_PARAMS": "tare da:", + "PROCEDURES_DEFNORETURN_TOOLTIP": "Ya ƙirƙiri wani aiki ba tare da sakamako ba.", + "PROCEDURES_DEFNORETURN_COMMENT": "Kwatanta wannan aiki...", + "PROCEDURES_DEFRETURN_RETURN": "mayar", + "PROCEDURES_DEFRETURN_TOOLTIP": "Ya ƙirƙiri wani aiki ba tare da wani sakamako ba.", + "PROCEDURES_ALLOW_STATEMENTS": "ƙyale bayanai", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Gardaɗi: Wannan aikin yana da ruɓi na gazawa.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Gudanar da aiki '%1' wanda mai amfani ya ayyana.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLRETURN_TOOLTIP": "Gudanar da aiki '%1' kuma a yi amfani da sakamakon sa.", + "PROCEDURES_MUTATORCONTAINER_TITLE": "bayani", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Daɗa, cire, ko sake tsarin bayani na wannan aiki.", + "PROCEDURES_MUTATORARG_TITLE": "saka suna:", + "PROCEDURES_MUTATORARG_TOOLTIP": "Daɗa wani bayani ga aikin.", + "PROCEDURES_HIGHLIGHT_DEF": "Bayar da haske na bayanin aiki", + "PROCEDURES_CREATE_DO": "Ƙirƙiri '%1'", + "PROCEDURES_IFRETURN_TOOLTIP": "Idan wata kima gaskiya ce, to dawo da kima ta biyu.", + "PROCEDURES_IFRETURN_WARNING": "Gargaɗi: Za a iya amfani da wannan bulo ne kawai a cikin bayani na wani aiki.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Faɗi wani abu..." +} diff --git a/js/msg/json/he.json b/js/msg/json/he.json new file mode 100644 index 0000000..a6d9cad --- /dev/null +++ b/js/msg/json/he.json @@ -0,0 +1,320 @@ +{ + "@metadata": { + "authors": [ + "Dorongol", + "YaronSh", + "Amire80", + "Inkbug", + "Yona b", + "Noamrotem", + "Dvb", + "LaG roiL", + "아라", + "Elyashiv", + "Guycn2", + "Deborahjay", + "נדב ס", + "Motife", + "Steeve815", + "דגש חזק" + ] + }, + "VARIABLES_DEFAULT_NAME": "פריט", + "TODAY": "היום", + "DUPLICATE_BLOCK": "שכפל", + "ADD_COMMENT": "הוסף תגובה", + "REMOVE_COMMENT": "הסר תגובה", + "DUPLICATE_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": "עזרה", + "UNDO": "ביטול", + "REDO": "ביצוע חוזר", + "CHANGE_VALUE_TITLE": "שנה ערך:", + "RENAME_VARIABLE": "שנה את שם המשתנה...", + "RENAME_VARIABLE_TITLE": "שנה את שם כל '%1' המשתנים ל:", + "NEW_VARIABLE": "צור משתנה...", + "NEW_STRING_VARIABLE": "צור משתנה מחרוזת", + "NEW_NUMBER_VARIABLE": "צור משתנה מחרוזת", + "NEW_COLOUR_VARIABLE": "יצירת משתנה צבע...", + "NEW_VARIABLE_TYPE_TITLE": "סוג המשתנה החדש:", + "NEW_VARIABLE_TITLE": "שם המשתנה החדש:", + "VARIABLE_ALREADY_EXISTS": "קיים כבר משתנה בשם \"%1\".", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "קיים כבר משתנה בשם \"%1\" מסוג אחר: \"%2\"", + "DELETE_VARIABLE_CONFIRMATION": "למחוק %1 שימושים במשתנה ‚%2’?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "אי אפשר למחוק את המשתנה \"%1\", מכיוון שהגדרת הפונקציה \"%2\" משתמשת בו.", + "DELETE_VARIABLE": "מחק את משתנה ה'%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_HELPURL": "http://he.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_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.", + "IOS_OK": "אישור", + "IOS_CANCEL": "ביטול", + "IOS_ERROR": "שגיאה", + "IOS_PROCEDURES_ADD_INPUT": "+ הוספת קלט", + "IOS_VARIABLES_ADD_VARIABLE": "+ הוספת משתנה", + "IOS_VARIABLES_ADD_BUTTON": "הוספה", + "IOS_VARIABLES_RENAME_BUTTON": "שינוי שם", + "IOS_VARIABLES_DELETE_BUTTON": "מחיקה", + "IOS_VARIABLES_VARIABLE_NAME": "שם המשתנה", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "לא ניתן להזין שם ריק למשתנה.", + "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_NEGATE_TOOLTIP": "החזר אמת אם הקלט הוא שקר. החזר שקר אם הקלט אמת.", + "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_HELPURL": "https://he.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://he.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://he.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://he.wikipedia.org/wiki/פונקציות_טריגונומטריות", + "MATH_TRIG_TOOLTIP_SIN": "החזרת הסינוס של מעלה (לא רדיאן).", + "MATH_TRIG_TOOLTIP_COS": "החזרת הקוסינוס של מעלה (לא רדיאן).", + "MATH_TRIG_TOOLTIP_TAN": "החזרת הטנגס של מעלה (לא רדיאן).", + "MATH_CONSTANT_HELPURL": "https://he.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_CHANGE_TITLE": "שינוי %1 על־ידי %2", + "MATH_CHANGE_TOOLTIP": "הוסף מספר למשתנה '%1'.", + "MATH_ROUND_HELPURL": "https://he.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_OPERATOR_MEDIAN": "חציון של רשימה", + "MATH_ONLIST_TOOLTIP_MEDIAN": "תחזיר את המספר החיצוני ביותר ברשימה.", + "MATH_ONLIST_OPERATOR_MODE": "שכיחי הרשימה", + "MATH_ONLIST_TOOLTIP_MODE": "החזרת רשימה של הפריטים הנפוצים ביותר ברשימה", + "MATH_ONLIST_TOOLTIP_STD_DEV": "מחזיר את סטיית התקן של הרשימה.", + "MATH_ONLIST_OPERATOR_RANDOM": "פריט אקראי מרשימה", + "MATH_ONLIST_TOOLTIP_RANDOM": "תחזיר רכיב אקראי מרשימה.", + "MATH_MODULO_TITLE": "שארית החילוק %1 ÷ %2", + "MATH_MODULO_TOOLTIP": "החזרת השארית מחלוקת שני המספרים.", + "MATH_CONSTRAIN_TITLE": "הגבל %1 בין %2 ל %3", + "MATH_RANDOM_INT_TITLE": "מספר שלם אקראי בין %1 ל-%2 (כולל)", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "שבר אקראי", + "TEXT_TEXT_HELPURL": "https://he.wikipedia.org/wiki/מחרוזת_(מדעי_המחשב)", + "TEXT_TEXT_TOOLTIP": "אות, מילה, או שורת טקסט.", + "TEXT_JOIN_TITLE_CREATEWITH": "יצירת טקסט עם", + "TEXT_CREATE_JOIN_TITLE_JOIN": "צירוף", + "TEXT_APPEND_TITLE": "אל %1 הוספת טקסט %2", + "TEXT_LENGTH_TITLE": "אורכו של %1", + "TEXT_LENGTH_TOOLTIP": "מחזיר את מספר התווים (אותיות, רווחים וכו') בטקסט שהוזן.", + "TEXT_ISEMPTY_TITLE": "%1 הוא ריק", + "TEXT_INDEXOF_TOOLTIP": "מחזירה את האינדקס של המופע הראשון/האחרון בטקסט הראשון לתוך הטקסט השני. מחזירה %1 אם הטקסט אינו נמצא.", + "TEXT_CHARAT_FIRST": "לקבל את האות הראשונה", + "TEXT_CHARAT_LAST": "לקבל את האות האחרונה", + "TEXT_CHARAT_RANDOM": "לקבל אות אקראית", + "TEXT_CHARAT_TOOLTIP": "מחזיר את האות במיקום שהוגדר.", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "בתוך הטקסט", + "TEXT_GET_SUBSTRING_END_FROM_START": "לאות #", + "TEXT_GET_SUBSTRING_END_FROM_END": "לאות # מהסוף", + "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": "מחזירה את האינדקס של המופע הראשון/האחרון של הפריט ברשימה. מחזירה %1 אם הפריט אינו נמצא.", + "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_INDEX_FROM_START_TOOLTIP": "%1 הוא הפריט הראשון.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 הוא הפריט האחרון.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "מחזיר פריט במיקום שצוין ברשימה.", + "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": "מסיר ומחזיר את הפריט במיקום שצוין ברשימה.", + "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": "מחזיר פריט במיקום שצוין ברשימה.", + "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": "מגדיר את הפריט במיקום שצוין ברשימה.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "מגדיר את הפריט הראשון ברשימה.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "מגדיר את הפריט האחרון ברשימה.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "מגדיר פריט אקראי ברשימה.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "מכניס את הפריט במיקום שצוין ברשימה.", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TOOLTIP": "מיון עותק של הרשימה.", + "LISTS_SORT_ORDER_ASCENDING": "סדר עולה", + "LISTS_SORT_ORDER_DESCENDING": "סדר יורד", + "LISTS_SORT_TYPE_NUMERIC": "נומרי", + "LISTS_SORT_TYPE_TEXT": "סדר אלפביתי", + "LISTS_SORT_TYPE_IGNORECASE": "סדר אלפביתי, לא תלוי רישיות", + "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_DEFNORETURN_COMMENT": "תאר את הפונקציה הזו...", + "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": "אזהרה: בלוק זה עשוי לשמש רק בתוך הגדרה של פונקציה.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "נא להזין הערה...", + "WORKSPACE_ARIA_LABEL": "סביבת העבודה חסומה" +} diff --git a/js/msg/json/hi.json b/js/msg/json/hi.json new file mode 100644 index 0000000..ddd1fec --- /dev/null +++ b/js/msg/json/hi.json @@ -0,0 +1,345 @@ +{ + "@metadata": { + "authors": [ + "Bl707", + "संजीव कुमार", + "Phoenix303", + "Sfic", + "Earlyengineers", + "Sachinkatiyar", + "Nilesh shukla" + ] + }, + "VARIABLES_DEFAULT_NAME": "वस्तु", + "UNNAMED_KEY": "अज्ञात", + "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": "सहायता", + "UNDO": "पूर्ववत करें", + "REDO": "फिर से करें", + "CHANGE_VALUE_TITLE": "मान परिवर्तित करें:", + "RENAME_VARIABLE": "चर का नाम बदलें...", + "RENAME_VARIABLE_TITLE": "सभी '%1' चरों के नाम बदलें:", + "NEW_VARIABLE": "चर बनाएँ...", + "NEW_STRING_VARIABLE": "लड़ी चर बनायें...", + "NEW_NUMBER_VARIABLE": "संख्या चर बनायें...", + "NEW_COLOUR_VARIABLE": "रंग चर बनाएँ...", + "NEW_VARIABLE_TYPE_TITLE": "नए चर का नाम:", + "NEW_VARIABLE_TITLE": "नए चर का नाम:", + "VARIABLE_ALREADY_EXISTS": "प्राचल नाम '%1' पहले से मौजूद है।", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "'%1' नाम का एक चर पहले से '%2' प्रकार के अन्य चर के लिए मौजूद है।", + "DELETE_VARIABLE_CONFIRMATION": "'%2' चर के %1 उपयोग को हटाएँ?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "चर '%1' को नहीं हटा सकता क्योंकि यह फ़ंक्शन '%2' की परिभाषा का हिस्सा है", + "DELETE_VARIABLE": "'%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_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": "यदि ब्लॉक है तो इसके लिए एक अंतिम, कैच-सभी स्थिति जोड़ें।", + "IOS_OK": "ठीक है", + "IOS_CANCEL": "रद्द करें", + "IOS_ERROR": "त्रुटि", + "IOS_PROCEDURES_INPUTS": "इनपुट", + "IOS_PROCEDURES_ADD_INPUT": "+ इनपुट जोड़ें", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "बयानों की अनुमति दें", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "इस फंक्शन में नकली निवेश हैं।", + "IOS_VARIABLES_ADD_VARIABLE": "+ चर जोड़ें", + "IOS_VARIABLES_ADD_BUTTON": "जोड़ें", + "IOS_VARIABLES_RENAME_BUTTON": "नाम बदलें", + "IOS_VARIABLES_DELETE_BUTTON": "हटाएँ", + "IOS_VARIABLES_VARIABLE_NAME": "चर का नाम", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "आप रिक्त चर नाम उपयोग नहीं कर सकते", + "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": "यदि गलत है", + "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": "संख्या का मूल 10 लघुगणक रिटर्न करें।", + "MATH_SINGLE_TOOLTIP_EXP": "किसी संख्या की शक्ति को वापस ई करें।", + "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": "सूची मे सबसे आम आइटम(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_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_TITLE": "%1 में पाठ %2 को जोड़ें", + "TEXT_APPEND_TOOLTIP": "कुछ टेक्स्ट इस चर '%1' से जोड़ें।", + "TEXT_LENGTH_TITLE": "%1 की लंबाई", + "TEXT_LENGTH_TOOLTIP": "दिए गये टेक्स्ट मे अक्षरों की संख्या रिटर्न करता है (खाली स्थान मिला के)।", + "TEXT_ISEMPTY_TITLE": "%1 खाली है", + "TEXT_ISEMPTY_TOOLTIP": "ट्रू रिटर्न करता है यदि दिया गया टेक्स्ट खाली है।", + "TEXT_INDEXOF_TOOLTIP": "दूसरे पाठ में पहले पाठ की पहली/अंतिम घटना का सूचक देता है। यदि पाठ नहीं मिला है तो %1 रिटर्न होता है।", + "TEXT_INDEXOF_TITLE": "पाठ %1 %2 %3 में", + "TEXT_INDEXOF_OPERATOR_FIRST": "टेक्स्ट पहली बार जहाँ आया है उसे ढूढ़े", + "TEXT_INDEXOF_OPERATOR_LAST": "टेक्स्ट आखरी बार जहाँ आया है उसे ढूढ़े", + "TEXT_CHARAT_TITLE": "पाठ %1 %2 में", + "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": "यूज़र से कुछ टेक्स्ट के लिए प्रॉम्प्ट करें।", + "TEXT_COUNT_MESSAGE0": "%1 को %2 में गिने", + "TEXT_COUNT_TOOLTIP": "गिने, कितनी बार कुछ पाठ कुछ अन्य पाठ के अंदर समाहित होता है।", + "TEXT_REPLACE_MESSAGE0": "%1 को %2 के साथ %3 में बदलें", + "TEXT_REPLACE_TOOLTIP": "कुछ अन्य पाठ के अंदर कुछ पाठ की सभी जगहों को बदलें।", + "TEXT_REVERSE_MESSAGE0": "%1 को बदल दें", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "पाठ में वर्णों के क्रम को उलट देता है।", + "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": "सूची में आइटम की पहली/अंतिम घटना का सूचक देता है। यदि आइटम नहीं मिला है तो %1 रिटर्न होता है।", + "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_INDEX_FROM_START_TOOLTIP": "%1 पहली वस्तु है।", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 आखिरी वस्तु है।", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "एक सूची में निर्दिष्ट स्थान पर वस्तु को लौटाता है।", + "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": "एक सूची में निर्दिष्ट स्थिति में आइटम निकालता है और लौटाता है।", + "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": "एक सूची में निर्दिष्ट स्थान पर आइटम निकाल देता है।", + "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": "सूची मे बताए गये स्थान में आइटम सैट करता है।", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "सूची में पहला आइटम सैट करता है।", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "सूची में आखरी आइटम सैट करता है।", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "सूची में रैन्डम आइटम सैट करता है।", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "सूची मे बताए गये स्थान में आइटम इनसर्ट करता है।", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "LISTS_SORT_TITLE": "%1 %2 %3 को छांटे", + "LISTS_SORT_TOOLTIP": "एक सूची की एक प्रति को छांटे।", + "LISTS_SORT_ORDER_ASCENDING": "बढ़ते क्रम", + "LISTS_SORT_ORDER_DESCENDING": "बढ़ते क्रम में", + "LISTS_SORT_TYPE_NUMERIC": "अंकीय", + "LISTS_SORT_TYPE_TEXT": "वर्णक्रमानुसार", + "LISTS_SORT_TYPE_IGNORECASE": "वर्णक्रमानुसार, मामले की अनदेखी करें", + "LISTS_SPLIT_LIST_FROM_TEXT": "पाठ से एक सूची बनाएं", + "LISTS_SPLIT_TEXT_FROM_LIST": "सूची से एक पाठ बनाएं", + "LISTS_SPLIT_WITH_DELIMITER": "सीमांकक के साथ", + "LISTS_SPLIT_TOOLTIP_SPLIT": "ग्रंथों की सूची में पाठ को विभाजित करें, प्रत्येक सीमांकक पर तोड़कर।", + "LISTS_SPLIT_TOOLTIP_JOIN": "ग्रंथों की एक सूची में शामिल करें, जो एक सीमांकक से अलग हो।", + "LISTS_REVERSE_MESSAGE0": "%1 को बदल दें", + "LISTS_REVERSE_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_DEFNORETURN_COMMENT": "इस फंकशन को समझाएँ...", + "PROCEDURES_DEFRETURN_RETURN": "वापस आएं", + "PROCEDURES_DEFRETURN_TOOLTIP": "आउटपुट वाला एक फ़ंक्शन बनाता है।", + "PROCEDURES_ALLOW_STATEMENTS": "बयानों की अनुमति दें", + "PROCEDURES_DEF_DUPLICATE_WARNING": "सावधान: इस फ़ंक्शन मे डुप्लिकेट पैरामीटर हैं।", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLNORETURN_TOOLTIP": "यूज़र द्वारा वर्णन किया गया फ़ंक्शन '%1' चलाएँ।", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "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/js/msg/json/hrx.json b/js/msg/json/hrx.json new file mode 100644 index 0000000..6380c0e --- /dev/null +++ b/js/msg/json/hrx.json @@ -0,0 +1,287 @@ +{ + "@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", + "CHANGE_VALUE_TITLE": "Neie Variable...", + "RENAME_VARIABLE": "Die neie Variable sei Noome:", + "RENAME_VARIABLE_TITLE": "All \"%1\" Variable umbenenne in:", + "NEW_VARIABLE": "Neie Variable...", + "NEW_VARIABLE_TITLE": "Die neie Variable sei Noome:", + "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_TITLE": "An %1 Text oonhänge %2", + "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 %1 zurück.", + "TEXT_INDEXOF_TITLE": "im Text %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "Such der Begriff sein earstes Voarkommniss", + "TEXT_INDEXOF_OPERATOR_LAST": "Suche der Begriff sein letztes Vorkommniss.", + "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 %1 zurück wenn nixs gefunn woard.", + "LISTS_GET_INDEX_GET": "Nehm", + "LISTS_GET_INDEX_GET_REMOVE": "Nehm und entfern", + "LISTS_GET_INDEX_REMOVE": "Entfern", + "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_INDEX_FROM_START_TOOLTIP": "%1 ist das earschte Element.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 ist das letzte Element.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Extrahiert das Element zu en definierte Stell von der List.", + "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": "Extrahiert und entfernt das Element zu en definierte Stell von der List.", + "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": "Entfernt das Element zu en definierte Stell von der List.", + "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": "Setzt das Element zu en definierte Stell in en List.", + "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": "Tut das Element ren setze an en definierte Stell an en List.", + "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/js/msg/json/hu.json b/js/msg/json/hu.json new file mode 100644 index 0000000..0338772 --- /dev/null +++ b/js/msg/json/hu.json @@ -0,0 +1,355 @@ +{ + "@metadata": { + "authors": [ + "Espertus", + "Takács Viktor László", + "Dj", + "Grin", + "ViDam", + "Csega", + "Fitoschido", + "Lajthabalazs", + "Tacsipacsi", + "Rodrigo", + "Máté", + "BanKris", + "Notramo", + "Urbalazs", + "MeskoBalazs" + ] + }, + "VARIABLES_DEFAULT_NAME": "változó", + "TODAY": "Ma", + "DUPLICATE_BLOCK": "Másolat", + "ADD_COMMENT": "Megjegyzés hozzáadása", + "REMOVE_COMMENT": "Megjegyzés eltávolítása", + "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 kinyitása", + "EXPAND_ALL": "Blokkok kinyitása", + "DISABLE_BLOCK": "Blokk letiltása", + "ENABLE_BLOCK": "Blokk engedélyezése", + "HELP": "Súgó", + "UNDO": "Visszavonás", + "REDO": "Újra", + "CHANGE_VALUE_TITLE": "Érték módosítása:", + "RENAME_VARIABLE": "Változó átnevezése…", + "RENAME_VARIABLE_TITLE": "Minden „%1” változó átnevezése erre:", + "NEW_VARIABLE": "Változó létrehozása…", + "NEW_VARIABLE_TITLE": "Az új változó neve:", + "VARIABLE_ALREADY_EXISTS": "A(z) „%1” nevű változó már létezik.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Egy „%1” nevű változó már létezik egy másik típussal: „%2”.", + "DELETE_VARIABLE_CONFIRMATION": "A(z) „%2” változó %1 használatának törlése?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "A(z) „%1” változó nem törölhető, mert része a(z) „%2” függvény definíciójának.", + "DELETE_VARIABLE": "A(z) „%1” változó törlése", + "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", + "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.", + "IOS_OK": "OK", + "IOS_CANCEL": "Mégse", + "IOS_ERROR": "Hiba", + "IOS_PROCEDURES_INPUTS": "BEMENETEK", + "IOS_PROCEDURES_ADD_INPUT": "+ Bemenet hozzáadása", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Utasítások engedélyezése", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Ennek a függvénynek kettőzött bemenete van.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Változó hozzáadása", + "IOS_VARIABLES_ADD_BUTTON": "Hozzáadás", + "IOS_VARIABLES_RENAME_BUTTON": "Átnevezés", + "IOS_VARIABLES_DELETE_BUTTON": "Törlés", + "IOS_VARIABLES_VARIABLE_NAME": "Változó neve", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Nem használhat üres változónevet.", + "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_TITLE": "A %1 szövegéhez fűzd hozzá %2", + "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. %1 esetén a szövegrészlet nem található.", + "TEXT_INDEXOF_TITLE": "A(z) %1 %2 %3 szövegnek", + "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_CHARAT_TITLE": "a szövegben: %1 %2", + "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.", + "TEXT_COUNT_MESSAGE0": "%1 száma ebben: %2", + "TEXT_COUNT_TOOLTIP": "A szöveg előfordulásainak megszámolása egy másik szövegben.", + "TEXT_REPLACE_MESSAGE0": "%1 cseréje %2-vel %3-ban", + "TEXT_REPLACE_TOOLTIP": "A szöveg összes előfordulásának cseréje egy másik szöveggel.", + "TEXT_REVERSE_MESSAGE0": "%1 megfordítása", + "TEXT_REVERSE_TOOLTIP": "Megfordítja a karakterek sorrendjét a szövegben.", + "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. Ha nem talál ilyen elemet, akkor %1 a visszatérési érték.", + "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_INDEX_FROM_START_TOOLTIP": "%1 az első elemet jelenti.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 az utolsó elemet jelenti.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "A lista megadott sorszámú elemét adja eredményül.", + "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": "A megadott sorszámú elem kivétele a listából.", + "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": "A megadott sorszámú elem törlése a listából.", + "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": "A megadott sorszámú elem cseréje a listában.", + "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": "Beszúrás a megadott sorszámú elem elé a listában.", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "%1 %2 %3 rendezés", + "LISTS_SORT_TOOLTIP": "Egy lista egy másolatának rendezése.", + "LISTS_SORT_ORDER_ASCENDING": "növekvő", + "LISTS_SORT_ORDER_DESCENDING": "csökkenő", + "LISTS_SORT_TYPE_NUMERIC": "numerikus", + "LISTS_SORT_TYPE_TEXT": "betűrendben", + "LISTS_SORT_TYPE_IGNORECASE": "betűrendben nagybetű figyelmen kívül hagyásával", + "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.", + "LISTS_REVERSE_MESSAGE0": "%1 megfordítása", + "LISTS_REVERSE_TOOLTIP": "Megfordítja a lista másolatát.", + "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_DEFNORETURN_COMMENT": "Írj erről a funkcióról...", + "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": "„%1” létrehozása", + "PROCEDURES_IFRETURN_TOOLTIP": "Ha az érték igaz, akkor visszatér a függvény értékével.", + "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", + "PROCEDURES_IFRETURN_WARNING": "Figyelem: Ez a blokk csak függvénydefiníción belül használható." +} diff --git a/js/msg/json/hy.json b/js/msg/json/hy.json new file mode 100644 index 0000000..e078123 --- /dev/null +++ b/js/msg/json/hy.json @@ -0,0 +1,336 @@ +{ + "@metadata": { + "authors": [ + "A.kolyan", + "Armenoid", + "Kareyac", + "Nona", + "Xelgen" + ] + }, + "VARIABLES_DEFAULT_NAME": "տարր", + "TODAY": "Այսօր", + "DUPLICATE_BLOCK": "Պատճենել", + "ADD_COMMENT": "Ավելացնել մեկնաբանություն", + "REMOVE_COMMENT": "Հեռացնել մեկնաբանությունը", + "DUPLICATE_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": "Օգնություն", + "UNDO": "Հետ շրջել", + "REDO": "Կրկին անել", + "CHANGE_VALUE_TITLE": "Փոխել նշանակություն:", + "RENAME_VARIABLE": "Վերանվանել փոփոխականը...", + "NEW_VARIABLE": "Ստեղծել փոփոխական...", + "NEW_STRING_VARIABLE": "Ստեղծել տեքստային փոփոխական", + "NEW_NUMBER_VARIABLE": "Ստեղծել թվային փոփոխական", + "NEW_COLOUR_VARIABLE": "Ստեղծել գույնի փոփոխական", + "NEW_VARIABLE_TYPE_TITLE": "Փոփոխականի նոր տիպ", + "NEW_VARIABLE_TITLE": "Նոր փոփոխականի անունը՝", + "VARIABLE_ALREADY_EXISTS": "'%1' անունով փոփոխական արդեն գոյություն ունի", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "'%1' անունով փոփոխական արդեն գոյություն ունի այլ տիպի համար: '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Ջնջե՞լ '%2' փոփոխականի %1 կիրառությունները", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Հնարավոր չի ջնջել %1 փոփոխականը, որովհետև այն '%2' ֆունկցիայի հայտարարման մասն է", + "DELETE_VARIABLE": "Հեռացնել '%1' փոփոխականը", + "COLOUR_PICKER_HELPURL": "https://hy.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_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": "Ավելացնել վերջնական ենթաբլոկ (այն կաշխատի, եթե բոլոր պայմանները կեղծ են)", + "IOS_OK": "Լավ", + "IOS_CANCEL": "Չեղարկել", + "IOS_ERROR": "Սխալ", + "IOS_PROCEDURES_INPUTS": "ՆԵՐՄՈՒԾՈՒՄ", + "IOS_PROCEDURES_ADD_INPUT": "+ Ավելացնել մուտքային փոփոխական", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Թույլատրել արտահայտությունները", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Այս ֆունկցիան կրկնօրինակում է մուտքային փոփոխականները:", + "IOS_VARIABLES_ADD_VARIABLE": "+ Ավելացնել փոփոխական", + "IOS_VARIABLES_ADD_BUTTON": "Ավելացնել", + "IOS_VARIABLES_RENAME_BUTTON": "Վերանվանել", + "IOS_VARIABLES_DELETE_BUTTON": "Ջնջել", + "IOS_VARIABLES_VARIABLE_NAME": "Փոփախականի անունը", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Չես կարող օգտագործել փոփոխականի «դատարկ» անուն", + "LOGIC_COMPARE_HELPURL": "https://hy.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": "Վերադարձնում է null (ոչինչ)", + "LOGIC_TERNARY_CONDITION": "ստուգում", + "LOGIC_TERNARY_IF_TRUE": "եթե ճշմարիտ է", + "LOGIC_TERNARY_IF_FALSE": "եթե կեղծ է", + "LOGIC_TERNARY_TOOLTIP": "Ստուգում է ընտրության պայմանը։ Եթե այն ճշմարիտ է, վերադարձնում է առաջին արժեքը, հակառակ դեպքում ՝ երկրորդը։", + "MATH_NUMBER_HELPURL": "https://hy.wikipedia.org/wiki/Թիվ", + "MATH_NUMBER_TOOLTIP": "Թիվ", + "MATH_ARITHMETIC_HELPURL": "https://hy.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": "Վերադարձնում է թվի աստիճանը։", + "MATH_SINGLE_TOOLTIP_POW10": "Վերադարձնում է 10֊ի նշված աստիճանը։", + "MATH_TRIG_HELPURL": "https://hy.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://hy.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_TITLE": "փոխել %1-ի արժեքը %2֊ով", + "MATH_CHANGE_TOOLTIP": "Ավելացնում է թիվ %1 փոփոխականին:", + "MATH_ROUND_HELPURL": "https://en.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_TITLE": "%1֊ի և %2֊ի բաժանման մնացորդը", + "MATH_MODULO_TOOLTIP": "Վերադարձնում է երկու թվերի բաժանման մնացորդը:", + "MATH_CONSTRAIN_TITLE": "սահմանափակել %1֊ը %2֊ի և %3֊ի միջև", + "MATH_CONSTRAIN_TOOLTIP": "Սահմանափակել թիվը երկու արժեքներով (ներառյալ)", + "MATH_RANDOM_INT_TITLE": "պատահական ամբողջ թիվ %1 -ից %2 -ը", + "MATH_RANDOM_INT_TOOLTIP": "Վերադարձնում է պատահական ամբողջ թիվ տրված երկու թվերի միջև (ներառյալ):", + "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Պատահական_թվերի_գեներատոր", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "պատահական կոտորակ", + "MATH_RANDOM_FLOAT_TOOLTIP": "Վերադարձնում է պատահական թիվ 0.0-ից (ներառյալ) 1.0 միջակայքից:", + "MATH_ATAN2_TITLE": "X:%1 Y:%2 ֊ի atan2֊ը", + "MATH_ATAN2_TOOLTIP": "Վերադարձնում է (X, Y) կետի արկտանգենսը աստիճաններով -180-ից մինչև 180:", + "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_TITLE": "%1֊ին կցել %2 տեքստը", + "TEXT_APPEND_TOOLTIP": "Կցել տեքստ '%1' փոփոխականին", + "TEXT_LENGTH_TITLE": "%1 -ի երկարությունը", + "TEXT_LENGTH_TOOLTIP": "Վերադարձնում է տրված տեքստի տառերի քանակը (ներառյալ բացատները)", + "TEXT_ISEMPTY_TITLE": "%1 -ը դատարկ է", + "TEXT_ISEMPTY_TOOLTIP": "Վերադարձնում է ճշմարիտ արժեք, եթե տրամադրված տեքստը դատարկ է:", + "TEXT_INDEXOF_TOOLTIP": "Վերադարձնում է առաջին տեքստի հանդիպման առաջին(կամ վերջին) դիրքը երկրորդ տեքստում։ Վերադարձնում %1 եթե տեքստը չի գտնվել։", + "TEXT_INDEXOF_TITLE": "Տեքստում %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "գտնել տեքստի առաջին հանդիպումը", + "TEXT_INDEXOF_OPERATOR_LAST": "գտնել տեքստի վերջին հանդիպումը", + "TEXT_CHARAT_TITLE": "տեքստում %1 %2", + "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": "Հարցնել տեքստ օգտատիրոջից։", + "TEXT_COUNT_MESSAGE0": "հաշվել %1 %2֊ում", + "TEXT_COUNT_TOOLTIP": "Հաշվել, թե քանի անգամ է տեքստը հանդիպում մեկ այլ տեքստի մեջ։", + "TEXT_REPLACE_MESSAGE0": "փոխարինել %1֊ը %2֊ով %3֊ում", + "TEXT_REPLACE_TOOLTIP": "Փոխարինել տեքստի բոլոր գտնված տարբերակները մեկ այլ տեսքով։", + "TEXT_REVERSE_MESSAGE0": "շրջել %1", + "TEXT_REVERSE_TOOLTIP": "Փոխում է տեքստում տառերի հաջորդականությունը։", + "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": "Վերադարձնում է ցանկում անդամի առաջին/վերջին հանդիպման դիրքը։ Վերադարձնում է %1, եթե անդամը չի գտնվել։", + "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_INDEX_FROM_START_TOOLTIP": "%1 առաջին տարրն է:", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 վերջին տարրն է:", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Վերադարձնում է նշված դիրքում գտնվող անդամը ցանկից։", + "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": "Հեռացնում և վերադարձնում է նշված դիրքում գտնվող անդամը ցանկից։", + "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": "Ցանկից հեռացնում է նշված դիրքում գտնվող անդամը։", + "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": "Տեղադրում է անդամը ցանկի նշված դիրքում։", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Սահմանում է ցանկի առաջին տարրը:", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Սահմանում է ցանկի վերջին տարրը:", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Սահմանում է ցանկից պատահական տարր:", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Ներմուծում է անդամը ցանկի նշված դիրքում։", + "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_SORT_TITLE": "դասավորել %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Դասավորում է ցանկի պատճենը", + "LISTS_SORT_ORDER_ASCENDING": "աճման կարգ", + "LISTS_SORT_ORDER_DESCENDING": "նվազման կարգ", + "LISTS_SORT_TYPE_NUMERIC": "թվային կարգ", + "LISTS_SORT_TYPE_TEXT": "այբբենական կարգ", + "LISTS_SORT_TYPE_IGNORECASE": "այբենական, անտեսել ռեգիստրը", + "LISTS_SPLIT_LIST_FROM_TEXT": "ստեղծել ցանկ տեքստից", + "LISTS_SPLIT_TEXT_FROM_LIST": "ստեղծել տեքստ ցանկից", + "LISTS_SPLIT_WITH_DELIMITER": "բաժանարարով", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Տեքստը վեր է ածվում ցանկի, նշված բաժանարարով։", + "LISTS_SPLIT_TOOLTIP_JOIN": "Ցանկից ստեղծվում է միացյալ տեքստ, ցանկի անդամները միացվում են բաժանարարներով։", + "LISTS_REVERSE_MESSAGE0": "շրջել %1", + "LISTS_REVERSE_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_DEFNORETURN_COMMENT": "Նկարագրիր այս ֆունկցիան...", + "PROCEDURES_DEFRETURN_RETURN": "վերադարձնել", + "PROCEDURES_DEFRETURN_TOOLTIP": "Ստեղծում է ֆունկցիա, որը վերադարձնում է արժեք:", + "PROCEDURES_ALLOW_STATEMENTS": "թույլատրել արտահայտությունները", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Զգուշացում։ Այս ֆունկցիան ունի կրկնվող պարամտերեր։", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Կատարում է %1 ֆունկցիան", + "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": "Զգուշացում. Այս բլոկը կարող է օգտագործվել միայն ֆունկցիայի սահմանման ներսում:", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Մի բան ասա ․․․" +} diff --git a/js/msg/json/ia.json b/js/msg/json/ia.json new file mode 100644 index 0000000..4f8460e --- /dev/null +++ b/js/msg/json/ia.json @@ -0,0 +1,336 @@ +{ + "@metadata": { + "authors": [ + "McDutchie", + "Karmwiki", + "Fanjiayi" + ] + }, + "VARIABLES_DEFAULT_NAME": "cosa", + "TODAY": "Hodie", + "DUPLICATE_BLOCK": "Duplicar", + "ADD_COMMENT": "Adder commento", + "REMOVE_COMMENT": "Remover commento", + "DUPLICATE_COMMENT": "Duplicar 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": "Rangiar 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", + "UNDO": "Disfacer", + "REDO": "Refacer", + "CHANGE_VALUE_TITLE": "Cambiar valor:", + "RENAME_VARIABLE": "Renominar variabile...", + "RENAME_VARIABLE_TITLE": "Renominar tote le variabiles '%1' a:", + "NEW_VARIABLE": "Crear variabile...", + "NEW_STRING_VARIABLE": "Crear variabile textual...", + "NEW_NUMBER_VARIABLE": "Crear variabile numeric...", + "NEW_COLOUR_VARIABLE": "Crear variabile de color...", + "NEW_VARIABLE_TYPE_TITLE": "Nove typo de variabile:", + "NEW_VARIABLE_TITLE": "Nomine del nove variabile:", + "VARIABLE_ALREADY_EXISTS": "Un variabile con le nomine '%1' jam existe.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Un variabile con le nomine '%1' jam existe pro un altere typo: '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Deler %1 usos del variabile '%2'?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Impossibile deler le variabile '%1' perque illo face parte del definition del function '%2'", + "DELETE_VARIABLE": "Deler le variabile '%1'", + "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\".", + "IOS_OK": "OK", + "IOS_CANCEL": "Cancellar", + "IOS_ERROR": "Error", + "IOS_PROCEDURES_INPUTS": "ENTRATAS", + "IOS_PROCEDURES_ADD_INPUT": "+ Adder entrata", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Permitter declarationes", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Iste function ha entratas duplicate.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Adder variabile", + "IOS_VARIABLES_ADD_BUTTON": "Adder", + "IOS_VARIABLES_RENAME_BUTTON": "Renominar", + "IOS_VARIABLES_DELETE_BUTTON": "Deler", + "IOS_VARIABLES_VARIABLE_NAME": "Nomine del variabile", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Non es possibile usar un nomine de variabile vacue.", + "LOGIC_COMPARE_HELPURL": "https://ia.wikipedia.org/wiki/Inequalitate_(mathematica)", + "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_HELPURL": "https://ia.wikipedia.org/wiki/Constante_mathematic", + "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).", + "MATH_ATAN2_TITLE": "atan2 de X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "Retornar le arco tangente del puncto (X, Y) in grados de -180 a 180.", + "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_TITLE": "a %1 adjunger texto %2", + "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 %1 si le texto non es trovate.", + "TEXT_INDEXOF_TITLE": "in le texto %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "cercar le prime occurrentia del texto", + "TEXT_INDEXOF_OPERATOR_LAST": "cercar le ultime occurrentia del texto", + "TEXT_CHARAT_TITLE": "in le texto %1 %2", + "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.", + "TEXT_COUNT_MESSAGE0": "contar %1 in %2", + "TEXT_COUNT_TOOLTIP": "Contar quante vices un texto occurre intra un altere texto.", + "TEXT_REPLACE_MESSAGE0": "reimplaciar %1 per %2 in %3", + "TEXT_REPLACE_TOOLTIP": "Reimplaciar tote le occurrentias de un texto intra un altere texto.", + "TEXT_REVERSE_MESSAGE0": "inverter %1", + "TEXT_REVERSE_TOOLTIP": "Inverte le ordine del characteres in le texto.", + "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 %1 si le elemento 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_INDEX_FROM_START_TOOLTIP": "%1 es le prime elemento.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 es le ultime elemento.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Retorna le elemento presente al position specificate in un lista.", + "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": "Remove e retorna le elemento presente al position specificate in un lista.", + "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": "Remove le elemento presente al position specificate in un lista.", + "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": "Defini le valor del elemento al position specificate in un lista.", + "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": "Insere le elemento al position specificate in un lista.", + "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_SORT_TITLE": "ordinamento %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Ordinar un copia de un lista.", + "LISTS_SORT_ORDER_ASCENDING": "ascendente", + "LISTS_SORT_ORDER_DESCENDING": "descendente", + "LISTS_SORT_TYPE_NUMERIC": "numeric", + "LISTS_SORT_TYPE_TEXT": "alphabetic", + "LISTS_SORT_TYPE_IGNORECASE": "alphabetic, ignorar majuscula/minuscula", + "LISTS_SPLIT_LIST_FROM_TEXT": "crear lista ab texto", + "LISTS_SPLIT_TEXT_FROM_LIST": "crear texto ab lista", + "LISTS_SPLIT_WITH_DELIMITER": "con delimitator", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Divider texto in un lista de textos, separante lo a cata delimitator.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Unir un lista de textos, separate per un delimitator, in un sol texto.", + "LISTS_REVERSE_MESSAGE0": "inverter %1", + "LISTS_REVERSE_TOOLTIP": "Inverter un copia de un lista.", + "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_DEFNORETURN_COMMENT": "Describe iste function...", + "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.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Dice qualcosa...", + "WORKSPACE_ARIA_LABEL": "Spatio de travalio de Blockly", + "COLLAPSED_WARNINGS_WARNING": "Blocos plicate contine advertimentos." +} diff --git a/js/msg/json/id.json b/js/msg/json/id.json new file mode 100644 index 0000000..87e28d8 --- /dev/null +++ b/js/msg/json/id.json @@ -0,0 +1,333 @@ +{ + "@metadata": { + "authors": [ + "Kenrick95", + "아라", + "Mirws", + "Marwan Mohamad", + "Kasimtan", + "Arifin.wijaya" + ] + }, + "VARIABLES_DEFAULT_NAME": "item", + "TODAY": "Hari ini", + "DUPLICATE_BLOCK": "Duplikat", + "ADD_COMMENT": "Tambahkan Komentar", + "REMOVE_COMMENT": "Hapus Komentar", + "EXTERNAL_INPUTS": "Input Eksternal", + "INLINE_INPUTS": "Input Inline", + "DELETE_BLOCK": "Hapus Blok", + "DELETE_X_BLOCKS": "Hapus %1 Blok", + "DELETE_ALL_BLOCKS": "Hapus semua %1 blok?", + "CLEAN_UP": "Bersihkan Blok", + "COLLAPSE_BLOCK": "Ciutkan Blok", + "COLLAPSE_ALL": "Ciutkan Blok", + "EXPAND_BLOCK": "Kembangkan Blok", + "EXPAND_ALL": "Kembangkan Blok", + "DISABLE_BLOCK": "Nonaktifkan Blok", + "ENABLE_BLOCK": "Aktifkan Blok", + "HELP": "Bantuan", + "UNDO": "Urungkan", + "REDO": "Lakukan ulang", + "CHANGE_VALUE_TITLE": "Ubah nilai:", + "RENAME_VARIABLE": "Ubah nama variabel...", + "RENAME_VARIABLE_TITLE": "Ubah nama semua variabel '%1' menjadi:", + "NEW_VARIABLE": "Buat variabel...", + "NEW_VARIABLE_TITLE": "Nama variabel baru:", + "VARIABLE_ALREADY_EXISTS": "Sebuah variabel dengan nama '%1' sudah ada.", + "DELETE_VARIABLE_CONFIRMATION": "Hapus %1 yang digunakan pada variabel '%2'?", + "DELETE_VARIABLE": "Hapus variabel '%1'", + "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": "campur", + "COLOUR_BLEND_COLOUR1": "warna 1", + "COLOUR_BLEND_COLOUR2": "warna 2", + "COLOUR_BLEND_RATIO": "rasio", + "COLOUR_BLEND_TOOLTIP": "Campur 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": "Selagi nilainya benar, maka lakukan beberapa perintah.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Selagi nilainya salah, 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 perulangan berikutnya", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Keluar dari perulangan.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Abaikan sisa dari perulangan ini, dan lanjutkan dengan langkah berikutnya.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Peringatan: Blok ini hanya dapat digunakan dalam perulangan.", + "CONTROLS_IF_TOOLTIP_1": "Jika nilainya benar, maka lakukan beberapa perintah.", + "CONTROLS_IF_TOOLTIP_2": "Jika nilainya benar, maka kerjakan perintah blok pertama. Jika tidak, kerjakan perintah blok kedua.", + "CONTROLS_IF_TOOLTIP_3": "Jika nilai pertama benar, maka kerjakan perintah blok pertama. Sebaliknya, jika nilai kedua benar, kerjakan perintah blok kedua.", + "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.", + "CONTROLS_IF_MSG_IF": "jika", + "CONTROLS_IF_MSG_ELSEIF": "atau jika", + "CONTROLS_IF_MSG_ELSE": "lainnya", + "CONTROLS_IF_IF_TOOLTIP": "Tambahkan, hapus, atau susun kembali bagian untuk mengkonfigurasi blok IF ini.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Tambahkan prasyarat ke dalam blok IF.", + "CONTROLS_IF_ELSE_TOOLTIP": "Terakhir, tambahkan kondisi tangkap-semua kedalam blok IF.", + "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", + "LOGIC_COMPARE_TOOLTIP_EQ": "Kembalikan benar jika kedua input sama satu dengan lainnya.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Kembalikan benar jika kedua input tidak sama satu dengan lainnya.", + "LOGIC_COMPARE_TOOLTIP_LT": "Kembalikan benar jika input pertama lebih kecil dari input kedua.", + "LOGIC_COMPARE_TOOLTIP_LTE": "Kembalikan benar jika input pertama lebih kecil atau sama dengan input kedua .", + "LOGIC_COMPARE_TOOLTIP_GT": "Kembalikan benar jika input pertama lebih besar dari input kedua.", + "LOGIC_COMPARE_TOOLTIP_GTE": "Kembalikan benar jika input pertama lebih besar dari atau sama dengan input kedua.", + "LOGIC_OPERATION_TOOLTIP_AND": "Kembalikan benar jika kedua input adalah benar.", + "LOGIC_OPERATION_AND": "dan", + "LOGIC_OPERATION_TOOLTIP_OR": "Kembalikan benar jika minimal satu input nilainya benar.", + "LOGIC_OPERATION_OR": "atau", + "LOGIC_NEGATE_TITLE": "bukan (not) %1", + "LOGIC_NEGATE_TOOLTIP": "Kembalikan benar jika input salah. Kembalikan salah jika input benar.", + "LOGIC_BOOLEAN_TRUE": "benar", + "LOGIC_BOOLEAN_FALSE": "salah", + "LOGIC_BOOLEAN_TOOLTIP": "Kembalikan benar atau salah.", + "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", + "LOGIC_NULL": "null", + "LOGIC_NULL_TOOLTIP": "Kembalikan null.", + "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", + "LOGIC_TERNARY_CONDITION": "test", + "LOGIC_TERNARY_IF_TRUE": "jika benar", + "LOGIC_TERNARY_IF_FALSE": "jika salah", + "LOGIC_TERNARY_TOOLTIP": "Periksa kondisi di 'test'. Jika kondisi benar, kembalikan nilai 'if true'; jika sebaliknya kembalikan nilai 'if false'.", + "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 cosinus dari derajat (bukan radian).", + "MATH_TRIG_TOOLTIP_TAN": "Kembalikan tangen dari derajat (bukan 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": "dapat dibagi oleh", + "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.", + "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": "membulatkan keatas", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "membulatkan kebawah", + "MATH_ONLIST_OPERATOR_SUM": "jumlah dari list", + "MATH_ONLIST_TOOLTIP_SUM": "Kembalikan jumlah dari seluruh bilangan dari list.", + "MATH_ONLIST_OPERATOR_MIN": "minimum dari list", + "MATH_ONLIST_TOOLTIP_MIN": "Kembalikan angka terkecil dari list.", + "MATH_ONLIST_OPERATOR_MAX": "maksimum dari list", + "MATH_ONLIST_TOOLTIP_MAX": "Kembalikan angka terbesar dari list.", + "MATH_ONLIST_OPERATOR_AVERAGE": "rata-rata dari list", + "MATH_ONLIST_TOOLTIP_AVERAGE": "Kembalikan rata-rata (mean aritmetik) dari nilai numerik dari list.", + "MATH_ONLIST_OPERATOR_MEDIAN": "median dari list", + "MATH_ONLIST_TOOLTIP_MEDIAN": "Kembalikan median dari list.", + "MATH_ONLIST_OPERATOR_MODE": "mode-mode dari list", + "MATH_ONLIST_TOOLTIP_MODE": "Kembalikan list berisi item yang paling umum dari dalam list.", + "MATH_ONLIST_OPERATOR_STD_DEV": "deviasi standar dari list", + "MATH_ONLIST_TOOLTIP_STD_DEV": "Kembalikan standard deviasi dari list.", + "MATH_ONLIST_OPERATOR_RANDOM": "item acak dari list", + "MATH_ONLIST_TOOLTIP_RANDOM": "Kembalikan elemen acak dari list.", + "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", + "MATH_MODULO_TITLE": "sisa dari %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": "Kembalikan 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": "Kembalikan nilai pecahan acak antara 0.0 (inklusif) dan 1.0 (eksklusif).", + "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_TITLE": "untuk %1 tambahkan teks %2", + "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 jika teks yang disediakan kosong.", + "TEXT_INDEXOF_TOOLTIP": "Kembalikan indeks pertama dan terakhir dari kejadian pertama/terakhir dari teks pertama dalam teks kedua. Kembalikan %1 jika teks tidak ditemukan.", + "TEXT_INDEXOF_TITLE": "dalam teks %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "temukan kejadian pertama dalam teks", + "TEXT_INDEXOF_OPERATOR_LAST": "temukan kejadian terakhir 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": "Kembalikan 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": "Kembalikan list, dengan panjang 0, tidak berisi data", + "LISTS_CREATE_WITH_TOOLTIP": "Buat sebuah list dengan sejumlah item.", + "LISTS_CREATE_WITH_INPUT_WITH": "buat list dengan", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "list", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Tambahkan, hapus, atau susun ulang bagian untuk mengkonfigurasi blok list ini.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Tambahkan sebuah item ke list.", + "LISTS_REPEAT_TOOLTIP": "Buat sebuah list yang terdiri dari nilai yang diberikan diulang sebanyak jumlah yang ditentukan.", + "LISTS_REPEAT_TITLE": "buat list dengan item %1 diulang %2 kali", + "LISTS_LENGTH_TITLE": "panjang dari %1", + "LISTS_LENGTH_TOOLTIP": "Kembalikan panjang list.", + "LISTS_ISEMPTY_TITLE": "%1 kosong", + "LISTS_ISEMPTY_TOOLTIP": "Kembalikan benar jika list kosong.", + "LISTS_INLIST": "dalam list", + "LISTS_INDEX_OF_FIRST": "cari kejadian pertama item", + "LISTS_INDEX_OF_LAST": "cari kejadian terakhir item", + "LISTS_INDEX_OF_TOOLTIP": "Kembalikan indeks dari item pertama/terakhir kali muncul dalam list. Kembalikan %1 jika item 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_INDEX_FROM_START_TOOLTIP": "%1 adalah item pertama.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 adalah item terakhir.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Kembalikan item di posisi tertentu dalam list.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Kembalikan item pertama dalam list.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Kembalikan item terakhir dalam list.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Kembalikan item acak dalam list.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Hapus dan kembalikan item di posisi tertentu dalam list.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Hapus dan kembalikan item pertama dalam list.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Hapus dan kembalikan item terakhir dalam list.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Hapus dan kembalikan item acak dalam list.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Hapus item di posisi tertentu dalam list.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Hapus item pertama dalam list.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Hapus item terakhir dalam list.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Hapus sebuah item 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": "Tetapkan item ke dalam posisi yang telah ditentukan di dalam list.", + "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": "Sisipkan item ke dalam posisi yang telah ditentukan di dalam list.", + "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 sub-list dari #", + "LISTS_GET_SUBLIST_START_FROM_END": "dapatkan sub-list dari nomor # dari akhir", + "LISTS_GET_SUBLIST_START_FIRST": "dapatkan sub-list dari pertama", + "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": "Buat salinan bagian tertentu dari list.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "urutkan %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Urutkan salinan dari daftar", + "LISTS_SORT_ORDER_ASCENDING": "menaik", + "LISTS_SORT_ORDER_DESCENDING": "menurun", + "LISTS_SORT_TYPE_NUMERIC": "sesuai nomor", + "LISTS_SORT_TYPE_TEXT": "sesuai abjad", + "LISTS_SORT_TYPE_IGNORECASE": "sesuai abjad, abaikan kasus", + "LISTS_SPLIT_LIST_FROM_TEXT": "buat list dari teks", + "LISTS_SPLIT_TEXT_FROM_LIST": "buat teks dari list", + "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": "Kembalikan nilai variabel ini.", + "VARIABLES_GET_CREATE_SET": "Buat 'set %1'", + "VARIABLES_SET": "tetapkan %1 untuk %2", + "VARIABLES_SET_TOOLTIP": "tetapkan variabel ini dengan input yang sama.", + "VARIABLES_SET_CREATE_GET": "Buat 'get %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": "Buat sebuah fungsi tanpa output.", + "PROCEDURES_DEFNORETURN_COMMENT": "Jelaskan fungsi ini...", + "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_DEFRETURN_RETURN": "kembali", + "PROCEDURES_DEFRETURN_TOOLTIP": "Buat 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/js/msg/json/ig.json b/js/msg/json/ig.json new file mode 100644 index 0000000..7f4fc2b --- /dev/null +++ b/js/msg/json/ig.json @@ -0,0 +1,343 @@ +{ + "@metadata": { + "authors": [ + "Mapmeld", + "Ukabia" + ] + }, + "VARIABLES_DEFAULT_NAME": "ihe", + "TODAY": "Taa", + "DUPLICATE_BLOCK": "Ntụgharị", + "ADD_COMMENT": "Tịnye okwu", + "REMOVE_COMMENT": "Wepu okwu", + "DUPLICATE_COMMENT": "Tụgharịa okwu", + "EXTERNAL_INPUTS": "Ntinye Mpụta", + "INLINE_INPUTS": "Ntinye N'ahịrị", + "DELETE_BLOCK": "Kpochapụ Ngọngọ", + "DELETE_X_BLOCKS": "Kpochapụ %1 Ngọngọ", + "DELETE_ALL_BLOCKS": "Mkpọchi %1 ngọngọ niile?", + "CLEAN_UP": "Hichapụ ngọngọ", + "COLLAPSE_BLOCK": "Kwada Ngọngọ", + "COLLAPSE_ALL": "Kwada Ngọngọ", + "EXPAND_BLOCK": "Gbasaa Ngọngọ", + "EXPAND_ALL": "Gbasaa Ngọngọ", + "DISABLE_BLOCK": "Gbanyụọ Ngọngọ", + "ENABLE_BLOCK": "Gbanye Ngọngọ", + "HELP": "Enyemaka", + "UNDO": "Me la àzụ", + "REDO": "Megharịa", + "CHANGE_VALUE_TITLE": "Gbanwee akara:", + "RENAME_VARIABLE": "Nyegharịa agbanwe aha...", + "RENAME_VARIABLE_TITLE": "Nyegharịa agbanwe '%1' nille ga:", + "NEW_VARIABLE": "Mepụta agbanwe...", + "NEW_STRING_VARIABLE": "Mepụta njikọ agbanwe...", + "NEW_NUMBER_VARIABLE": "Mepụta nọmba agbanwe...", + "NEW_COLOUR_VARIABLE": "Mepụta agba agbanwe...", + "NEW_VARIABLE_TYPE_TITLE": "Ụdị agbanwe ọhụụ:", + "NEW_VARIABLE_TITLE": "Aha agbanwe ọhụụ:", + "VARIABLE_ALREADY_EXISTS": "Agbanwe akpọrọ '%1' dị adị.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Agbanwe akpọrọ '%1' dị adị na ụdị ozo: '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Kpochapụ %1 ojịjị nke agbanwe '%2'?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Agaghị ekpochapụlị agbanwe '%1' maka nsonye ya na nkọwa nke ọrụ ahụ '%2'", + "DELETE_VARIABLE": "Kpochapụ agbanwe ‘%1' ahu", + "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", + "COLOUR_PICKER_TOOLTIP": "Họrọ agba site na palette.", + "COLOUR_RANDOM_TITLE": "agba ọbụla", + "COLOUR_RANDOM_TOOLTIP": "Họrọ agba na-nke ọbụla.", + "COLOUR_RGB_TITLE": "agba ya na", + "COLOUR_RGB_RED": "uhie", + "COLOUR_RGB_GREEN": "akwụkwọ ndụ", + "COLOUR_RGB_BLUE": "bluu", + "COLOUR_RGB_TOOLTIP": "Mepụta agba nwere ọnụ ọgụgụ kpọmkwem nke agba uhie, akwụkwọ ndụ, na akara niile ga-adịrịrị n'etiti 0 rụọ 100.", + "COLOUR_BLEND_TITLE": "ngwakọta", + "COLOUR_BLEND_COLOUR1": "agba 1", + "COLOUR_BLEND_COLOUR2": "agba 2", + "COLOUR_BLEND_RATIO": "oke", + "COLOUR_BLEND_TOOLTIP": "Na ngwakọta agba abụọ ọnụ na na oke enyere (0.0 - 1.0).", + "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", + "CONTROLS_REPEAT_TITLE": "meghachi ụgbọ %1", + "CONTROLS_REPEAT_INPUT_DO": "mee", + "CONTROLS_REPEAT_TOOLTIP": "Mee ụfọdụ okwu ọtụtụ ugboro.", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "megharịa mgbe", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "megharịa tụpụ", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Ọ bụ ebe akara bụ ezịọkwụ, megharịa ụfọdụ koodu.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Ọ bụ ebe akara bụ ụgha, megharịa ụfọdụ koodu.", + "CONTROLS_FOR_TOOLTIP": "Nwere ngwakọta '%1' na akara ọbụla sịte na mbịdo ọnụọgụgụ rụọ na ngwụcha ọnụọgụgụ, na-ngụta sịtere na nkeji oge kpọmkwem. megharịa koodu oge ọbụla:", + "CONTROLS_FOR_TITLE": "gụọ na %1 site na %2 rụọ %3 tupu %4", + "CONTROLS_FOREACH_TITLE": "maka ihe ọ bụla %1 n'ime ndepụta %2", + "CONTROLS_FOREACH_TOOLTIP": "Maka ihe ọ bụla n'ime ndepụta, debe agbanwe '%1' na ihe ahụ, wee degharịa ụfọdụ koodu.", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "gbapuo na meghachi a", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "malite na nsoghari nke meghachi ozo", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Gba puo na gburugburu nke ọdị n’ime ya.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Wụọ mkpụchị meghachi ndị a fọdụrụ, ma gaa n'ihu na nsoghari nke aka.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Ịdọ aka ná ntị: Enwere ike iji ngọngọ a naanị n'ime meghachi.", + "CONTROLS_IF_TOOLTIP_1": "Ọ bụrụ na akara bụ ezịọkwụ, mezie ụfọdụ okwu.", + "CONTROLS_IF_TOOLTIP_2": "Ọ bụrụ na akara bụ ezịọkwụ, mezie ngọngọ mbụ nke okwu. Ma ọ bụghị ya, mezie ngọngọ nke abụọ nke okwu.", + "CONTROLS_IF_TOOLTIP_3": "Ọ bụrụ na akara mbụ bụ ezịọkwụ, mezie ngọngọ mbụ nke okwu. Ma ọ bụghị ya, ọ bụrụ na akara nke abụọ bụ ezịọkwụ, mee ngọngọ nke abụọ nke okwu.", + "CONTROLS_IF_TOOLTIP_4": "Ọ bụrụ na akara mbụ bụ ezịọkwụ, mezie ngọngọ mbụ nke okwu. Ma ọ bụghị ya, ọ bụrụ na akara nke abụọ bụ ezịọkwụ, mee ngọngọ nke abụọ nke okwu. Ọ bụrụ na onweghị akara bụ ezịọkwụ, mee ngọngọ okwu ikpeazụ.", + "CONTROLS_IF_MSG_IF": "ọ bụrụ", + "CONTROLS_IF_MSG_ELSEIF": "ọzọ ma ọ bụrụ", + "CONTROLS_IF_MSG_ELSE": "ọzọ", + "CONTROLS_IF_IF_TOOLTIP": "Tinye, wepu, ma ọ bụ megharia ngalaba iji haziearịa nke a ma ọ bụrụ na ngọngọ.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Tinye ọnọdụ na ngọngọ ma ọ bụrụ.", + "CONTROLS_IF_ELSE_TOOLTIP": "Tinye ngwucha, ọnọdụ jide-niile na ngọngọ ma ọ bụrụ.", + "IOS_OK": "Ọ DỊ MMA", + "IOS_CANCEL": "Hapụ̀", + "IOS_ERROR": "Njehie", + "IOS_PROCEDURES_INPUTS": "NTINYE", + "IOS_PROCEDURES_ADD_INPUT": "+ Tinye ntinye", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Kwe ka okwu", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Ọrụ a nwere ọnụọgụ abụọ.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Tinye agbanwe", + "IOS_VARIABLES_ADD_BUTTON": "Tinye", + "IOS_VARIABLES_RENAME_BUTTON": "Nyegharịa aha", + "IOS_VARIABLES_DELETE_BUTTON": "Kpochapụ", + "IOS_VARIABLES_VARIABLE_NAME": "Aha agbanwe", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Ị nweghị ike iji aha agbanwe dị n’efu.", + "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", + "LOGIC_COMPARE_TOOLTIP_EQ": "Weghachi ezịọkwụ ma ọ bụrụ na ntinye hatara onwe ha.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Weghachi ezịọkwụ ma ọ bụrụ na ntinye aghataghị onwe ha.", + "LOGIC_COMPARE_TOOLTIP_LT": "Weghachi ezịọkwụ ma ọ bụrụ na ntinye mbu dị obere karia ntinye nke abụọ.", + "LOGIC_COMPARE_TOOLTIP_LTE": "Weghachi ezịọkwụ ma ọ bụrụ na ntinye mbu dị obere karia ma ọ bụ hatara ntinye nke abụọ.", + "LOGIC_COMPARE_TOOLTIP_GT": "Weghachi ezịọkwụ ma ọ bụrụ na ntinye mbu dị ụkwụụ karia ntinye nke abụọ.", + "LOGIC_COMPARE_TOOLTIP_GTE": "Weghachi ezịọkwụ ma ọ bụrụ na ntinye mbu dị ụkwụụ karia ma ọ bụ hatara ntinye nke abụọ.", + "LOGIC_OPERATION_TOOLTIP_AND": "Weghachi ezịọkwụ ma ọ bụrụ na ntinye abụọ a bụ ezịọkwụ.", + "LOGIC_OPERATION_AND": "ma", + "LOGIC_OPERATION_TOOLTIP_OR": "Weghachi ezịọkwụ ma ọ bụrụ na ọdịkarịa ala otu n’ime ntinye a bụ ezịọkwụ.", + "LOGIC_OPERATION_OR": "ma ọ bụrụ", + "LOGIC_NEGATE_TITLE": "ma ọ bụghị %1", + "LOGIC_NEGATE_TOOLTIP": "Weghachitere ezịọkwụ ma ọ bụrụ na ntinye bụ ụgha. Weghachitere ụgha ma ọ bụrụ na ntinye bụ ezịọkwụ.", + "LOGIC_BOOLEAN_TRUE": "ezịọkwụ", + "LOGIC_BOOLEAN_FALSE": "ụgha", + "LOGIC_BOOLEAN_TOOLTIP": "Weghachitere ezịọkwụ ma ọ bụ ụgha.", + "LOGIC_NULL": "null", + "LOGIC_NULL_TOOLTIP": "Weghachitere nkịtị.", + "LOGIC_TERNARY_CONDITION": "ule", + "LOGIC_TERNARY_IF_TRUE": "ọ bụrụ na eziokwu", + "LOGIC_TERNARY_IF_FALSE": "ọ bụrụ ụgha", + "LOGIC_TERNARY_TOOLTIP": "Lelee ọnọdụ na 'ule'. Ọ bụrụ na ọnọdụ ahụ bụ eziokwu, weghachitere akara 'ọ bụrụ na eziokwu’; ma ọ bụghị ya weghachitere akara 'ọ bụrụ ụgha'.", + "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", + "MATH_NUMBER_TOOLTIP": "Ọnụọgụgụ.", + "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", + "MATH_ARITHMETIC_TOOLTIP_ADD": "Weghachite ngụkọ ọnụ ọgụgụ abụọ ahụ.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "Weghachite nwepụ ọnụ ọgụgụ abụọ ahụ.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Weghachite mụbaa ọnụ ọgụgụ abụọ ahụ.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Weghachite kwenye ọnụ ọgụgụ abụọ ahụ.", + "MATH_ARITHMETIC_TOOLTIP_POWER": "Weghachite nọmba mbu nke emeturu ike nke nọmba nke abụọ.", + "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", + "MATH_SINGLE_OP_ROOT": "Isi ngụkọ", + "MATH_SINGLE_TOOLTIP_ROOT": "Weghachite Isi ngụkọ nke nọmba.", + "MATH_SINGLE_OP_ABSOLUTE": "ozụzụ", + "MATH_SINGLE_TOOLTIP_ABS": "Weghachite akara ozụzụ nke nọmba.", + "MATH_SINGLE_TOOLTIP_NEG": "Weghachite njụ nke nọmba.", + "MATH_SINGLE_TOOLTIP_LN": "Weghachite lọgarịdịm nke di na nọmba.", + "MATH_SINGLE_TOOLTIP_LOG10": "Weghachite isi lọgarịdịm 10 nke nọmba.", + "MATH_SINGLE_TOOLTIP_EXP": "Weghachite na ike nke nọmba.", + "MATH_SINGLE_TOOLTIP_POW10": "Weghachite 10 na ike nke nọmba.", + "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", + "MATH_TRIG_TOOLTIP_SIN": "Weghachite saịn nke ogo (ọ bụghị redian).", + "MATH_TRIG_TOOLTIP_COS": "Weghachite kosaịn nke ogo (ọ bụghị redian).", + "MATH_TRIG_TOOLTIP_TAN": "Weghachite tanjentị nke ogo (ọ bụghị redian).", + "MATH_TRIG_TOOLTIP_ASIN": "Weghachite aksaịn nke nọmba.", + "MATH_TRIG_TOOLTIP_ACOS": "Weghachite akosaịn nke nọmba.", + "MATH_TRIG_TOOLTIP_ATAN": "Weghachite aktanjentị nke nọmba.", + "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", + "MATH_CONSTANT_TOOLTIP": "Weghachite otu n'ime kọnstant ndị nkịtị: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity).", + "MATH_IS_EVEN": "bụ ịvụn", + "MATH_IS_ODD": "bụ ọd", + "MATH_IS_PRIME": "bụ praim", + "MATH_IS_WHOLE": "zuru ezu", + "MATH_IS_POSITIVE": "bu posịtịf", + "MATH_IS_NEGATIVE": "bụ negetịf", + "MATH_IS_DIVISIBLE_BY": "ga ekenwụ", + "MATH_IS_TOOLTIP": "Tụlee ma nọmba ọ bụ ịvụn, ọd, praim, zuru ezu, posịtịf, negetịf, ma e nwere nọmba ga ekenwu ya. Weghachitere eziokwu ma ọ bụ ụgha.", + "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", + "MATH_CHANGE_TITLE": "gbanwee %1 site na %2", + "MATH_CHANGE_TOOLTIP": "Tinye nọmba na agbanwe '%1'.", + "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", + "MATH_ROUND_TOOLTIP": "Gbaago nọmba n'elu ma ọ bụ ala.", + "MATH_ROUND_OPERATOR_ROUND": "gbaarịa", + "MATH_ROUND_OPERATOR_ROUNDUP": "gbaago elu", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "gbatụọ ala", + "MATH_ONLIST_OPERATOR_SUM": "nchịkọta nke ndepụta", + "MATH_ONLIST_TOOLTIP_SUM": "Weghachite nchịkọta nke nọmba niile na ndepụta.", + "MATH_ONLIST_OPERATOR_MIN": "opekempe nke ndepụta", + "MATH_ONLIST_TOOLTIP_MIN": "Weghachite nọmba kacha obere na ndepụta.", + "MATH_ONLIST_OPERATOR_MAX": "ọkacha ukwuu nke ndepụta", + "MATH_ONLIST_TOOLTIP_MAX": "Weghachite nọmba kacha ukwuu na ndepụta.", + "MATH_ONLIST_OPERATOR_AVERAGE": "agbaetiti nke ndepụta", + "MATH_ONLIST_TOOLTIP_AVERAGE": "Weghachite agbaetiti (nchịkọta mpụta) nke akara ọnụọgụ na ndepụta.", + "MATH_ONLIST_OPERATOR_MEDIAN": "etiti nke ndepụta", + "MATH_ONLIST_TOOLTIP_MEDIAN": "Weghachite nọmba agbaetiti na ndepụta.", + "MATH_ONLIST_OPERATOR_MODE": "ụdị ndepụta", + "MATH_ONLIST_TOOLTIP_MODE": "Weghachite ndepụta nke nke ihe kachasị mkpa na ndepụta.", + "MATH_ONLIST_OPERATOR_STD_DEV": "ntughari usoro nke ndepụta", + "MATH_ONLIST_TOOLTIP_STD_DEV": "Weghachite ntughari usoro nke ndepụta.", + "MATH_ONLIST_OPERATOR_RANDOM": "Ihe ọbụla nke ndepụta", + "MATH_ONLIST_TOOLTIP_RANDOM": "Weghachite Ihe ọbụla site na ndepụta.", + "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", + "MATH_MODULO_TITLE": "ihe fọdụrụ nke %1 ÷ %2", + "MATH_MODULO_TOOLTIP": "Weghachite ihe fọdụrụ site na nkewa nọmba abụọ.", + "MATH_CONSTRAIN_TITLE": "gbochịe %1 ala %2 elu %3", + "MATH_CONSTRAIN_TOOLTIP": "Gbochịe ọnụọgụgụ dị n'etiti nọmba dị oke ala na nọmba dị oke elu (gụnyere).", + "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_INT_TITLE": "ọnụọgụgụ ọbụla site na %1 rụọ %2", + "MATH_RANDOM_INT_TOOLTIP": "Weghachite ọnụọgụgụ ọbụla dị n'etiti ihe abụọ a kapịrị ọnụ, agụnyere.", + "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "nkewa ọbụla", + "MATH_RANDOM_FLOAT_TOOLTIP": "Weghachite ọnụọgụgụ ọbụla dị n'etiti 0.0 (gụnyere) na 1.0 (agụnyeghị).", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 nke X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "Weghachite aktanjentị nke isi (X, Y) na ogo site na -180 rụọ 180.", + "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", + "TEXT_TEXT_TOOLTIP": "Akwụkwọ ozi, okwu, ma ọ bụ akara ederede.", + "TEXT_JOIN_TITLE_CREATEWITH": "mepụta ederede na", + "TEXT_JOIN_TOOLTIP": "Mepụta otu ederede site na ijikọta ọnụ ọgụgụ ihe ọ bụla.", + "TEXT_CREATE_JOIN_TITLE_JOIN": "jikọta", + "TEXT_CREATE_JOIN_TOOLTIP": "Tinye, wepu, ma ọ bụ megharia ngalaba iji haziearia ngọngọ ederede a.", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Tinye ihe na ederede.", + "TEXT_APPEND_TITLE": "iji %1 tinye ederede %2", + "TEXT_APPEND_TOOLTIP": "Tinye ederede na mgbanwee '%1'.", + "TEXT_LENGTH_TITLE": "ogologo nke %1", + "TEXT_LENGTH_TOOLTIP": "Weghachitere nọmba nke akwụkwọ ozi (gụnyere oghere) na ederede enyere.", + "TEXT_ISEMPTY_TITLE": "%1 di n’efu", + "TEXT_ISEMPTY_TOOLTIP": "Weghachitere ezịọkwụ ma ọ bụrụ na ederede enyere di n’efu.", + "TEXT_INDEXOF_TOOLTIP": "Weghachitere ntughari nke mbụ / nke ikpeazụ nke ihe dị na ndepụta. Weghachitere %1 ma ọ bụrụ na achọtaghị ihe.", + "TEXT_INDEXOF_TITLE": "chọta na ederede %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "chọta ihe omume mbu nke ederede", + "TEXT_INDEXOF_OPERATOR_LAST": "chọta ihe omume ikpeazụ nke ederede", + "TEXT_CHARAT_TITLE": "chọta na ederede %1 %2", + "TEXT_CHARAT_FROM_START": "nweta akwụkwọ ozi #", + "TEXT_CHARAT_FROM_END": "nweta akwụkwọ ozi # site na njedebe", + "TEXT_CHARAT_FIRST": "nweta akwụkwọ ozi mbu", + "TEXT_CHARAT_LAST": "nweta akwụkwọ ozi ikpeazụ", + "TEXT_CHARAT_RANDOM": "nweta akwụkwọ ozi ọbụla", + "TEXT_CHARAT_TOOLTIP": "Weghachite akwụkwọ ozi ahụ na ọnọdụ a kapịrị ọnụ.", + "TEXT_GET_SUBSTRING_TOOLTIP": "Weghachite akụkụ nke akọwapụtara ederede.", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "chọta na ederede", + "TEXT_GET_SUBSTRING_START_FROM_START": "nweta njịkọ-ala na akwụkwọ ozi #", + "TEXT_GET_SUBSTRING_START_FROM_END": "nweta njịkọ-ala na akwụkwọ ozi # site na njedebe", + "TEXT_GET_SUBSTRING_START_FIRST": "nweta njịkọ-ala na akwụkwọ ozi mbu", + "TEXT_GET_SUBSTRING_END_FROM_START": "na akwụkwọ ozi #", + "TEXT_GET_SUBSTRING_END_FROM_END": "na akwụkwọ ozi # site na njedebe", + "TEXT_GET_SUBSTRING_END_LAST": "na leta ikpeazụ", + "TEXT_CHANGECASE_TOOLTIP": "AA <-> aa", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "na AHỊRỊ ELU", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "na ahịrị elu", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "na Aha Ahịrị", + "TEXT_TRIM_TOOLTIP": "Weghachite otu ederede ya na oghere ọzọ wepụrụ site n'otu ma ọ bụ akụkụ mechị abụọ.", + "TEXT_TRIM_OPERATOR_BOTH": "belata oghere dị mkpụmkpụ si n'akụkụ abụọ nke", + "TEXT_TRIM_OPERATOR_LEFT": "belata oghere dị mkpụmkpụ si n'akụkụ aka ịkpa nke", + "TEXT_TRIM_OPERATOR_RIGHT": "belata oghere dị mkpụmkpụ si n'akụkụ aka nrị nke", + "TEXT_PRINT_TITLE": "bipụta %1", + "TEXT_PRINT_TOOLTIP": "Bipụta ederede a kapịrị ọnụ, nọmba ma ọ bụ akara ọzọ.", + "TEXT_PROMPT_TYPE_TEXT": "Mepụta ngwa maka iji ederede na ozi", + "TEXT_PROMPT_TYPE_NUMBER": "Mepụta ngwa maka maka nọmba na ozi", + "TEXT_PROMPT_TOOLTIP_NUMBER": "Mepụta ngwa onye ọrụ maka nọmba.", + "TEXT_PROMPT_TOOLTIP_TEXT": "Mepụta ngwa onye ọrụ maka ederede.", + "TEXT_COUNT_MESSAGE0": "gụọ %1 n’ime %2", + "TEXT_COUNT_TOOLTIP": "Gụọ ugboro ole ụfọdụ ederede na’apụta n’ụfọdụ ederede ọzọ.", + "TEXT_REPLACE_MESSAGE0": "dochie %1 na %2 n’ime %3", + "TEXT_REPLACE_TOOLTIP": "Dochie ihe omuma nke ederede ufodu n'ime ufodu ederede ozo.", + "TEXT_REVERSE_MESSAGE0": "gbanwe %1", + "TEXT_REVERSE_TOOLTIP": "Na-agbanwe iwu nke ndị odide na ederede.", + "LISTS_CREATE_EMPTY_TITLE": "mepụta ndepụta efu", + "LISTS_CREATE_EMPTY_TOOLTIP": "Weghachite ndepụta, nke ogologo 0, nke enweghị ndekọ data", + "LISTS_CREATE_WITH_TOOLTIP": "Mepụta ndepụta na nọmba ọ bụla.", + "LISTS_CREATE_WITH_INPUT_WITH": "mepụta ndepụta", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "ndepụta", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Tinye, wepu, ma ọ bụ megharia ngalaba iji haziearia ngọngọ ederede a.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Tinye ihe na ndepụta.", + "LISTS_REPEAT_TOOLTIP": "Na-emepụta listi ndepụta gụnyere akara a nyere ya ugboro ugboro.", + "LISTS_REPEAT_TITLE": "mepụta ndepụta na ihe %1 emegharịrị ugboro %2", + "LISTS_LENGTH_TITLE": "ogo nke %1", + "LISTS_LENGTH_TOOLTIP": "Weghachite ogo nke ndepụta.", + "LISTS_ISEMPTY_TITLE": "%1 ghe oghe", + "LISTS_ISEMPTY_TOOLTIP": "Weghachite eziokwu ma ọ bụrụ na ndepụta ahụ dị n’efu.", + "LISTS_INLIST": "n’ime ndepụta", + "LISTS_INDEX_OF_FIRST": "chọta ihe mbu nke ihe", + "LISTS_INDEX_OF_LAST": "chọta ihe ikpeazụ nke ihe", + "LISTS_INDEX_OF_TOOLTIP": "Weghachitere ntughari nke mbụ / nke ikpeazụ nke ihe dị na ndepụta. Weghachitere %1 ma ọ bụrụ na achọtaghị ihe.", + "LISTS_GET_INDEX_GET": "nweta", + "LISTS_GET_INDEX_GET_REMOVE": "nweta ma wepu", + "LISTS_GET_INDEX_REMOVE": "wepu", + "LISTS_GET_INDEX_FROM_END": "# site na njedebe", + "LISTS_GET_INDEX_FIRST": "mbu", + "LISTS_GET_INDEX_LAST": "ikpeazụ", + "LISTS_GET_INDEX_RANDOM": "nke ọ bụla", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 bụ ihe mbụ.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 bụ ihe ikpeazụ.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Weghachitere ihe na ọnọdụ a kapịrị ọnụ na ndepụta.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Weghachitere ihe mbụ n'ime ndepụta.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Weghachitere ihe ikpeazụ n'ime ndepụta.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Weghachitere ihe ọbụla n'ime ndepụta.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Wepu ma weghachite ihe na ọnọdụ a kapịrị ọnụ na ndepụta.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Wepu ma weghachite ihe mbu na ndepụta.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Wepu ma weghachite ihe ikpeazụ n'ime ndepụta.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Wepu ma weghachite ihe ọbụla n'ime ndepụta.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Wepu ihe ahụ na ọnọdụ a kapịrị ọnụ na ndepụta.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Wepu ihe mbụ n'ime ndepụta.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Wepu ihe ikpeazụ n'ime ndepụta.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Wepu ihe ọbụla n'ime ndepụta.", + "LISTS_SET_INDEX_SET": "set", + "LISTS_SET_INDEX_INSERT": "tinye na", + "LISTS_SET_INDEX_INPUT_TO": "dị ka", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Debe ihe ahụ na ọnọdụ a kapịrị ọnụ na ndepụta.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Debe ihe mbụ n'ime ndepụta.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Debe ihe ikpeazụ n'ime ndepụta.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Debe ihe ọbụla n'ime ndepụta.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Na-etinye ihe na ọnọdụ a kapịrị ọnụ na ndepụta.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Na-etinye ihe ahụ na mmalite nke ndepụta.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Na-etinye ihe ahụ na ngwụcha nke ndepụta.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Na-etinye ihe ahụ na ebe ọbụla nke ndepụta.", + "LISTS_GET_SUBLIST_START_FROM_START": "nweta akụkụ ndepụta site na #", + "LISTS_GET_SUBLIST_START_FROM_END": "nweta akụkụ ndepụta site na # site na njedebe", + "LISTS_GET_SUBLIST_START_FIRST": "nweta akụkụ ndepụta site na mbịdo", + "LISTS_GET_SUBLIST_END_FROM_START": "rụọ #", + "LISTS_GET_SUBLIST_END_FROM_END": "rụọ # site na njedebe", + "LISTS_GET_SUBLIST_END_LAST": "rụọ na ngwụcha", + "LISTS_GET_SUBLIST_TOOLTIP": "Na-emepụta otu akụkụ a kapịrị ọnụ nke ndepụta.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "hazie %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Tọọ otu akụkụ ndepụta ahụ.", + "LISTS_SORT_ORDER_ASCENDING": "arịgo", + "LISTS_SORT_ORDER_DESCENDING": "agbada", + "LISTS_SORT_TYPE_NUMERIC": "nọmba", + "LISTS_SORT_TYPE_TEXT": "mkpụrụ edemede", + "LISTS_SORT_TYPE_IGNORECASE": "mkpụrụ edemede, leghara ọnọdụ anya", + "LISTS_SPLIT_LIST_FROM_TEXT": "mee ndepụta site na ederede", + "LISTS_SPLIT_TEXT_FROM_LIST": "mee ederede site na ndepụta", + "LISTS_SPLIT_WITH_DELIMITER": "na ihe nkewa", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Kewaa ederede n'ime ndepụta nke ederede, na-agbasa na ihe nkwea ọ bụla.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Jikọọ ndepụta nke ederede gaa na otu ederede, nke oihe nkewa kewara.", + "LISTS_REVERSE_MESSAGE0": "gbanwe %1", + "LISTS_REVERSE_TOOLTIP": "Tụgharịa otu akụkụ ndepụta.", + "VARIABLES_GET_TOOLTIP": "Weghachite akara nke agbanwe a.", + "VARIABLES_GET_CREATE_SET": "Mepụta 'dozie %1'", + "VARIABLES_SET": "dozie %1 ga na %2", + "VARIABLES_SET_TOOLTIP": "Debe mgbanwe a ka ọ ghata ihe ntinye.", + "VARIABLES_SET_CREATE_GET": "Mepụta 'nweta uru %1'", + "PROCEDURES_DEFNORETURN_TITLE": "ga na", + "PROCEDURES_DEFNORETURN_PROCEDURE": "megharịa", + "PROCEDURES_BEFORE_PARAMS": "na:", + "PROCEDURES_CALL_BEFORE_PARAMS": "na:", + "PROCEDURES_DEFNORETURN_TOOLTIP": "Na emepụta ọrụ na-enweghị mmepụta.", + "PROCEDURES_DEFNORETURN_COMMENT": "Kọwaa ọrụ a...", + "PROCEDURES_DEFRETURN_RETURN": "weghachite", + "PROCEDURES_DEFRETURN_TOOLTIP": "Na emepụta ọrụ nwere mmepụta.", + "PROCEDURES_ALLOW_STATEMENTS": "kwe ka okwu", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Ịdọ aka ná ntị: Ọrụ a nwere ọnụọgụ abụọ.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Gbaa ọrụ a kọwaa onye-ọrụ '%1'.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLRETURN_TOOLTIP": "Gbaa ọrụ a kọwaa onye-ọrụ '%1' ma jiri mmepụta ya.", + "PROCEDURES_MUTATORCONTAINER_TITLE": "ntinye", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Tinye, wepu, ma ọ bụ tugharịa ntinye na ọrụ a.", + "PROCEDURES_MUTATORARG_TITLE": "tinye aha:", + "PROCEDURES_MUTATORARG_TOOLTIP": "Tinye ntinye aka na ọrụ ahụ.", + "PROCEDURES_HIGHLIGHT_DEF": "Nkọwapụta njirimara ọrụ", + "PROCEDURES_CREATE_DO": "Mepụta '%1'", + "PROCEDURES_IFRETURN_TOOLTIP": "Weghachite akara nke agbanwe a.", + "PROCEDURES_IFRETURN_WARNING": "Ịdọ aka ná ntị: Ọrụ a nwere ọnụọgụ abụọ.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Kwuo ihe ọ bụla..." +} diff --git a/js/msg/json/is.json b/js/msg/json/is.json new file mode 100644 index 0000000..cbcd2ad --- /dev/null +++ b/js/msg/json/is.json @@ -0,0 +1,374 @@ +{ + "@metadata": { + "authors": [ + "Jonbg", + "아라", + "Gaddi00", + "Sveinki", + "Sveinn í Felli" + ] + }, + "VARIABLES_DEFAULT_NAME": "atriði", + "TODAY": "Í dag", + "DUPLICATE_BLOCK": "Afrita", + "ADD_COMMENT": "Skrifa skýringu", + "REMOVE_COMMENT": "Fjarlægja skýringu", + "DUPLICATE_COMMENT": "Tvítaka athugasemd", + "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?", + "CLEAN_UP": "Hreinsa kubba", + "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", + "UNDO": "Afturkalla", + "REDO": "Endurtaka", + "CHANGE_VALUE_TITLE": "Breyta gildi:", + "RENAME_VARIABLE": "Endurnefna breytu...", + "RENAME_VARIABLE_TITLE": "Endurnefna allar '%1' breyturnar:", + "NEW_VARIABLE": "Búa til breytu...", + "NEW_VARIABLE_TITLE": "Heiti nýrrar breytu:", + "VARIABLE_ALREADY_EXISTS": "Breyta með heitinu '%1' er þegar til staðar.", + "DELETE_VARIABLE": "Eyða '%1' breytunni", + "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 á tiltekna bilinu og gera tilteknu kubbana.", + "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.", + "IOS_OK": "Í lagi", + "IOS_CANCEL": "Hætta við", + "IOS_ERROR": "Villa", + "IOS_VARIABLES_ADD_VARIABLE": "+ Bæta við breytu", + "IOS_VARIABLES_ADD_BUTTON": "Bæta við", + "IOS_VARIABLES_RENAME_BUTTON": "Endurnefna", + "IOS_VARIABLES_DELETE_BUTTON": "Eyða", + "IOS_VARIABLES_VARIABLE_NAME": "Nafn breytu", + "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_TITLE": "við %1 bæta texta %2", + "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 %1 ef textinn finnst ekki.", + "TEXT_INDEXOF_TITLE": "í texta %1 %2 %3", + "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_TITLE": "í texta %1 %2", + "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.", + "TEXT_COUNT_MESSAGE0": "fjöldi %1 í %2", + "TEXT_REPLACE_MESSAGE0": "skipta %1 út með %2 í %3", + "TEXT_REVERSE_MESSAGE0": "snúa við %1", + "TEXT_REVERSE_TOOLTIP": "Snýr við röð stafanna í textanum.", + "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 %1 ef atriðið finnst ekki.", + "LISTS_GET_INDEX_GET": "sækja", + "LISTS_GET_INDEX_GET_REMOVE": "sækja og fjarlægja", + "LISTS_GET_INDEX_REMOVE": "fjarlægja", + "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_INDEX_FROM_START_TOOLTIP": "%1 er fyrsta atriðið.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 er síðasta atriðið.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Skilar atriðinu í hinum tiltekna stað í lista.", + "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": "Fjarlægir og skilar atriðinu á hinum tiltekna stað í lista.", + "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": "Fjarlægir atriðið á hinum tiltekna stað í lista.", + "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": "Setur atriðið í tiltekna sætið í listanum.", + "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": "Bætir atriðinu í listann á tilteknum stað.", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "raða %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Raða afriti lista.", + "LISTS_SORT_ORDER_ASCENDING": "hækkandi", + "LISTS_SORT_ORDER_DESCENDING": "lækkandi", + "LISTS_SORT_TYPE_NUMERIC": "í númeraröð", + "LISTS_SORT_TYPE_TEXT": "í stafrófsröð", + "LISTS_SORT_TYPE_IGNORECASE": "í stafrófsröð án tillits til stafstöðu", + "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.", + "LISTS_REVERSE_MESSAGE0": "snúa við %1", + "LISTS_REVERSE_TOOLTIP": "Snúa við afriti lista.", + "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_DEFNORETURN_COMMENT": "Lýstu þessari aðgerð/falli...", + "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/Subroutine", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Keyra heimatilbúna fallið '%1'.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "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_HELPURL": "http://c2.com/cgi/wiki?GuardClause", + "PROCEDURES_IFRETURN_WARNING": "Aðvörun: Þennan kubb má aðeins nota í skilgreiningu falls.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Segðu eitthvað..." +} diff --git a/js/msg/json/it.json b/js/msg/json/it.json new file mode 100644 index 0000000..2fe88f8 --- /dev/null +++ b/js/msg/json/it.json @@ -0,0 +1,358 @@ +{ + "@metadata": { + "authors": [ + "Beta16", + "Espertus", + "Nerimic", + "Gbonanome", + "Gianfranco", + "Federico Mugnaini", + "JackLantern", + "Selven", + "Samuele2002", + "Greis", + "Sarah Bernabei", + "Albe Albe 460" + ] + }, + "VARIABLES_DEFAULT_NAME": "elemento", + "UNNAMED_KEY": "senza nome", + "TODAY": "Oggi", + "DUPLICATE_BLOCK": "Duplica", + "ADD_COMMENT": "Aggiungi commento", + "REMOVE_COMMENT": "Rimuovi commento", + "DUPLICATE_COMMENT": "Duplica 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", + "UNDO": "Annulla", + "REDO": "Ripeti", + "CHANGE_VALUE_TITLE": "Modifica valore:", + "RENAME_VARIABLE": "Rinomina variabile...", + "RENAME_VARIABLE_TITLE": "Rinomina tutte le variabili '%1' in:", + "NEW_VARIABLE": "Crea variabile...", + "NEW_STRING_VARIABLE": "Crea variabile stringa...", + "NEW_NUMBER_VARIABLE": "Crea variabile numero...", + "NEW_COLOUR_VARIABLE": "Crea variabile colore...", + "NEW_VARIABLE_TYPE_TITLE": "Tipo della nuova variabile:", + "NEW_VARIABLE_TITLE": "Nome della nuova variabile:", + "VARIABLE_ALREADY_EXISTS": "Una variabile denominata '%1' esiste già.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Una variabile nominata '%1' esiste già per un'altro tipo: '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Cancella %1 usi della variabile '%2'?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Non si può cancellare la variabile '%1' perché è parte della definizione della funzione '%2'", + "DELETE_VARIABLE": "Cancella la variabile '%1'", + "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.", + "IOS_OK": "OK", + "IOS_CANCEL": "Annulla", + "IOS_ERROR": "Errore", + "IOS_PROCEDURES_INPUTS": "INPUTS", + "IOS_PROCEDURES_ADD_INPUT": "+ Aggiungi input", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Consenti dichiarazioni", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Questa funzione ha entrate duplicate.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Aggiungi variabile", + "IOS_VARIABLES_ADD_BUTTON": "Aggiungi", + "IOS_VARIABLES_RENAME_BUTTON": "Rinomina", + "IOS_VARIABLES_DELETE_BUTTON": "Cancella", + "IOS_VARIABLES_VARIABLE_NAME": "Nome variabile", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Non puoi utilizzare un nome di variabile vuoto.", + "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).", + "MATH_ATAN2_HELPURL": "https://it.wikipedia.org/wiki/Arcotangente2", + "MATH_ATAN2_TITLE": "atan2 di X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "Restituisce l'arcotangente del punto (X, Y) in gradi da -180 a 180.", + "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_TITLE": "a %1 aggiungi il testo %2", + "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 %1 se il testo non viene trovato.", + "TEXT_INDEXOF_TITLE": "nel testo %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "trova la prima occorrenza del testo", + "TEXT_INDEXOF_OPERATOR_LAST": "trova l'ultima occorrenza del testo", + "TEXT_CHARAT_TITLE": "nel testo %1 %2", + "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.", + "TEXT_COUNT_MESSAGE0": "conta %1 in %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Contare quante volte una parte di testo si ripete all'interno di qualche altro testo.", + "TEXT_REPLACE_MESSAGE0": "sostituisci %1 con %2 in %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "sostituisci tutte le occorrenze di un certo testo con qualche altro testo.", + "TEXT_REVERSE_MESSAGE0": "inverti %1", + "TEXT_REVERSE_TOOLTIP": "Inverte l'ordine dei caratteri nel testo.", + "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 %1 se l'elemento non viene trovato.", + "LISTS_GET_INDEX_GET": "prendi", + "LISTS_GET_INDEX_GET_REMOVE": "prendi e rimuovi", + "LISTS_GET_INDEX_REMOVE": "rimuovi", + "LISTS_GET_INDEX_FROM_END": "# dalla fine", + "LISTS_GET_INDEX_FIRST": "primo", + "LISTS_GET_INDEX_LAST": "ultimo", + "LISTS_GET_INDEX_RANDOM": "casuale", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 corrisponde al primo elemento.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 corrisponde all'ultimo elemento.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Restituisce l'elemento nella posizione indicata della lista.", + "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": "Rimuove e restituisce l'elemento nella posizione indicata in una lista.", + "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": "Rimuove l'elemento nella posizione indicata in una lista.", + "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": "Imposta l'elemento nella posizione indicata di una lista.", + "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": "Inserisci un elemento nella posizione indicata in una lista.", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "ordinamento %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Ordina una copia di un elenco.", + "LISTS_SORT_ORDER_ASCENDING": "crescente", + "LISTS_SORT_ORDER_DESCENDING": "decrescente", + "LISTS_SORT_TYPE_NUMERIC": "numerico", + "LISTS_SORT_TYPE_TEXT": "alfabetico", + "LISTS_SORT_TYPE_IGNORECASE": "alfabetico, ignorare differenze maiuscole e minuscole", + "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.", + "LISTS_REVERSE_MESSAGE0": "inverti %1", + "LISTS_REVERSE_TOOLTIP": "Inverti una copia di un elenco.", + "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_DEFNORETURN_COMMENT": "Descrivi questa funzione...", + "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_HELPURL": "http://c2.com/cgi/wiki?GuardClause", + "PROCEDURES_IFRETURN_WARNING": "Attenzioneː Questo blocco può essere usato solo all'interno di una definizione di funzione.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Scrivi qualcosa...", + "COLLAPSED_WARNINGS_WARNING": "I blocchi compressi contengono avvertimenti." +} diff --git a/js/msg/json/ja.json b/js/msg/json/ja.json new file mode 100644 index 0000000..0e3b809 --- /dev/null +++ b/js/msg/json/ja.json @@ -0,0 +1,382 @@ +{ + "@metadata": { + "authors": [ + "Shirayuki", + "Oda", + "아라", + "Otokoume", + "Sujiniku", + "Sgk", + "TAKAHASHI Shuuji", + "Suiato", + "ネイ", + "Aefgh39622", + "Omotecho", + "Gimite", + "Gulpin" + ] + }, + "VARIABLES_DEFAULT_NAME": "項目", + "UNNAMED_KEY": "名前なし", + "TODAY": "今日", + "DUPLICATE_BLOCK": "複製", + "ADD_COMMENT": "コメントを追加", + "REMOVE_COMMENT": "コメントを削除", + "DUPLICATE_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": "ヘルプ", + "UNDO": "取り消す", + "REDO": "やり直す", + "CHANGE_VALUE_TITLE": "値を変える:", + "RENAME_VARIABLE": "変数の名前を変える…", + "RENAME_VARIABLE_TITLE": "選択した%1の変数すべての名前を変える:", + "NEW_VARIABLE": "変数の作成…", + "NEW_STRING_VARIABLE": "文字列の変数を作る...", + "NEW_NUMBER_VARIABLE": "数の変数を作る...", + "NEW_COLOUR_VARIABLE": "色の変数を作る...", + "NEW_VARIABLE_TYPE_TITLE": "新しい変数の型:", + "NEW_VARIABLE_TITLE": "新しい変数の名前:", + "VARIABLE_ALREADY_EXISTS": "変数名 '%1' は既に存在しています。", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "'%2' 型の '%1' という名前の変数が既に存在します。", + "DELETE_VARIABLE_CONFIRMATION": "%1か所で使われている変数 '%2' を削除しますか?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "変数 '%1' は関数 '%2' の定義の一部であるため、削除できません", + "DELETE_VARIABLE": "変数 '%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": "繰り返す:続ける条件", + "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": "リスト%2の各項目%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": "値が 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ブロックに、すべてをキャッチする条件を追加。", + "IOS_OK": "OK", + "IOS_CANCEL": "キャンセル", + "IOS_ERROR": "エラー", + "IOS_PROCEDURES_INPUTS": "入力", + "IOS_PROCEDURES_ADD_INPUT": "+ 入力を追加", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "ステートメントを許可", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "この関数には重複する入力があります。", + "IOS_VARIABLES_ADD_VARIABLE": "+ 変数を追加", + "IOS_VARIABLES_ADD_BUTTON": "追加", + "IOS_VARIABLES_RENAME_BUTTON": "名前を変更", + "IOS_VARIABLES_DELETE_BUTTON": "削除", + "IOS_VARIABLES_VARIABLE_NAME": "変数名", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "空の変数名は使用できません。", + "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": "最初の入力が 2 番目の入力以下の場合に true を返します。", + "LOGIC_COMPARE_TOOLTIP_GT": "最初の入力が 2 番目の入力よりも大きい場合は true を返します。", + "LOGIC_COMPARE_TOOLTIP_GTE": "最初の入力が 2 番目の入力以上の場合に true を返します。", + "LOGIC_OPERATION_TOOLTIP_AND": "両方の入力が true のときに 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": "底が10の対数を返す。", + "MATH_SINGLE_TOOLTIP_EXP": "ネイピア数eの数値乗を返す。", + "MATH_SINGLE_TOOLTIP_POW10": "10の数値乗を返す。", + "MATH_TRIG_HELPURL": "https://ja.wikipedia.org/wiki/三角関数", + "MATH_TRIG_TOOLTIP_SIN": "(ラジアンではなく)度数の正弦(sin)を返す。", + "MATH_TRIG_TOOLTIP_COS": "(ラジアンではなく)度数の余弦(cosin)を返す。", + "MATH_TRIG_TOOLTIP_TAN": "(ラジアンではなく)度数の正接(tan)を返す。", + "MATH_TRIG_TOOLTIP_ASIN": "アークサイン(arcsin)を返す。", + "MATH_TRIG_TOOLTIP_ACOS": "アークコサイン(arccosin)を返す。", + "MATH_TRIG_TOOLTIP_ATAN": "アークタンジェント(arctan)を返す。", + "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_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": "指定した上限と下限の間に値を制限する(上限と下限の値を含む)。", + "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": "1未満の正の乱数", + "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_TITLE": "項目 %1 へテキストを追加 %2", + "TEXT_APPEND_TOOLTIP": "変数 '%1' にテキストを追加。", + "TEXT_LENGTH_TITLE": "%1の長さ", + "TEXT_LENGTH_TOOLTIP": "与えられたテキストの(スペースを含む)文字数を返す。", + "TEXT_ISEMPTY_TITLE": "%1が空", + "TEXT_ISEMPTY_TOOLTIP": "与えられたテキストが空の場合は true を返す。", + "TEXT_INDEXOF_TOOLTIP": "二番目のテキストの中で一番目のテキストが最初/最後に出現したインデックスを返す。テキストが見つからない場合は%1を返す。", + "TEXT_INDEXOF_TITLE": "テキスト %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "で以下のテキストの最初の出現箇所を検索:", + "TEXT_INDEXOF_OPERATOR_LAST": "で以下のテキストの最後の出現箇所を検索:", + "TEXT_CHARAT_TITLE": "テキスト %1 %2", + "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": "ユーザーにテキスト入力を求める。", + "TEXT_COUNT_MESSAGE0": "%2に含まれる%1の数を数える", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "とある文が別の文のなかに使われた回数を数える。", + "TEXT_REPLACE_MESSAGE0": "%3に含まれる%1を%2に置換", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "文に含まれるキーワードを置換する。", + "TEXT_REVERSE_MESSAGE0": "%1を逆順に", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "文の文字を逆順にする。", + "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": "リストが空の場合は、true を返します。", + "LISTS_INLIST": "リスト", + "LISTS_INDEX_OF_FIRST": "で以下のアイテムの最初の出現箇所を検索:", + "LISTS_INDEX_OF_LAST": "で以下のテキストの最後の出現箇所を検索:", + "LISTS_INDEX_OF_TOOLTIP": "リスト項目の最初/最後に出現するインデックス位置を返します。項目が見つからない場合は %1 を返します。", + "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_INDEX_FROM_START_TOOLTIP": "%1 は、最初の項目です。", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 は、最後の項目です。", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "リスト内の指定位置にある項目を返します。", + "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": "リスト内の指定位置にある項目を削除し、返します。", + "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": "リスト内の指定された項目を削除します。", + "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": "リスト内の指定された位置に項目を設定します。", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "リスト内に最初の項目を設定します。", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "リスト内の最後の項目を設定します。", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "リスト内にランダムなアイテムを設定します。", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "リスト内の指定位置に項目を挿入します。", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "%1 ( %2 ) に %3 を並び替える", + "LISTS_SORT_TOOLTIP": "リストのコピーを並べ替え", + "LISTS_SORT_ORDER_ASCENDING": "昇順", + "LISTS_SORT_ORDER_DESCENDING": "降順", + "LISTS_SORT_TYPE_NUMERIC": "数値順", + "LISTS_SORT_TYPE_TEXT": "アルファベット順", + "LISTS_SORT_TYPE_IGNORECASE": "アルファベット順(大文字・小文字の区別無し)", + "LISTS_SPLIT_LIST_FROM_TEXT": "テキストからリストを作る", + "LISTS_SPLIT_TEXT_FROM_LIST": "リストからテキストを作る", + "LISTS_SPLIT_WITH_DELIMITER": "区切り記号", + "LISTS_SPLIT_TOOLTIP_SPLIT": "テキストを区切り記号で分割したリストにする", + "LISTS_SPLIT_TOOLTIP_JOIN": "テキストのリストを区切り記号で区切られた一つのテキストにする", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "%1を逆順に", + "LISTS_REVERSE_TOOLTIP": "リストのコピーを逆順にする。", + "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_DEFNORETURN_COMMENT": "この関数の説明…", + "PROCEDURES_DEFRETURN_HELPURL": "https://ja.wikipedia.org/wiki/サブルーチン", + "PROCEDURES_DEFRETURN_RETURN": "返す", + "PROCEDURES_DEFRETURN_TOOLTIP": "一つの出力を持つ関数を作成します。", + "PROCEDURES_ALLOW_STATEMENTS": "ステートメントを許可", + "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_MUTATORCONTAINER_TOOLTIP": "この関数への入力の追加、削除、順番変更。", + "PROCEDURES_MUTATORARG_TITLE": "入力名:", + "PROCEDURES_MUTATORARG_TOOLTIP": "関数への入力の追加。", + "PROCEDURES_HIGHLIGHT_DEF": "関数の内容を強調表示します。", + "PROCEDURES_CREATE_DO": "'%1' を作成", + "PROCEDURES_IFRETURN_TOOLTIP": "1番目の値が true の場合、2番目の値を返します。", + "PROCEDURES_IFRETURN_WARNING": "警告: このブロックは、関数定義内でのみ使用できます。", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "ここへ入力", + "WORKSPACE_ARIA_LABEL": "Blocklyワークスペース" +} diff --git a/js/msg/json/kab.json b/js/msg/json/kab.json new file mode 100644 index 0000000..5224544 --- /dev/null +++ b/js/msg/json/kab.json @@ -0,0 +1,347 @@ +{ + "@metadata": { + "authors": [ + "Amaziɣ maziɣ", + "Belkacem77", + "Alem", + "YubaWissin" + ] + }, + "VARIABLES_DEFAULT_NAME": "aferdis", + "UNNAMED_KEY": "warisem", + "TODAY": "Ass-a", + "DUPLICATE_BLOCK": "Sleg", + "ADD_COMMENT": "Rnu awennit", + "REMOVE_COMMENT": "Kkes awennit", + "DUPLICATE_COMMENT": "Sleg awennit", + "EXTERNAL_INPUTS": "Inekcam izɣarayen", + "INLINE_INPUTS": "Inekcam srid", + "DELETE_BLOCK": "Kkes iḥder", + "DELETE_X_BLOCKS": "Kkes %1 n yiḥderan", + "DELETE_ALL_BLOCKS": "Kkes akk %1 n yiḥedran?", + "CLEAN_UP": "Sfeḍ iḥedran", + "COLLAPSE_BLOCK": "Fneẓ iḥder", + "COLLAPSE_ALL": "Fneẓ iḥedran", + "EXPAND_BLOCK": "Snefli iḥder", + "EXPAND_ALL": "Snefli iḥedran", + "DISABLE_BLOCK": "Sens iḥder", + "ENABLE_BLOCK": "Sens iḥedran", + "HELP": "Tallelt", + "UNDO": "Err-d", + "REDO": "Uɣal", + "CHANGE_VALUE_TITLE": "Beddel azal:", + "RENAME_VARIABLE": "Beddel isem n umutti...", + "RENAME_VARIABLE_TITLE": "Beddel akk isem n yimuttiyen '%1' ar:", + "NEW_VARIABLE": "Rnu amutti...", + "NEW_STRING_VARIABLE": "Rnu amutti azrir n yisekkilen...", + "NEW_NUMBER_VARIABLE": "Rnu amutti amḍan...", + "NEW_COLOUR_VARIABLE": "Rnu amutti ini...", + "NEW_VARIABLE_TYPE_TITLE": "Anaw amaynut n umutti:", + "NEW_VARIABLE_TITLE": "Isem amaynut n wazal:", + "VARIABLE_ALREADY_EXISTS": "Amutti s yisem '%1' yella yakan.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Amutti s yisem '%1' yella yakan i wanaw-nniḍen: '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Kkes %1 n useqdec n umutti '%2'?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Ur izmir ara ad yekkes amutti '%1' acku yedda di tbadut n twuri '%2'", + "DELETE_VARIABLE": "Kkes amutti '%1'", + "COLOUR_PICKER_HELPURL": "https://kab.wikipedia.org/wiki/Ini", + "COLOUR_PICKER_TOOLTIP": "Fren ini seg ugalis.", + "COLOUR_RANDOM_TITLE": "ini agacuran", + "COLOUR_RANDOM_TOOLTIP": "Fren ini s wudem agacuran.", + "COLOUR_RGB_TITLE": "ini s", + "COLOUR_RGB_RED": "azeggaɣ", + "COLOUR_RGB_GREEN": "azegzaw", + "COLOUR_RGB_BLUE": "anili", + "COLOUR_RGB_TOOLTIP": "Rnu ini s tnecta yettunefk s tesmekta n uzeggaɣ, azegzaw, akked unili. Yessefk akk azalen ad ilin gar 0 akked 100.", + "COLOUR_BLEND_TITLE": "rkwec", + "COLOUR_BLEND_COLOUR1": "ini 1", + "COLOUR_BLEND_COLOUR2": "ini 2", + "COLOUR_BLEND_RATIO": "afmiḍi", + "COLOUR_BLEND_TOOLTIP": "Sexleḍ sin n yiniten d tesmekta (gar 0.0 ar 1.0).", + "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", + "CONTROLS_REPEAT_TITLE": "Ales %1 n tikal", + "CONTROLS_REPEAT_INPUT_DO": "eg", + "CONTROLS_REPEAT_TOOLTIP": "Selkem ddeqs n tinaḍin ddeqs n tikal.", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "ales skud", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "ales arama", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Skud azal d idetti, selkem ihi tinadin.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Skud azal d ucciḍ, selkem ihi tinadin.", + "CONTROLS_FOR_TOOLTIP": "Mudd i umutti '%1' azalen seg umḍan n tazwara arama d umḍan n tagara, stmerna n usurif yettunefken, sakin selkem tiaḍin yettunefken.", + "CONTROLS_FOR_TITLE": "siḍen akked %1 seg %2 ar %3 s %4", + "CONTROLS_FOREACH_TITLE": "i yal aferdis %1 di tebdart %2", + "CONTROLS_FOREACH_TOOLTIP": "I yal aferdis n tebdart, mudd azal n uferdis i umutti '%1', sakin selkem tinaḍin.", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "ffeɣ seg tneddict", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "kemmel s wallus d tneddict d-iteddun", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Ffeɣ si tneddict tamagbart.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Zgel ayen i d-yeqqimen di tneddict-agi, sakin kemmel allus d-iteddun.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Ɣur-k: Iḥder-agi yessefk ad yettwaseqdec di tneddict.", + "CONTROLS_IF_TOOLTIP_1": "ma yella azal d idetti, ihi selkem kra n tinaḍin.", + "CONTROLS_IF_TOOLTIP_2": "Ma yella zal d idetti, selkem iḥder amezwaru. Neɣ ma ulac, selkem iḥder wis sin.", + "CONTROLS_IF_TOOLTIP_3": "Ma yella azal amezwaru d idetti, selkem iḥder amezwaru. Neɣ ma azal wis sin d ucciḍ, selkem iḥ€der wis sin.", + "CONTROLS_IF_TOOLTIP_4": "Ma yella azal amezwaru d idetti, selkem iḥeder amezwaru. Neɣ, ma yella azal wis sin d idetti, selkem iḥder wis sin. Ma yella ula d yisen seg-sen mačči d idetti, selkem iḥder aneggaru.", + "CONTROLS_IF_MSG_IF": "ma", + "CONTROLS_IF_MSG_ELSEIF": "neɣ ma", + "CONTROLS_IF_MSG_ELSE": "neɣ", + "CONTROLS_IF_IF_TOOLTIP": "Rnu, kkes, neq ales ales asmizzwer n tgezmiyin akken ad talseḍ tawila n iḥder-agi ma.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Rni tawtilt i yiḥder ma.", + "CONTROLS_IF_ELSE_TOOLTIP": "Rnu tawtilt taneggarut i yiḥder ma igebren akk tinaḍin.", + "IOS_OK": "IH", + "IOS_CANCEL": "Sefsex", + "IOS_ERROR": "Tuccḍa", + "IOS_PROCEDURES_INPUTS": "INEKCAM", + "IOS_PROCEDURES_ADD_INPUT": "+ Rnu anekcum", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Sireg asmizzwer", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Tawuri-a ɣur-s inekcam imsinen.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Rnu amutti", + "IOS_VARIABLES_ADD_BUTTON": "Rnu", + "IOS_VARIABLES_RENAME_BUTTON": "Snifel isem", + "IOS_VARIABLES_DELETE_BUTTON": "Kkes", + "IOS_VARIABLES_VARIABLE_NAME": "Isem n umutti", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Ur tezmireḍ ara ad tesqedceḍ isem n umutti amaynut.", + "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", + "LOGIC_COMPARE_TOOLTIP_EQ": "Ad yerr idetti ma yella i sin n inekcam d imegduya.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Ad d-yerr idetti ma yella i sin n inekcam mačči d imegduya.", + "LOGIC_COMPARE_TOOLTIP_LT": "Ad d-yerr idetti ma yella anekcam amezwaru meẓẓi ɣef wis sin.", + "LOGIC_COMPARE_TOOLTIP_LTE": "Ad d-yerr idetti ma yella anekcam amezwaru meẓẓi neɣ yegda wis sin.", + "LOGIC_COMPARE_TOOLTIP_GT": "Ad d-yerr idetti ma yella anekcam amezwaru meqqeṛ ɣef wis sin.", + "LOGIC_COMPARE_TOOLTIP_GTE": "Ad d-yerr idetti ma yella anekcam amezwaru meqqeṛ neɣ yegda wis sin.", + "LOGIC_OPERATION_TOOLTIP_AND": "Ad d-yerr idetti ma yella inekcam d idettiyen.", + "LOGIC_OPERATION_AND": "akked", + "LOGIC_OPERATION_TOOLTIP_OR": "Ad d-yerr idetti ma yella ɣarsum yiwen seg inekcam d idetti.", + "LOGIC_OPERATION_OR": "neɣ", + "LOGIC_NEGATE_TITLE": "mačči %1", + "LOGIC_NEGATE_TOOLTIP": "Ad d-yerr idetti ma yella anekcam d ucciḍ. Ad d-yerr ucciḍ ma yella anekcam d idetti.", + "LOGIC_BOOLEAN_TRUE": "idetti", + "LOGIC_BOOLEAN_FALSE": "ucciḍ", + "LOGIC_BOOLEAN_TOOLTIP": "Ad d-yerr idetti neɣ ucciḍ", + "LOGIC_NULL": "Ilem", + "LOGIC_NULL_TOOLTIP": "Ad d-yerr ilem", + "LOGIC_TERNARY_CONDITION": "sekyed", + "LOGIC_TERNARY_IF_TRUE": "ma d idetti", + "LOGIC_TERNARY_IF_FALSE": "ma ucciḍ", + "LOGIC_TERNARY_TOOLTIP": "Senqed tawtilt deg 'sekyed'. Ma yella d idetti, ad d-yerr azal 'ma idetti', ma ulac ad d-yerr azam 'ma ucciḍ'.", + "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", + "MATH_NUMBER_TOOLTIP": "Amḍan.", + "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", + "MATH_ARITHMETIC_TOOLTIP_ADD": "Ad d-yerr tmerni n sin n imiḍanen.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "Ad d-yerr tmernit n sin n imiḍanen.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Ad d-yerr tukksa gar sin n imiḍanen.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Ad d-yerr aful n sin n imḍanen.", + "MATH_ARITHMETIC_TOOLTIP_POWER": "Ad d-yerr amḍan amezwaru uzmir wis sin.", + "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", + "MATH_SINGLE_OP_ROOT": "aẓar uzmir 2", + "MATH_SINGLE_TOOLTIP_ROOT": "Ad d-yerr aẓaṛ uzmir sin n umiḍan.", + "MATH_SINGLE_OP_ABSOLUTE": "azal amagdez", + "MATH_SINGLE_TOOLTIP_ABS": "Ad d-yerr azal amagdez n umiḍan.", + "MATH_SINGLE_TOOLTIP_NEG": "Ad d-yerr ugmiḍ n umḍan.", + "MATH_SINGLE_TOOLTIP_LN": "Ad d-yerr alugaritm agamawan n umiḍan.", + "MATH_SINGLE_TOOLTIP_LOG10": "Ad d-yerr alugaritm 10 n umiḍan.", + "MATH_SINGLE_TOOLTIP_EXP": "Ad d-yerr e uzmir amiḍan.", + "MATH_SINGLE_TOOLTIP_POW10": "Ad d-yerr 10 uzmir amiḍan.", + "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", + "MATH_TRIG_TOOLTIP_SIN": "Ad d-yerr asinus n teɣmert s tfesna (mačči aṛadyan).", + "MATH_TRIG_TOOLTIP_COS": "Ad d-yerr akusinus n teɣmert s tfesna (mačči aṛadyan).", + "MATH_TRIG_TOOLTIP_TAN": "Ad d-yerr taslayt n teɣmert s tfesna (mačči aṛadyan).", + "MATH_TRIG_TOOLTIP_ASIN": "Ad d-yerr taganzi n usinus n umḍan.", + "MATH_TRIG_TOOLTIP_ACOS": "Ad d-yerr taganzi n ukusinus n umḍan.", + "MATH_TRIG_TOOLTIP_ATAN": "Ad d-yerr taganzi n teslayt n umiḍan.", + "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", + "MATH_CONSTANT_TOOLTIP": "Ad d-yerr yiwet seg tmezgiyin yettwasnen : π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), neɣ ∞ (ifeḍ).", + "MATH_IS_EVEN": "d ayugan", + "MATH_IS_ODD": "d aryugan", + "MATH_IS_PRIME": "d amenzu", + "MATH_IS_WHOLE": "d ummid", + "MATH_IS_POSITIVE": "d ufrar", + "MATH_IS_NEGATIVE": "d uzdir", + "MATH_IS_DIVISIBLE_BY": "d ubṭay ɣef", + "MATH_IS_TOOLTIP": "Senqed ma yella amḍan d ayugan, d aryugan, d amenzu, d ummid, d ufrar, d uzdir, neɣ d ybṭay ɣef kra n umḍan. Ad d-yerr idettu neɣ ucciḍ.", + "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", + "MATH_CHANGE_TITLE": "snifel %1 s %2", + "MATH_CHANGE_TOOLTIP": "Rnu amḍan i umutti '%1'.", + "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", + "MATH_ROUND_TOOLTIP": "Saẓ amiḍan d asawen neɣ d akesser.", + "MATH_ROUND_OPERATOR_ROUND": "Saẓ", + "MATH_ROUND_OPERATOR_ROUNDUP": "Saẓ d asawen", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "Saẓ d akesser", + "MATH_ONLIST_OPERATOR_SUM": "Timernit n tebdart", + "MATH_ONLIST_TOOLTIP_SUM": "Ad d-yerr timernit n imḍanen meṛṛa deg tebdart.", + "MATH_ONLIST_OPERATOR_MIN": "adday n tebdart", + "MATH_ONLIST_TOOLTIP_MIN": "Ad d-yerr amḍan ameẓẓyan di tebdart.", + "MATH_ONLIST_OPERATOR_MAX": "afellay n tebdart", + "MATH_ONLIST_TOOLTIP_MAX": "Ad d-yerr amḍan ameqqran di tebdart.", + "MATH_ONLIST_OPERATOR_AVERAGE": "talemmast n tebdart", + "MATH_ONLIST_TOOLTIP_AVERAGE": "Ad d-yerr talemmas( tasnamḍant) n wazalen umḍinen di tebdart.", + "MATH_ONLIST_OPERATOR_MEDIAN": "tanammast n tebdart", + "MATH_ONLIST_TOOLTIP_MEDIAN": "Ad d-yerr amḍan n anammas n tebdart.", + "MATH_ONLIST_OPERATOR_MODE": "Tigwtiwin n tebdart", + "MATH_ONLIST_TOOLTIP_MODE": "Ad d-yerr tabdart n iferdisen i d-yettuɣalen s waṭas di tebdart.", + "MATH_ONLIST_OPERATOR_STD_DEV": "azza n tebdart", + "MATH_ONLIST_TOOLTIP_STD_DEV": "Ad d-yerr azza n tebdart.", + "MATH_ONLIST_OPERATOR_RANDOM": "aferdis agacuran n tebdart", + "MATH_ONLIST_TOOLTIP_RANDOM": "Ad d-yerr aferdis seg tebdart s wudem agacuran.", + "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", + "MATH_MODULO_TITLE": "tasagert n %1 ÷ %2", + "MATH_MODULO_TOOLTIP": "Ad d-yerr tasagert n beṭṭu n sin n imḍanen.", + "MATH_CONSTRAIN_TITLE": "Err tamara i %1 gar %2 akked %3", + "MATH_CONSTRAIN_TOOLTIP": "Err tamara n umiḍan akken ad yili gar snat n tlisa (ddant).", + "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_INT_TITLE": "ummid agacuran gar %1 akked %2", + "MATH_RANDOM_INT_TOOLTIP": "Ad d-yerr ummid agacuran gar snat n tlisa, ddant.", + "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "tirẓi tagacurant", + "MATH_RANDOM_FLOAT_TOOLTIP": "Ad d-yerr tirẓi tagacurant gar 0.0 (yedda) akked 1.0 (ur yeddi ara).", + "MATH_ATAN2_HELPURL": "https://kab.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 seg X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "Ad d-yerr arctangent n waggaz (X, Y) s tfesniwin deg -180 ɣer 180.", + "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", + "TEXT_TEXT_TOOLTIP": "Asekkil, awal neɣ izirig n uḍris.", + "TEXT_JOIN_TITLE_CREATEWITH": "rnu aḍṛis s", + "TEXT_JOIN_TOOLTIP": "Ad yernu taceqquft n uḍris s usdukel gar yal amḍan n iferdisen.", + "TEXT_CREATE_JOIN_TITLE_JOIN": "sdukkel", + "TEXT_CREATE_JOIN_TOOLTIP": "Rnu, kkes, neɣ ales asmizzwer n tgezmiyin akken ad talseḍ tawila n iḥder-agi.", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Rnu aferdis ar uḍris.", + "TEXT_APPEND_TITLE": "Rnu aḍris %2 ar %1", + "TEXT_APPEND_TOOLTIP": "Rnu aḍris ar umutti '%1'.", + "TEXT_LENGTH_TITLE": "teɣzi n %1", + "TEXT_LENGTH_TOOLTIP": "Ad d-yerr amḍan n isekkilen (ddab ula d imellalen) deg uḍris d-ittunefken.", + "TEXT_ISEMPTY_TITLE": "%1 d ilem", + "TEXT_ISEMPTY_TOOLTIP": "Add d-yerr idetti ma yella aḍris d ilem.", + "TEXT_INDEXOF_TOOLTIP": "Ad d-yerr amatar n tmeḍriwt tamezwarut/taneggarut n uḍris amewaru deg uḍris wis sin. Ad d-yerr %1 ma yella ulac adris.", + "TEXT_INDEXOF_TITLE": "deg uḍris %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "af-d timeḍriwt tamezwarut n uḍris", + "TEXT_INDEXOF_OPERATOR_LAST": "af-d timeḍriwt taneggarut deg uḍris", + "TEXT_CHARAT_TITLE": "deg uḍris %1 %2", + "TEXT_CHARAT_FROM_START": "awi asekkel #", + "TEXT_CHARAT_FROM_END": "awi-d asekkil # si tagara", + "TEXT_CHARAT_FIRST": "awi-d asekkil amezwaru", + "TEXT_CHARAT_LAST": "awi-d asekkil aneggaru", + "TEXT_CHARAT_RANDOM": "awi-d asekkil s wudem agacuran", + "TEXT_CHARAT_TOOLTIP": "Ad d-yerr asekkil deg wuṭṭun yettwammlen.", + "TEXT_GET_SUBSTRING_TOOLTIP": "Ad d-yerr aḥric yettwammlen deg uḍris.", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "deg uḍris", + "TEXT_GET_SUBSTRING_START_FROM_START": "awi-d azrir asnawan seg usekkil #", + "TEXT_GET_SUBSTRING_START_FROM_END": "awi-d azrir asnawan seg usekkil # si tagara", + "TEXT_GET_SUBSTRING_START_FIRST": "awi-d azrir asnawan seg usekkil amezwaru", + "TEXT_GET_SUBSTRING_END_FROM_START": "arama d asekkil #", + "TEXT_GET_SUBSTRING_END_FROM_END": "arama d asekkil # si tagara", + "TEXT_GET_SUBSTRING_END_LAST": "arama d asekkil aneggaru", + "TEXT_CHANGECASE_TOOLTIP": "Ad d-yerr anɣel n uḍris s truẓi-nniḍen.", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "s USEKKIL AMEQQRAN", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "s usekkil ameẓẓyan", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "s Umeqqran Di Tazwara n Yal Awal.", + "TEXT_TRIM_TOOLTIP": "Ad d-yerr anɣel n uḍris s isekkilen ilmawen yettwakksen seg ixf neɣ i sin.", + "TEXT_TRIM_OPERATOR_BOTH": "Tukksa n isekkilen imellalen seg sin n idisan", + "TEXT_TRIM_OPERATOR_LEFT": "tukksa n isekkilen seg uzelmaḍ", + "TEXT_TRIM_OPERATOR_RIGHT": "tukksa n isekkilen seg uyeffus", + "TEXT_PRINT_TITLE": "ad d-yesken %1", + "TEXT_PRINT_TOOLTIP": "Sken aḍris, amḍan neɣ azal-nniḍen d-ittunefken.", + "TEXT_PROMPT_TYPE_TEXT": "aneftaɣ i uḍris s yizen", + "TEXT_PROMPT_TYPE_NUMBER": "aneftaɣ i umḍan s yizen", + "TEXT_PROMPT_TOOLTIP_NUMBER": "Suter amḍan i useqdac.", + "TEXT_PROMPT_TOOLTIP_TEXT": "Suter aḍris i useqdac.", + "TEXT_COUNT_MESSAGE0": "amḍan %1 ɣef %2", + "TEXT_COUNT_TOOLTIP": "Ad isiḍen amḍan n tmeḍriwt n uḍris deg ayeḍ.", + "TEXT_REPLACE_MESSAGE0": "semselsi %1 s %2 di %3", + "TEXT_REPLACE_TOOLTIP": "As isemselsi akk timeḍriwin n uḍris s wayeḍ.", + "TEXT_REVERSE_MESSAGE0": "tti %1", + "TEXT_REVERSE_TOOLTIP": "Ad yetti asmizzwer n isekkilen deg uḍris.", + "LISTS_CREATE_EMPTY_TITLE": "rnu tabdart tilemt", + "LISTS_CREATE_EMPTY_TOOLTIP": "Ad d-yerr tabdart n teɣzi 0 ur yegbiren ara ikalasen", + "LISTS_CREATE_WITH_TOOLTIP": "Ad yernu tabdart s umḍan n iferdisen.", + "LISTS_CREATE_WITH_INPUT_WITH": "rnu tabdart s", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "tabdart", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Rnu, kkes, neɣ ales asmizzwer n tgezmiyin akken ad talseḍ tawila n iḥder-agi n tebdart.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Ad yernu aferdis ar tebdart.", + "LISTS_REPEAT_TOOLTIP": "Ad yernu tabdart inetmen n wazal yettunefken ddeqs n tikal s umḍan yettwammlen.", + "LISTS_REPEAT_TITLE": "ad yernu tabdart s uferdis %1 s tmeḍriwt %2", + "LISTS_LENGTH_TITLE": "teɣzi n %1", + "LISTS_LENGTH_TOOLTIP": "Ad d-yerr teɣzi n tebdart.", + "LISTS_ISEMPTY_TITLE": "%1 d ilem", + "LISTS_ISEMPTY_TOOLTIP": "Ad d-yerr idetti ma yella tabdart d tilemt.", + "LISTS_INLIST": "di tebdart", + "LISTS_INDEX_OF_FIRST": "aff-d timeḍriwt tamezwarut n uferdis", + "LISTS_INDEX_OF_LAST": "af-d timeḍriwt taneggarut n uferdis", + "LISTS_INDEX_OF_TOOLTIP": "Ad d-yerr amatar n tmeḍriwt tamezwarut/taneggarut n uferdis amewaru deg tebdart. Ad d-yerr %1 ma yella ulac aferdis.", + "LISTS_GET_INDEX_GET": "awi", + "LISTS_GET_INDEX_GET_REMOVE": "awi u kkes", + "LISTS_GET_INDEX_REMOVE": "kkes", + "LISTS_GET_INDEX_FROM_END": "# si tagara", + "LISTS_GET_INDEX_FIRST": "amezwaru", + "LISTS_GET_INDEX_LAST": "aneggaru", + "LISTS_GET_INDEX_RANDOM": "agacuran", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 d aferdis amezwaru.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 d aferdis aneggaru.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Ad d-yerr aferdis n wadig yettwammlen deg tabdart.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Ad d-yerr aferdis amezwaru n tebdart..", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Ad d-yerr aferdis aneggaru di tebdart.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Ad yerr aferdis agacuran di tebdart.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Ad yekkes sakin ad d-yerr aferdis n wadig yettwammlen deg tabdart.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Ad yekkes sakin ad -yerr aferdis amezwaru di tebdart.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Ad yekkes sakin ad -yerr aferdis aneggaru di tebdart.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Ad yekkes sakin ad d-yerr aferdis agacuran di tebdart.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Ad yekkes aferdis n wadig yettwammlen deg tabdart.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Ad yekkes aferdis amezwaru n tebdart..", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Ad yekkes aferdis aneggaru di tebdart.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Ad yekkes aferdis agacuran di tebdart.", + "LISTS_SET_INDEX_SET": "sbadu", + "LISTS_SET_INDEX_INSERT": "ger s", + "LISTS_SET_INDEX_INPUT_TO": "am", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Ad yesbadu aferdis n wadig yettwammlen deg tabdart.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Ad d-yerr aferdis amezwaru di tebdart.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Ad d-yerr aferdis aneggaru di tebdart.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Ad yesbadu aferdis agacuran di tebdart.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Ad iger aferdis n wadig yettwammlen deg tabdart.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Ad iger aferdis di tazwara n tebdart.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Ad yernu aferdis ar tagara n tebdart.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Ad iger aferdis s wudem agacuran deg tebdart.", + "LISTS_GET_SUBLIST_START_FROM_START": "awi-d tabdart tasnawant seg #", + "LISTS_GET_SUBLIST_START_FROM_END": "awi-d tabdart tasnawant seg # si tagara", + "LISTS_GET_SUBLIST_START_FIRST": "awi-d tabdart tasnawant si tazwara", + "LISTS_GET_SUBLIST_END_FROM_START": "ar #", + "LISTS_GET_SUBLIST_END_FROM_END": "ar # si tagara", + "LISTS_GET_SUBLIST_END_LAST": "ar tagara", + "LISTS_GET_SUBLIST_TOOLTIP": "Ad yernu anɣel n uḥric yettwammlen n tebdart.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "smizzwer %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Smizzwer anɣel n tebdart.", + "LISTS_SORT_ORDER_ASCENDING": "igemmen", + "LISTS_SORT_ORDER_DESCENDING": "amnusruy", + "LISTS_SORT_TYPE_NUMERIC": "umḍin", + "LISTS_SORT_TYPE_TEXT": "agemmayan", + "LISTS_SORT_TYPE_IGNORECASE": "agemmayan, anef i truẓi n usekkil", + "LISTS_SPLIT_LIST_FROM_TEXT": "rnu tabdart seg uḍris", + "LISTS_SPLIT_TEXT_FROM_LIST": "rnu aḍris si tebdart", + "LISTS_SPLIT_WITH_DELIMITER": "s unabraz", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Ad yegzem aḍris ɣef ddeqs n tebdarin n yoiḍrisen, s unegzum yal anabraz.", + "LISTS_SPLIT_TOOLTIP_JOIN": "ad yesdukel tabdart n yiḍrisen deg iwen s usnabraz.", + "LISTS_REVERSE_MESSAGE0": "tti %1", + "LISTS_REVERSE_TOOLTIP": "Tti anɣel n tebdart.", + "VARIABLES_GET_TOOLTIP": "Ad d-yerr azal n umutti-agi.", + "VARIABLES_GET_CREATE_SET": "Rnu 'sbadu %1'", + "VARIABLES_SET": "sbadu %1 ar %2", + "VARIABLES_SET_TOOLTIP": "Ad yesbadu amutti-agi akken ad yegdu azal n unekcam.", + "VARIABLES_SET_CREATE_GET": "Rnu 'awi-d %1'", + "PROCEDURES_DEFNORETURN_TITLE": "i", + "PROCEDURES_DEFNORETURN_PROCEDURE": "eg kra", + "PROCEDURES_BEFORE_PARAMS": "s:", + "PROCEDURES_CALL_BEFORE_PARAMS": "s:", + "PROCEDURES_DEFNORETURN_TOOLTIP": "Rnu tawuri s war anekcam.", + "PROCEDURES_DEFNORETURN_COMMENT": "Seglem tawuri-agi...", + "PROCEDURES_DEFRETURN_RETURN": "tuɣalin", + "PROCEDURES_DEFRETURN_TOOLTIP": "ad yernu tawuri s tuffɣa.", + "PROCEDURES_ALLOW_STATEMENTS": "Sireg asmizzwer", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Ɣur-k: Tawuri-agi ɣur-s iɣewwaṛen usligen.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Selkem tawuri '%1' yesbadu u seqdac.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLRETURN_TOOLTIP": "Selkem tawuri '%1' yesbadu useqdace sakin seqdec agmuḍ-is.", + "PROCEDURES_MUTATORCONTAINER_TITLE": "inekcam", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Rnu, kkes neɣ ales asmizzwer n inekcam i twuri-agi.", + "PROCEDURES_MUTATORARG_TITLE": "isem n unekcum:", + "PROCEDURES_MUTATORARG_TOOLTIP": "rnu anekcam ar twuri-agi.", + "PROCEDURES_HIGHLIGHT_DEF": "Sebruṛeq tabadut n twuri", + "PROCEDURES_CREATE_DO": "rnu '%1'", + "PROCEDURES_IFRETURN_TOOLTIP": "ma yella azal d idetti, ad d-yerr azal-nniḍen wis sin.", + "PROCEDURES_IFRETURN_WARNING": "Ɣur-k: Iḥder-agi yezmer ur yettwaseqdac ara ala di tebadut n twuri-agi.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Ini kra...", + "COLLAPSED_WARNINGS_WARNING": "Iḥedran yettin gebren ilɣa." +} diff --git a/js/msg/json/ko.json b/js/msg/json/ko.json new file mode 100644 index 0000000..b71be48 --- /dev/null +++ b/js/msg/json/ko.json @@ -0,0 +1,414 @@ +{ + "@metadata": { + "authors": [ + "Hym411", + "아라", + "Priviet", + "Revi", + "SeoJeongHo", + "Alex00728", + "Kurousagi", + "Lemondoge", + "Ykhwong", + "Jerrykim306", + "Onebone", + "JeonHK", + "Liuxinyu970226", + "Peurocs4", + "Gongsoonyee" + ] + }, + "VARIABLES_DEFAULT_NAME": "항목", + "UNNAMED_KEY": "이름이 없는", + "TODAY": "오늘", + "DUPLICATE_BLOCK": "복제", + "ADD_COMMENT": "주석 추가", + "REMOVE_COMMENT": "주석 제거", + "DUPLICATE_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": "도움말", + "UNDO": "실행 취소", + "REDO": "다시 실행", + "CHANGE_VALUE_TITLE": "값 바꾸기:", + "RENAME_VARIABLE": "변수 이름 바꾸기:", + "RENAME_VARIABLE_TITLE": "'%1' 변수 이름을 바꾸기:", + "NEW_VARIABLE": "변수 만들기...", + "NEW_STRING_VARIABLE": "문자열 변수 만들기...", + "NEW_NUMBER_VARIABLE": "숫자 변수 만들기....", + "NEW_COLOUR_VARIABLE": "색 변수 만들기...", + "NEW_VARIABLE_TYPE_TITLE": "새 변수 유형:", + "NEW_VARIABLE_TITLE": "새 변수 이름:", + "VARIABLE_ALREADY_EXISTS": "'%1' 변수는 이미 존재합니다.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "'%1' 변수는 다른 유형에 대해 이미 존재합니다: '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "'%2' 변수에서 %1을(를) 삭제하시겠습니까?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "'%2' 함수 정의의 일부이기 때문에 '%1' 변수를 삭제할 수 없습니다", + "DELETE_VARIABLE": "'%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": "색", + "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": "섹션을 추가, 제거하거나 순서를 변경하여 이 if 블럭을 재구성합니다.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "\"만약\" 블럭에 조건 검사를 추가합니다.", + "CONTROLS_IF_ELSE_TOOLTIP": "\"만약\" 블럭의 마지막에, 모든 검사 결과가 거짓인 경우 실행할 부분을 추가합니다.", + "IOS_OK": "확인", + "IOS_CANCEL": "취소", + "IOS_ERROR": "오류", + "IOS_PROCEDURES_INPUTS": "입력", + "IOS_PROCEDURES_ADD_INPUT": "+ 입력 추가", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "이 기능은 중복된 입력이 있습니다.", + "IOS_VARIABLES_ADD_VARIABLE": "+ 변수 추가", + "IOS_VARIABLES_ADD_BUTTON": "추가", + "IOS_VARIABLES_RENAME_BUTTON": "이름 바꾸기", + "IOS_VARIABLES_DELETE_BUTTON": "삭제", + "IOS_VARIABLES_VARIABLE_NAME": "변수 이름", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "비어있는 변수 이름을 사용할 수 없습니다.", + "LOGIC_COMPARE_HELPURL": "https://ko.wikipedia.org/wiki/부등식", + "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://ko.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://ko.wikipedia.org/wiki/수_(수학)", + "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://ko.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://ko.wikipedia.org/wiki/제곱근", + "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의 거듭제곱 값을 반환합니다.", + "MATH_SINGLE_TOOLTIP_POW10": "10의 거듭제곱 값을 반환합니다.", + "MATH_TRIG_HELPURL": "https://ko.wikipedia.org/wiki/삼각함수", + "MATH_TRIG_TOOLTIP_SIN": "각도의 사인을 반환합니다. (라디안 아님)", + "MATH_TRIG_TOOLTIP_COS": "각도의 코사인을 반환합니다. (라디안 아님)", + "MATH_TRIG_TOOLTIP_TAN": "각도의 탄젠트를 반환합니다. (라디안 아님)", + "MATH_TRIG_TOOLTIP_ASIN": "어떤 수에 대한, asin(arcsine) 값을 돌려줍니다.", + "MATH_TRIG_TOOLTIP_ACOS": "어떤 수에 대한, acos(arccosine) 값을 돌려줍니다.", + "MATH_TRIG_TOOLTIP_ATAN": "어떤 수에 대한, atan(arctangent) 값을 돌려줍니다.", + "MATH_CONSTANT_HELPURL": "https://ko.wikipedia.org/wiki/수학_상수", + "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://ko.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": "리스트에 들어있는 수(값)들을, 모두 합(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": "이 리스트의 표준 편차를 반환합니다.", + "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/클램핑_(그래픽)", + "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 (배타적) 사이의 임의 분수 값을 돌려줍니다.", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "TEXT_TEXT_HELPURL": "https://ko.wikipedia.org/wiki/문자열", + "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_TITLE": "다음 %1 내용 덧붙이기 %2", + "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": "두 번째 텍스트에서 첫 번째 텍스트가 처음 또는 마지막으로 발생한 색인 위치를 반환합니다. 텍스트가 없으면 %1을 반환합니다.", + "TEXT_INDEXOF_TITLE": "문장 %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "에서 다음 문장이 처음으로 나타난 위치 찾기 :", + "TEXT_INDEXOF_OPERATOR_LAST": "에서 다음 문장이 마지막으로 나타난 위치 찾기 :", + "TEXT_CHARAT_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-text", + "TEXT_CHARAT_TITLE": "텍스트 %1 %2에서", + "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": "문장에 대해 사용자의 입력을 받습니다.", + "TEXT_COUNT_MESSAGE0": "%2에서 %1 숫자 세기", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "다른 어떤 텍스트에서 어떤 텍스트가 나타난 횟수를 셉니다.", + "TEXT_REPLACE_MESSAGE0": "%3에서 %2을(를) %1(으)로 바꾸기", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REVERSE_MESSAGE0": "%1 뒤집기", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "텍스트 안의 문자의 순서를 반전시킵니다.", + "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_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": "목록에서 항목이 처음 또는 마지막으로 발생한 색인 위치를 반환합니다. 항목이 없으면 %1을 반환합니다.", + "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_INDEX_FROM_START_TOOLTIP": "%1은 첫 번째 항목입니다.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1은(는) 마지막 항목입니다.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "목록에서 특정 위치의 항목을 반환합니다.", + "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": "목록의 특정 위치에 있는 항목을 제거하고 반환합니다.", + "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": "목록에서 특정 위치의 항목을 삭제합니다.", + "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": "목록의 특정 위치에 있는 항목으로 설정합니다.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "첫 번째 위치의 아이템으로 설정합니다.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "마지막 아이템으로 설정합니다.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "목록에서 임의 위치의 아이템을 설정합니다.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "목록의 특정 위치에 항목을 삽입합니다.", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "정렬 %1 %2 %3", + "LISTS_SORT_TOOLTIP": "목록의 사본을 정렬합니다.", + "LISTS_SORT_ORDER_ASCENDING": "오름차순", + "LISTS_SORT_ORDER_DESCENDING": "내림차순", + "LISTS_SORT_TYPE_NUMERIC": "숫자순", + "LISTS_SORT_TYPE_TEXT": "알파벳순", + "LISTS_SORT_TYPE_IGNORECASE": "알파벳순 (대소문자 구분 안 함)", + "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": "구분 기호로 구분하여 텍스트 목록을 하나의 텍스트에 병합합니다.", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "%1 뒤집기", + "LISTS_REVERSE_TOOLTIP": "리스트의 복사본을 뒤집습니다.", + "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_DEFNORETURN_COMMENT": "이 함수를 설명하세요...", + "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://ko.wikipedia.org/wiki/함수_(프로그래밍)", + "PROCEDURES_CALLNORETURN_TOOLTIP": "미리 정의해 둔 '%1' 함수를 실행합니다.", + "PROCEDURES_CALLRETURN_HELPURL": "https://ko.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_HELPURL": "http://c2.com/cgi/wiki?GuardClause", + "PROCEDURES_IFRETURN_WARNING": "경고: 이 블럭은, 함수 정의 블럭 안에서만 사용할 수 있습니다.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "말해 보세요..." +} diff --git a/js/msg/json/lb.json b/js/msg/json/lb.json new file mode 100644 index 0000000..ff12392 --- /dev/null +++ b/js/msg/json/lb.json @@ -0,0 +1,145 @@ +{ + "@metadata": { + "authors": [ + "Robby", + "Soued031", + "Les Meloures" + ] + }, + "VARIABLES_DEFAULT_NAME": "Element", + "UNNAMED_KEY": "ouni Numm", + "TODAY": "Haut", + "DUPLICATE_BLOCK": "Eng Kopie maachen", + "ADD_COMMENT": "Bemierkung derbäisetzen", + "REMOVE_COMMENT": "Bemierkung ewechhuelen", + "DUPLICATE_COMMENT": "Bemierkung kopéieren", + "DELETE_BLOCK": "Block läschen", + "DELETE_X_BLOCKS": "%1 Bléck läschen", + "CLEAN_UP": "Bléck opraumen", + "COLLAPSE_BLOCK": "Block zesummeklappen", + "COLLAPSE_ALL": "Bléck zesummeklappen", + "EXPAND_BLOCK": "Block opklappen", + "EXPAND_ALL": "Bléck opklappen", + "DISABLE_BLOCK": "Block desaktivéieren", + "ENABLE_BLOCK": "Block aktivéieren", + "HELP": "Hëllef", + "UNDO": "Réckgängeg maachen", + "REDO": "Widderhuelen", + "CHANGE_VALUE_TITLE": "Wäert änneren:", + "RENAME_VARIABLE": "Variabel ëmbenennen...", + "RENAME_VARIABLE_TITLE": "All '%1' Variabelen ëmbenennen op:", + "NEW_VARIABLE": "Variabel uleeën...", + "NEW_VARIABLE_TITLE": "Neie variabelen Numm:", + "COLOUR_PICKER_TOOLTIP": "Sicht eng Faarf an der Palette eraus.", + "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": "maach", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "Widderhuel soulaang", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "widderhuele bis", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Féiert d'Uweisungen aus, soulaang wéi de Wäert richteg ass", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Féiert d'Uweisungen aus, soulaang wéi de Wäert falsch ass.", + "CONTROLS_FOR_TITLE": "zielt mat %1 vun %2 bis %3 mat %4", + "CONTROLS_FOREACH_TITLE": "fir all Element %1 an der Lëscht %2", + "CONTROLS_IF_MSG_IF": "wann", + "CONTROLS_IF_MSG_ELSE": "soss", + "IOS_OK": "OK", + "IOS_CANCEL": "Ofbriechen", + "IOS_ERROR": "Feeler", + "IOS_VARIABLES_ADD_VARIABLE": "+ Variabel derbäisetzen", + "IOS_VARIABLES_ADD_BUTTON": "Derbäisetzen", + "IOS_VARIABLES_RENAME_BUTTON": "Ëmbenennen", + "IOS_VARIABLES_DELETE_BUTTON": "Läschen", + "IOS_VARIABLES_VARIABLE_NAME": "Numm vun der Variabel", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Dir kënnt keen eidelen Numm fir eng Variabel benotzen.", + "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": "Den Total vun den zwou Zuelen zréckginn.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "D'Produkt vun den zwou Zuelen zréckginn.", + "MATH_SINGLE_HELPURL": "https://lb.wikipedia.org/wiki/Racine carrée", + "MATH_SINGLE_OP_ROOT": "Quadratwuerzel", + "MATH_SINGLE_OP_ABSOLUTE": "absolut", + "MATH_IS_EVEN": "ass gerued", + "MATH_IS_ODD": "ass ongerued", + "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 ofrënnen.", + "MATH_ROUND_OPERATOR_ROUND": "opronnen", + "MATH_ROUND_OPERATOR_ROUNDUP": "oprënnen", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "ofrënnen", + "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": "Moyenne 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_LENGTH_TITLE": "Längt vu(n) %1", + "TEXT_ISEMPTY_TITLE": "%1 ass eidel", + "TEXT_INDEXOF_TITLE": "am Text %1 %2 %3", + "TEXT_CHARAT_TITLE": "am Text %1 %2", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "am Text", + "TEXT_GET_SUBSTRING_END_FROM_START": "bis bei de Buschtaf #", + "TEXT_GET_SUBSTRING_END_LAST": "bis bei de leschte Buschtaw", + "TEXT_PRINT_TITLE": "%1 drécken", + "TEXT_PROMPT_TOOLTIP_TEXT": "Frot de Benotzer no engem Text.", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_REPLACE_MESSAGE0": "%1 duerch %2 a(n) %3 ersetzen", + "TEXT_REPLACE_TOOLTIP": "All Kéiers wou e bestëmmten Text do ass duerch en aneren Text ersetzen.", + "TEXT_REVERSE_TOOLTIP": "Dréint d'Reiefolleg vun den Zeechen am Text ëm.", + "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": "# vun hannen", + "LISTS_GET_INDEX_FIRST": "éischt", + "LISTS_GET_INDEX_LAST": "lescht", + "LISTS_GET_INDEX_RANDOM": "Zoufall", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 ass dat éischt Element.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 ass dat éischt Element.", + "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 zoufällegt Element an eng Lëscht.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Setzt d'Element um Enn 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.", + "LISTS_SORT_TITLE": "%1 %2 %3 zortéieren", + "LISTS_SORT_TYPE_NUMERIC": "numeresch", + "LISTS_SORT_TYPE_TEXT": "alphabetesch", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "%1 ëmdréinen", + "PROCEDURES_DEFNORETURN_PROCEDURE": "eppes maachen", + "PROCEDURES_BEFORE_PARAMS": "mat:", + "PROCEDURES_CALL_BEFORE_PARAMS": "mat:", + "PROCEDURES_DEFNORETURN_COMMENT": "Dës Funktioun beschreiwen...", + "PROCEDURES_DEFRETURN_RETURN": "zréck", + "PROCEDURES_CREATE_DO": "'%1' uleeën", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Sot eppes..." +} diff --git a/js/msg/json/lki.json b/js/msg/json/lki.json new file mode 100644 index 0000000..e27c575 --- /dev/null +++ b/js/msg/json/lki.json @@ -0,0 +1,294 @@ +{ + "@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": "کؤمةک", + "CHANGE_VALUE_TITLE": "تةغییر مقدار:", + "RENAME_VARIABLE": "تغییر نام متغیر...", + "RENAME_VARIABLE_TITLE": "تغییر نام همهٔ متغیرهای «%1» به:", + "NEW_VARIABLE": "متغیر تازه...", + "NEW_VARIABLE_TITLE": "نام متغیر تازه:", + "COLOUR_PICKER_HELPURL": "https://lki.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_TITLE": "به %1 چسباندن متن %2", + "TEXT_APPEND_TOOLTIP": "الحاق متنی به متغیر «%1».", + "TEXT_LENGTH_TITLE": "طول %1", + "TEXT_LENGTH_TOOLTIP": "بازگرداندن عددی از حروف (شامل فاصله‌ها) در متن فراهم‌شده.", + "TEXT_ISEMPTY_TITLE": "%1 خالی است", + "TEXT_ISEMPTY_TOOLTIP": "اضافه‌کردن صحیح اگر متن فراهم‌شده خالی است.", + "TEXT_INDEXOF_TOOLTIP": "شاخصی از اولین آخرین رخ‌داد متن اول در متن دوم بر می‌گرداند. اگر متن یافت نشد %1 باز می‌گرداند.", + "TEXT_INDEXOF_TITLE": "در متن %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "اولین رخداد متن را بیاب", + "TEXT_INDEXOF_OPERATOR_LAST": "آخرین رخداد متن را بیاب", + "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": "شاخصی از اولین/آخرین رخ‌داد مورد در فهرست را بر می‌گرداند. %1 بر می‌گرداند اگر آیتم موجود نبود.", + "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_INDEX_FROM_START_TOOLTIP": "%1 اولین مورد است.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 آخرین مورد است.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "موردی در محل مشخص‌شده بر می‌گرداند.", + "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": "مورد در محل مشخص‌شده در فهرست را حذف و بر می‌گرداند.", + "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": "مورد مشخص‌شده در موقعیت مشخص در یک فهرست را حذف و بر می‌گرداند.", + "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": "مورد مشخص‌شده در یک فهرست را قرار می‌دهد.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "اولین مورد در یک فهرست را تعیین می‌کند.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "آخرین مورد در یک فهرست را تعیین می‌کند.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "یک مورد تصادفی در یک فهرست را تعیین می‌کند.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "موردی در موقعیت مشخص‌شده در یک فهرست اضافه می‌کند.", + "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://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/js/msg/json/lo.json b/js/msg/json/lo.json new file mode 100644 index 0000000..ec7aabb --- /dev/null +++ b/js/msg/json/lo.json @@ -0,0 +1,93 @@ +{ + "@metadata": { + "authors": [ + "Aefgh39622" + ] + }, + "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": "ຊ່ວຍເຫຼືອ", + "UNDO": "ກັບຄືນ", + "REDO": "ເຮັດຄືນ", + "CHANGE_VALUE_TITLE": "ປ່ຽນຄ່າ:", + "RENAME_VARIABLE": "ປ່ຽນຊື່ຕົວແປ...", + "RENAME_VARIABLE_TITLE": "ປ່ຽນຊື່ຕົວແປ '%1' ທັງໝົດເປັນ:", + "NEW_VARIABLE_TITLE": "ຊື່ຕົວແປໃໝ່:", + "COLOUR_PICKER_HELPURL": "https://lo.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_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://​​lo.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://lo.wikipedia.org/wiki/ຈຳນວນ", + "MATH_NUMBER_TOOLTIP": "ຈຳນວນໜຶ່ງ." +} diff --git a/js/msg/json/lrc.json b/js/msg/json/lrc.json new file mode 100644 index 0000000..a3b07e2 --- /dev/null +++ b/js/msg/json/lrc.json @@ -0,0 +1,136 @@ +{ + "@metadata": { + "authors": [ + "Mogoeilor", + "Lorestani" + ] + }, + "VARIABLES_DEFAULT_NAME": "قلٱم", + "TODAY": "اؽمرۊ", + "DUPLICATE_BLOCK": "کپی کردن", + "ADD_COMMENT": "نٱزٱرتو ناْ اْزاف بٱکؽت", + "REMOVE_COMMENT": "هٱزف نٱزٱر", + "DUPLICATE_COMMENT": "نٱزٱر تکراری", + "EXTERNAL_INPUTS": "دادٱیا ڤ دری", + "INLINE_INPUTS": "دادٱیا مؽنجا", + "DELETE_BLOCK": "پاکسا کردن برشت", + "DELETE_X_BLOCKS": "پاکسا کردن%1 د برشتؽا", + "COLLAPSE_BLOCK": "کوچک کردن برشت", + "COLLAPSE_ALL": "کوچک کردن برشتؽا", + "EXPAND_BLOCK": "گٱپ کردن برشت", + "EXPAND_ALL": "گٱپ کردن برشتؽا", + "DISABLE_BLOCK": "ناکشتگر کردن برشت", + "ENABLE_BLOCK": "کنشتگر کردن برشت", + "HELP": "هومياری", + "UNDO": "ٱنجوم نٱداٛئن", + "REDO": "د نۊ ٱنجوم داٛئن", + "CHANGE_VALUE_TITLE": "ٱرزشت آلشت کو:", + "RENAME_VARIABLE": "د نۊ نوم نؽاین آلشتگر...", + "RENAME_VARIABLE_TITLE": "د نو نوم نؽاین %1 د تموم آلشتگریا د:", + "NEW_VARIABLE": "آلشتگر تازٱ...", + "NEW_VARIABLE_TYPE_TITLE": "نوع آلشتگر تازٱ", + "NEW_VARIABLE_TITLE": "نوم آلشتگر تازٱ:", + "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_ISEMPTY_TITLE": "%1 هالٛیٱ", + "TEXT_INDEXOF_TITLE": "د مٱتن %1 %2 %3", + "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/js/msg/json/lt.json b/js/msg/json/lt.json new file mode 100644 index 0000000..649f516 --- /dev/null +++ b/js/msg/json/lt.json @@ -0,0 +1,323 @@ +{ + "@metadata": { + "authors": [ + "Eitvys200", + "Jurgis", + "Zygimantus", + "Nuodas" + ] + }, + "VARIABLES_DEFAULT_NAME": "elementas", + "TODAY": "Šiandien", + "DUPLICATE_BLOCK": "Kopijuoti", + "ADD_COMMENT": "Palikti komentarą", + "REMOVE_COMMENT": "Pašalinti komentarą", + "DUPLICATE_COMMENT": "Dubliuoti 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", + "DELETE_ALL_BLOCKS": "Ištrinti visus %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", + "UNDO": "Anuliuoti", + "REDO": "Atkurti", + "CHANGE_VALUE_TITLE": "Keisti reikšmę:", + "RENAME_VARIABLE": "Pervardyti kintamajį...", + "RENAME_VARIABLE_TITLE": "Pervadinti visus '%1' kintamuosius į:", + "NEW_VARIABLE": "Sukurti kintamąjį", + "NEW_NUMBER_VARIABLE": "Sukurti skaičiaus kintamąjį...", + "NEW_COLOUR_VARIABLE": "Sukurti spalvos kintamąjį...", + "NEW_VARIABLE_TYPE_TITLE": "Naujas kintamojo tipas:", + "NEW_VARIABLE_TITLE": "Naujo kintamojo pavadinimas:", + "VARIABLE_ALREADY_EXISTS": "Kintamasis, pavadinimu '%1', jau egzistuoja.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Kintamasis, pavadinimu '%1', jau egzistuoja kaip kitas tipas: '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Ištrinti %1 '%2' panaudojimus?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Negalima ištrinti kintamojo '%1', nes jis yra dalis funkcijos '%2'", + "DELETE_VARIABLE": "Ištrinti „%1“ kintamąjį", + "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": "Imama kintamoji '%1' reikšmė nuo pradinio skaičiaus iki pabaigos skaičiaus, skaičiuojant nustatytais intervalais ir atliekant nustatytus blokus.", + "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.", + "IOS_OK": "Gerai", + "IOS_CANCEL": "Atšaukti", + "IOS_ERROR": "Klaida", + "IOS_PROCEDURES_INPUTS": "ĮVESTYS", + "IOS_PROCEDURES_ADD_INPUT": "+ Pridėti Įvestį", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Ši funkcija turi pasikartojančias įvestis", + "IOS_VARIABLES_ADD_VARIABLE": "+Pridėti Kintamąjį", + "IOS_VARIABLES_ADD_BUTTON": "Pridėti", + "IOS_VARIABLES_RENAME_BUTTON": "Pervadinti", + "IOS_VARIABLES_DELETE_BUTTON": "Ištrinti", + "IOS_VARIABLES_VARIABLE_NAME": "Kintamojo pavadinimas", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Negalite naudoti tuščio kintamojo pavadinimo.", + "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", + "LOGIC_COMPARE_TOOLTIP_EQ": "Tenkinama, jei abu reiškiniai lygūs.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Grįžti tiesa, jeigu abi įvestys ne lygios tarpusavyje.", + "LOGIC_COMPARE_TOOLTIP_LT": "Grįžti tiesa, jei pirma įvestis mažesnė nei antra įvestis.", + "LOGIC_COMPARE_TOOLTIP_LTE": "Grįžti tiesa, jei pirma įvestis mažesnė arba lygi antrajai įvesčiai.", + "LOGIC_COMPARE_TOOLTIP_GT": "Grįžti tiesa, jei pirmoji įvestis didesnė nei antroji įvestis.", + "LOGIC_COMPARE_TOOLTIP_GTE": "Grįžti tiesa, jei pirma įvestis didesnė arba lygi antrajai įvesčiai.", + "LOGIC_OPERATION_TOOLTIP_AND": "Bus teisinga, kai abi sąlygos bus tenkinamos.", + "LOGIC_OPERATION_AND": "ir", + "LOGIC_OPERATION_TOOLTIP_OR": "Grįžti tiesa, jei bent viena įvestis teisinga.", + "LOGIC_OPERATION_OR": "arba", + "LOGIC_NEGATE_TITLE": "ne %1", + "LOGIC_NEGATE_TOOLTIP": "Grįžti tiesa, jei įvestis klaidinga. Grįžti klaidinga, jei įvestis teisinga.", + "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_TOOLTIP_ROOT": "Grįžti kvadratinę šaknį iš skaičiaus.", + "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_LOG10": "Grįžti 10 pagrindinių logaritmų iš skaičiaus.", + "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_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", + "MATH_CONSTANT_TOOLTIP": "Grįžti viena iš pagrindinių konstantų: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (begalybė).", + "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_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", + "MATH_CHANGE_TITLE": "padidink %1 (emptypage) %2", + "MATH_CHANGE_TOOLTIP": "Prideda skaičių prie kintamojo '%1'. Kai skaičius neigiamas - gaunasi atimtis.", + "MATH_ROUND_HELPURL": "https://lt.wikipedia.org/wiki/Apvalinimas", + "MATH_ROUND_TOOLTIP": "Suapvalinti skaičių į žemesnę ar aukštesnę reikšmę.", + "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_TOOLTIP_MIN": "Grįžti mažiausiu skaičiumi sąraše.", + "MATH_ONLIST_OPERATOR_MAX": "didžiausia reikšmė sąraše", + "MATH_ONLIST_TOOLTIP_MAX": "Grįžti didžiausiu skaičiumi sąraše.", + "MATH_ONLIST_OPERATOR_AVERAGE": "vidurkis", + "MATH_ONLIST_TOOLTIP_AVERAGE": "Grįžti vidurkiu (aritmetinis vidurkis) iš skaitinių reikšmių sąraše.", + "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_TOOLTIP_STD_DEV": "Grįžti standartine pakraipa iš sąrašo.", + "MATH_ONLIST_OPERATOR_RANDOM": "atsitiktinis elementas iš sąrašo", + "MATH_ONLIST_TOOLTIP_RANDOM": "Grąžinti atsitiktinį elementą iš sąrašo.", + "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", + "MATH_MODULO_TITLE": "dalybos liekana %1 ÷ %2", + "MATH_MODULO_TOOLTIP": "Grįžti likučiu nuo dviejų skaičių dalybos.", + "MATH_CONSTRAIN_TITLE": "apribok %1 tarp %2 ir %3", + "MATH_CONSTRAIN_TOOLTIP": "Apriboti skaičių, kad būtų tarp nustatytų ribų (imtinai).", + "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_INT_TITLE": "atsitiktinis sveikas sk. nuo %1 iki %2", + "MATH_RANDOM_INT_TOOLTIP": "Grįžti atsitiktinį sveikąjį skaičių tarp dviejų nustatytų ribų, imtinai.", + "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "atsitiktinė trupmena", + "MATH_RANDOM_FLOAT_TOOLTIP": "Atsitiktinė trupmena nuo 0 (imtinai) iki 1 (neimtinai).", + "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", + "TEXT_TEXT_TOOLTIP": "Tekstas (arba žodis, ar raidė)", + "TEXT_JOIN_TITLE_CREATEWITH": "sukurti tekstą su", + "TEXT_JOIN_TOOLTIP": "Sukurti teksto fragmentą sujungiant bet kokį skaičių fragmentų.", + "TEXT_CREATE_JOIN_TITLE_JOIN": "sujunk", + "TEXT_CREATE_JOIN_TOOLTIP": "Pridėti, pašalinti arba paskirstyti skyrius, kad pertvarkyti šį teksto bloką.", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Pridėti teksto elementą.", + "TEXT_APPEND_TITLE": "prie %1 pridėk tekstą %2", + "TEXT_APPEND_TOOLTIP": "Pridėti tekstą prie kintamojo '%1'.", + "TEXT_LENGTH_TITLE": "teksto %1 ilgis", + "TEXT_LENGTH_TOOLTIP": "Suranda teksto simbolių kiekį (įskaitant ir tarpus)", + "TEXT_ISEMPTY_TITLE": "%1 yra tuščias", + "TEXT_ISEMPTY_TOOLTIP": "Grįžti tiesa, jei numatytas tekstas tuščias.", + "TEXT_INDEXOF_TOOLTIP": "Grąžina pirmą/paskutinę pirmo teksto reikšmę antrame tekste. Grąžina %1, jei tekstas nerastas.", + "TEXT_INDEXOF_TITLE": "tekste %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "rask,kur pirmą kartą paminėta", + "TEXT_INDEXOF_OPERATOR_LAST": "rask,kur paskutinį kartą paminėta", + "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_CHARAT_TOOLTIP": "Grąžina raidę į tam tikrą poziciją.", + "TEXT_GET_SUBSTRING_TOOLTIP": "Grąžina tam tikrą teksto dalį.", + "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_TOOLTIP": "Kitu atvėju, grąžina teksto kopiją.", + "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_TOOLTIP": "Grąžina teksto kopiją, pašalinus tarpus iš vieno ar abiejų kraštų.", + "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_PRINT_TOOLTIP": "Spausdinti nurodytą tekstą, skaičių ar kitą reikšmę.", + "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ą.", + "TEXT_COUNT_MESSAGE0": "skaičius %1 iš %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Suskaičiuoti, kiek kartų šis tekstas kartojasi kitame tekste.", + "TEXT_REPLACE_MESSAGE0": "pakeisti %1 į %2 šiame %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "Pašalinti visas teksto dalis kitame tekste.", + "TEXT_REVERSE_MESSAGE0": "atbulai %1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REVERSE_TOOLTIP": "Apversti teksto simbolių tvarką.", + "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_CONTAINER_TOOLTIP": "Pridėti, pašalinti arba paskirstyti skyrius, kad pertvarkyti šį teksto bloką.", + "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 %1, jei reikšmės neranda.", + "LISTS_GET_INDEX_GET": "paimk", + "LISTS_GET_INDEX_GET_REMOVE": "paimk ir ištrink", + "LISTS_GET_INDEX_REMOVE": "pašalinti", + "LISTS_GET_INDEX_FROM_END": "# nuo galo", + "LISTS_GET_INDEX_FIRST": "pirmas", + "LISTS_GET_INDEX_LAST": "paskutinis", + "LISTS_GET_INDEX_RANDOM": "atsitiktinis", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 yra pirmasis objektas.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 yra paskutinis objektas.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Gražina objektą į nurodyta poziciją sąraše.", + "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_GET_INDEX_TOOLTIP_REMOVE_FROM": "Pašalina objektą iš nurodytos vietos sąraše.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Pašalina pirmą objektą sąraše.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Pašalina paskutinį objektą sąraše.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Pašalina atsitiktinį objektą sąraše.", + "LISTS_SET_INDEX_SET": "priskirk elementui", + "LISTS_SET_INDEX_INSERT": "įterpk į vietą", + "LISTS_SET_INDEX_INPUT_TO": "kaip", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Įterpią objektą į nurodytą poziciją sąraše.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Įterpia objektą į sąrašo pradžią.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Įterpia objektą į atsitiktinę sąrašo vietą.", + "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", + "LISTS_GET_SUBLIST_TOOLTIP": "Sukuria nurodytos sąrašo dalies kopiją.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "rūšiuoti %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Rūšiuoti sąrašo kopiją.", + "LISTS_SORT_ORDER_ASCENDING": "didėjančia tvarka", + "LISTS_SORT_ORDER_DESCENDING": "mažėjančia tvarka", + "LISTS_SORT_TYPE_NUMERIC": "skaitmeninis", + "LISTS_SORT_TYPE_TEXT": "abėcėlės", + "LISTS_SORT_TYPE_IGNORECASE": "abecėlės, ignoruoti raidžių dydį", + "LISTS_SPLIT_WITH_DELIMITER": "su dalikliu", + "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_DEFNORETURN_COMMENT": "Apibūdinkite šią funkciją...", + "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_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Vykdyti sukurtą komandą \"%1\".", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "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ą.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Kažką pasakykite..." +} diff --git a/js/msg/json/lv.json b/js/msg/json/lv.json new file mode 100644 index 0000000..6585930 --- /dev/null +++ b/js/msg/json/lv.json @@ -0,0 +1,320 @@ +{ + "@metadata": { + "authors": [ + "Elomage", + "Janis", + "Papuass", + "Silraks", + "RFenichel" + ] + }, + "VARIABLES_DEFAULT_NAME": "vienums", + "TODAY": "Šodiena", + "DUPLICATE_BLOCK": "Dublēt", + "ADD_COMMENT": "Pievienot komentāru", + "REMOVE_COMMENT": "Noņemt komentāru", + "EXTERNAL_INPUTS": "Ārējie ievaddati", + "INLINE_INPUTS": "Iekšējie ievaddati", + "DELETE_BLOCK": "Izmest bloku", + "DELETE_X_BLOCKS": "Izmest %1 blokus", + "DELETE_ALL_BLOCKS": "Izdzēst visus %1 blokus?", + "CLEAN_UP": "Sakopt blokus", + "COLLAPSE_BLOCK": "Sakļaut bloku", + "COLLAPSE_ALL": "Sakļaut blokus", + "EXPAND_BLOCK": "Izvērst bloku", + "EXPAND_ALL": "Izvērst blokus", + "DISABLE_BLOCK": "Atspējot bloku", + "ENABLE_BLOCK": "Iespējot bloku", + "HELP": "Palīdzība", + "UNDO": "Atsaukt", + "REDO": "Atcelt atsaukšanu", + "CHANGE_VALUE_TITLE": "Mainīt vērtību:", + "RENAME_VARIABLE": "Pārdēvēt mainīgo...", + "RENAME_VARIABLE_TITLE": "Pārdēvējiet visus '%1' mainīgos:", + "NEW_VARIABLE": "Izveidot mainīgo...", + "NEW_VARIABLE_TITLE": "Jaunā mainīgā vārds:", + "VARIABLE_ALREADY_EXISTS": "Mainīgais '%1' jau eksistē.", + "DELETE_VARIABLE_CONFIRMATION": "Mainīgais \"%2\" tiek izmantots %1 vietās. Dzēst?", + "DELETE_VARIABLE": "Izdzēst mainīgo \"%1\"", + "COLOUR_PICKER_HELPURL": "https://lv.wikipedia.org/wiki/Krāsa", + "COLOUR_PICKER_TOOLTIP": "Izvēlēties krāsu no paletes.", + "COLOUR_RANDOM_TITLE": "nejauša krāsa", + "COLOUR_RANDOM_TOOLTIP": "Izvēlēties krāsu pēc nejaušības principa.", + "COLOUR_RGB_TITLE": "veido krāsu no", + "COLOUR_RGB_RED": "sarkana", + "COLOUR_RGB_GREEN": "zaļa", + "COLOUR_RGB_BLUE": "zila", + "COLOUR_RGB_TOOLTIP": "Izveidot krāsu ar norādīto daudzumu sarkanā, zaļā un zilā toņu. Visas vērtības ir starp 0 un 100.", + "COLOUR_BLEND_TITLE": "sajaukt", + "COLOUR_BLEND_COLOUR1": "1. krāsa", + "COLOUR_BLEND_COLOUR2": "2. krāsa", + "COLOUR_BLEND_RATIO": "attiecība", + "COLOUR_BLEND_TOOLTIP": "Sajauc kopā divas krāsas ar doto attiecību (0.0 - 1.0).", + "CONTROLS_REPEAT_HELPURL": "https://lv.wikipedia.org/wiki/Cikls", + "CONTROLS_REPEAT_TITLE": "atkārtot %1 reizes", + "CONTROLS_REPEAT_INPUT_DO": "izpildi", + "CONTROLS_REPEAT_TOOLTIP": "Izpildīt komandas vairākas reizes.", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "atkārtot kamēr", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "atkārtot līdz", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Izpildīt komandas, kamēr vērtība ir patiesa.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Izpildīt komandas, kamēr vērtība ir nepatiesa.", + "CONTROLS_FOR_TOOLTIP": "Ļauj mainīgajam '%1' pieņemt vērtības no sākuma līdz beigu vērtībai, un izpildīt iekļautos blokus katrai no šīm pieņemtajām vērtībām.", + "CONTROLS_FOR_TITLE": "skaitīt %1 no %2 līdz %3 ar soli %4", + "CONTROLS_FOREACH_TITLE": "visiem %1 no saraksta %2", + "CONTROLS_FOREACH_TOOLTIP": "Katram objektam no saraksta piešķirt mainīgajam '%1' šo objektu un izpildīt komandas.", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "iet ārā no cikla", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "turpināt ar cikla nākamo iterāciju", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Iet ārā no iekļaujošā cikla", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Nepildīt atlikušo cikla daļu bet sākt nākamo iterāciju.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Brīdinājums: šo bloku drīkst izmantot tikai cikla iekšienē.", + "CONTROLS_IF_TOOLTIP_1": "Ja vērtība ir patiesa, tad izpildīt komandas.", + "CONTROLS_IF_TOOLTIP_2": "Ja vērtība ir patiesa, tad izpildīt pirmo bloku ar komandām. Citādi izpildīt otro bloku ar komandām.", + "CONTROLS_IF_TOOLTIP_3": "Ja pirmā vērtība ir patiesa, tad izpildīt pirmo bloku ar komandām. Citādi, ja otrā vērtība ir patiesa, izpildīt otro bloku ar komandām.", + "CONTROLS_IF_TOOLTIP_4": "Ja pirmā vērtība ir patiesa, tad izpildīt pirmo bloku ar komandām. Citādi, ja otrā vērtība ir patiesa, izpildīt otro bloku ar komandām. Ja neviena no vertībām nav patiesa, tad izpildīt pēdējo bloku ar komandām.", + "CONTROLS_IF_MSG_IF": "ja", + "CONTROLS_IF_MSG_ELSEIF": "citādi, ja", + "CONTROLS_IF_MSG_ELSE": "citādi", + "CONTROLS_IF_IF_TOOLTIP": "Pievienot, noņemt vai mainīt sekciju secību šim \"ja\" blokam.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Pievienot nosacījumu \"ja\" blokam.", + "CONTROLS_IF_ELSE_TOOLTIP": "Pievienot gala nosacījumu \"ja\" blokam.", + "IOS_OK": "Labi", + "IOS_CANCEL": "Atcelt", + "IOS_ERROR": "Kļūda", + "IOS_VARIABLES_ADD_VARIABLE": "+ Pievienot mainīgo", + "IOS_VARIABLES_ADD_BUTTON": "Pievienot", + "IOS_VARIABLES_RENAME_BUTTON": "Pārsaukt", + "IOS_VARIABLES_DELETE_BUTTON": "Dzēst", + "IOS_VARIABLES_VARIABLE_NAME": "Mainīgā nosaukums", + "LOGIC_COMPARE_HELPURL": "https://lv.wikipedia.org/wiki/Nevien%C4%81d%C4%ABba", + "LOGIC_COMPARE_TOOLTIP_EQ": "Patiess, ja abas puses ir vienādas.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Patiess, ja abas puses nav vienādas.", + "LOGIC_COMPARE_TOOLTIP_LT": "Patiess, ja kreisā puse ir mazāka par labo pusi.", + "LOGIC_COMPARE_TOOLTIP_LTE": "Patiess, ja kreisā puse ir mazāka vai vienāda ar labo pusi.", + "LOGIC_COMPARE_TOOLTIP_GT": "Patiess, ja kreisā puse ir lielāka par labo pusi.", + "LOGIC_COMPARE_TOOLTIP_GTE": "Patiess, ja kreisā puse ir lielāka vai vienāda ar labo pusi.", + "LOGIC_OPERATION_TOOLTIP_AND": "Patiess, ja abas puses ir patiesas.", + "LOGIC_OPERATION_AND": "un", + "LOGIC_OPERATION_TOOLTIP_OR": "Patiess, ja vismaz viena puse ir patiesa.", + "LOGIC_OPERATION_OR": "vai", + "LOGIC_NEGATE_TITLE": "ne %1", + "LOGIC_NEGATE_TOOLTIP": "Patiess, ja arguments ir aplams.", + "LOGIC_BOOLEAN_TRUE": "patiess", + "LOGIC_BOOLEAN_FALSE": "aplams", + "LOGIC_BOOLEAN_TOOLTIP": "Atgriež rezultātu \"patiess\" vai \"aplams\".", + "LOGIC_NULL": "nekas", + "LOGIC_NULL_TOOLTIP": "Atgriež neko.", + "LOGIC_TERNARY_CONDITION": "nosacījums", + "LOGIC_TERNARY_IF_TRUE": "ja patiess", + "LOGIC_TERNARY_IF_FALSE": "ja aplams", + "LOGIC_TERNARY_TOOLTIP": "Pārbaudīt nosacījumu. Ja 'nosacījums' ir patiess, atgriež vērtību 'ja patiess', pretējā gadījumā vērtību 'ja aplams'.", + "MATH_NUMBER_HELPURL": "https://lv.wikipedia.org/wiki/Skaitlis", + "MATH_NUMBER_TOOLTIP": "Skaitlis.", + "MATH_ARITHMETIC_HELPURL": "https://lv.wikipedia.org/wiki/Aritm%C4%93tika", + "MATH_ARITHMETIC_TOOLTIP_ADD": "Atgriež divu skaitļu summu.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "Atgriež divu skaitļu starpību.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Atgriež divu skaitļu reizinājumu.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Atgriež divu skaitļu dalījumu.", + "MATH_ARITHMETIC_TOOLTIP_POWER": "Atgriež pirmo skaitli kāpinātu pakāpē otrais skaitlis.", + "MATH_SINGLE_HELPURL": "https://lv.wikipedia.org/wiki/Kvadr%C4%81tsakne", + "MATH_SINGLE_OP_ROOT": "kvadrātsakne", + "MATH_SINGLE_TOOLTIP_ROOT": "Atgriež skaitļa kvadrātsakni.", + "MATH_SINGLE_OP_ABSOLUTE": "absolūtā vērtība", + "MATH_SINGLE_TOOLTIP_ABS": "Atgriež skaitļa absolūto vērtību.", + "MATH_SINGLE_TOOLTIP_NEG": "Atgriež pretējo skaitli.", + "MATH_SINGLE_TOOLTIP_LN": "Atgriež skaitļa naturālo logaritmu.", + "MATH_SINGLE_TOOLTIP_LOG10": "Atgriež skaitļa logaritmu pie bāzes 10.", + "MATH_SINGLE_TOOLTIP_EXP": "Atgriež e pakāpē dotais skaitlis.", + "MATH_SINGLE_TOOLTIP_POW10": "Atgriež 10 pakāpē dotais skaitlis.", + "MATH_TRIG_HELPURL": "https://lv.wikipedia.org/wiki/Trigonometrisk%C4%81s_funkcijas", + "MATH_TRIG_TOOLTIP_SIN": "Sinuss no grādiem (nevis radiāniem).", + "MATH_TRIG_TOOLTIP_COS": "Kosinuss no grādiem (nevis radiāniem).", + "MATH_TRIG_TOOLTIP_TAN": "Tangenss no grādiem (nevis radiāniem).", + "MATH_TRIG_TOOLTIP_ASIN": "Arksinuss (grādos).", + "MATH_TRIG_TOOLTIP_ACOS": "Arkkosinuss (grādos).", + "MATH_TRIG_TOOLTIP_ATAN": "Arktangenss (grādos).", + "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", + "MATH_CONSTANT_TOOLTIP": "Atgriež kādu no matemātikas konstantēm: π (3.141…), e (2.718…), φ (1.618…), √(2) (1.414…), √(½) (0.707…), ∞ (bezgalība).", + "MATH_IS_EVEN": "ir pāra", + "MATH_IS_ODD": "ir nepāra", + "MATH_IS_PRIME": "ir pirmskaitlis", + "MATH_IS_WHOLE": "ir vesels", + "MATH_IS_POSITIVE": "ir pozitīvs", + "MATH_IS_NEGATIVE": "ir negatīvs", + "MATH_IS_DIVISIBLE_BY": "dalās bez atlikuma ar", + "MATH_IS_TOOLTIP": "Pārbauda, vai skaitlis ir pāra, nepāra, vesels, pozitīvs, negatīvs vai dalās ar noteiktu skaitli. Atgriež \"patiess\" vai \"aplams\".", + "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", + "MATH_CHANGE_TITLE": "izmainīt %1 par %2", + "MATH_CHANGE_TOOLTIP": "Pieskaitīt doto skaitli mainīgajam '%1'.", + "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", + "MATH_ROUND_TOOLTIP": "Noapaļot skaitli uz augšu vai uz leju.", + "MATH_ROUND_OPERATOR_ROUND": "noapaļot", + "MATH_ROUND_OPERATOR_ROUNDUP": "apaļot uz augšu", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "apaļot uz leju", + "MATH_ONLIST_OPERATOR_SUM": "summa", + "MATH_ONLIST_TOOLTIP_SUM": "Saskaitīt visus skaitļus no dotā saraksta.", + "MATH_ONLIST_OPERATOR_MIN": "mazākais", + "MATH_ONLIST_TOOLTIP_MIN": "Atgriež mazāko vērtību no saraksta.", + "MATH_ONLIST_OPERATOR_MAX": "lielākais", + "MATH_ONLIST_TOOLTIP_MAX": "Atgriež lielāko vērtību no saraksta.", + "MATH_ONLIST_OPERATOR_AVERAGE": "vidējais", + "MATH_ONLIST_TOOLTIP_AVERAGE": "Atgriež dotā saraksta vidējo aritmētisko vērtību.", + "MATH_ONLIST_OPERATOR_MEDIAN": "mediāna", + "MATH_ONLIST_TOOLTIP_MEDIAN": "Atgriež dotā saraksta mediānas vērtību.", + "MATH_ONLIST_OPERATOR_MODE": "moda", + "MATH_ONLIST_TOOLTIP_MODE": "Atgriež dotā saraksta biežāk sastopamās vērtības (modas).", + "MATH_ONLIST_OPERATOR_STD_DEV": "standartnovirze", + "MATH_ONLIST_TOOLTIP_STD_DEV": "Atgriež dotā saraksta standartnovirzi.", + "MATH_ONLIST_OPERATOR_RANDOM": "nejaušs", + "MATH_ONLIST_TOOLTIP_RANDOM": "Atgriež nejauši izvēlētu vērtību no dotā saraksta.", + "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", + "MATH_MODULO_TITLE": "atlikums no %1 ÷ %2", + "MATH_MODULO_TOOLTIP": "Atlikums no divu skaitļu dalījuma.", + "MATH_CONSTRAIN_TITLE": "ierobežot %1 no %2 līdz %3", + "MATH_CONSTRAIN_TOOLTIP": "Ierobežo skaitli no noteiktajās robežās (ieskaitot galapunktus).", + "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_INT_TITLE": "nejaušs vesels skaitlis no %1 līdz %2", + "MATH_RANDOM_INT_TOOLTIP": "Atgriež nejaušu veselu skaitli dotajās robežās (iekļaujot galapunktus)", + "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "nejaušs skaitlis [0..1)", + "MATH_RANDOM_FLOAT_TOOLTIP": "Atgriež nejaušu reālo skaitli robežās no 0 (iekļaujot) līdz 1 (neiekļaujot).", + "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", + "TEXT_TEXT_TOOLTIP": "Burts, vārds vai jebkāda teksta rinda.", + "TEXT_JOIN_TITLE_CREATEWITH": "veidot tekstu no", + "TEXT_JOIN_TOOLTIP": "Izveidot tekstu savienojot dotos argumentus.", + "TEXT_CREATE_JOIN_TITLE_JOIN": "savienot", + "TEXT_CREATE_JOIN_TOOLTIP": "Pievienot, noņemt vai mainīt sekciju secību šim \"teksta\" blokam.", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Pievienot tekstam objektu.", + "TEXT_APPEND_TITLE": "tekstam %1 pievienot tekstu %2", + "TEXT_APPEND_TOOLTIP": "Pievienot tekstu mainīgajam '%1'.", + "TEXT_LENGTH_TITLE": "garums tekstam %1", + "TEXT_LENGTH_TOOLTIP": "Atgriež burtu skaitu (ieskaitot atstarpes) dotajā tekstā.", + "TEXT_ISEMPTY_TITLE": "%1 ir tukšs", + "TEXT_ISEMPTY_TOOLTIP": "Patiess, ja teksts ir tukšs.", + "TEXT_INDEXOF_TOOLTIP": "Meklē pirmā teksta rindu otrajā tekstā. Atgriež pozīciju otrajā tekstā, kurā sākas pirmais teksts. Atgriež %1 ja pirmā teksta rinda nav atrasta.", + "TEXT_INDEXOF_TITLE": "tekstā %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "meklēt pirmo vietu, kur sākas teksts", + "TEXT_INDEXOF_OPERATOR_LAST": "meklēt pēdējo vietu, kur sākas teksts", + "TEXT_CHARAT_FROM_START": "paņemt burtu #", + "TEXT_CHARAT_FROM_END": "paņemt no beigām burtu #", + "TEXT_CHARAT_FIRST": "paņemt pirmo burtu", + "TEXT_CHARAT_LAST": "paņemt pēdējo burtu", + "TEXT_CHARAT_RANDOM": "paņemt nejaušu burtu", + "TEXT_CHARAT_TOOLTIP": "Atgriež burtu dotajā pozīcijā.", + "TEXT_GET_SUBSTRING_TOOLTIP": "Atgriež norādīto teksta daļu.", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "no teksta", + "TEXT_GET_SUBSTRING_START_FROM_START": "paņemt apakšvirkni sākot no burta nr", + "TEXT_GET_SUBSTRING_START_FROM_END": "paņemt apakšvirkni no beigām sākot ar burta nr", + "TEXT_GET_SUBSTRING_START_FIRST": "paņemt apakšvirkni no sākuma", + "TEXT_GET_SUBSTRING_END_FROM_START": "līdz burtam nr", + "TEXT_GET_SUBSTRING_END_FROM_END": "līdz burtam nr (no beigām)", + "TEXT_GET_SUBSTRING_END_LAST": "līdz pēdējam burtam", + "TEXT_CHANGECASE_TOOLTIP": "Atgriež teksta kopiju ar mainītiem lielajiem/mazajiem burtiem.", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "kā LIELIE BURTI", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "kā mazie burti", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "kā Nosaukuma Burti", + "TEXT_TRIM_TOOLTIP": "Atgriež teksta kopiju ar noņemtām atstarpēm vienā vai otrā galā.", + "TEXT_TRIM_OPERATOR_BOTH": "Dzēst atstarpes no abām pusēm", + "TEXT_TRIM_OPERATOR_LEFT": "Dzēst atstarpes no sākuma", + "TEXT_TRIM_OPERATOR_RIGHT": "Dzēst atstarpes no beigām", + "TEXT_PRINT_TITLE": "parādīt %1", + "TEXT_PRINT_TOOLTIP": "Parādīt norādīto tekstu vai skaitli.", + "TEXT_PROMPT_TYPE_TEXT": "palūgt ievadīt tekstu ar ziņu", + "TEXT_PROMPT_TYPE_NUMBER": "palūgt ievadīt skaitli ar ziņu", + "TEXT_PROMPT_TOOLTIP_NUMBER": "Palūgt lietotāju ievadīt skaitli.", + "TEXT_PROMPT_TOOLTIP_TEXT": "Palūgt lietotāju ievadīt tekstu.", + "LISTS_CREATE_EMPTY_TITLE": "izveidot tukšu sarakstu", + "LISTS_CREATE_EMPTY_TOOLTIP": "Izveidot sarakstu bez elementiem tajā.", + "LISTS_CREATE_WITH_TOOLTIP": "Izveidot sarakstu no jebkura skaita vienību.", + "LISTS_CREATE_WITH_INPUT_WITH": "izveidot sarakstu no", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "saraksts", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Pievienot, noņemt vai mainīt sekciju secību šim \"saraksta\" blokam.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Pievienot objektu sarakstam.", + "LISTS_REPEAT_TOOLTIP": "Izveido sarakstu, kas sastāv no dotās vērtības noteiktu reižu skaita.", + "LISTS_REPEAT_TITLE": "saraksts no %1 atkārtots %2 reizes", + "LISTS_LENGTH_TITLE": "%1 garums", + "LISTS_LENGTH_TOOLTIP": "Atgriež elementu skaitu srakstā.", + "LISTS_ISEMPTY_TITLE": "%1 ir tukšs", + "LISTS_ISEMPTY_TOOLTIP": "Patiess, ja saraksts ir tukšs.", + "LISTS_INLIST": "sarakstā", + "LISTS_INDEX_OF_FIRST": "atrast pirmo elementu, kas vienāds ar", + "LISTS_INDEX_OF_LAST": "atrast pēdējo elementu, kas vienāds ar", + "LISTS_INDEX_OF_TOOLTIP": "Atgriež pozīciju sarakstā, kurā atrodas dotais objekts. Atgriež %1 ja objekts neatrodas sarakstā.", + "LISTS_GET_INDEX_GET": "paņemt", + "LISTS_GET_INDEX_GET_REMOVE": "paņemt uz dzēst", + "LISTS_GET_INDEX_REMOVE": "dzēst", + "LISTS_GET_INDEX_FROM_END": "no beigām numur", + "LISTS_GET_INDEX_FIRST": "pirmo", + "LISTS_GET_INDEX_LAST": "pēdējo", + "LISTS_GET_INDEX_RANDOM": "nejauši izvēlētu", + "LISTS_INDEX_FROM_START_TOOLTIP": "Saraksta elementu numerācija sākas no %1", + "LISTS_INDEX_FROM_END_TOOLTIP": "Saraksta elementu numerācija no beigām sākas no %1", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Atgriež norādīto elementu no saraksta.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Atgriež pirmo saraksta elementu.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Atgriež pēdējo saraksta elementu.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Atgriež nejauši izvēlētu saraksta elementu", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Atgriež un izdzēš no saraksta norādīto elementu.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Atgriež un izdzēš saraksta pirmo elementu.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Atgriež un izdzēš saraksta pēdējo elementu.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Atgriež un izdzēš no saraksta nejauši izvēlētu elementu.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Izdēš norādīto elementu no saraksta.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Izdēš pirmo saraksta elementu.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Izdēš pēdējo saraksta elementu.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Izdzēš no saraksta nejauši izvēlētu elementu.", + "LISTS_SET_INDEX_SET": "aizvieto", + "LISTS_SET_INDEX_INSERT": "ievieto", + "LISTS_SET_INDEX_INPUT_TO": "kā", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Aizvieto sarakstā elementu norādītajā pozīcijā.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Aizvieto elementu saraksta sākumā.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Aizvieto elementu saraksta beigās.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Aizvieto sarakstā elementu nejauši izvēlētā pozīcijā.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Ievieto sarakstā elementu norādītajā pozīcijā.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Ievieto elementu saraksta sākumā.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Pievieno elementu saraksta beigās.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Ievieto sarakstā jaunu elementu nejauši izvēlētā pozīcijā.", + "LISTS_GET_SUBLIST_START_FROM_START": "paņemt apakšsarakstu no pozīcijas", + "LISTS_GET_SUBLIST_START_FROM_END": "paņemt apakšsarakstu no beigām no pozīcijas", + "LISTS_GET_SUBLIST_START_FIRST": "paņemt apakšsarakstu no sākuma", + "LISTS_GET_SUBLIST_END_FROM_START": "līdz pozīcijai", + "LISTS_GET_SUBLIST_END_FROM_END": "līdz pozīcijai no beigām", + "LISTS_GET_SUBLIST_END_LAST": "līdz beigām", + "LISTS_GET_SUBLIST_TOOLTIP": "Nokopēt daļu no dotā saraksta.", + "LISTS_SORT_TITLE": "Sakārtot sarakstu no %3 elementiem %2 secībā %1", + "LISTS_SORT_TOOLTIP": "Saraksta sakārtota kopija.", + "LISTS_SORT_ORDER_ASCENDING": "augošā", + "LISTS_SORT_ORDER_DESCENDING": "dilstošā", + "LISTS_SORT_TYPE_NUMERIC": "skaitliski", + "LISTS_SORT_TYPE_TEXT": "pēc alfabēta", + "LISTS_SORT_TYPE_IGNORECASE": "pēc alfabēta, ignorēt mazos/lielos burtus", + "LISTS_SPLIT_LIST_FROM_TEXT": "vārdu saraksts no teksta", + "LISTS_SPLIT_TEXT_FROM_LIST": "izveidot tekstu no saraksta", + "LISTS_SPLIT_WITH_DELIMITER": "ar atdalītāju", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Sadalīt tekstu vārdos izmantojot atdalītāju.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Apvienot tekstu izmantojot atdalītāju.", + "VARIABLES_GET_TOOLTIP": "Atgriež mainīgā vērtību.", + "VARIABLES_GET_CREATE_SET": "Izveidot piešķiršanu mainīgajam %1", + "VARIABLES_SET": "piešķirt mainīgajam %1 vērtību %2", + "VARIABLES_SET_TOOLTIP": "Piešķirt mainīgajam vērtību.", + "VARIABLES_SET_CREATE_GET": "Izveidot 'ņem %1'", + "PROCEDURES_DEFNORETURN_TITLE": "funkcija", + "PROCEDURES_DEFNORETURN_PROCEDURE": "darīt kaut ko", + "PROCEDURES_BEFORE_PARAMS": "ar:", + "PROCEDURES_CALL_BEFORE_PARAMS": "ar:", + "PROCEDURES_DEFNORETURN_TOOLTIP": "Izveido funkciju, kas neatgriež rezultātu.", + "PROCEDURES_DEFNORETURN_COMMENT": "Funkcijas apraksts...", + "PROCEDURES_DEFRETURN_RETURN": "atgriezt", + "PROCEDURES_DEFRETURN_TOOLTIP": "Izveido funkciju, kas atgriež rezultātu.", + "PROCEDURES_ALLOW_STATEMENTS": "atļaut apakškomandas", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Brīdinājums: funkcijai ir vienādi argumenti.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Izpildīt iepriekš definētu funkcju '%1'.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_CALLRETURN_TOOLTIP": "Izpildīt iepriekš definētu funkcju '%1' un izmantot tās rezultātu.", + "PROCEDURES_MUTATORCONTAINER_TITLE": "argumenti", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Pievienot, pārkārtot vai dzēst funkcijas argumentus.", + "PROCEDURES_MUTATORARG_TITLE": "arguments:", + "PROCEDURES_MUTATORARG_TOOLTIP": "Pievienot funkcijai argumentu.", + "PROCEDURES_HIGHLIGHT_DEF": "Izcelt funkcijas definīciju", + "PROCEDURES_CREATE_DO": "Izveidot '%1' izsaukumu", + "PROCEDURES_IFRETURN_TOOLTIP": "Ja pirmā vērtība ir \"patiesa\", tad atgriezt otro vērtību.", + "PROCEDURES_IFRETURN_WARNING": "Brīdinājums: Šo bloku var izmantot tikai funkcijas definīcijā." +} diff --git a/js/msg/json/mk.json b/js/msg/json/mk.json new file mode 100644 index 0000000..8ae40bd --- /dev/null +++ b/js/msg/json/mk.json @@ -0,0 +1,188 @@ +{ + "@metadata": { + "authors": [ + "Bjankuloski06", + "Vlad5250" + ] + }, + "VARIABLES_DEFAULT_NAME": "елемент", + "UNNAMED_KEY": "без име", + "TODAY": "Денес", + "DUPLICATE_BLOCK": "Ископирај", + "ADD_COMMENT": "Додај коментар:", + "REMOVE_COMMENT": "Отстрани коментар", + "DUPLICATE_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": "Помош", + "UNDO": "Откажи", + "REDO": "Повтори", + "CHANGE_VALUE_TITLE": "Смена на вредност:", + "RENAME_VARIABLE": "Преименувај променлива...", + "RENAME_VARIABLE_TITLE": "Преименувај ги сите променливи „%1“ во:", + "NEW_VARIABLE": "Создај променлива...", + "NEW_STRING_VARIABLE": "Создај променлива на низа...", + "NEW_VARIABLE_TYPE_TITLE": "Тип на новата променлива:", + "NEW_VARIABLE_TITLE": "Назив на новата променлива:", + "VARIABLE_ALREADY_EXISTS": "Променлива со име '%1' веќе постои.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Променлива со име '%1' веќе постои за друг тип: '%2'.", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Променливата '%1' не може се избрише бидејќи е дел од определението на функцијата '%2'", + "DELETE_VARIABLE": "Избриши ја променливата \"%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_TOOLTIP_1": "Ако вредноста е вистинита, исполни некои наредби.", + "CONTROLS_IF_MSG_IF": "ако", + "CONTROLS_IF_MSG_ELSEIF": "инаку ако", + "CONTROLS_IF_MSG_ELSE": "инаку", + "CONTROLS_IF_IF_TOOLTIP": "Додава, отстранува или прередува делови за прераспоредување на овој блок „ако“.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Додај услов кон „ако“ блокот.", + "IOS_OK": "ОК", + "IOS_CANCEL": "Откажи", + "IOS_ERROR": "Грешка", + "IOS_PROCEDURES_ADD_INPUT": "+ Додај влез", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Дозволи тврдења", + "IOS_VARIABLES_ADD_VARIABLE": "+ Додај променлива", + "IOS_VARIABLES_ADD_BUTTON": "Додај", + "IOS_VARIABLES_RENAME_BUTTON": "Преименувај", + "IOS_VARIABLES_DELETE_BUTTON": "Избриши", + "IOS_VARIABLES_VARIABLE_NAME": "Име на променливата", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Не можете да искористите празно име за променлива.", + "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_NUMBER_HELPURL": "https://mk.wikipedia.org/wiki/Број", + "MATH_NUMBER_TOOLTIP": "Број.", + "MATH_ARITHMETIC_HELPURL": "https://mk.wikipedia.org/wiki/Аритметика", + "MATH_SINGLE_OP_ROOT": "корен квадратен", + "MATH_SINGLE_TOOLTIP_ROOT": "Дава корен квадратен од број.", + "MATH_SINGLE_OP_ABSOLUTE": "апсолутна", + "MATH_SINGLE_TOOLTIP_ABS": "Ја дава апсолутната вредност на број.", + "MATH_TRIG_HELPURL": "https://mk.wikipediа.org/wiki/Тригонометриски_функции", + "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": "Дава список на најзастапен(и) елемент(и) на списокот.", + "MATH_ONLIST_OPERATOR_RANDOM": "случајна ставка од списокот", + "TEXT_JOIN_TITLE_CREATEWITH": "создај текст со", + "TEXT_CREATE_JOIN_TITLE_JOIN": "поврзи", + "TEXT_CREATE_JOIN_TOOLTIP": "Додај, отстрани или пререди ги деловите за прераспоредување на овој блок „текст“.", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Додај ставка кон текстот.", + "TEXT_LENGTH_TITLE": "должина на %1", + "TEXT_ISEMPTY_TITLE": "%1 е празен", + "TEXT_INDEXOF_TITLE": "во текст %1 %2 %3", + "TEXT_CHARAT_TITLE": "во текст %1 %2", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "во текстот", + "TEXT_COUNT_MESSAGE0": "пресметка на %1 во %2", + "TEXT_REPLACE_MESSAGE0": "замени го %1 со %2 во %3", + "LISTS_CREATE_EMPTY_TITLE": "создај празен список", + "LISTS_CREATE_WITH_INPUT_WITH": "создај список со", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "список", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Додај, отстрани или пререди ги деловите за прераспоредување на овој блок „список“.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Додај ставка кон списокот.", + "LISTS_LENGTH_TITLE": "должина на %1", + "LISTS_ISEMPTY_TITLE": "%1 е празен", + "LISTS_INLIST": "во списокот", + "LISTS_GET_INDEX_REMOVE": "отстрани", + "LISTS_GET_INDEX_FROM_END": "# од крајот", + "LISTS_GET_INDEX_FIRST": "прв", + "LISTS_GET_INDEX_LAST": "последен", + "LISTS_GET_INDEX_RANDOM": "случаен", + "LISTS_SET_INDEX_SET": "задај", + "LISTS_SET_INDEX_INSERT": "вметни на", + "LISTS_SET_INDEX_INPUT_TO": "како", + "LISTS_SORT_TITLE": "подреди %1 %2 %3", + "VARIABLES_GET_CREATE_SET": "Создај „задавање на %1“", + "VARIABLES_SET": "задај %1 на %2", + "PROCEDURES_DEFNORETURN_TITLE": "за да", + "PROCEDURES_DEFNORETURN_PROCEDURE": "направиш", + "PROCEDURES_BEFORE_PARAMS": "со:", + "PROCEDURES_CALL_BEFORE_PARAMS": "со:", + "PROCEDURES_DEFNORETURN_COMMENT": "Опишете ја оваа функција...", + "PROCEDURES_DEFRETURN_RETURN": "назад", + "PROCEDURES_ALLOW_STATEMENTS": "дозволи тврдења", + "PROCEDURES_CALLNORETURN_HELPURL": "https://mk.wikipedia.org/wiki/Потпрограма", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Додај, отстрани или пренареди ги влезните параметри за оваа функција.", + "PROCEDURES_CREATE_DO": "Создај го '%1'", + "WORKSPACE_ARIA_LABEL": "Работен простор на Blockly" +} diff --git a/js/msg/json/mnw.json b/js/msg/json/mnw.json new file mode 100644 index 0000000..6988a70 --- /dev/null +++ b/js/msg/json/mnw.json @@ -0,0 +1,105 @@ +{ + "@metadata": { + "authors": [ + "Aue Nai", + "Htawmonzel" + ] + }, + "VARIABLES_DEFAULT_NAME": "ဒကုတ်", + "TODAY": "တ္ၚဲဏအ်", + "DUPLICATE_BLOCK": "ချာဲ", + "ADD_COMMENT": "စုတ် လညာတ်", + "REMOVE_COMMENT": "ပဲါပ္တိတ် လညာတ်", + "DUPLICATE_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": "ရီု", + "UNDO": "ဟွံပ", + "REDO": "ကလေင်ပ", + "CHANGE_VALUE_TITLE": "သၠာဲ ဍာ်ဒကေဝ်", + "RENAME_VARIABLE": "ကလေင်ကဵုယၟု မပြံင်လှာဲ...", + "RENAME_VARIABLE_TITLE": "'%1' သီုဖအိုတ်ဂှ် ကဵုယၟုတၟိ ပြံင်လှာဲထောအ်:", + "NEW_VARIABLE": "အဃောမပြံင်လှာဲဒၟံင်...", + "NEW_STRING_VARIABLE": "အဃောမပြံင်လှာဲကၠောန်ဒၟံင် လၟေင်...", + "NEW_NUMBER_VARIABLE": "အဃောမပြံင်လှာဲ ကၠောန်ဒၟံင် လၟိဟ်ဂၞန်...", + "NEW_COLOUR_VARIABLE": "အဃောမပြံင်လှာဲ ကၠောန်ဒၟံင် အသာ်...", + "NEW_VARIABLE_TYPE_TITLE": "ဗီုပြင် မပြံင်လှာဲလဝ် တၟိ -", + "NEW_VARIABLE_TITLE": "ယၟု မပြံင်လှာဲလဝ် တၟိ -", + "VARIABLE_ALREADY_EXISTS": "ယၟုမပြံင်လှာဲ '%1' ဂှ် နွံဒၟံင်တုဲရ၊၊", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "ယၟုမပြံင်လှာဲ '%1' ဂှ် နွံဒၟံင်တုဲရ နကဵုဗီုပြင်တၞဟ် - '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "ဇိုတ်ပလီု %1 တုဲ ရပ်စပ် '%2' နဒဒှ်မပြံင်လှာဲဟာ?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "မပြံင်လှာဲ '%1' ဂှ် ဇိုတ်ပလီု ဟွံဂွံ၊ ဟိုတ်နူ ဍေဟ်ဂှ် ဆက်စပ်ဒၟံင် ကုဝှင်ရှေန် '%2'", + "DELETE_VARIABLE": "ဇိုတ်ပလီု အပြံင်အလှာဲ '%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": "အသာ် ၁", + "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_FOR_TITLE": "ရိုဟ်လၟိဟ် %1 နူ %2 စဵုကဵု %3 နကဵု %4", + "CONTROLS_FOREACH_TITLE": "သွက်ဇၟာပ် ဒကုတ် %1 ပ္ဍဲ စရင် %2", + "CONTROLS_FOREACH_TOOLTIP": "သွက်ဇၟာပ် ဒကုတ် ပ္ဍဲစရင်မွဲ မစုတ်လဝ် ပရေင်ပြံင်လှာဲ %1 သွက် ဒကုတ်၊ တုဲမ္ဂး ကၠောန်ပ တင်ဂရင်ဗ္တီ၊၊", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "ကၟာတ်ထောအ် loop", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "ဆက်ကၠောန် နကဵု ပရေင်ချဳဒရာင်ဗွဲအပ္ဍဲ loop", + "CONTROLS_IF_MSG_IF": "ယဝ်ရ", + "CONTROLS_IF_MSG_ELSEIF": "ယဝ်နွံမံၚ်ဏီ", + "CONTROLS_IF_MSG_ELSE": "မုနွံ", + "CONTROLS_IF_IF_TOOLTIP": "ထပ်, ပတိတ်, ဟွံသေၚ် ကလေၚ်ဖျေံလၟေၚ် ရုဲစှ် သွက်ဂွံကလေၚ်ထမံက်ဣဏံ ယဝ်ရကၟာတ်မ္ဂး", + "IOS_OK": "OK", + "IOS_CANCEL": "တးပဲါ", + "IOS_ERROR": "ဗၠေတ်", + "IOS_PROCEDURES_INPUTS": "INPUTS", + "IOS_PROCEDURES_ADD_INPUT": "+ စုတ် Input", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "ကဵုအခေါင် လိက်လလောင်တရးဂမၠိုင်", + "IOS_VARIABLES_ADD_VARIABLE": "+ ထပ် ကိုန်ချဳ", + "IOS_VARIABLES_ADD_BUTTON": "စုတ်", + "IOS_VARIABLES_RENAME_BUTTON": "ကဵုယၟုတၟိ", + "IOS_VARIABLES_DELETE_BUTTON": "ပလီု", + "IOS_VARIABLES_VARIABLE_NAME": "ယၟု ကိုန်ချဳ", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "မၞးသုၚ်စောဲကေတ် ယၟုကိုန်ချဳမမုဟွံမွဲ", + "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/ဟွံညဳသၟဟ်_(သၚ်္ချာဂမၠိုၚ်)", + "LOGIC_OPERATION_AND": "ကေုာံ", + "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://en.wikipedia.org/wiki/Number", + "MATH_NUMBER_TOOLTIP": "မဂၞန်မွဲ", + "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", + "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", + "MATH_SINGLE_OP_ABSOLUTE": "ဍာံဍာံ" +} diff --git a/js/msg/json/ms.json b/js/msg/json/ms.json new file mode 100644 index 0000000..b10332d --- /dev/null +++ b/js/msg/json/ms.json @@ -0,0 +1,311 @@ +{ + "@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?", + "CLEAN_UP": "Kemaskan 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", + "CHANGE_VALUE_TITLE": "Ubah nilai:", + "RENAME_VARIABLE": "Tukar nama pembolehubah...", + "RENAME_VARIABLE_TITLE": "Tukar nama semua pembolehubah '%1' kepada:", + "NEW_VARIABLE": "Pembolehubah baru...", + "NEW_VARIABLE_TITLE": "Nama pembolehubah baru:", + "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_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 %1 Jika teks tidak ditemui.", + "TEXT_INDEXOF_TITLE": "dalam teks %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "mencari kejadian pertama teks", + "TEXT_INDEXOF_OPERATOR_LAST": "mencari kejadian terakhir 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": "Menyatakan indeks kejadian pertama/terakhir item berkenaan dalam senarai. Menyatakan %1 jika item berkenaan tidak ditemui.", + "LISTS_GET_INDEX_GET": "dapatkan", + "LISTS_GET_INDEX_GET_REMOVE": "dapat dan alihkan", + "LISTS_GET_INDEX_REMOVE": "alihkan", + "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_INDEX_FROM_START_TOOLTIP": "%1 ialah item pertama.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 ialah item terakhir.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Kembalikan item dalam kedudukan yang ditetapkan dalam senarai.", + "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": "Alihkan dan kembalikan item mengikut spesifikasi posisi dalam senarai.", + "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": "Alihkan item pada posisi mengikut spesifikasi dalam senarai.", + "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": "Masukkan item pada posisi yang ditentukan dalam senarai.", + "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": "Masukkan item pada posisi yand ditentukan dalam senarai.", + "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_DEFNORETURN_COMMENT": "Terangkan fungsi ini...", + "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_HELPURL": "http://c2.com/cgi/wiki?GuardClause", + "PROCEDURES_IFRETURN_WARNING": "Amaran: Blok ini hanya boleh digunakan dalam fungsi definisi." +} diff --git a/js/msg/json/nb.json b/js/msg/json/nb.json new file mode 100644 index 0000000..ca5f305 --- /dev/null +++ b/js/msg/json/nb.json @@ -0,0 +1,373 @@ +{ + "@metadata": { + "authors": [ + "Cocu", + "Kingu", + "아라", + "SuperPotato", + "Jon Harald Søby" + ] + }, + "VARIABLES_DEFAULT_NAME": "element", + "TODAY": "I dag", + "DUPLICATE_BLOCK": "duplikat", + "ADD_COMMENT": "Legg til kommentar", + "REMOVE_COMMENT": "Fjern kommentar", + "DUPLICATE_COMMENT": "Dupliser 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?", + "CLEAN_UP": "Rydd opp Blocks", + "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", + "UNDO": "Angre", + "REDO": "Gjør om", + "CHANGE_VALUE_TITLE": "Bytt verdi:", + "RENAME_VARIABLE": "Gi nytt navn til variabel…", + "RENAME_VARIABLE_TITLE": "Endre navnet til alle '%1' variabler til:", + "NEW_VARIABLE": "Opprett variabel…", + "NEW_STRING_VARIABLE": "Oppretter strengvariabel …", + "NEW_NUMBER_VARIABLE": "Oppretter tallvariabel …", + "NEW_COLOUR_VARIABLE": "Oppretter fargevariabel …", + "NEW_VARIABLE_TYPE_TITLE": "Ny variabeltype:", + "NEW_VARIABLE_TITLE": "Nytt variabelnavn:", + "VARIABLE_ALREADY_EXISTS": "En variabel med navn «%1» finnes allerede.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "En variabel med navn «%1» finnes allerede for en annen type: «%2».", + "DELETE_VARIABLE_CONFIRMATION": "Slett %1 bruk av variabelen «%2»?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Kan ikke slette variabelen «%1» fordi den er del av definisjonen for funksjonen «%2»", + "DELETE_VARIABLE": "Slett variabelen «%1»", + "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.", + "IOS_OK": "OK", + "IOS_CANCEL": "Avbryt", + "IOS_ERROR": "Feil", + "IOS_PROCEDURES_INPUTS": "PARAMETERE", + "IOS_PROCEDURES_ADD_INPUT": "+ Legg til parameter", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Tillat kommandoer", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Denne funksjonen har duplikatparametere.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Legg til variabel", + "IOS_VARIABLES_ADD_BUTTON": "Legg til", + "IOS_VARIABLES_RENAME_BUTTON": "Endre navn", + "IOS_VARIABLES_DELETE_BUTTON": "Slett", + "IOS_VARIABLES_VARIABLE_NAME": "Variabelnavn", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Du kan ikke bruke et tomt variabelnavn.", + "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_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).", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 av X:%1 Y:%2", + "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": "lag 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_TITLE": "til %1, legg til teksten %2", + "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 %1 hvis teksten ikke blir funnet.", + "TEXT_INDEXOF_TITLE": "i teksten %1, %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "finn første forekomst av tekst", + "TEXT_INDEXOF_OPERATOR_LAST": "finn siste forekomst av tekst", + "TEXT_CHARAT_TITLE": "i teksten %1, %2", + "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.", + "TEXT_COUNT_MESSAGE0": "tell %1 i %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Tell hvor mange ganger noe tekst dukker opp i annen tekst.", + "TEXT_REPLACE_MESSAGE0": "erstatt %1 med %2 i %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "Erstatter alle forekomster av noe tekst i en annen tekst.", + "TEXT_REVERSE_MESSAGE0": "reverser %1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "Reverserer rekkefølgen på tegnene i teksten.", + "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 indeksen av den første/siste forekomsten av elementet i lista. Returnerer %1 hvis ikke funnet.", + "LISTS_GET_INDEX_GET": "hent", + "LISTS_GET_INDEX_GET_REMOVE": "hent og fjern", + "LISTS_GET_INDEX_REMOVE": "fjern", + "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_INDEX_FROM_START_TOOLTIP": "%1 er det første elementet.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 er det siste elementet.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Returner elementet på den angitte posisjonen i en liste.", + "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": "Fjerner og returnerer elementet ved en gitt posisjon i en liste.", + "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": "Fjerner et element ved en gitt posisjon i en liste.", + "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": "Setter inn elementet ved den angitte posisjonen i en liste.", + "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": "Setter inn elementet ved den angitte posisjonen i en liste.", + "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.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "sorter %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Sorter en kopi av en liste.", + "LISTS_SORT_ORDER_ASCENDING": "stigende", + "LISTS_SORT_ORDER_DESCENDING": "synkende", + "LISTS_SORT_TYPE_NUMERIC": "numerisk", + "LISTS_SORT_TYPE_TEXT": "alfabetisk", + "LISTS_SORT_TYPE_IGNORECASE": "alfabetisk, ignorert store/små bokstaver", + "LISTS_SPLIT_LIST_FROM_TEXT": "lag liste av tekst", + "LISTS_SPLIT_TEXT_FROM_LIST": "lag tekst av liste", + "LISTS_SPLIT_WITH_DELIMITER": "med avgrenser", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Splitt teksten til en liste med tekster, brutt ved hver avgrenser.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Føy sammen en liste tekster til én tekst, avskilt av en avgrenser.", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "reverser %1", + "LISTS_REVERSE_TOOLTIP": "Reverser en kopi av ei liste.", + "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_DEFNORETURN_COMMENT": "Beskriv denne funksjonen…", + "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/Subroutine", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Kjør den brukerdefinerte funksjonen '%1'.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "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.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Si noe …" +} diff --git a/js/msg/json/nl.json b/js/msg/json/nl.json new file mode 100644 index 0000000..3e4892a --- /dev/null +++ b/js/msg/json/nl.json @@ -0,0 +1,404 @@ +{ + "@metadata": { + "authors": [ + "Siebrand", + "McDutchie", + "Ribert", + "MedShot", + "아라", + "JaapDeKleine", + "Sjoerddebruin", + "Lemondoge", + "Jeleniccz", + "Festina90", + "Optilete", + "Patio", + "KlaasZ4usV", + "Marcelhospers", + "Elroy" + ] + }, + "VARIABLES_DEFAULT_NAME": "item", + "UNNAMED_KEY": "zonder naam", + "TODAY": "Vandaag", + "DUPLICATE_BLOCK": "Duplicaat", + "ADD_COMMENT": "Opmerking toevoegen", + "REMOVE_COMMENT": "Opmerking verwijderen", + "DUPLICATE_COMMENT": "Opmerking dupliceren", + "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 samenvouwen", + "COLLAPSE_ALL": "Blokken samenvouwen", + "EXPAND_BLOCK": "Blok uitvouwen", + "EXPAND_ALL": "Blokken uitvouwen", + "DISABLE_BLOCK": "Blok uitschakelen", + "ENABLE_BLOCK": "Blok inschakelen", + "HELP": "Hulp", + "UNDO": "Ongedaan maken", + "REDO": "Opnieuw", + "CHANGE_VALUE_TITLE": "Waarde wijzigen:", + "RENAME_VARIABLE": "Variabele hernoemen...", + "RENAME_VARIABLE_TITLE": "Alle variabelen \"%1\" hernoemen naar:", + "NEW_VARIABLE": "Variabele maken...", + "NEW_STRING_VARIABLE": "Creëer tekstvariabele", + "NEW_NUMBER_VARIABLE": "Creëer numeriek variabele", + "NEW_COLOUR_VARIABLE": "Creëer kleurvariabele", + "NEW_VARIABLE_TYPE_TITLE": "Nieuw soort variabele", + "NEW_VARIABLE_TITLE": "Nieuwe variabelenaam:", + "VARIABLE_ALREADY_EXISTS": "Er bestaat al een variabele met de naam \"%1\".", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Een variabele met de naam '%1' bestaat al voor een ander soort variabele: '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "%1 gebruiken van de variabele \"%2\" verwijderen?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "De variabele \"%1\" kan niet verwijderd worden omdat die onderdeel uitmaakt van de definitie van de functie \"%2\"", + "DELETE_VARIABLE": "Verwijder de variabele \"%1\"", + "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.", + "IOS_OK": "OK", + "IOS_CANCEL": "Annuleren", + "IOS_ERROR": "Fout", + "IOS_PROCEDURES_INPUTS": "INVOER", + "IOS_PROCEDURES_ADD_INPUT": "+ Invoer toevoegen", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Statements toestaan", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Deze functie heeft dubbele invoeren.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Variabele toevoegen", + "IOS_VARIABLES_ADD_BUTTON": "Toevoegen", + "IOS_VARIABLES_RENAME_BUTTON": "Hernoemen", + "IOS_VARIABLES_DELETE_BUTTON": "Verwijderen", + "IOS_VARIABLES_VARIABLE_NAME": "Variabelenaam", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "U kunt geen lege variabelenaam gebruiken.", + "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).", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 van X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "Geef de boogtangens van punt (X, Y) terug in graden tussen -180 naar 180.", + "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_TITLE": "voor%1 voeg tekst toe van %2", + "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 het eerste of laatste voorkomen van de eerste tekst in de tweede tekst. Geeft %1 terug als de tekst niet gevonden is.", + "TEXT_INDEXOF_TITLE": "in tekst %1 %2 %3", + "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_TITLE": "in tekst %1 %2", + "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.", + "TEXT_COUNT_MESSAGE0": "%1 in %2 tellen", + "TEXT_COUNT_TOOLTIP": "Tel hoe vaak bepaalde tekst voorkomt in andere tekst.", + "TEXT_REPLACE_MESSAGE0": "vervang %1 door %2 in %3", + "TEXT_REPLACE_TOOLTIP": "Vervang alle voorkomens van tekst in een andere tekst.", + "TEXT_REVERSE_MESSAGE0": "%1 omkeren", + "TEXT_REVERSE_TOOLTIP": "Keert de volgorde van de tekens in de tekst om.", + "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 %1 terug als het item niet is gevonden.", + "LISTS_GET_INDEX_GET": "haal op", + "LISTS_GET_INDEX_GET_REMOVE": "haal op en verwijder", + "LISTS_GET_INDEX_REMOVE": "verwijder", + "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_INDEX_FROM_START_TOOLTIP": "Item %1 is het eerste item.", + "LISTS_INDEX_FROM_END_TOOLTIP": "Item %1 is het laatste item.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Geeft het item op de opgegeven positie in een lijst.", + "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": "Geeft het item op de opgegeven positie in een lijst terug en verwijdert het.", + "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": "Verwijdert het item op de opgegeven positie in een lijst.", + "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": "Zet het item op de opgegeven positie in de lijst.", + "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": "Voegt het item op een opgegeven positie in een lijst in.", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "sorteer %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Sorteer een kopie van een lijst.", + "LISTS_SORT_ORDER_ASCENDING": "oplopend", + "LISTS_SORT_ORDER_DESCENDING": "aflopend", + "LISTS_SORT_TYPE_NUMERIC": "numeriek", + "LISTS_SORT_TYPE_TEXT": "alfabetisch", + "LISTS_SORT_TYPE_IGNORECASE": "alfabetisch, negeer hoofd-/kleine letters", + "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 lijst van teksten 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.", + "LISTS_REVERSE_MESSAGE0": "%1 omkeren", + "LISTS_REVERSE_TOOLTIP": "Keert een kopie van een lijst om.", + "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_DEFNORETURN_COMMENT": "Deze functie beschrijven...", + "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_HELPURL": "http://c2.com/cgi/wiki?GuardClause", + "PROCEDURES_IFRETURN_WARNING": "Waarschuwing: dit blok mag alleen gebruikt worden binnen de definitie van een functie.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Zeg iets...", + "WORKSPACE_ARIA_LABEL": "Blockly werkruimte", + "COLLAPSED_WARNINGS_WARNING": "Samengevouwen blokken bevatten waarschuwingen." +} diff --git a/js/msg/json/oc.json b/js/msg/json/oc.json new file mode 100644 index 0000000..758ae13 --- /dev/null +++ b/js/msg/json/oc.json @@ -0,0 +1,210 @@ +{ + "@metadata": { + "authors": [ + "Cedric31" + ] + }, + "VARIABLES_DEFAULT_NAME": "element", + "TODAY": "Uèi", + "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 ?", + "CLEAN_UP": "Netejar los 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", + "UNDO": "Anullar", + "REDO": "Refar", + "CHANGE_VALUE_TITLE": "Modificar la valor :", + "RENAME_VARIABLE": "Renomenar la variabla…", + "RENAME_VARIABLE_TITLE": "Renomenar totas las variablas « %1 » a :", + "NEW_VARIABLE": "Crear una variabla...", + "NEW_STRING_VARIABLE": "Crear una variabla cadena…", + "NEW_NUMBER_VARIABLE": "Crear una variabla nombre…", + "NEW_COLOUR_VARIABLE": "Crear una variabla color…", + "NEW_VARIABLE_TYPE_TITLE": "Novèl tipe de variabla :", + "NEW_VARIABLE_TITLE": "Nom de la novèla variabla :", + "VARIABLE_ALREADY_EXISTS": "Existís ja una variabla nomenada \"%1\".", + "DELETE_VARIABLE": "Suprimir la variabla '%1'", + "COLOUR_PICKER_HELPURL": "https://oc.wikipedia.org/wiki/Color", + "COLOUR_PICKER_TOOLTIP": "Causir una color dins la paleta.", + "COLOUR_RANDOM_TITLE": "color aleatòria", + "COLOUR_RANDOM_TOOLTIP": "Causir una color a l'azard.", + "COLOUR_RGB_TITLE": "coloriar 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_FLOW_STATEMENTS_OPERATOR_BREAK": "quitar la bocla", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "passar a l’iteracion de bocla seguenta", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Sortir de la bocla englobanta.", + "CONTROLS_IF_MSG_IF": "se", + "CONTROLS_IF_MSG_ELSEIF": "siquenon se", + "CONTROLS_IF_MSG_ELSE": "siquenon", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Apondre una condicion al blòt 'se'.", + "IOS_OK": "D'acòrdi", + "IOS_CANCEL": "Anullar", + "IOS_ERROR": "Error", + "IOS_PROCEDURES_INPUTS": "ENTRADAS", + "IOS_PROCEDURES_ADD_INPUT": "+ Apondre una entrada", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Òrdres autorizats", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Aquesta foncion a d'entradas duplicadas.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Apondre una variabla", + "IOS_VARIABLES_ADD_BUTTON": "Apondre", + "IOS_VARIABLES_RENAME_BUTTON": "Renomenar", + "IOS_VARIABLES_DELETE_BUTTON": "Suprimir", + "IOS_VARIABLES_VARIABLE_NAME": "Nom de la variabla", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Podètz pas utilizar un nom de variabla void.", + "LOGIC_COMPARE_HELPURL": "https://fr.wikipedia.org/wiki/Inegalite_(mathematiques)", + "LOGIC_COMPARE_TOOLTIP_EQ": "Renviar verai se las doas entradas son egalas.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Renviar verai se las doas entradas son diferentas.", + "LOGIC_OPERATION_TOOLTIP_AND": "Renviar verai se las doas entradas son vertadièras.", + "LOGIC_OPERATION_AND": "e", + "LOGIC_OPERATION_OR": "o", + "LOGIC_NEGATE_TITLE": "pas %1", + "LOGIC_BOOLEAN_TRUE": "verai", + "LOGIC_BOOLEAN_FALSE": "fals", + "LOGIC_BOOLEAN_TOOLTIP": "Renvia siá verai siá 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_ARITHMETIC_TOOLTIP_ADD": "Renvia la soma dels dos nombres.", + "MATH_SINGLE_HELPURL": "https://fr.wikipedia.org/wiki/Racine_carree", + "MATH_SINGLE_OP_ROOT": "raiç carrada", + "MATH_SINGLE_TOOLTIP_ROOT": "Renvia la raiç carrada d’un nombre.", + "MATH_SINGLE_OP_ABSOLUTE": "absolut", + "MATH_SINGLE_TOOLTIP_ABS": "Renvia la valor absoluda d’un nombre.", + "MATH_SINGLE_TOOLTIP_NEG": "Renvia l’opausat d’un nombre", + "MATH_SINGLE_TOOLTIP_LN": "Renvia lo logaritme natural d’un nombre.", + "MATH_SINGLE_TOOLTIP_LOG10": "Renvia lo logaritme decimal d’un nombre.", + "MATH_SINGLE_TOOLTIP_EXP": "Renvia a la poténcia d’un nombre.", + "MATH_SINGLE_TOOLTIP_POW10": "Renvia 10 a la poténcia d’un nombre.", + "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", + "MATH_TRIG_TOOLTIP_SIN": "Renvia lo sinus d’un angle en grases (pas en radians).", + "MATH_TRIG_TOOLTIP_COS": "Renvia lo cosinus d’un angle en grases (pas en radians).", + "MATH_TRIG_TOOLTIP_TAN": "Renvia la tangenta d’un angle en grases (pas en radians).", + "MATH_TRIG_TOOLTIP_ASIN": "Renvia l’arcsinus d’un nombre.", + "MATH_TRIG_TOOLTIP_ACOS": "Renvia l’arccosinus d’un nombre.", + "MATH_TRIG_TOOLTIP_ATAN": "Renvia l’arctangenta d’un nombre.", + "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", + "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", + "MATH_ONLIST_OPERATOR_MODE": "majoritaris de la lista", + "MATH_ONLIST_OPERATOR_STD_DEV": "escart-tipe de la lista", + "MATH_ONLIST_OPERATOR_RANDOM": "element aleatòri de lista", + "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", + "MATH_MODULO_TITLE": "residú de %1 ÷ %2", + "MATH_CONSTRAIN_TITLE": "constrénher %1 entre %2 e %3", + "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "fraccion aleatòria", + "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", + "TEXT_TEXT_TOOLTIP": "Una letra, un mot o una linha de tèxte.", + "TEXT_JOIN_TITLE_CREATEWITH": "crear un tèxte amb", + "TEXT_CREATE_JOIN_TITLE_JOIN": "jónher", + "TEXT_APPEND_TITLE": "a %1 apondre lo tèxte %2", + "TEXT_LENGTH_TITLE": "longor de %1", + "TEXT_ISEMPTY_TITLE": "%1 es void", + "TEXT_INDEXOF_TITLE": "dins lo tèxte %1 %2 %3", + "TEXT_CHARAT_TITLE": "dins lo tèxte %1 %2", + "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_GET_SUBSTRING_END_LAST": "fins a la darrièra letra", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "en MAJUSCULAS", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "en minusculas", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "en Majuscula Al Començament De Cada Mot", + "TEXT_TRIM_OPERATOR_BOTH": "suprimir los espacis dels dos costats", + "TEXT_PRINT_TITLE": "afichar %1", + "TEXT_COUNT_MESSAGE0": "nombre %1 sus %2", + "TEXT_REVERSE_MESSAGE0": "inversar %1", + "LISTS_CREATE_EMPTY_TITLE": "crear una lista voida", + "LISTS_CREATE_WITH_INPUT_WITH": "crear una lista amb", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "lista", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Apondre un element a la lista.", + "LISTS_LENGTH_TITLE": "longitud de %1", + "LISTS_ISEMPTY_TITLE": "%1 es voida", + "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_INDEX_FROM_START_TOOLTIP": "%1 es lo primièr element.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 es lo darrièr element.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Renvia l'element de la posicion especificada dins la lista.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Renvia lo primièr element dins una lista.", + "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", + "LISTS_SORT_TITLE": "triar %1 %2 %3", + "LISTS_SORT_ORDER_ASCENDING": "creissent", + "LISTS_SORT_ORDER_DESCENDING": "descreissent", + "LISTS_SORT_TYPE_NUMERIC": "numeric", + "LISTS_SORT_TYPE_TEXT": "alfabetic", + "LISTS_SPLIT_WITH_DELIMITER": "amb lo separador", + "LISTS_REVERSE_MESSAGE0": "inversar %1", + "LISTS_REVERSE_TOOLTIP": "Inversar la còpia d’una lista.", + "VARIABLES_GET_CREATE_SET": "Crear 'fixar %1'", + "VARIABLES_SET": "fixar %1 a %2", + "VARIABLES_SET_CREATE_GET": "Crear 'obténer %1'", + "PROCEDURES_DEFNORETURN_TITLE": "a", + "PROCEDURES_DEFNORETURN_PROCEDURE": "far quicòm", + "PROCEDURES_BEFORE_PARAMS": "amb :", + "PROCEDURES_CALL_BEFORE_PARAMS": "amb :", + "PROCEDURES_DEFRETURN_RETURN": "retorn", + "PROCEDURES_ALLOW_STATEMENTS": "autorizar los òrdres", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_MUTATORCONTAINER_TITLE": "entradas", + "PROCEDURES_MUTATORARG_TITLE": "nom de l’entrada :", + "PROCEDURES_CREATE_DO": "Crear '%1'" +} diff --git a/js/msg/json/pl.json b/js/msg/json/pl.json new file mode 100644 index 0000000..9791bfa --- /dev/null +++ b/js/msg/json/pl.json @@ -0,0 +1,386 @@ +{ + "@metadata": { + "authors": [ + "Cotidianis", + "Faren", + "Vengir", + "Pbz", + "Pio387", + "아라", + "Mateon1", + "Expert3222", + "Cirasean", + "Fringoo", + "Chrumps", + "Woytecr", + "Liuxinyu970226", + "Krottyianock", + "Mazab IZW", + "Teeed", + "InternerowyGołąb", + "Wojtas", + "Stojex", + "Rail" + ] + }, + "VARIABLES_DEFAULT_NAME": "element", + "UNNAMED_KEY": "bez nazwy", + "TODAY": "Dzisiaj", + "DUPLICATE_BLOCK": "Powiel", + "ADD_COMMENT": "Dodaj Komentarz", + "REMOVE_COMMENT": "Usuń komentarz", + "DUPLICATE_COMMENT": "Zduplikowany komentarz", + "EXTERNAL_INPUTS": "Zewnętrzne Wejścia", + "INLINE_INPUTS": "Wbudowane Wejścia", + "DELETE_BLOCK": "Usuń Klocek", + "DELETE_X_BLOCKS": "Usuń %1 Bloki(ów)", + "DELETE_ALL_BLOCKS": "Usunąć wszystkie klocki z %1?", + "CLEAN_UP": "Uporządkuj Bloki", + "COLLAPSE_BLOCK": "Zwiń Klocek", + "COLLAPSE_ALL": "Zwiń Bloki", + "EXPAND_BLOCK": "Rozwiń Klocek", + "EXPAND_ALL": "Rozwiń Bloki", + "DISABLE_BLOCK": "Wyłącz Klocek", + "ENABLE_BLOCK": "Włącz Blok", + "HELP": "Pomoc", + "UNDO": "Cofnij", + "REDO": "Ponów", + "CHANGE_VALUE_TITLE": "Zmień wartość:", + "RENAME_VARIABLE": "Zmień nazwę zmiennej...", + "RENAME_VARIABLE_TITLE": "Zmień nazwy wszystkich '%1' zmiennych na:", + "NEW_VARIABLE": "Utwórz zmienną...", + "NEW_STRING_VARIABLE": "Utwórz zmienną typu string", + "NEW_NUMBER_VARIABLE": "Utwórz zmienną typu number", + "NEW_COLOUR_VARIABLE": "Utwórz zmienną colour", + "NEW_VARIABLE_TYPE_TITLE": "Nowy typ zmiennej:", + "NEW_VARIABLE_TITLE": "Nowa nazwa zmiennej:", + "VARIABLE_ALREADY_EXISTS": "Zmienna o nazwie '%1' już istnieje.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Zmienna o nazwie '%1' już istnieje i jest typu '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Usunąć %1 wystąpień zmiennej '%2'?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Nie można usunąć zmiennej '%1', ponieważ jest częścią definicji funkcji '%2'", + "DELETE_VARIABLE": "Usuń zmienną '%1'", + "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": "Utwórz kolor składający sie z podanej ilości czerwieni, zieleni i błękitu. Zakres wartości: 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ż do", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Dopóki wyrażenie jest prawdziwe, wykonaj zadane czynności.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Dopóki wyrażenie jest nieprawdziwe, wykonaj zadane czynności.", + "CONTROLS_FOR_TOOLTIP": "Zmiennej '%1' przypisuje wartości z podanego zakresu z podanym interwałem i wykonuje zadane bloki.", + "CONTROLS_FOR_TITLE": "licz z %1 od %2 do %3 co %4 (wartość kroku)", + "CONTROLS_FOREACH_TITLE": "dla każdego elementu %1 listy %2", + "CONTROLS_FOREACH_TOOLTIP": "Przypisz zmiennej '%1' kolejno wartość każdego elementu listy, a następnie wykonaj kilka instrukcji.", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "przerwij pętlę", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "przejdź do kolejnej iteracji pętli", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Przerwij działanie pętli.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Pomiń resztę pętli i kontynuuj w kolejnej iteracji.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Uwaga: Ten klocek może być użyty tylko wewnątrz pętli.", + "CONTROLS_IF_TOOLTIP_1": "Jeśli warunek jest spełniony, wykonaj zadane czynności.", + "CONTROLS_IF_TOOLTIP_2": "Jeśli warunek jest spełniony, wykonaj pierwszy blok instrukcji. W przeciwnym razie, wykonaj drugi blok instrukcji.", + "CONTROLS_IF_TOOLTIP_3": "Jeśli pierwszy warunek jest spełniony, wykonaj pierwszy blok instrukcji. W przeciwnym razie, jeśli drugi warunek jest spełniony, wykonaj drugi blok instrukcji.", + "CONTROLS_IF_TOOLTIP_4": "Jeśli pierwszy warunek jest spełniony, wykonaj pierwszy blok czynności. W przeciwnym razie jeśli drugi warunek jest spełniony, wykonaj drugi blok czynności. Jeżeli żaden z warunków nie zostanie spełniony, wykonaj ostatni blok czynności.", + "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ść czynności, żeby zmodyfikować ten klocek „jeśli”.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Dodaj warunek do klocka „jeśli”.", + "CONTROLS_IF_ELSE_TOOLTIP": "Dodaj ostatni zawsze prawdziwy warunek do klocka „jeśli”.", + "IOS_OK": "OK", + "IOS_CANCEL": "Anuluj", + "IOS_ERROR": "Błąd", + "IOS_PROCEDURES_INPUTS": "WEJŚCIA", + "IOS_PROCEDURES_ADD_INPUT": "+ Dodaj Wejście", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Zezwalaj na czynności.", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Ta funkcja ma zduplikowane wejścia.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Dodaj Zmienną", + "IOS_VARIABLES_ADD_BUTTON": "Dodaj", + "IOS_VARIABLES_RENAME_BUTTON": "Zmień nazwę", + "IOS_VARIABLES_DELETE_BUTTON": "Usuń", + "IOS_VARIABLES_VARIABLE_NAME": "Nazwa zmiennej", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Nie możesz utworzyć funkcji bez nazwy.", + "LOGIC_COMPARE_HELPURL": "https://pl.wikipedia.org/wiki/Nierówność", + "LOGIC_COMPARE_TOOLTIP_EQ": "Zwraca \"prawda\", jeśli wejścia są identyczne.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Zwraca \"prawda\", jeśli wejścia nie są identyczne.", + "LOGIC_COMPARE_TOOLTIP_LT": "Zwraca \"prawda\" jeśli pierwsze wejście jest mniejsze od drugiego.", + "LOGIC_COMPARE_TOOLTIP_LTE": "Zwraca \"prawda\", jeśli pierwsze wejście jest mniejsze lub równe drugiemu.", + "LOGIC_COMPARE_TOOLTIP_GT": "Zwraca \"prawda\" jeśli pierwsze wejście jest większe od drugiego.", + "LOGIC_COMPARE_TOOLTIP_GTE": "Zwraca \"prawda\", jeśli pierwsze wejście jest większe lub równe drugiemu.", + "LOGIC_OPERATION_TOOLTIP_AND": "Zwraca \"prawda\" jeśli na obydwóch wejściach jest \"prawda\".", + "LOGIC_OPERATION_AND": "i", + "LOGIC_OPERATION_TOOLTIP_OR": "Zwraca \"prawda\" jeśli co najmniej na jednyk wejściu jest \"prawda\".", + "LOGIC_OPERATION_OR": "lub", + "LOGIC_NEGATE_TITLE": "nie %1", + "LOGIC_NEGATE_TOOLTIP": "Zwraca \"prawda\", jeśli wejściu jest \"fałsz\". Zwraca \"fałsz\", jeśli na wejściu jest \"prawda\".", + "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://pl.wikipedia.org/wiki/Pierwiastek_kwadratowy", + "MATH_SINGLE_OP_ROOT": "pierwiastek kwadratowy", + "MATH_SINGLE_TOOLTIP_ROOT": "Zwróć pierwiastek kwadratowy danej liczby.", + "MATH_SINGLE_OP_ABSOLUTE": "wartość bezwzględna", + "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://pl.wikipedia.org/wiki/Funkcje_trygonometryczne", + "MATH_TRIG_TOOLTIP_SIN": "Zwróć wartość sinusa o stopniu (nie w radianach).", + "MATH_TRIG_TOOLTIP_COS": "Zwróć wartość cosinusa o stopniu (nie w radianach).", + "MATH_TRIG_TOOLTIP_TAN": "Zwróć tangens o stopniu (nie w radianach).", + "MATH_TRIG_TOOLTIP_ASIN": "Zwróć arcus sinus danej liczby.", + "MATH_TRIG_TOOLTIP_ACOS": "Zwróć arcus cosinus danej liczby.", + "MATH_TRIG_TOOLTIP_ATAN": "Zwróć arcus tangens danej liczby.", + "MATH_CONSTANT_HELPURL": "https://pl.wikipedia.org/wiki/Stała_(matematyka)", + "MATH_CONSTANT_TOOLTIP": "Zwróć jedną wspólną stałą: π (3.141), e (2.718...), φ (1.618...), sqrt(2) (1.414...), sqrt(½) (0.707...) lub ∞ (nieskończoność).", + "MATH_IS_EVEN": "jest parzysta", + "MATH_IS_ODD": "jest nieparzysta", + "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://pl.wikipedia.org/wiki/Zaokrąglanie", + "MATH_ROUND_TOOLTIP": "Zaokrąglij w górę lub w dół.", + "MATH_ROUND_OPERATOR_ROUND": "zaokrąglij", + "MATH_ROUND_OPERATOR_ROUNDUP": "zaokrąglij w górę", + "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://pl.wikipedia.org/wiki/Modulo", + "MATH_MODULO_TITLE": "reszta z dzielenia %1 przez %2", + "MATH_MODULO_TOOLTIP": "Zwróć resztę z dzielenia dwóch liczb przez siebie.", + "MATH_CONSTRAIN_TITLE": "ogranicz %1 z dołu %2 z góry %3", + "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://pl.wikipedia.org/wiki/Tekstowy_typ_danych", + "TEXT_TEXT_TOOLTIP": "Litera, wyraz lub linia tekstu.", + "TEXT_JOIN_TITLE_CREATEWITH": "utwórz tekst z", + "TEXT_JOIN_TOOLTIP": "Tworzy fragment tekstu, łącząc ze sobą dowolną liczbę tekstów.", + "TEXT_CREATE_JOIN_TITLE_JOIN": "połącz", + "TEXT_CREATE_JOIN_TOOLTIP": "Dodaj, usuń lub zmień kolejność sekcji, aby zmodyfikować klocek tekstowy.", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Dodaj element do tekstu.", + "TEXT_APPEND_TITLE": "dodaj tekst %2 do %1", + "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ść %1, jeśli tekst nie został znaleziony.", + "TEXT_INDEXOF_TITLE": "w tekście %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "znajdź pierwsze wystąpienie tekstu", + "TEXT_INDEXOF_OPERATOR_LAST": "znajdź ostatnie wystąpienie tekstu", + "TEXT_CHARAT_TITLE": "w tekście %1 %2", + "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 odwruconą wielkością liter.", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "na WIELKIE LITERY", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "na małe litery", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "na Pierwsza Duża", + "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": "Wyświetl określony tekst, liczbę lub inną wartość.", + "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.", + "TEXT_COUNT_MESSAGE0": "policz %1 w %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Liczy ile razy dany tekst występuje w innym tekście.", + "TEXT_REPLACE_MESSAGE0": "zamień %1 na %2 w %3", + "TEXT_REPLACE_TOOLTIP": "Zastąp wszystkie wystąpienia danego tekstu innym.", + "TEXT_REVERSE_MESSAGE0": "odwróć %1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "Odwraca kolejność znaków w tekście.", + "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ą danych", + "LISTS_CREATE_WITH_TOOLTIP": "Utwórz listę z dowolną ilością elementów.", + "LISTS_CREATE_WITH_INPUT_WITH": "utwórz listę z", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "lista", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Dodaj, usuń lub zmień kolejność sekcji aby przekonfigurować blok tej listy.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Dodaj element do listy.", + "LISTS_REPEAT_TOOLTIP": "Tworzy listę zawierającą podaną wartość powtórzoną żądaną ilość razy.", + "LISTS_REPEAT_TITLE": "utwórz listę powtarzając %1 %2 razy.", + "LISTS_LENGTH_TITLE": "długość %1", + "LISTS_LENGTH_TOOLTIP": "Zwraca długość listy.", + "LISTS_ISEMPTY_TITLE": "%1 jest pusta", + "LISTS_ISEMPTY_TOOLTIP": "Zwraca \"prawda\" jeśli lista jest pusta.", + "LISTS_INLIST": "na liście", + "LISTS_INDEX_OF_FIRST": "znajdź pierwsze wystąpienie elementu", + "LISTS_INDEX_OF_LAST": "znajdź ostatanie wystąpienie elementu", + "LISTS_INDEX_OF_TOOLTIP": "Zwraca indeks pierwszego/ostatniego wystąpienia elementu z listy. Zwraca %1, jeśli nie zostanie znaleziony.", + "LISTS_GET_INDEX_GET": "pobierz", + "LISTS_GET_INDEX_GET_REMOVE": "zabierz", + "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_INDEX_FROM_START_TOOLTIP": "%1 to pierwszy element.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 to ostatni element.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Zwraca element z konkretnej pozycji na liście.", + "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": "Usuwa i zwraca element z określonej pozycji na liście.", + "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": "Usuwa element z określonej pozycji na liście.", + "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": "Ustawia element w określonym miejscu na liście.", + "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": "Wstawia element na żądanej pozycji listy.", + "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": "utwórz listę podrzędną z #", + "LISTS_GET_SUBLIST_START_FROM_END": "utwórz listę podrzędną z # od końca", + "LISTS_GET_SUBLIST_START_FIRST": "utwórz listę podrzędną od 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ę żądanej części listy.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "sortuj %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Sortuj kopię listy.", + "LISTS_SORT_ORDER_ASCENDING": "rosnąco", + "LISTS_SORT_ORDER_DESCENDING": "malejąco", + "LISTS_SORT_TYPE_NUMERIC": "numerycznie", + "LISTS_SORT_TYPE_TEXT": "alfabetycznie", + "LISTS_SORT_TYPE_IGNORECASE": "alfabetycznie, ignoruj wielkość liter", + "LISTS_SPLIT_LIST_FROM_TEXT": "utwórz listę z tekstu", + "LISTS_SPLIT_TEXT_FROM_LIST": "utwórz tekst z listy", + "LISTS_SPLIT_WITH_DELIMITER": "z separatorem", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Rozdziela tekst zgodnie z separatorem tworząc listę z powstałych elementów.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Łączy listę tekstów w jeden tekst, rozdzielany separatorem.", + "LISTS_REVERSE_MESSAGE0": "odwróć %1", + "LISTS_REVERSE_TOOLTIP": "Odwraca kolejność danych w kopii listy.", + "ORDINAL_NUMBER_SUFFIX": "", + "VARIABLES_GET_TOOLTIP": "Zwraca wartość tej zmiennej.", + "VARIABLES_GET_CREATE_SET": "Utwórz klocek 'ustaw %1'", + "VARIABLES_SET": "przypisz %1 wartość %2", + "VARIABLES_SET_TOOLTIP": "Wartości zmiennej i wejście będą identyczne.", + "VARIABLES_SET_CREATE_GET": "Utwórz klocek '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ę nie posiadającą wyjścia.", + "PROCEDURES_DEFNORETURN_COMMENT": "Opisz tę funkcję...", + "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_DEFRETURN_RETURN": "zwróć", + "PROCEDURES_DEFRETURN_TOOLTIP": "Tworzy funkcję posiadającą wyjście.", + "PROCEDURES_ALLOW_STATEMENTS": "zezwól na czynności", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Uwaga: Ta funkcja ma powtórzone parametry.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://pl.wikipedia.org/wiki/Podprogram", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Uruchom zdefiniowaną przez użytkownika funkcję '%1'.", + "PROCEDURES_CALLRETURN_HELPURL": "https://pl.wikipedia.org/wiki/Podprogram", + "PROCEDURES_CALLRETURN_TOOLTIP": "Uruchom zdefiniowaną przez użytkownika funkcję '%1' i użyj jej wyjścia.", + "PROCEDURES_MUTATORCONTAINER_TITLE": "wejścia", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Dodaj, usuń lub zmień kolejność wejść tej funkcji.", + "PROCEDURES_MUTATORARG_TITLE": "nazwa wejścia:", + "PROCEDURES_MUTATORARG_TOOLTIP": "Dodaj wejście do funkcji.", + "PROCEDURES_HIGHLIGHT_DEF": "Podświetl definicję funkcji", + "PROCEDURES_CREATE_DO": "Utwórz '%1'", + "PROCEDURES_IFRETURN_TOOLTIP": "Jeśli warunek jest spełniony zwróć drugą wartość.", + "PROCEDURES_IFRETURN_WARNING": "Uwaga: Ten klocek może być używany tylko w definicji funkcji.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Powiedz coś..." +} diff --git a/js/msg/json/pms.json b/js/msg/json/pms.json new file mode 100644 index 0000000..c89b503 --- /dev/null +++ b/js/msg/json/pms.json @@ -0,0 +1,352 @@ +{ + "@metadata": { + "authors": [ + "Borichèt" + ] + }, + "VARIABLES_DEFAULT_NAME": "element", + "UNNAMED_KEY": "anònim", + "TODAY": "Ancheuj", + "DUPLICATE_BLOCK": "Dupliché", + "ADD_COMMENT": "Gionté un coment", + "REMOVE_COMMENT": "Scancelé un coment", + "DUPLICATE_COMMENT": "Dupliché ël 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", + "UNDO": "Anulé", + "REDO": "Fé torna", + "CHANGE_VALUE_TITLE": "Modifiché ël valor:", + "RENAME_VARIABLE": "Arnomé la variàbil...", + "RENAME_VARIABLE_TITLE": "Arnomé tute le variàbij '%1' 'me:", + "NEW_VARIABLE": "Creé na variàbil...", + "NEW_STRING_VARIABLE": "Creé na variàbil dë stringa...", + "NEW_NUMBER_VARIABLE": "Creé na variàbil numérica...", + "NEW_COLOUR_VARIABLE": "Creé na variàbil ëd color...", + "NEW_VARIABLE_TYPE_TITLE": "Neuva sòrt ëd variàbil:", + "NEW_VARIABLE_TITLE": "Nòm ëd la neuva variàbil:", + "VARIABLE_ALREADY_EXISTS": "Na variàbil con ël nòm '%1' a esist già.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Na variàbil ciamà '%1' a esist già për n'àutra sòrt: '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Eliminé %1 utilisassion ëd la variàbil '%2'?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "As peul nen eliminesse la variàbil '%1' përchè a l'é part ëd la definission dla fonsion '%2'", + "DELETE_VARIABLE": "Eliminé la variàbil '%1'", + "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.", + "IOS_OK": "Va bin", + "IOS_CANCEL": "Anulé", + "IOS_ERROR": "Eror", + "IOS_PROCEDURES_INPUTS": "IMISSION", + "IOS_PROCEDURES_ADD_INPUT": "+ Gionté n'imission", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Përmëtte le diciairassion", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Costa imission a dj'imission duplicà.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Gionté na variàbil", + "IOS_VARIABLES_ADD_BUTTON": "Gionté", + "IOS_VARIABLES_RENAME_BUTTON": "Arnominé", + "IOS_VARIABLES_DELETE_BUTTON": "Eliminé", + "IOS_VARIABLES_VARIABLE_NAME": "Nòm ëd la variàbil", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "A peul nen dovré un nòm ëd variàbil veuid.", + "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).", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 ëd X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "A rëspond con l'arch-tangent dël pont (X, Y) an gre da -180 a 180.", + "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_TITLE": "a %1 taché ël test %2", + "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 %1 se ël test a l'é nen trovà.", + "TEXT_INDEXOF_TITLE": "ant ël test %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "trové la prima ocorensa dël test", + "TEXT_INDEXOF_OPERATOR_LAST": "trové l'ùltima ocorensa dël test", + "TEXT_CHARAT_TITLE": "ant ël test %1 %2", + "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.", + "TEXT_COUNT_MESSAGE0": "nùmer %1 su %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Conté vàire vire un test dàit a compariss an n'àutr test.", + "TEXT_REPLACE_MESSAGE0": "rampiassé %1 con %2 an %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "Rampiassé tute j'ocorense d'un test con n'àutr.", + "TEXT_REVERSE_MESSAGE0": "Anversé %1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "Anversé l'òrdin dij caràter ant ël test.", + "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 %1 se l'element a l'é nen trovà.", + "LISTS_GET_INDEX_GET": "oten-e", + "LISTS_GET_INDEX_GET_REMOVE": "oten-e e eliminé", + "LISTS_GET_INDEX_REMOVE": "eliminé", + "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_INDEX_FROM_START_TOOLTIP": "%1 a l'é ël prim element.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 a l'é l'ùltim element.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "A smon l'element a la posission ëspessificà an na lista.", + "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": "A gava e a smon l'element a la posission ëspessificà an na lista.", + "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": "A gava l'element a la posission ëspessificà an na lista.", + "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": "A fissa l'element a la posission ëspessificà an na lista.", + "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": "A anseriss l'element a la posission ëspessificà an na lista.", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "ordiné %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Ordiné na còpia ëd na lista.", + "LISTS_SORT_ORDER_ASCENDING": "chërsent", + "LISTS_SORT_ORDER_DESCENDING": "calant", + "LISTS_SORT_TYPE_NUMERIC": "numérich", + "LISTS_SORT_TYPE_TEXT": "alfabétich", + "LISTS_SORT_TYPE_IGNORECASE": "alfabétich, ignorand ël caràter minùscol o majùscol", + "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.", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "anversé %1", + "LISTS_REVERSE_TOOLTIP": "Anversé na còpia ëd na lista", + "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_DEFNORETURN_COMMENT": "Descrive sa fonsion...", + "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/Subroutine", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Eseguì la fonsion '%1' definìa da l'utent.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "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_HELPURL": "http://c2.com/cgi/wiki?GuardClause", + "PROCEDURES_IFRETURN_WARNING": "Atension: Ës blòch a podria esse dovrà mach an na definission ëd fonsion.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Dì cheicòs...", + "WORKSPACE_ARIA_LABEL": "Spassi ëd travaj ëd Blockly", + "COLLAPSED_WARNINGS_WARNING": "Ij blòch sarà a conten-o dj'avertense." +} diff --git a/js/msg/json/pt-br.json b/js/msg/json/pt-br.json new file mode 100644 index 0000000..4dc2615 --- /dev/null +++ b/js/msg/json/pt-br.json @@ -0,0 +1,390 @@ +{ + "@metadata": { + "authors": [ + "Espertus", + "Prilopes", + "Mordecaista", + "Amgauna", + "TheGabrielZaum", + "Cainamarques", + "Tuliouel", + "Rodrigo codignoli", + "Webysther", + "Fasouzafreitas", + "Almondega", + "Rogerio Melfi", + "Caçador de Palavras", + "Luk3", + "Cristofer Alves", + "EVinente", + "Lowvy", + "Trigonometria87", + "BarbaraAckles", + "Mauricio", + "Felipe L. Ewald", + "Eduardo Addad de Oliveira", + "McDutchie", + "WikiUser22222" + ] + }, + "VARIABLES_DEFAULT_NAME": "item", + "UNNAMED_KEY": "Sem título", + "TODAY": "Hoje", + "DUPLICATE_BLOCK": "Duplicar", + "ADD_COMMENT": "Adicionar comentário", + "REMOVE_COMMENT": "Remover comentário", + "DUPLICATE_COMMENT": "Duplicar comentário", + "EXTERNAL_INPUTS": "Entradas externas", + "INLINE_INPUTS": "Entradas incorporadas", + "DELETE_BLOCK": "Deletar bloco", + "DELETE_X_BLOCKS": "Deletar %1 blocos", + "DELETE_ALL_BLOCKS": "Deletar todos os blocos %1?", + "CLEAN_UP": "Limpar blocos", + "COLLAPSE_BLOCK": "Colapsar Bloco", + "COLLAPSE_ALL": "Colapsar Blocos", + "EXPAND_BLOCK": "Expandir bloco", + "EXPAND_ALL": "Expandir blocos", + "DISABLE_BLOCK": "Desabilitar bloco", + "ENABLE_BLOCK": "Habilitar bloco", + "HELP": "Ajuda", + "UNDO": "Desfazer", + "REDO": "Refazer", + "CHANGE_VALUE_TITLE": "Mudar valor:", + "RENAME_VARIABLE": "Renomear variável...", + "RENAME_VARIABLE_TITLE": "Renomear todas as variáveis '%1' para:", + "NEW_VARIABLE": "Criar variável...", + "NEW_STRING_VARIABLE": "Criar variável de segmentos de texto...", + "NEW_NUMBER_VARIABLE": "Criar variável numérica...", + "NEW_COLOUR_VARIABLE": "Criar variável colorida...", + "NEW_VARIABLE_TYPE_TITLE": "Tipo da nova variável:", + "NEW_VARIABLE_TITLE": "Nome da nova variável:", + "VARIABLE_ALREADY_EXISTS": "A variável chamada '%1' já existe.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Já existe uma variável chamada '%1' para outra do tipo: '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Deletar %1 usos da variável '%2'?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Não se pode deletar a variável '%1' porque é parte da definição da função '%2'", + "DELETE_VARIABLE": "Deletar a variável '%1'", + "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": "Criar uma cor 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": "Faça 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 execute 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, atribua o item à variável '%1' e então realize 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.", + "IOS_OK": "Ok", + "IOS_CANCEL": "blockly:IOS Cancelar/pt-br", + "IOS_ERROR": "Erro", + "IOS_PROCEDURES_INPUTS": "ENTRADAS", + "IOS_PROCEDURES_ADD_INPUT": "+ Adicionar Entrada", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Permitir declarações", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Essa função tem entradas duplicadas.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Adicionar Variável", + "IOS_VARIABLES_ADD_BUTTON": "Adicionar", + "IOS_VARIABLES_RENAME_BUTTON": "Blockly:Renomear varioas botoens/pt-br", + "IOS_VARIABLES_DELETE_BUTTON": "Deletar", + "IOS_VARIABLES_VARIABLE_NAME": "Nome variavel", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Você não pode usar um nome de variável vazio.", + "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).", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 de X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "Retorne o arco tangente do ponto (X, Y) em graus de -180 a 180.", + "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_TITLE": "para %1 anexar texto %2", + "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 %1 se o texto não for encontrado.", + "TEXT_INDEXOF_TITLE": "no texto %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "encontre a primeira ocorrência do item", + "TEXT_INDEXOF_OPERATOR_LAST": "encontre a última ocorrência do texto", + "TEXT_CHARAT_TITLE": "no texto %1 %2", + "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_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text", + "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_HELPURL": "https://github.com/google/blockly/wiki/Text#adjusting-text-case", + "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_HELPURL": "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces", + "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_HELPURL": "https://github.com/google/blockly/wiki/Text#printing-text", + "TEXT_PRINT_TITLE": "imprime %1", + "TEXT_PRINT_TOOLTIP": "Imprime o texto, número ou valor especificado.", + "TEXT_PROMPT_HELPURL": "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user", + "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.", + "TEXT_COUNT_MESSAGE0": "Contar %1 em %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Calcule quantas vezes algum texto aparece centro de algum outro texto.", + "TEXT_REPLACE_MESSAGE0": "substituir %1 por %2 em %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Texto#substituindo-substrings", + "TEXT_REPLACE_TOOLTIP": "Substitua todas as ocorrências de algum texto dentro de algum outro texto.", + "TEXT_REVERSE_MESSAGE0": "inverter %1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Texto#invertendo-texto", + "TEXT_REVERSE_TOOLTIP": "Inverter a ordem dos caracteres no 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 registro", + "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", + "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_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", + "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_HELPURL": "https://github.com/google/blockly/wiki/Lists#length-of", + "LISTS_LENGTH_TITLE": "tamanho de %1", + "LISTS_LENGTH_TOOLTIP": "Retorna o tamanho de uma lista.", + "LISTS_ISEMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#is-empty", + "LISTS_ISEMPTY_TITLE": "%1 é vazia", + "LISTS_ISEMPTY_TOOLTIP": "Retorna ao 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 %1 se o item não for encontrado.", + "LISTS_GET_INDEX_GET": "obter", + "LISTS_GET_INDEX_GET_REMOVE": "obter e remover", + "LISTS_GET_INDEX_REMOVE": "remover", + "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_INDEX_FROM_START_TOOLTIP": "%1 é o primeiro item.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 é o último item.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Retorna o item da lista na posição especificada.", + "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": "Remove e retorna o item na posição especificada em uma lista.", + "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": "Remove o item na posição especificada em uma lista.", + "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": "Define o item da posição especificada de uma lista.", + "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": "Insere o item na posição especificada em uma lista.", + "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_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-a-sublist", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "ordenar %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Ordenar uma cópia de uma lista.", + "LISTS_SORT_ORDER_ASCENDING": "ascendente", + "LISTS_SORT_ORDER_DESCENDING": "descendente", + "LISTS_SORT_TYPE_NUMERIC": "numérico", + "LISTS_SORT_TYPE_TEXT": "alfabético", + "LISTS_SORT_TYPE_IGNORECASE": "alfabético, ignorar maiúscula/minúscula", + "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", + "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.", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Listas#invertendo-uma-lista", + "LISTS_REVERSE_MESSAGE0": "inverter %1", + "LISTS_REVERSE_TOOLTIP": "Inverter uma cópia da lista.", + "VARIABLES_GET_HELPURL": "https://github.com/google/blockly/wiki/Variables#get", + "VARIABLES_GET_TOOLTIP": "Retorna o valor desta variável.", + "VARIABLES_GET_CREATE_SET": "Criar \"definir %1\"", + "VARIABLES_SET_HELPURL": "https://github.com/google/blockly/wiki/Variables#set", + "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_HELPURL": "https://pt.wikipedia.org/wiki/M%C3%A9todo_(programa%C3%A7%C3%A3o)", + "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_DEFNORETURN_COMMENT": "Descreva esta função...", + "PROCEDURES_DEFRETURN_HELPURL": "https://pt.wikipedia.org/wiki/M%C3%A9todo_(programa%C3%A7%C3%A3o)", + "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/M%C3%A9todo_(programa%C3%A7%C3%A3o)", + "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_HELPURL": "http://c2.com/cgi/wiki?GuardClause", + "PROCEDURES_IFRETURN_WARNING": "Atenção: Este bloco só pode ser utilizado dentro da definição de uma função.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Diz algo...", + "WORKSPACE_ARIA_LABEL": "Espaço de trabalho do Blockly", + "COLLAPSED_WARNINGS_WARNING": "Bloqueios recolhidos contêm avisos." +} diff --git a/js/msg/json/pt.json b/js/msg/json/pt.json new file mode 100644 index 0000000..8fc659f --- /dev/null +++ b/js/msg/json/pt.json @@ -0,0 +1,384 @@ +{ + "@metadata": { + "authors": [ + "Imperadeiro98", + "Waldir", + "Vitorvicentevalente", + "아라", + "Nicola Nascimento", + "Önni", + "Diniscoelho", + "Fúlvio", + "Mansil", + "Mauricio", + "Vicng", + "MokaAkashiyaPT", + "Athena in Wonderland", + "McDutchie", + "Hamilton Abreu", + "Waldyrious", + "Mansil alfalb" + ] + }, + "VARIABLES_DEFAULT_NAME": "item", + "UNNAMED_KEY": "sem nome", + "TODAY": "Hoje", + "DUPLICATE_BLOCK": "Duplicar", + "ADD_COMMENT": "Adicionar Comentário", + "REMOVE_COMMENT": "Remover Comentário", + "DUPLICATE_COMMENT": "Duplicar comentário", + "EXTERNAL_INPUTS": "Entradas Externas", + "INLINE_INPUTS": "Entradas Em Linhas", + "DELETE_BLOCK": "Eliminar Bloco", + "DELETE_X_BLOCKS": "Eliminar %1 Blocos", + "DELETE_ALL_BLOCKS": "Eliminar todos os %1 blocos?", + "CLEAN_UP": "Limpar Blocos", + "COLLAPSE_BLOCK": "Ocultar Bloco", + "COLLAPSE_ALL": "Ocultar Blocos", + "EXPAND_BLOCK": "Expandir Bloco", + "EXPAND_ALL": "Expandir Blocos", + "DISABLE_BLOCK": "Desativar Bloco", + "ENABLE_BLOCK": "Ativar Bloco", + "HELP": "Ajuda", + "UNDO": "Desfazer", + "REDO": "Refazer", + "CHANGE_VALUE_TITLE": "Alterar valor:", + "RENAME_VARIABLE": "Renomear variável...", + "RENAME_VARIABLE_TITLE": "Renomear todas as variáveis '%1' para:", + "NEW_VARIABLE": "Criar variável…", + "NEW_STRING_VARIABLE": "Criar variável de segmentos de texto...", + "NEW_NUMBER_VARIABLE": "Criar variável numérica...", + "NEW_COLOUR_VARIABLE": "Criar variável colorida...", + "NEW_VARIABLE_TYPE_TITLE": "Tipo da nova variável:", + "NEW_VARIABLE_TITLE": "Nome da nova variável:", + "VARIABLE_ALREADY_EXISTS": "Já existe uma variável com o nome de '%1'.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Já existe uma variável chamada '%1' para outra do tipo: '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Eliminar %1 utilizações da variável '%2'?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Não se pode eliminar a variável '%1' porque faz parte da definição da função '%2'", + "DELETE_VARIABLE": "Eliminar a variável '%1'", + "COLOUR_PICKER_HELPURL": "http://pt.wikipedia.org/wiki/Cor", + "COLOUR_PICKER_TOOLTIP": "Escolha uma cor da paleta de cores.", + "COLOUR_RANDOM_TITLE": "cor aleatória", + "COLOUR_RANDOM_TOOLTIP": "Escolha uma cor aleatoriamente.", + "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 com a proporção indicada (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": "repetir %1 vez", + "CONTROLS_REPEAT_INPUT_DO": "faça", + "CONTROLS_REPEAT_TOOLTIP": "Faça algumas instruções várias vezes.", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "repetir enquanto", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "repetir 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 por %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": "Ignorar o resto deste ciclo, e continuar com a próxima iteração.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Aviso: 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.", + "IOS_OK": "Aceitar", + "IOS_CANCEL": "Cancelar", + "IOS_ERROR": "Erro", + "IOS_PROCEDURES_INPUTS": "ENTRADAS", + "IOS_PROCEDURES_ADD_INPUT": "+ Adicionar entrada", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Permitir declarações", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Essa função tem entradas duplicadas.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Adicionar Variável", + "IOS_VARIABLES_ADD_BUTTON": "Adicionar", + "IOS_VARIABLES_RENAME_BUTTON": "Renomear", + "IOS_VARIABLES_DELETE_BUTTON": "Eliminar", + "IOS_VARIABLES_VARIABLE_NAME": "Nome da variável", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Você não pode usar um nome de variável vazio.", + "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).", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 de X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "Devolver o arco tangente do ponto (X, Y) em graus entre -180 e 180.", + "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_TITLE": "para %1 acrescentar texto %2", + "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 %1 se o texto não for encontrado.", + "TEXT_INDEXOF_TITLE": "no texto %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "primeira ocorrência do texto", + "TEXT_INDEXOF_OPERATOR_LAST": "última ocorrência do texto", + "TEXT_CHARAT_TITLE": "no texto %1 %2", + "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.", + "TEXT_COUNT_MESSAGE0": "contar %1 em %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Conte quantas vezes um certo texto aparece dentro de algum outro texto.", + "TEXT_REPLACE_MESSAGE0": "substituir %1 por %2 em %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "Substituir todas as ocorrências de um certo texto dentro de algum outro texto.", + "TEXT_REVERSE_MESSAGE0": "inverter %1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "Inverte a ordem dos caracteres no 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 %1 se o item não for encontrado.", + "LISTS_GET_INDEX_GET": "obter", + "LISTS_GET_INDEX_GET_REMOVE": "obter e remover", + "LISTS_GET_INDEX_REMOVE": "remover", + "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_INDEX_FROM_START_TOOLTIP": "%1 é o primeiro item.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 é o último item.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Retorna o item na posição especificada da lista.", + "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": "Remove e retorna o item na posição especificada de uma lista.", + "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": "Remove o item de uma posição especifica da lista.", + "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": "Define o item na posição especificada de uma lista.", + "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": "Insere o item numa posição especificada numa lista.", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "ordenar %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Ordenar uma cópia de uma lista.", + "LISTS_SORT_ORDER_ASCENDING": "ascendente", + "LISTS_SORT_ORDER_DESCENDING": "descendente", + "LISTS_SORT_TYPE_NUMERIC": "numérica", + "LISTS_SORT_TYPE_TEXT": "alfabética", + "LISTS_SORT_TYPE_IGNORECASE": "alfabética, ignorar maiúsculas/minúsculas", + "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.", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "inverter %1", + "LISTS_REVERSE_TOOLTIP": "Inverter uma cópia da lista.", + "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_DEFNORETURN_COMMENT": "Descreva esta função...", + "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": "Aviso: Esta função tem parâmetros duplicados.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://pt.wikipedia.org/wiki/Sub-rotina", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Executa a função \"%1\".", + "PROCEDURES_CALLRETURN_HELPURL": "https://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": "Aviso: Este bloco só pode ser utilizado dentro da definição de uma função.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Diz algo...", + "WORKSPACE_ARIA_LABEL": "Espaço de trabalho de Blockly", + "COLLAPSED_WARNINGS_WARNING": "Os blocos ocultados contêm avisos." +} diff --git a/js/msg/json/qqq.json b/js/msg/json/qqq.json new file mode 100644 index 0000000..f2b7d17 --- /dev/null +++ b/js/msg/json/qqq.json @@ -0,0 +1,402 @@ +{ + "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}}", + "UNNAMED_KEY": "default name - A simple, default name for an unnamed function or variable. Preferably indicates that the item is unnamed.", + "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.", + "DUPLICATE_COMMENT": "context menu - Make a copy of the selected workspace comment.\n{{Identical|Duplicate}}", + "EXTERNAL_INPUTS": "context menu - Change from 'external' to 'inline' mode for displaying blocks used as inputs to the selected block. See [[Translating:Blockly#context_menus]].", + "INLINE_INPUTS": "context menu - Change from 'internal' to 'external' mode for displaying blocks used as inputs to the selected block. See [[Translating:Blockly#context_menus]].", + "DELETE_BLOCK": "context menu - Permanently delete the selected block.", + "DELETE_X_BLOCKS": "context menu - Permanently delete the %1 selected blocks.\n\nParameters:\n* %1 - an integer greater than 1.", + "DELETE_ALL_BLOCKS": "confirmation prompt - Question the user if they really wanted to permanently delete all %1 blocks.\n\nParameters:\n* %1 - an integer greater than 1.", + "CLEAN_UP": "context menu - Reposition all the blocks so that they form a neat line.", + "COLLAPSE_BLOCK": "context menu - Make the appearance of the selected block smaller by hiding some information about it.", + "COLLAPSE_ALL": "context menu - Make the appearance of all blocks smaller by hiding some information about it. Use the same terminology as in the previous message.", + "EXPAND_BLOCK": "context menu - Restore the appearance of the selected block by showing information about it that was hidden (collapsed) earlier.", + "EXPAND_ALL": "context menu - Restore the appearance of all blocks by showing information about it that was hidden (collapsed) earlier. Use the same terminology as in the previous message.", + "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}}", + "CHANGE_VALUE_TITLE": "prompt - This message is only seen in the Opera browser. With most browsers, users can edit numeric values in blocks by just clicking and typing. Opera does not allows this, so we have to open a new window and prompt users with this message to chanage a value.", + "RENAME_VARIABLE": "dropdown choice - When the user clicks on a variable block, this is one of the dropdown menu choices. It is used to rename the current variable. See [https://github.com/google/blockly/wiki/Variables#dropdown-menu https://github.com/google/blockly/wiki/Variables#dropdown-menu].", + "RENAME_VARIABLE_TITLE": "prompt - Prompts the user to enter the new name for the selected variable. See [https://github.com/google/blockly/wiki/Variables#dropdown-menu https://github.com/google/blockly/wiki/Variables#dropdown-menu].\n\nParameters:\n* %1 - the name of the variable to be renamed.", + "NEW_VARIABLE": "button text - Text on the button used to launch the variable creation dialogue.", + "NEW_STRING_VARIABLE": "button text - Text on the button used to launch the variable creation dialogue.", + "NEW_NUMBER_VARIABLE": "button text - Text on the button used to launch the variable creation dialogue.", + "NEW_COLOUR_VARIABLE": "button text - Text on the button used to launch the variable creation dialogue.", + "NEW_VARIABLE_TYPE_TITLE": "prompt - Prompts the user to enter the type for a variable.", + "NEW_VARIABLE_TITLE": "prompt - Prompts the user to enter the name for a new variable. See [https://github.com/google/blockly/wiki/Variables#dropdown-menu https://github.com/google/blockly/wiki/Variables#dropdown-menu].", + "VARIABLE_ALREADY_EXISTS": "alert - Tells the user that the name they entered is already in use.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "alert - Tells the user that the name they entered is already in use for another type.", + "DELETE_VARIABLE_CONFIRMATION": "confirm - Ask the user to confirm their deletion of multiple uses of a variable.", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "alert - Tell the user that they can't delete a variable because it's part of the definition of a function.", + "DELETE_VARIABLE": "dropdown choice - Delete the currently selected variable.", + "COLOUR_PICKER_HELPURL": "{{Optional}} url - Information about colour.", + "COLOUR_PICKER_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Colour#picking-a-colour-from-a-palette https://github.com/google/blockly/wiki/Colour#picking-a-colour-from-a-palette].", + "COLOUR_RANDOM_HELPURL": "{{Optional}} url - A link that displays a random colour each time you visit it.", + "COLOUR_RANDOM_TITLE": "block text - Title of block that generates a colour at random.", + "COLOUR_RANDOM_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Colour#generating-a-random-colour https://github.com/google/blockly/wiki/Colour#generating-a-random-colour].", + "COLOUR_RGB_HELPURL": "{{Optional}} url - A link for colour codes with percentages (0-100%) for each component, instead of the more common 0-255, which may be more difficult for beginners.", + "COLOUR_RGB_TITLE": "block text - Title of block for [https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components].", + "COLOUR_RGB_RED": "block input text - The amount of red (from 0 to 100) to use when [https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components].\n{{Identical|Red}}", + "COLOUR_RGB_GREEN": "block input text - The amount of green (from 0 to 100) to use when [https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components].", + "COLOUR_RGB_BLUE": "block input text - The amount of blue (from 0 to 100) to use when [https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components].\n{{Identical|Blue}}", + "COLOUR_RGB_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components].", + "COLOUR_BLEND_HELPURL": "{{Optional}} url - A useful link that displays blending of two colours.", + "COLOUR_BLEND_TITLE": "block text - A verb for blending two shades of paint.", + "COLOUR_BLEND_COLOUR1": "block input text - The first of two colours to [https://github.com/google/blockly/wiki/Colour#blending-colours blend].", + "COLOUR_BLEND_COLOUR2": "block input text - The second of two colours to [https://github.com/google/blockly/wiki/Colour#blending-colours blend].", + "COLOUR_BLEND_RATIO": "block input text - The proportion of the [https://github.com/google/blockly/wiki/Colour#blending-colours blend] containing the first colour; the remaining proportion is of the second colour. For example, if the first colour is red and the second colour blue, a ratio of 1 would yield pure red, a ratio of .5 would yield purple (equal amounts of red and blue), and a ratio of 0 would yield pure blue.\n{{Identical|Ratio}}", + "COLOUR_BLEND_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Colour#blending-colours https://github.com/google/blockly/wiki/Colour#blending-colours].", + "CONTROLS_REPEAT_HELPURL": "{{Optional}} url - Describes 'repeat loops' in computer programs; consider using the translation of the page [https://en.wikipedia.org/wiki/Control_flow https://en.wikipedia.org/wiki/Control_flow].", + "CONTROLS_REPEAT_TITLE": "block input text - Title of [https://github.com/google/blockly/wiki/Loops#repeat repeat block].\n\nParameters:\n* %1 - the number of times the body of the loop should be repeated.", + "CONTROLS_REPEAT_INPUT_DO": "block text - Preceding the blocks in the body of the loop. See [https://github.com/google/blockly/wiki/Loops https://github.com/google/blockly/wiki/Loops].\n{{Identical|Do}}", + "CONTROLS_REPEAT_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Loops#repeat https://github.com/google/blockly/wiki/Loops#repeat].", + "CONTROLS_WHILEUNTIL_HELPURL": "{{Optional}} url - Describes 'while loops' in computer programs; consider using the translation of [https://en.wikipedia.org/wiki/While_loop https://en.wikipedia.org/wiki/While_loop], if present, or [https://en.wikipedia.org/wiki/Control_flow https://en.wikipedia.org/wiki/Control_flow].", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "dropdown - Specifies that a loop should [https://github.com/google/blockly/wiki/Loops#repeat-while repeat while] the following condition is true.", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "dropdown - Specifies that a loop should [https://github.com/google/blockly/wiki/Loops#repeat-until repeat until] the following condition becomes true.", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "tooltip - See [https://github.com/google/blockly/wiki/Loops#repeat-while Loops#repeat-while https://github.com/google/blockly/wiki/Loops#repeat-while Loops#repeat-while].", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "tooltip - See [https://github.com/google/blockly/wiki/Loops#repeat-until https://github.com/google/blockly/wiki/Loops#repeat-until].", + "CONTROLS_FOR_HELPURL": "{{Optional}} url - Describes 'for loops' in computer programs. Consider using your language's translation of [https://en.wikipedia.org/wiki/For_loop https://en.wikipedia.org/wiki/For_loop], if present.", + "CONTROLS_FOR_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Loops#count-with https://github.com/google/blockly/wiki/Loops#count-with].\n\nParameters:\n* %1 - the name of the loop variable.", + "CONTROLS_FOR_TITLE": "block text - Repeatedly counts a variable (%1) starting with a (usually lower) number in a range (%2), ending with a (usually higher) number in a range (%3), and counting the iterations by a number of steps (%4). As in [https://github.com/google/blockly/wiki/Loops#count-with https://github.com/google/blockly/wiki/Loops#count-with]. [[File:Blockly-count-with.png]]", + "CONTROLS_FOREACH_HELPURL": "{{Optional}} url - Describes 'for-each loops' in computer programs. Consider using your language's translation of [https://en.wikipedia.org/wiki/Foreach https://en.wikipedia.org/wiki/Foreach] if present.", + "CONTROLS_FOREACH_TITLE": "block text - Title of [https://github.com/google/blockly/wiki/Loops#for-each for each block]. Sequentially assigns every item in array %2 to the valiable %1.", + "CONTROLS_FOREACH_TOOLTIP": "block text - Description of [https://github.com/google/blockly/wiki/Loops#for-each for each blocks].\n\nParameters:\n* %1 - the name of the loop variable.", + "CONTROLS_FLOW_STATEMENTS_HELPURL": "{{Optional}} url - Describes control flow in computer programs. Consider using your language's translation of [https://en.wikipedia.org/wiki/Control_flow https://en.wikipedia.org/wiki/Control_flow], if it exists.", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "dropdown - The current loop should be exited. See [https://github.com/google/blockly/wiki/Loops#break https://github.com/google/blockly/wiki/Loops#break].", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "dropdown - The current iteration of the loop should be ended and the next should begin. See [https://github.com/google/blockly/wiki/Loops#continue-with-next-iteration https://github.com/google/blockly/wiki/Loops#continue-with-next-iteration].", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "tooltip - See [https://github.com/google/blockly/wiki/Loops#break-out-of-loop https://github.com/google/blockly/wiki/Loops#break-out-of-loop].", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "tooltip - See [https://github.com/google/blockly/wiki/Loops#continue-with-next-iteration https://github.com/google/blockly/wiki/Loops#continue-with-next-iteration].", + "CONTROLS_FLOW_STATEMENTS_WARNING": "warning - The user has tried placing a block outside of a loop (for each, while, repeat, etc.), but this type of block may only be used within a loop. See [https://github.com/google/blockly/wiki/Loops#loop-termination-blocks https://github.com/google/blockly/wiki/Loops#loop-termination-blocks].", + "CONTROLS_IF_HELPURL": "{{Optional}} url - Describes conditional statements (if-then-else) in computer programs. Consider using your language's translation of [https://en.wikipedia.org/wiki/If_else https://en.wikipedia.org/wiki/If_else], if present.", + "CONTROLS_IF_TOOLTIP_1": "tooltip - Describes [https://github.com/google/blockly/wiki/IfElse#if-blocks 'if' blocks]. Consider using your language's translation of [https://en.wikipedia.org/wiki/If_statement https://en.wikipedia.org/wiki/If_statement], if present.", + "CONTROLS_IF_TOOLTIP_2": "tooltip - Describes [https://github.com/google/blockly/wiki/IfElse#if-else-blocks if-else blocks]. Consider using your language's translation of [https://en.wikipedia.org/wiki/If_statement https://en.wikipedia.org/wiki/If_statement], if present.", + "CONTROLS_IF_TOOLTIP_3": "tooltip - Describes [https://github.com/google/blockly/wiki/IfElse#if-else-if-blocks if-else-if blocks]. Consider using your language's translation of [https://en.wikipedia.org/wiki/If_statement https://en.wikipedia.org/wiki/If_statement], if present.", + "CONTROLS_IF_TOOLTIP_4": "tooltip - Describes [https://github.com/google/blockly/wiki/IfElse#if-else-if-else-blocks if-else-if-else blocks]. Consider using your language's translation of [https://en.wikipedia.org/wiki/If_statement https://en.wikipedia.org/wiki/If_statement], if present.", + "CONTROLS_IF_MSG_IF": "block text - See [https://github.com/google/blockly/wiki/IfElse https://github.com/google/blockly/wiki/IfElse]. It is recommended, but not essential, that this have text in common with the translation of 'else if'\n{{Identical|If}}", + "CONTROLS_IF_MSG_ELSEIF": "block text - See [https://github.com/google/blockly/wiki/IfElse https://github.com/google/blockly/wiki/IfElse]. The English words 'otherwise if' would probably be clearer than 'else if', but the latter is used because it is traditional and shorter.", + "CONTROLS_IF_MSG_ELSE": "block text - See [https://github.com/google/blockly/wiki/IfElse https://github.com/google/blockly/wiki/IfElse]. The English word 'otherwise' would probably be superior to 'else', but the latter is used because it is traditional and shorter.", + "CONTROLS_IF_IF_TOOLTIP": "tooltip - Describes [https://github.com/google/blockly/wiki/IfElse#block-modification if block modification].", + "CONTROLS_IF_ELSEIF_TOOLTIP": "tooltip - Describes the 'else if' subblock during [https://github.com/google/blockly/wiki/IfElse#block-modification if block modification].", + "CONTROLS_IF_ELSE_TOOLTIP": "tooltip - Describes the 'else' subblock during [https://github.com/google/blockly/wiki/IfElse#block-modification if block modification].", + "IOS_OK": "button text - Text on a button inside a dialogue window, which will accept or acknowledge the contents of the dialogue when pressed.\n{{Identical|OK}}", + "IOS_CANCEL": "button text - Text on a button inside a dialogue window, which will close or cancel the dialogue when pressed.\n{{Identical|Cancel}}", + "IOS_ERROR": "alert - Title text for an error dialogue.\n{{Identical|Error}}", + "IOS_PROCEDURES_INPUTS": "header text - Title of a section that displays a list of parameters (aka. 'inputs') that have been defined for a procedure. This is used inside a dialogue window to configure a procedure.\n{{Identical|Input}}", + "IOS_PROCEDURES_ADD_INPUT": "button text - Text on a button which will add a parameter (aka. 'input') to a procedure. This is used inside a dialogue window to configure a procedure. NOTE: The '+' should be preserved at the beginning of the text.", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "option text - Text describing an option to allow statements to be added within a procedure. This is used inside a dialogue window to configure a procedure.", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "alert - Error message when duplicate parameters (aka. 'inputs') have been defined on a procedure. This is used inside a dialogue window to configure procedure parameters.", + "IOS_VARIABLES_ADD_VARIABLE": "button text - Text on a button which will open a variable creation dialogue when pressed. NOTE: The '+' should be preserved at the beginning of the text.", + "IOS_VARIABLES_ADD_BUTTON": "button text - Text on a button inside a variable creation dialogue, which will add a variable when pressed.\n{{Identical|Add}}", + "IOS_VARIABLES_RENAME_BUTTON": "button text - Text on a button inside a variable rename dialogue, which will rename a variable when pressed.\n{{Identical|Rename}}", + "IOS_VARIABLES_DELETE_BUTTON": "button text - Text on a button inside a variable deletion dialogue, which will delete a variable when pressed.\n{{Identical|Delete}}", + "IOS_VARIABLES_VARIABLE_NAME": "placeholder text - Placeholder text used inside a text input, where a variable name should be entered.", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "alert - Error message that is displayed when the user attempts to create a variable without a name.", + "LOGIC_COMPARE_HELPURL": "{{Optional}} url - Information about comparisons.", + "LOGIC_COMPARE_TOOLTIP_EQ": "tooltip - Describes the equals (=) block.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "tooltip - Describes the not equals (≠) block.", + "LOGIC_COMPARE_TOOLTIP_LT": "tooltip - Describes the less than (<) block.", + "LOGIC_COMPARE_TOOLTIP_LTE": "tooltip - Describes the less than or equals (≤) block.", + "LOGIC_COMPARE_TOOLTIP_GT": "tooltip - Describes the greater than (>) block.", + "LOGIC_COMPARE_TOOLTIP_GTE": "tooltip - Describes the greater than or equals (≥) block.", + "LOGIC_OPERATION_HELPURL": "{{Optional}} 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].\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].\n{{Identical|Or}}", + "LOGIC_NEGATE_HELPURL": "{{Optional}} 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": "{{Optional}} 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''.\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": "{{Optional}} 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'.\n{{Identical|Null}}", + "LOGIC_NULL_TOOLTIP": "tooltip - This should use the word from the previous message.", + "LOGIC_TERNARY_HELPURL": "{{Optional}} url - Describes the programming language operator known as the ''ternary'' or ''conditional'' operator. It is recommended that you use the translation of [https://en.wikipedia.org/wiki/%3F: https://en.wikipedia.org/wiki/%3F:] if it exists.", + "LOGIC_TERNARY_CONDITION": "block input text - Label for the input whose value determines which of the other two inputs is returned. In some programming languages, this is called a ''''predicate''''.", + "LOGIC_TERNARY_IF_TRUE": "block input text - Indicates that the following input should be returned (used as output) if the test input is true. Remember to try to keep block text terse (short).", + "LOGIC_TERNARY_IF_FALSE": "block input text - Indicates that the following input should be returned (used as output) if the test input is false.", + "LOGIC_TERNARY_TOOLTIP": "tooltip - See [https://en.wikipedia.org/wiki/%3F: https://en.wikipedia.org/wiki/%3F:].", + "MATH_NUMBER_HELPURL": "{{Optional}} url - Information about (real) numbers.", + "MATH_NUMBER_TOOLTIP": "tooltip - Any positive or negative number, not necessarily an integer.", + "MATH_ADDITION_SYMBOL": "{{Optional}} math - The symbol for the binary operation addition.", + "MATH_SUBTRACTION_SYMBOL": "{{Optional}} math - The symbol for the binary operation indicating that the right operand should be subtracted from the left operand.", + "MATH_DIVISION_SYMBOL": "{{Optional}} math - The binary operation indicating that the left operand should be divided by the right operand.", + "MATH_MULTIPLICATION_SYMBOL": "{{Optional}} math - The symbol for the binary operation multiplication.", + "MATH_POWER_SYMBOL": "{{Optional}} math - The symbol for the binary operation exponentiation. Specifically, if the value of the left operand is L and the value of the right operand (the exponent) is R, multiply L by itself R times. (Fractional and negative exponents are also legal.)", + "MATH_TRIG_SIN": "math - The short name of the trigonometric function [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent sine].", + "MATH_TRIG_COS": "math - The short name of the trigonometric function [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent cosine].", + "MATH_TRIG_TAN": "math - The short name of the trigonometric function [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent tangent].", + "MATH_TRIG_ASIN": "math - The short name of the ''inverse of'' the trigonometric function [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent sine].", + "MATH_TRIG_ACOS": "math - The short name of the ''inverse of'' the trigonometric function [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent cosine].", + "MATH_TRIG_ATAN": "math - The short name of the ''inverse of'' the trigonometric function [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent tangent].", + "MATH_ARITHMETIC_HELPURL": "{{Optional}} url - Information about addition, subtraction, multiplication, division, and exponentiation.", + "MATH_ARITHMETIC_TOOLTIP_ADD": "tooltip - See [https://en.wikipedia.org/wiki/Addition https://en.wikipedia.org/wiki/Addition].", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "tooltip - See [https://en.wikipedia.org/wiki/Subtraction https://en.wikipedia.org/wiki/Subtraction].", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "tooltip - See [https://en.wikipedia.org/wiki/Multiplication https://en.wikipedia.org/wiki/Multiplication].", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "tooltip - See [https://en.wikipedia.org/wiki/Division_(mathematics) https://en.wikipedia.org/wiki/Division_(mathematics)].", + "MATH_ARITHMETIC_TOOLTIP_POWER": "tooltip - See [https://en.wikipedia.org/wiki/Exponentiation https://en.wikipedia.org/wiki/Exponentiation].", + "MATH_SINGLE_HELPURL": "{{Optional}} url - Information about the square root operation.", + "MATH_SINGLE_OP_ROOT": "dropdown - This computes the positive [https://en.wikipedia.org/wiki/Square_root square root] of its input. For example, the square root of 16 is 4.", + "MATH_SINGLE_TOOLTIP_ROOT": "tooltip - Please use the same term as in the previous message.", + "MATH_SINGLE_OP_ABSOLUTE": "dropdown - This leaves positive numeric inputs changed and inverts negative inputs. For example, the absolute value of 5 is 5; the absolute value of -5 is also 5. For more information, see [https://en.wikipedia.org/wiki/Absolute_value https://en.wikipedia.org/wiki/Absolute_value].", + "MATH_SINGLE_TOOLTIP_ABS": "tooltip - Please use the same term as in the previous message.", + "MATH_SINGLE_TOOLTIP_NEG": "tooltip - Calculates '''0-n''', where '''n''' is the single numeric input.", + "MATH_SINGLE_TOOLTIP_LN": "tooltip - Calculates the [https://en.wikipedia.org/wiki/Natural_logarithm|natural logarithm] of its single numeric input.", + "MATH_SINGLE_TOOLTIP_LOG10": "tooltip - Calculates the [https://en.wikipedia.org/wiki/Common_logarithm common logarithm] of its single numeric input.", + "MATH_SINGLE_TOOLTIP_EXP": "tooltip - Multiplies [https://en.wikipedia.org/wiki/E_(mathematical_constant) e] by itself n times, where n is the single numeric input.", + "MATH_SINGLE_TOOLTIP_POW10": "tooltip - Multiplies 10 by itself n times, where n is the single numeric input.", + "MATH_TRIG_HELPURL": "{{Optional}} url - Information about the trigonometric functions sine, cosine, tangent, and their inverses (ideally using degrees, not radians).", + "MATH_TRIG_TOOLTIP_SIN": "tooltip - Return the [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent sine] of an [https://en.wikipedia.org/wiki/Degree_(angle) angle in degrees], not radians.", + "MATH_TRIG_TOOLTIP_COS": "tooltip - Return the [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent cosine] of an [https://en.wikipedia.org/wiki/Degree_(angle) angle in degrees], not radians.", + "MATH_TRIG_TOOLTIP_TAN": "tooltip - Return the [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent tangent] of an [https://en.wikipedia.org/wiki/Degree_(angle) angle in degrees], not radians.", + "MATH_TRIG_TOOLTIP_ASIN": "tooltip - The [https://en.wikipedia.org/wiki/Inverse_trigonometric_functions inverse] of the [https://en.wikipedia.org/wiki/Cosine#Sine.2C_cosine_and_tangent sine function], using [https://en.wikipedia.org/wiki/Degree_(angle) degrees], not radians.", + "MATH_TRIG_TOOLTIP_ACOS": "tooltip - The [https://en.wikipedia.org/wiki/Inverse_trigonometric_functions inverse] of the [https://en.wikipedia.org/wiki/Cosine#Sine.2C_cosine_and_tangent cosine] function, using [https://en.wikipedia.org/wiki/Degree_(angle) degrees], not radians.", + "MATH_TRIG_TOOLTIP_ATAN": "tooltip - The [https://en.wikipedia.org/wiki/Inverse_trigonometric_functions inverse] of the [https://en.wikipedia.org/wiki/Cosine#Sine.2C_cosine_and_tangent tangent] function, using [https://en.wikipedia.org/wiki/Degree_(angle) degrees], not radians.", + "MATH_CONSTANT_HELPURL": "{{Optional}} url - Information about the mathematical constants Pi (π), e, the golden ratio (φ), √ 2, √ 1/2, and infinity (∞).", + "MATH_CONSTANT_TOOLTIP": "tooltip - Provides the specified [https://en.wikipedia.org/wiki/Mathematical_constant mathematical constant].", + "MATH_IS_EVEN": "dropdown - A number is '''even''' if it is a multiple of 2. For example, 4 is even (yielding true), but 3 is not (false).", + "MATH_IS_ODD": "dropdown - A number is '''odd''' if it is not a multiple of 2. For example, 3 is odd (yielding true), but 4 is not (false). The opposite of 'odd' is 'even'.", + "MATH_IS_PRIME": "dropdown - A number is [https://en.wikipedia.org/wiki/Prime prime] if it cannot be evenly divided by any positive integers except for 1 and itself. For example, 5 is prime, but 6 is not because 2 × 3 = 6.", + "MATH_IS_WHOLE": "dropdown - A number is '''whole''' if it is an [https://en.wikipedia.org/wiki/Integer integer]. For example, 5 is whole, but 5.1 is not.", + "MATH_IS_POSITIVE": "dropdown - A number is '''positive''' if it is greater than 0. (0 is neither negative nor positive.)", + "MATH_IS_NEGATIVE": "dropdown - A number is '''negative''' if it is less than 0. (0 is neither negative nor positive.)", + "MATH_IS_DIVISIBLE_BY": "dropdown - A number x is divisible by y if y goes into x evenly. For example, 10 is divisible by 5, but 10 is not divisible by 3.", + "MATH_IS_TOOLTIP": "tooltip - This block lets the user specify via a dropdown menu whether to check if the numeric input is even, odd, prime, whole, positive, negative, or divisible by a given value.", + "MATH_CHANGE_HELPURL": "{{Optional}} url - Information about incrementing (increasing the value of) a variable. For other languages, just use the translation of the Wikipedia page about addition ([https://en.wikipedia.org/wiki/Addition https://en.wikipedia.org/wiki/Addition]).", + "MATH_CHANGE_TITLE": "- As in: ''change'' [the value of variable] ''item'' ''by'' 1 (e.g., if the variable named 'item' had the value 5, change it to 6). %1 is a variable name. %2 is the amount of change.", + "MATH_CHANGE_TOOLTIP": "tooltip - This updates the value of the variable by adding to it the following numeric input.\n\nParameters:\n* %1 - the name of the variable whose value should be increased.", + "MATH_ROUND_HELPURL": "{{Optional}} url - Information about how numbers are rounded to the nearest integer", + "MATH_ROUND_TOOLTIP": "tooltip - See [https://en.wikipedia.org/wiki/Rounding https://en.wikipedia.org/wiki/Rounding].", + "MATH_ROUND_OPERATOR_ROUND": "dropdown - This rounds its input to the nearest whole number. For example, 3.4 is rounded to 3.", + "MATH_ROUND_OPERATOR_ROUNDUP": "dropdown - This rounds its input up to the nearest whole number. For example, if the input was 2.2, the result would be 3.", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "dropdown - This rounds its input down to the nearest whole number. For example, if the input was 3.8, the result would be 3.", + "MATH_ONLIST_HELPURL": "{{Optional}} url - Information about applying a function to a list of numbers. (We were unable to find such information in English. Feel free to skip this and any other URLs that are difficult.)", + "MATH_ONLIST_OPERATOR_SUM": "dropdown - This computes the sum of the numeric elements in the list. For example, the sum of the list {1, 4} is 5.", + "MATH_ONLIST_TOOLTIP_SUM": "tooltip - Please use the same term for 'sum' as in the previous message.", + "MATH_ONLIST_OPERATOR_MIN": "dropdown - This finds the smallest (minimum) number in a list. For example, the smallest number in the list [-5, 0, 3] is -5.", + "MATH_ONLIST_TOOLTIP_MIN": "tooltip - Please use the same term for 'min' or 'minimum' as in the previous message.", + "MATH_ONLIST_OPERATOR_MAX": "dropdown - This finds the largest (maximum) number in a list. For example, the largest number in the list [-5, 0, 3] is 3.", + "MATH_ONLIST_TOOLTIP_MAX": "tooltip", + "MATH_ONLIST_OPERATOR_AVERAGE": "dropdown - This adds up all of the numbers in a list and divides the sum by the number of elements in the list. For example, the [https://en.wikipedia.org/wiki/Arithmetic_mean average] of the list [1, 2, 3, 4] is 2.5 (10/4).", + "MATH_ONLIST_TOOLTIP_AVERAGE": "tooltip - See [https://en.wikipedia.org/wiki/Arithmetic_mean https://en.wikipedia.org/wiki/Arithmetic_mean] for more informatin.", + "MATH_ONLIST_OPERATOR_MEDIAN": "dropdown - This finds the [https://en.wikipedia.org/wiki/Median median] of the numeric values in a list. For example, the median of the list {1, 2, 7, 12, 13} is 7.", + "MATH_ONLIST_TOOLTIP_MEDIAN": "tooltip - See [https://en.wikipedia.org/wiki/Median median https://en.wikipedia.org/wiki/Median median] for more information.", + "MATH_ONLIST_OPERATOR_MODE": "dropdown - This finds the most common numbers ([https://en.wikipedia.org/wiki/Mode_(statistics) modes]) in a list. For example, the modes of the list {1, 3, 9, 3, 9} are {3, 9}.", + "MATH_ONLIST_TOOLTIP_MODE": "tooltip - See [https://en.wikipedia.org/wiki/Mode_(statistics) https://en.wikipedia.org/wiki/Mode_(statistics)] for more information.", + "MATH_ONLIST_OPERATOR_STD_DEV": "dropdown - This finds the [https://en.wikipedia.org/wiki/Standard_deviation standard deviation] of the numeric values in a list.", + "MATH_ONLIST_TOOLTIP_STD_DEV": "tooltip - See [https://en.wikipedia.org/wiki/Standard_deviation https://en.wikipedia.org/wiki/Standard_deviation] for more information.", + "MATH_ONLIST_OPERATOR_RANDOM": "dropdown - This choose an element at random from a list. Each element is chosen with equal probability.", + "MATH_ONLIST_TOOLTIP_RANDOM": "tooltip - Please use same term for 'random' as in previous entry.", + "MATH_MODULO_HELPURL": "{{Optional}} url - information about the modulo (remainder) operation.", + "MATH_MODULO_TITLE": "block text - Title of block providing the remainder when dividing the first numerical input by the second. For example, the remainder of 10 divided by 3 is 1.\n\nParameters:\n* %1 - the dividend (10, in our example)\n* %2 - the divisor (3 in our example).", + "MATH_MODULO_TOOLTIP": "tooltip - For example, the remainder of 10 divided by 3 is 1.", + "MATH_CONSTRAIN_HELPURL": "{{Optional}} url - Information about constraining a numeric value to be in a specific range. (The English URL is not ideal. Recall that translating URLs is the lowest priority.)", + "MATH_CONSTRAIN_TITLE": "block text - The title of the block that '''constrain'''s (forces) a number to be in a given range. For example, if the number 150 is constrained to be between 5 and 100, the result will be 100. \n\nParameters:\n* %1 - the value to constrain (e.g., 150)\n* %2 - the minimum value (e.g., 5)\n* %3 - the maximum value (e.g., 100).", + "MATH_CONSTRAIN_TOOLTIP": "tooltip - This compares a number ''x'' to a low value ''L'' and a high value ''H''. If ''x'' is less then ''L'', the result is ''L''. If ''x'' is greater than ''H'', the result is ''H''. Otherwise, the result is ''x''.", + "MATH_RANDOM_INT_HELPURL": "{{Optional}} url - Information about how computers generate random numbers.", + "MATH_RANDOM_INT_TITLE": "block text - The title of the block that generates a random integer (whole number) in the specified range. For example, if the range is from 5 to 7, this returns 5, 6, or 7 with equal likelihood. %1 is a placeholder for the lower number, %2 is the placeholder for the larger number.", + "MATH_RANDOM_INT_TOOLTIP": "tooltip - Return a random integer between two values specified as inputs. For example, if one input was 7 and another 9, any of the numbers 7, 8, or 9 could be produced.", + "MATH_RANDOM_FLOAT_HELPURL": "{{Optional}} url - Information about how computers generate random numbers (specifically, numbers in the range from 0 to just below 1).", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "block text - The title of the block that generates a random number greater than or equal to 0 and less than 1.", + "MATH_RANDOM_FLOAT_TOOLTIP": "tooltip - Return a random fraction between 0 and 1. The value may be equal to 0 but must be less than 1.", + "MATH_ATAN2_HELPURL": "{{Optional}} url - Information about how to calculate atan2.", + "MATH_ATAN2_TITLE": "block text - The title of the block that calculates atan2 of point (X, Y). For example, if the point is (-1, -1), this returns -135. %1 is a placeholder for the X coordinate, %2 is the placeholder for the Y coordinate.", + "MATH_ATAN2_TOOLTIP": "tooltip - Return the arctangent of point (X, Y) in degrees from -180 to 180. For example, if the point is (-1, -1) this returns -135.", + "TEXT_TEXT_HELPURL": "{{Optional}} url - Information about how computers represent text (sometimes referred to as ''string''s).", + "TEXT_TEXT_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Text https://github.com/google/blockly/wiki/Text].", + "TEXT_JOIN_HELPURL": "{{Optional}} url - Information on concatenating/appending pieces of text.", + "TEXT_JOIN_TITLE_CREATEWITH": "block text - See [https://github.com/google/blockly/wiki/Text#text-creation https://github.com/google/blockly/wiki/Text#text-creation].", + "TEXT_JOIN_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Text#text-creation create text with] for more information.", + "TEXT_CREATE_JOIN_TITLE_JOIN": "block text - This is shown when the programmer wants to change the number of pieces of text being joined together. See [https://github.com/google/blockly/wiki/Text#text-creation https://github.com/google/blockly/wiki/Text#text-creation], specifically the last picture in the 'Text creation' section.\n{{Identical|Join}}", + "TEXT_CREATE_JOIN_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Text#text-creation https://github.com/google/blockly/wiki/Text#text-creation], specifically the last picture in the 'Text creation' section.", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "block text - See [https://github.com/google/blockly/wiki/Text#text-creation https://github.com/google/blockly/wiki/Text#text-creation], specifically the last picture in the 'Text creation' section.", + "TEXT_APPEND_HELPURL": "{{Optional}} url - This and the other text-related URLs are going to be hard to translate. As always, it is okay to leave untranslated or paste in the English-language URL. For these URLs, you might also consider a general URL about how computers represent text (such as the translation of [https://en.wikipedia.org/wiki/String_(computer_science) this Wikipedia page]).", + "TEXT_APPEND_TITLE": "block input text - Message that the variable name at %1 will have the item at %2 appended to it. [[File:blockly-append-text.png]]", + "TEXT_APPEND_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Text#text-modification https://github.com/google/blockly/wiki/Text#text-modification] for more information.\n\nParameters:\n* %1 - the name of the variable to which text should be appended", + "TEXT_LENGTH_HELPURL": "{{Optional}} url - Information about text on computers (usually referred to as 'strings').", + "TEXT_LENGTH_TITLE": "block text - See [https://github.com/google/blockly/wiki/Text#text-length https://github.com/google/blockly/wiki/Text#text-length]. \n\nParameters:\n* %1 - the piece of text to take the length of", + "TEXT_LENGTH_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Text#text-length https://github.com/google/blockly/wiki/Text#text-length].", + "TEXT_ISEMPTY_HELPURL": "{{Optional}} url - Information about empty pieces of text on computers (usually referred to as 'empty strings').", + "TEXT_ISEMPTY_TITLE": "block text - See [https://github.com/google/blockly/wiki/Text#checking-for-empty-text https://github.com/google/blockly/wiki/Text#checking-for-empty-text]. \n\nParameters:\n* %1 - the piece of text to test for emptiness", + "TEXT_ISEMPTY_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Text#checking-for-empty-text https://github.com/google/blockly/wiki/Text#checking-for-empty-text].", + "TEXT_INDEXOF_HELPURL": "{{Optional}} url - Information about finding a character in a piece of text.", + "TEXT_INDEXOF_TOOLTIP": "tooltip - %1 will be replaced by either the number 0 or -1 depending on the indexing mode. See [https://github.com/google/blockly/wiki/Text#finding-text https://github.com/google/blockly/wiki/Text#finding-text].", + "TEXT_INDEXOF_TITLE": "block text - Title of blocks allowing users to find text. See [https://github.com/google/blockly/wiki/Text#finding-text https://github.com/google/blockly/wiki/Text#finding-text]. [[File:Blockly-find-text.png]]. In English the expanded message is 'in text %1 find (first|last) occurance of text %3' where %1 and %3 are added by the user. See TEXT_INDEXOF_OPERATOR_FIRST and TEXT_INDEXOF_OPERATOR_LAST for the dropdown text that replaces %2.", + "TEXT_INDEXOF_OPERATOR_FIRST": "dropdown - See [https://github.com/google/blockly/wiki/Text#finding-text https://github.com/google/blockly/wiki/Text#finding-text]. [[File:Blockly-find-text.png]].", + "TEXT_INDEXOF_OPERATOR_LAST": "dropdown - See [https://github.com/google/blockly/wiki/Text#finding-text https://github.com/google/blockly/wiki/Text#finding-text]. This would replace 'find first occurrence of text' below. (For more information on how common text is factored out of dropdown menus, see [https://translatewiki.net/wiki/Translating:Blockly#Drop-Down_Menus https://translatewiki.net/wiki/Translating:Blockly#Drop-Down_Menus)].) [[File:Blockly-find-text.png]].", + "TEXT_CHARAT_HELPURL": "{{Optional}} url - Information about extracting characters (letters, number, symbols, etc.) from text.", + "TEXT_CHARAT_TITLE": "block text - Text for a block to extract a letter (or number, punctuation character, etc.) from a string, as shown below. %1 is added by the user and %2 is replaced by a dropdown of options, possibly followed by another user supplied string. TEXT_CHARAT_TAIL is then added to the end. See [https://github.com/google/blockly/wiki/Text#extracting-a-single-character https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. [[File:Blockly-text-get.png]]", + "TEXT_CHARAT_FROM_START": "dropdown - Indicates that the letter (or number, punctuation character, etc.) with the specified index should be obtained from the preceding piece of text. See [https://github.com/google/blockly/wiki/Text#extracting-a-single-character https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. [[File:Blockly-text-get.png]]", + "TEXT_CHARAT_FROM_END": "block text - Indicates that the letter (or number, punctuation character, etc.) with the specified index from the end of a given piece of text should be obtained. See [https://github.com/google/blockly/wiki/Text#extracting-a-single-character https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. [[File:Blockly-text-get.png]]", + "TEXT_CHARAT_FIRST": "block text - Indicates that the first letter of the following piece of text should be retrieved. See [https://github.com/google/blockly/wiki/Text#extracting-a-single-character https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. [[File:Blockly-text-get.png]]", + "TEXT_CHARAT_LAST": "block text - Indicates that the last letter (or number, punctuation mark, etc.) of the following piece of text should be retrieved. See [https://github.com/google/blockly/wiki/Text#extracting-a-single-character https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. [[File:Blockly-text-get.png]]", + "TEXT_CHARAT_RANDOM": "block text - Indicates that any letter (or number, punctuation mark, etc.) in the following piece of text should be randomly selected. See [https://github.com/google/blockly/wiki/Text#extracting-a-single-character https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. [[File:Blockly-text-get.png]]", + "TEXT_CHARAT_TAIL": "block text - Text that goes after the rightmost block/dropdown when getting a single letter from a piece of text, as in [https://blockly-demo.appspot.com/static/apps/code/index.html#3m23km these blocks] or shown below. For most languages, this will be blank. [[File:Blockly-text-get.png]]", + "TEXT_CHARAT_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Text#extracting-a-single-character https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. [[File:Blockly-text-get.png]]", + "TEXT_GET_SUBSTRING_TOOLTIP": "See [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text].", + "TEXT_GET_SUBSTRING_HELPURL": "{{Optional}} url - Information about extracting characters from text. Reminder: urls are the lowest priority translations. Feel free to skip.", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "block text - Precedes a piece of text from which a portion should be extracted. [[File:Blockly-get-substring.png]]", + "TEXT_GET_SUBSTRING_START_FROM_START": "dropdown - Indicates that the following number specifies the position (relative to the start position) of the beginning of the region of text that should be obtained from the preceding piece of text. See [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. [[File:Blockly-get-substring.png]]", + "TEXT_GET_SUBSTRING_START_FROM_END": "dropdown - Indicates that the following number specifies the position (relative to the end position) of the beginning of the region of text that should be obtained from the preceding piece of text. See [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. Note: If {{msg-blockly|ORDINAL_NUMBER_SUFFIX}} is defined, it will automatically appear ''after'' this and any other [https://translatewiki.net/wiki/Translating:Blockly#Ordinal_numbers ordinal numbers] on this block. [[File:Blockly-get-substring.png]]", + "TEXT_GET_SUBSTRING_START_FIRST": "block text - Indicates that a region starting with the first letter of the preceding piece of text should be extracted. See [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. [[File:Blockly-get-substring.png]]", + "TEXT_GET_SUBSTRING_END_FROM_START": "dropdown - Indicates that the following number specifies the position (relative to the start position) of the end of the region of text that should be obtained from the preceding piece of text. See [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. [[File:Blockly-get-substring.png]]", + "TEXT_GET_SUBSTRING_END_FROM_END": "dropdown - Indicates that the following number specifies the position (relative to the end position) of the end of the region of text that should be obtained from the preceding piece of text. See [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. [[File:Blockly-get-substring.png]]", + "TEXT_GET_SUBSTRING_END_LAST": "block text - Indicates that a region ending with the last letter of the preceding piece of text should be extracted. See [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. [[File:Blockly-get-substring.png]]", + "TEXT_GET_SUBSTRING_TAIL": "block text - Text that should go after the rightmost block/dropdown when [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text extracting a region of text]. In most languages, this will be the empty string. [[File:Blockly-get-substring.png]]", + "TEXT_CHANGECASE_HELPURL": "{{Optional}} url - Information about the case of letters (upper-case and lower-case).", + "TEXT_CHANGECASE_TOOLTIP": "tooltip - Describes a block to adjust the case of letters. For more information on this block, see [https://github.com/google/blockly/wiki/Text#adjusting-text-case https://github.com/google/blockly/wiki/Text#adjusting-text-case].", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "block text - Indicates that all of the letters in the following piece of text should be capitalized. If your language does not use case, you may indicate that this is not applicable to your language. For more information on this block, see [https://github.com/google/blockly/wiki/Text#adjusting-text-case https://github.com/google/blockly/wiki/Text#adjusting-text-case].", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "block text - Indicates that all of the letters in the following piece of text should be converted to lower-case. If your language does not use case, you may indicate that this is not applicable to your language. For more information on this block, see [https://github.com/google/blockly/wiki/Text#adjusting-text-case https://github.com/google/blockly/wiki/Text#adjusting-text-case].", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "block text - Indicates that the first letter of each of the following words should be capitalized and the rest converted to lower-case. If your language does not use case, you may indicate that this is not applicable to your language. For more information on this block, see [https://github.com/google/blockly/wiki/Text#adjusting-text-case https://github.com/google/blockly/wiki/Text#adjusting-text-case].", + "TEXT_TRIM_HELPURL": "{{Optional}} url - Information about trimming (removing) text off the beginning and ends of pieces of text.", + "TEXT_TRIM_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Text#trimming-removing-spaces https://github.com/google/blockly/wiki/Text#trimming-removing-spaces].", + "TEXT_TRIM_OPERATOR_BOTH": "dropdown - Removes spaces from the beginning and end of a piece of text. See [https://github.com/google/blockly/wiki/Text#trimming-removing-spaces https://github.com/google/blockly/wiki/Text#trimming-removing-spaces]. Note that neither this nor the other options modify the original piece of text (that follows); the block just returns a version of the text without the specified spaces.", + "TEXT_TRIM_OPERATOR_LEFT": "dropdown - Removes spaces from the beginning of a piece of text. See [https://github.com/google/blockly/wiki/Text#trimming-removing-spaces https://github.com/google/blockly/wiki/Text#trimming-removing-spaces]. Note that in right-to-left scripts, this will remove spaces from the right side.", + "TEXT_TRIM_OPERATOR_RIGHT": "dropdown - Removes spaces from the end of a piece of text. See [https://github.com/google/blockly/wiki/Text#trimming-removing-spaces https://github.com/google/blockly/wiki/Text#trimming-removing-spaces]. Note that in right-to-left scripts, this will remove spaces from the left side.", + "TEXT_PRINT_HELPURL": "{{Optional}} url - Information about displaying text on computers.", + "TEXT_PRINT_TITLE": "block text - Display the input on the screen. See [https://github.com/google/blockly/wiki/Text#printing-text https://github.com/google/blockly/wiki/Text#printing-text]. \n\nParameters:\n* %1 - the value to print", + "TEXT_PRINT_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Text#printing-text https://github.com/google/blockly/wiki/Text#printing-text].", + "TEXT_PROMPT_HELPURL": "{{Optional}} url - Information about getting text from users.", + "TEXT_PROMPT_TYPE_TEXT": "dropdown - Specifies that a piece of text should be requested from the user with the following message. See [https://github.com/google/blockly/wiki/Text#printing-text https://github.com/google/blockly/wiki/Text#printing-text].", + "TEXT_PROMPT_TYPE_NUMBER": "dropdown - Specifies that a number should be requested from the user with the following message. See [https://github.com/google/blockly/wiki/Text#printing-text https://github.com/google/blockly/wiki/Text#printing-text].", + "TEXT_PROMPT_TOOLTIP_NUMBER": "dropdown - Precedes the message with which the user should be prompted for a number. See [https://github.com/google/blockly/wiki/Text#printing-text https://github.com/google/blockly/wiki/Text#printing-text].", + "TEXT_PROMPT_TOOLTIP_TEXT": "dropdown - Precedes the message with which the user should be prompted for some text. See [https://github.com/google/blockly/wiki/Text#printing-text https://github.com/google/blockly/wiki/Text#printing-text].", + "TEXT_COUNT_MESSAGE0": "block text - Title of a block that counts the number of instances of a smaller pattern (%1) inside a longer string (%2).", + "TEXT_COUNT_HELPURL": "{{Optional}} url - Information about counting how many times a string appears in another string.", + "TEXT_COUNT_TOOLTIP": "tooltip - Short description of a block that counts how many times some text occurs within some other text.", + "TEXT_REPLACE_MESSAGE0": "block text - Title of a block that returns a copy of text (%3) with all instances of some smaller text (%1) replaced with other text (%2).", + "TEXT_REPLACE_HELPURL": "{{Optional}} url - Information about replacing each copy text (or string, in computer lingo) with other text.", + "TEXT_REPLACE_TOOLTIP": "tooltip - Short description of a block that replaces copies of text in a large text with other text.", + "TEXT_REVERSE_MESSAGE0": "block text - Title of block that returns a copy of text (%1) with the order of letters and characters reversed.", + "TEXT_REVERSE_HELPURL": "{{Optional}} url - Information about reversing a letters/characters in text.", + "TEXT_REVERSE_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Text].", + "LISTS_CREATE_EMPTY_HELPURL": "{{Optional}} url - Information on empty lists.", + "LISTS_CREATE_EMPTY_TITLE": "block text - See [https://github.com/google/blockly/wiki/Lists#create-empty-list https://github.com/google/blockly/wiki/Lists#create-empty-list].", + "LISTS_CREATE_EMPTY_TOOLTIP": "block text - See [https://github.com/google/blockly/wiki/Lists#create-empty-list https://github.com/google/blockly/wiki/Lists#create-empty-list].", + "LISTS_CREATE_WITH_HELPURL": "{{Optional}} url - Information on building lists.", + "LISTS_CREATE_WITH_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Lists#create-list-with https://github.com/google/blockly/wiki/Lists#create-list-with].", + "LISTS_CREATE_WITH_INPUT_WITH": "block text - See [https://github.com/google/blockly/wiki/Lists#create-list-with https://github.com/google/blockly/wiki/Lists#create-list-with].", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "block text - This appears in a sub-block when [https://github.com/google/blockly/wiki/Lists#changing-number-of-inputs changing the number of inputs in a ''''create list with'''' block].\n{{Identical|List}}", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Lists#changing-number-of-inputs https://github.com/google/blockly/wiki/Lists#changing-number-of-inputs].", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Lists#changing-number-of-inputs https://github.com/google/blockly/wiki/Lists#changing-number-of-inputs].", + "LISTS_REPEAT_HELPURL": "{{Optional}} url - Information about [https://github.com/google/blockly/wiki/Lists#create-list-with creating a list with multiple copies of a single item].", + "LISTS_REPEAT_TOOLTIP": "{{Optional}} url - See [https://github.com/google/blockly/wiki/Lists#create-list-with creating a list with multiple copies of a single item].", + "LISTS_REPEAT_TITLE": "block text - See [https://github.com/google/blockly/wiki/Lists#create-list-with https://github.com/google/blockly/wiki/Lists#create-list-with]. \n\nParameters:\n* %1 - the item (text) to be repeated\n* %2 - the number of times to repeat it", + "LISTS_LENGTH_HELPURL": "{{Optional}} url - Information about how the length of a list is computed (i.e., by the total number of elements, not the number of different elements).", + "LISTS_LENGTH_TITLE": "block text - See [https://github.com/google/blockly/wiki/Lists#length-of https://github.com/google/blockly/wiki/Lists#length-of]. \n\nParameters:\n* %1 - the list whose length is desired", + "LISTS_LENGTH_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Lists#length-of https://github.com/google/blockly/wiki/Lists#length-of Blockly:Lists:length of].", + "LISTS_ISEMPTY_HELPURL": "{{Optional}} url - See [https://github.com/google/blockly/wiki/Lists#is-empty https://github.com/google/blockly/wiki/Lists#is-empty].", + "LISTS_ISEMPTY_TITLE": "block text - See [https://github.com/google/blockly/wiki/Lists#is-empty https://github.com/google/blockly/wiki/Lists#is-empty]. \n\nParameters:\n* %1 - the list to test", + "LISTS_ISEMPTY_TOOLTIP": "block tooltip - See [https://github.com/google/blockly/wiki/Lists#is-empty https://github.com/google/blockly/wiki/Lists#is-empty].", + "LISTS_INLIST": "block text - Title of blocks operating on [https://github.com/google/blockly/wiki/Lists lists].", + "LISTS_INDEX_OF_HELPURL": "{{Optional}} url - See [https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list].", + "LISTS_INDEX_OF_FIRST": "dropdown - See [https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list Lists#finding-items-in-a-list]. [[File:Blockly-list-find.png]]", + "LISTS_INDEX_OF_LAST": "dropdown - See [https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list]. [[File:Blockly-list-find.png]]", + "LISTS_INDEX_OF_TOOLTIP": "tooltip - %1 will be replaced by either the number 0 or -1 depending on the indexing mode. See [https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list]. [[File:Blockly-list-find.png]]", + "LISTS_GET_INDEX_GET": "dropdown - Indicates that the user wishes to [https://github.com/google/blockly/wiki/Lists#getting-a-single-item get an item from a list] without removing it from the list.", + "LISTS_GET_INDEX_GET_REMOVE": "dropdown - Indicates that the user wishes to [https://github.com/google/blockly/wiki/Lists#getting-a-single-item get and remove an item from a list], as opposed to merely getting it without modifying the list.", + "LISTS_GET_INDEX_REMOVE": "dropdown - Indicates that the user wishes to [https://github.com/google/blockly/wiki/Lists#removing-an-item remove an item from a list].\n{{Identical|Remove}}", + "LISTS_GET_INDEX_FROM_START": "dropdown - Indicates that an index relative to the front of the list should be used to [https://github.com/google/blockly/wiki/Lists#getting-a-single-item get and/or remove an item from a list]. Note: If {{msg-blockly|ORDINAL_NUMBER_SUFFIX}} is defined, it will automatically appear ''after'' this number (and any other ordinal numbers on this block). See [[Translating:Blockly#Ordinal_numbers]] for more information on ordinal numbers in Blockly. [[File:Blockly-list-get-item.png]]", + "LISTS_GET_INDEX_FROM_END": "dropdown - Indicates that an index relative to the end of the list should be used to [https://github.com/google/blockly/wiki/Lists#getting-a-single-item access an item in a list]. [[File:Blockly-list-get-item.png]]", + "LISTS_GET_INDEX_FIRST": "dropdown - Indicates that the '''first''' item should be [https://github.com/google/blockly/wiki/Lists#getting-a-single-item accessed in a list]. [[File:Blockly-list-get-item.png]]", + "LISTS_GET_INDEX_LAST": "dropdown - Indicates that the '''last''' item should be [https://github.com/google/blockly/wiki/Lists#getting-a-single-item accessed in a list]. [[File:Blockly-list-get-item.png]]", + "LISTS_GET_INDEX_RANDOM": "dropdown - Indicates that a '''random''' item should be [https://github.com/google/blockly/wiki/Lists#getting-a-single-item accessed in a list]. [[File:Blockly-list-get-item.png]]", + "LISTS_GET_INDEX_TAIL": "block text - Text that should go after the rightmost block/dropdown when [https://github.com/google/blockly/wiki/Lists#getting-a-single-item accessing an item from a list]. In most languages, this will be the empty string. [[File:Blockly-list-get-item.png]]", + "LISTS_INDEX_FROM_START_TOOLTIP": "tooltip - Indicates the ordinal number that the first item in a list is referenced by. %1 will be replaced by either '#0' or '#1' depending on the indexing mode.", + "LISTS_INDEX_FROM_END_TOOLTIP": "tooltip - Indicates the ordinal number that the last item in a list is referenced by. %1 will be replaced by either '#0' or '#1' depending on the indexing mode.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for more information.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for more information.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for more information.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for more information.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for '#' or '# from end'.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'first'.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'last'.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'random'.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for '#' or '# from end'.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'first'.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'last'.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'random'.", + "LISTS_SET_INDEX_HELPURL": "{{Optional}} url - Information about putting items in lists.", + "LISTS_SET_INDEX_SET": "block text - [https://github.com/google/blockly/wiki/Lists#in-list--set Replaces an item in a list]. [[File:Blockly-in-list-set-insert.png]]", + "LISTS_SET_INDEX_INSERT": "block text - [https://github.com/google/blockly/wiki/Lists#in-list--insert-at Inserts an item into a list]. [[File:Blockly-in-list-set-insert.png]]", + "LISTS_SET_INDEX_INPUT_TO": "block text - The word(s) after the position in the list and before the item to be set/inserted. [[File:Blockly-in-list-set-insert.png]]", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the 'get' block, the idea is the same for the 'set' block).", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the 'get' block, the idea is the same for the 'set' block).", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the 'get' block, the idea is the same for the 'set' block).", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the 'get' block, the idea is the same for the 'set' block).", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the 'get' block, the idea is the same for the 'insert' block).", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the 'get' block, the idea is the same for the 'insert' block).", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the 'get' block, the idea is the same for the 'insert' block).", + "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the 'get' block, the idea is the same for the 'insert' block).", + "LISTS_GET_SUBLIST_HELPURL": "{{Optional}} url - Information describing extracting a sublist from an existing list.", + "LISTS_GET_SUBLIST_START_FROM_START": "dropdown - Indicates that an index relative to the front of the list should be used to specify the beginning of the range from which to [https://github.com/google/blockly/wiki/Lists#getting-a-sublist get a sublist]. [[File:Blockly-get-sublist.png]] Note: If {{msg-blockly|ORDINAL_NUMBER_SUFFIX}} is defined, it will automatically appear ''after'' this number (and any other ordinal numbers on this block). See [[Translating:Blockly#Ordinal_numbers]] for more information on ordinal numbers in Blockly.", + "LISTS_GET_SUBLIST_START_FROM_END": "dropdown - Indicates that an index relative to the end of the list should be used to specify the beginning of the range from which to [https://github.com/google/blockly/wiki/Lists#getting-a-sublist get a sublist].", + "LISTS_GET_SUBLIST_START_FIRST": "dropdown - Indicates that the [https://github.com/google/blockly/wiki/Lists#getting-a-sublist sublist to extract] should begin with the list's first item.", + "LISTS_GET_SUBLIST_END_FROM_START": "dropdown - Indicates that an index relative to the front of the list should be used to specify the end of the range from which to [https://github.com/google/blockly/wiki/Lists#getting-a-sublist get a sublist]. [[File:Blockly-get-sublist.png]]", + "LISTS_GET_SUBLIST_END_FROM_END": "dropdown - Indicates that an index relative to the end of the list should be used to specify the end of the range from which to [https://github.com/google/blockly/wiki/Lists#getting-a-sublist get a sublist]. [[File:Blockly-get-sublist.png]]", + "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": "{{Optional}} 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.\n{{Identical|Sort}}", + "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.\n{{Identical|Ascending}}", + "LISTS_SORT_ORDER_DESCENDING": "sorting order or direction from high to low value for numeric, or Z-A for alphabetic.\n{{Identical|Descending}}", + "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": "{{Optional}} 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').", + "LISTS_SPLIT_WITH_DELIMITER": "block text - Prompts for a letter to be used as a separator when splitting or joining text.", + "LISTS_SPLIT_TOOLTIP_SPLIT": "tooltip - See [https://github.com/google/blockly/wiki/Lists#make-list-from-text https://github.com/google/blockly/wiki/Lists#make-list-from-text] for more information.", + "LISTS_SPLIT_TOOLTIP_JOIN": "tooltip - See [https://github.com/google/blockly/wiki/Lists#make-text-from-list https://github.com/google/blockly/wiki/Lists#make-text-from-list] for more information.", + "LISTS_REVERSE_HELPURL": "{{Optional}} url - Information describing reversing a list.", + "LISTS_REVERSE_MESSAGE0": "block text - Title of block that returns a copy of a list (%1) with the order of items reversed.", + "LISTS_REVERSE_TOOLTIP": "tooltip - Short description for a block that reverses a copy of a list.", + "ORDINAL_NUMBER_SUFFIX": "grammar - Text that follows an ordinal number (a number that indicates position relative to other numbers). In most languages, such text appears before the number, so this should be blank. An exception is Hungarian. See [[Translating:Blockly#Ordinal_numbers]] for more information.", + "VARIABLES_GET_HELPURL": "{{Optional}} url - Information about ''variables'' in computer programming. Consider using your language's translation of [https://en.wikipedia.org/wiki/Variable_(computer_science) https://en.wikipedia.org/wiki/Variable_(computer_science)], if it exists.", + "VARIABLES_GET_TOOLTIP": "tooltip - This gets the value of the named variable without modifying it.", + "VARIABLES_GET_CREATE_SET": "context menu - Selecting this creates a block to set (change) the value of this variable. \n\nParameters:\n* %1 - the name of the variable.", + "VARIABLES_SET_HELPURL": "{{Optional}} url - Information about ''variables'' in computer programming. Consider using your language's translation of [https://en.wikipedia.org/wiki/Variable_(computer_science) https://en.wikipedia.org/wiki/Variable_(computer_science)], if it exists.", + "VARIABLES_SET": "block text - Change the value of a mathematical variable: '''set [the value of] x to 7'''.\n\nParameters:\n* %1 - the name of the variable.\n* %2 - the value to be assigned.", + "VARIABLES_SET_TOOLTIP": "tooltip - This initializes or changes the value of the named variable.", + "VARIABLES_SET_CREATE_GET": "context menu - Selecting this creates a block to get (change) the value of this variable.\n\nParameters:\n* %1 - the name of the variable.", + "PROCEDURES_DEFNORETURN_HELPURL": "{{Optional}} url - Information about defining [https://en.wikipedia.org/wiki/Subroutine functions] that do not have return values.", + "PROCEDURES_DEFNORETURN_TITLE": "block text - This precedes the name of the function when defining it. See [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#c84aoc this sample function definition].", + "PROCEDURES_DEFNORETURN_PROCEDURE": "default name - This acts as a placeholder for the name of a function on a function definition block, as shown on [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#w7cfju this block]. The user will replace it with the function's name.", + "PROCEDURES_BEFORE_PARAMS": "block text - This precedes the list of parameters on a function's definition block. See [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#voztpd this sample function with parameters].", + "PROCEDURES_CALL_BEFORE_PARAMS": "block text - This precedes the list of parameters on a function's caller block. See [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#voztpd this sample function with parameters].", + "PROCEDURES_DEFNORETURN_DO": "block text - This appears next to the function's 'body', the blocks that should be run when the function is called, as shown in [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#voztpd this sample function definition].", + "PROCEDURES_DEFNORETURN_TOOLTIP": "tooltip", + "PROCEDURES_DEFNORETURN_COMMENT": "Placeholder text that the user is encouraged to replace with a description of what their function does.", + "PROCEDURES_DEFRETURN_HELPURL": "{{Optional}} url - Information about defining [https://en.wikipedia.org/wiki/Subroutine functions] that have return values.", + "PROCEDURES_DEFRETURN_RETURN": "block text - This imperative or infinite verb precedes the value that is used as the return value (output) of this function. See [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#6ot5y5 this sample function that returns a value].", + "PROCEDURES_DEFRETURN_TOOLTIP": "tooltip", + "PROCEDURES_ALLOW_STATEMENTS": "Label for a checkbox that controls if statements are allowed in a function.", + "PROCEDURES_DEF_DUPLICATE_WARNING": "alert - The user has created a function with two parameters that have the same name. Every parameter must have a different name.", + "PROCEDURES_CALLNORETURN_HELPURL": "{{Optional}} url - Information about calling [https://en.wikipedia.org/wiki/Subroutine functions] that do not return values.", + "PROCEDURES_CALLNORETURN_TOOLTIP": "tooltip - This block causes the body (blocks inside) of the named function definition to be run.", + "PROCEDURES_CALLRETURN_HELPURL": "{{Optional}} url - Information about calling [https://en.wikipedia.org/wiki/Subroutine functions] that return values.", + "PROCEDURES_CALLRETURN_TOOLTIP": "tooltip - This block causes the body (blocks inside) of the named function definition to be run.\n\nParameters:\n* %1 - the name of the function.", + "PROCEDURES_MUTATORCONTAINER_TITLE": "block text - This text appears on a block in a window that appears when the user clicks on the plus sign or star on a function definition block. It refers to the set of parameters (referred to by the simpler term 'inputs') to the function. See [[Translating:Blockly#function_definitions]].\n{{Identical|Input}}", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "tooltip", + "PROCEDURES_MUTATORARG_TITLE": "block text - This text appears on a block in a window that appears when the user clicks on the plus sign or star on a function definition block]. It appears on the block for adding an individual parameter (referred to by the simpler term 'inputs') to the function. See [[Translating:Blockly#function_definitions]].", + "PROCEDURES_MUTATORARG_TOOLTIP": "tooltip", + "PROCEDURES_HIGHLIGHT_DEF": "context menu - This appears on the context menu for function calls. Selecting it causes the corresponding function definition to be highlighted (as shown at [[Translating:Blockly#context_menus]].", + "PROCEDURES_CREATE_DO": "context menu - This appears on the context menu for function definitions. Selecting it creates a block to call the function.\n\nParameters:\n* %1 - the name of the function.\n{{Identical|Create}}", + "PROCEDURES_IFRETURN_TOOLTIP": "tooltip - If the first value is true, this causes the second value to be returned immediately from the enclosing function.", + "PROCEDURES_IFRETURN_HELPURL": "{{Optional}} url - Information about guard clauses.", + "PROCEDURES_IFRETURN_WARNING": "warning - This appears if the user tries to use this block outside of a function definition.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "comment text - This text appears in a new workspace comment, to hint that the user can type here.", + "WORKSPACE_ARIA_LABEL": "workspace - This text is read out when a user navigates to the workspace while using a screen reader.", + "COLLAPSED_WARNINGS_WARNING": "warning - This appears if the user collapses a block, and blocks inside that block have warnings attached to them. It should inform the user that the block they collapsed contains blocks that have warnings." +} diff --git a/js/msg/json/ro.json b/js/msg/json/ro.json new file mode 100644 index 0000000..df3ead9 --- /dev/null +++ b/js/msg/json/ro.json @@ -0,0 +1,368 @@ +{ + "@metadata": { + "authors": [ + "Minisarm", + "Ely en", + "Hugbear", + "아라", + "Ykhwong", + "Wintereu", + "MSClaudiu" + ] + }, + "VARIABLES_DEFAULT_NAME": "element", + "TODAY": "Astăzi", + "DUPLICATE_BLOCK": "Duplicate", + "ADD_COMMENT": "Adaugă un comentariu", + "REMOVE_COMMENT": "Elimină comentariu", + "DUPLICATE_COMMENT": "Coment duplicat", + "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?", + "CLEAN_UP": "Curăță blocări", + "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", + "UNDO": "Anulează", + "REDO": "Refă", + "CHANGE_VALUE_TITLE": "Schimbaţi valoarea:", + "RENAME_VARIABLE": "Redenumirea variabilei...", + "RENAME_VARIABLE_TITLE": "Redenumeşte toate variabilele '%1' în:", + "NEW_VARIABLE": "Crează variabilă", + "NEW_STRING_VARIABLE": "Crează o variabilă string", + "NEW_NUMBER_VARIABLE": "Crează o variabilă număr", + "NEW_COLOUR_VARIABLE": "Crează o variabilă culoare", + "NEW_VARIABLE_TYPE_TITLE": "Tip nou de variabilă", + "NEW_VARIABLE_TITLE": "Noul nume de variabilă:", + "VARIABLE_ALREADY_EXISTS": "O variabilă cu numele '%1' există deja.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "o variabilă numită '%1' există deja pentru alt tip: '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Șterge %1 utilizările variabilei '%2'?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Nu se poate șterge variabila '%1' deoarece face parte din definiția funcției '%2'", + "DELETE_VARIABLE": "Ștergeți variabila '%1'", + "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.", + "IOS_OK": "OK", + "IOS_CANCEL": "Anulare", + "IOS_ERROR": "Eroare", + "IOS_PROCEDURES_INPUTS": "INTRĂRI", + "IOS_PROCEDURES_ADD_INPUT": "+ Adăugați intrare", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Permite declarațiile", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Această funcție are intrări duplicate.", + "IOS_VARIABLES_ADD_VARIABLE": "+Adăugați variabilă", + "IOS_VARIABLES_ADD_BUTTON": "Adaugă", + "IOS_VARIABLES_RENAME_BUTTON": "Redenumire", + "IOS_VARIABLES_DELETE_BUTTON": "Ştergeți", + "IOS_VARIABLES_VARIABLE_NAME": "Numele variabilei", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Nu puteți utiliza un nume de variabilă gol.", + "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://ro.wikipedia.org/wiki/Funcții_trigonometrice", + "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).", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 of X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "Întoarceți arctangentul punctului (X, Y) în grade de la -180 la 180.", + "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_TITLE": "la %1 Adăugaţi text %2", + "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ă %1 dacă textul nu este găsit.", + "TEXT_INDEXOF_TITLE": "în text %1 %2 %3", + "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_TITLE": "în text %1 %2", + "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.", + "TEXT_COUNT_MESSAGE0": "numără %1 in %2", + "TEXT_COUNT_TOOLTIP": "Aflați de câte ori apare un text într-un alt text.", + "TEXT_REPLACE_MESSAGE0": "înlocuiți %1 cu %2 în %3", + "TEXT_REPLACE_TOOLTIP": "Înlocuiți toate aparițiile anumitor texte într-un alt text.", + "TEXT_REVERSE_MESSAGE0": "inversă %1", + "TEXT_REVERSE_TOOLTIP": "Inversează ordinea caracterelor din 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": "Returnează indexul primei/ultimei apariții a articolului din listă. Returnează %1 dacă elementul nu este găsit.", + "LISTS_GET_INDEX_GET": "obţine", + "LISTS_GET_INDEX_GET_REMOVE": "obţine şi elimină", + "LISTS_GET_INDEX_REMOVE": "elimină", + "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_INDEX_FROM_START_TOOLTIP": "%1 este primul element.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 este ultimul element.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Returneaza elementul la poziţia specificată într-o listă.", + "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": "Elimină şi returneaza elementul la poziţia specificată într-o listă.", + "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": "Elimină elementul la poziţia specificată într-o listă.", + "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": "Setează elementul la poziţia specificată într-o listă.", + "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": "Inserează elementul la poziţia specificată într-o listă.", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "sortați %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Sortați o copie a unei liste.", + "LISTS_SORT_ORDER_ASCENDING": "crescător", + "LISTS_SORT_ORDER_DESCENDING": "descrescător", + "LISTS_SORT_TYPE_NUMERIC": "numeric", + "LISTS_SORT_TYPE_TEXT": "alfabetic", + "LISTS_SORT_TYPE_IGNORECASE": "alfabetic, ignorați cazul", + "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", + "LISTS_REVERSE_MESSAGE0": "inversă %1", + "LISTS_REVERSE_TOOLTIP": "Inversați copia unei liste.", + "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_DEFNORETURN_COMMENT": "Descrieți această funcție ...", + "PROCEDURES_DEFRETURN_HELPURL": "https://ro.wikipedia.org/wiki/Subrutină", + "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/Subroutine", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Executați funcția '%1 'definită de utilizator.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "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.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Spune ceva...", + "COLLAPSED_WARNINGS_WARNING": "Blocurile blocate conțin avertismente." +} diff --git a/js/msg/json/ru.json b/js/msg/json/ru.json new file mode 100644 index 0000000..ef98c70 --- /dev/null +++ b/js/msg/json/ru.json @@ -0,0 +1,366 @@ +{ + "@metadata": { + "authors": [ + "Espertus", + "MS", + "Okras", + "RedFox", + "Mailman", + "Silovan", + "Redredsonia", + "Facenapalm", + "Helpau", + "SimondR", + "Mouse21", + "Movses", + "Vlad5250" + ] + }, + "VARIABLES_DEFAULT_NAME": "элемент", + "UNNAMED_KEY": "без названия", + "TODAY": "Сегодня", + "DUPLICATE_BLOCK": "Дублировать", + "ADD_COMMENT": "Добавить комментарий", + "REMOVE_COMMENT": "Удалить комментарий", + "DUPLICATE_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": "Справка", + "UNDO": "Отменить", + "REDO": "Повторить", + "CHANGE_VALUE_TITLE": "Измените значение:", + "RENAME_VARIABLE": "Переименовать переменную…", + "RENAME_VARIABLE_TITLE": "Переименовать все переменные '%1' в:", + "NEW_VARIABLE": "Создать переменную…", + "NEW_STRING_VARIABLE": "Создать строковую переменную...", + "NEW_NUMBER_VARIABLE": "Создать числовую переменную...", + "NEW_COLOUR_VARIABLE": "Создать переменную цвета...", + "NEW_VARIABLE_TYPE_TITLE": "Новый тип переменной:", + "NEW_VARIABLE_TITLE": "Имя новой переменной:", + "VARIABLE_ALREADY_EXISTS": "Переменная с именем '%1' уже существует.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Название переменной '%1' уже используется другой типа: '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Удалить %1 использований переменной '%2'?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Невозможно удалить переменную '%1', поскольку она является частью определения функции '%2'", + "DELETE_VARIABLE": "Удалить переменную '%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": "Добавить заключительный подблок для случая, когда все условия ложны.", + "IOS_OK": "ОК", + "IOS_CANCEL": "Отмена", + "IOS_ERROR": "Ошибка", + "IOS_PROCEDURES_INPUTS": "ВХОД", + "IOS_PROCEDURES_ADD_INPUT": "+ Добавить входную переменную", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Разрешить операторы", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "У этой функции есть дублирующиеся входные переменные.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Добавить переменную", + "IOS_VARIABLES_ADD_BUTTON": "Добавить", + "IOS_VARIABLES_RENAME_BUTTON": "Переименовать", + "IOS_VARIABLES_DELETE_BUTTON": "Удалить", + "IOS_VARIABLES_VARIABLE_NAME": "Имя переменной", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Вы не можете использовать пустое имя переменной.", + "LOGIC_COMPARE_HELPURL": "https://ru.wikipedia.org/wiki/Неравенство", + "LOGIC_COMPARE_TOOLTIP_EQ": "Возвращает положительное значение, если вводы равны.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Возвращает положительное значение, если вводы не равны.", + "LOGIC_COMPARE_TOOLTIP_LT": "Возвращает положительное значение, если первый ввод меньше второго.", + "LOGIC_COMPARE_TOOLTIP_LTE": "Возвращает значение истина, если первая вставка меньше или равна второй.", + "LOGIC_COMPARE_TOOLTIP_GT": "Возвращает значение истина, если первая вставка больше второй.", + "LOGIC_COMPARE_TOOLTIP_GTE": "Возвращает значение истина, если первая вставка больше или равна второй.", + "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.", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 от X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "Возвращает арктангенс точки (X, Y) в градусах от -180 до 180.", + "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_TITLE": "к %1 добавить текст %2", + "TEXT_APPEND_TOOLTIP": "Добавить текст к переменной «%1».", + "TEXT_LENGTH_TITLE": "длина %1", + "TEXT_LENGTH_TOOLTIP": "Возвращает число символов (включая пробелы) в заданном тексте.", + "TEXT_ISEMPTY_TITLE": "%1 пуст", + "TEXT_ISEMPTY_TOOLTIP": "Возвращает значение истина, если предоставленный текст пуст.", + "TEXT_INDEXOF_TOOLTIP": "Возвращает номер позиции первого/последнего вхождения первого текста во втором. Возвращает %1, если текст не найден.", + "TEXT_INDEXOF_TITLE": "в тексте %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "найти первое вхождение текста", + "TEXT_INDEXOF_OPERATOR_LAST": "найти последнее вхождение текста", + "TEXT_CHARAT_TITLE": "в тексте %1 %2", + "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": "Запросить у пользователя текст.", + "TEXT_COUNT_MESSAGE0": "подсчитать количество %1 в %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Подсчитать, сколько раз отрывок текста появляется в другом тексте.", + "TEXT_REPLACE_MESSAGE0": "заменить %1 на %2 в %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "Заменить все вхождения некоторого текста другим текстом.", + "TEXT_REVERSE_MESSAGE0": "изменить порядок на обратный %1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "Меняет порядок символов в тексте на обратный.", + "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": "Возвращает номер позиции первого/последнего вхождения элемента в списке. Возвращает %1, если элемент не найден.", + "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_INDEX_FROM_START_TOOLTIP": "%1 - первый элемент.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 - последний элемент.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Возвращает элемент в указанной позиции списка.", + "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": "Удаляет и возвращает элемент в указанной позиции списка.", + "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": "Удаляет элемент в указанной позиции списка.", + "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": "Присваивает значение элементу в указанной позиции списка.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Присваивает значение первому элементу списка.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Присваивает значение последнему элементу списка.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Присваивает значение случайному элементу списка.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Вставляет элемент в указанной позиции списка.", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "сортировать %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Сортировать копию списка.", + "LISTS_SORT_ORDER_ASCENDING": "по возрастанию", + "LISTS_SORT_ORDER_DESCENDING": "по убыванию", + "LISTS_SORT_TYPE_NUMERIC": "числовая", + "LISTS_SORT_TYPE_TEXT": "по алфавиту", + "LISTS_SORT_TYPE_IGNORECASE": "по алфавиту, без учёта регистра", + "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": "Соединяет список текстов в один текст с разделителями.", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "изменить порядок на обратный %1", + "LISTS_REVERSE_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_DEFNORETURN_COMMENT": "Опишите эту функцию…", + "PROCEDURES_DEFRETURN_RETURN": "вернуть", + "PROCEDURES_DEFRETURN_TOOLTIP": "Создаёт процедуру, возвращающую значение.", + "PROCEDURES_ALLOW_STATEMENTS": "разрешить операторы", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Предупреждение: эта функция имеет повторяющиеся параметры.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://ru.wikipedia.org/wiki/Подпрограмма", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Исполняет определённую пользователем процедуру '%1'.", + "PROCEDURES_CALLRETURN_HELPURL": "https://ru.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_HELPURL": "http://c2.com/cgi/wiki?GuardClause", + "PROCEDURES_IFRETURN_WARNING": "Предупреждение: Этот блок может использоваться только внутри определения функции.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Напишите здесь что-нибудь...", + "WORKSPACE_ARIA_LABEL": "Рабочая область Blockly", + "COLLAPSED_WARNINGS_WARNING": "Свёрнутые блоки содержат предупреждения." +} diff --git a/js/msg/json/sc.json b/js/msg/json/sc.json new file mode 100644 index 0000000..282d529 --- /dev/null +++ b/js/msg/json/sc.json @@ -0,0 +1,297 @@ +{ + "@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", + "CHANGE_VALUE_TITLE": "Muda valori:", + "RENAME_VARIABLE": "Muda nòmini a variabili...", + "RENAME_VARIABLE_TITLE": "A is variabilis '%1' muda nòmini a:", + "NEW_VARIABLE": "Variabili noa...", + "NEW_VARIABLE_TITLE": "Nòmini de sa variabili noa:", + "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_TITLE": "a %1 acciungi su testu %2", + "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 %1 si su testu no ddu agatat.", + "TEXT_INDEXOF_TITLE": "in su testu %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "circa prima ocasioni de su testu", + "TEXT_INDEXOF_OPERATOR_LAST": "circa urtima ocasioni de 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 %1 si s'item non s'agatat.", + "LISTS_GET_INDEX_GET": "piga", + "LISTS_GET_INDEX_GET_REMOVE": "piga e fùlia", + "LISTS_GET_INDEX_REMOVE": "fùlia", + "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_INDEX_FROM_START_TOOLTIP": "%1 est po su primu elementu.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 est po s'urtimu elementu.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Torrat s'elementu de su postu inditau de una lista.", + "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": "Fùliat e torrat s'elementu de su postu inditau de una lista.", + "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": "Fùliat s'elementu de su postu inditau de una lista.", + "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": "Impostat s'elementu in su postu inditau de una lista.", + "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": "Insertat s'elementu in su postu inditau in una lista.", + "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/js/msg/json/sd.json b/js/msg/json/sd.json new file mode 100644 index 0000000..1ea4235 --- /dev/null +++ b/js/msg/json/sd.json @@ -0,0 +1,158 @@ +{ + "@metadata": { + "authors": [ + "Aursani", + "Mehtab ahmed", + "Indus Asia", + "Tweety" + ] + }, + "VARIABLES_DEFAULT_NAME": "اسم", + "TODAY": "اڄ", + "DUPLICATE_BLOCK": "نقل", + "ADD_COMMENT": "رايو ڏيو", + "REMOVE_COMMENT": "رايو ڊاهيو", + "DUPLICATE_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": "مدد", + "UNDO": "ڊاهيو", + "REDO": "ٻيهر ڪريو", + "CHANGE_VALUE_TITLE": "قدر بدلايو", + "RENAME_VARIABLE": "ڦرڻي کي نئون نالو ڏيو...", + "NEW_VARIABLE": "نئون ڦرڻو...", + "NEW_VARIABLE_TITLE": "ڦرڻي جو نئون نالو:", + "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_WHILEUNTIL_OPERATOR_WHILE": "ورجايو جڏهن", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "ورجايو جيستائين", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "چڪر مان ٻاهر نڪرو", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "چڪر جاري رکندي نئين ڦيري پايو", + "CONTROLS_IF_MSG_IF": "جيڪڏهن", + "CONTROLS_IF_MSG_ELSEIF": "نہ تہ جي", + "CONTROLS_IF_MSG_ELSE": "نہ تہ", + "IOS_OK": "ٺيڪ (او ڪي) آهي", + "IOS_CANCEL": "رد", + "IOS_ERROR": "چُڪَ", + "IOS_PROCEDURES_INPUTS": "داخلائون (اِن پٽس)", + "IOS_VARIABLES_ADD_VARIABLE": "تبديل ٿيندڙ (ويريئيبل) وجهو", + "IOS_VARIABLES_ADD_BUTTON": "شامل ڪيو", + "IOS_VARIABLES_RENAME_BUTTON": "ٻيهر نالو ڏيو", + "IOS_VARIABLES_DELETE_BUTTON": "ڊاهيو", + "IOS_VARIABLES_VARIABLE_NAME": "تبيديل ٿيندڙ (ويريئيبل) جو نالو", + "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_TERNARY_CONDITION": "پرک (ٽيسٽ)", + "LOGIC_TERNARY_IF_TRUE": "جيڪڏهن سچو", + "LOGIC_TERNARY_IF_FALSE": "جيڪڏهن ڪوڙو", + "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/ٻيون مول", + "MATH_SINGLE_OP_ROOT": "ٻيون مول", + "MATH_SINGLE_TOOLTIP_ROOT": "ڪنهن انگ جو ٻيون مول ڄاڻايو.", + "MATH_SINGLE_OP_ABSOLUTE": "ٺپ", + "MATH_SINGLE_TOOLTIP_NEG": "ڪنهن انگ جو ڪاٽو ڄاڻايو.", + "MATH_SINGLE_TOOLTIP_LN": "ڪنهن انگ جو قدرتي لاگ ڄاڻايو.", + "MATH_SINGLE_TOOLTIP_LOG10": "ڪنهن انگ جو 10 بنيادي لاگ ڄاڻايو.", + "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/ٽڪنڊور ڪاڄ", + "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/رياضياتي استقلال", + "MATH_IS_EVEN": "ٻڌي آهي", + "MATH_IS_ODD": "اِڪي آهي", + "MATH_IS_PRIME": "مفرد آهي", + "MATH_IS_WHOLE": "سڄو آهي", + "MATH_IS_POSITIVE": "واڌو آهي", + "MATH_IS_NEGATIVE": "ڪاٽو آهي", + "MATH_IS_DIVISIBLE_BY": "سان ونڊجندڙ آهي", + "MATH_CHANGE_TITLE": "%1 کي %2 سان مَٽايو", + "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": "بي ترتيب جذن جي فهرست (رينڊم آئيٽم آف لسٽ)", + "TEXT_JOIN_TITLE_CREATEWITH": "سان مواد تخليق ڪيو (ڪريئيٽ ٽيڪسٽ وِد)", + "TEXT_CREATE_JOIN_TITLE_JOIN": "شامل ٿيو", + "TEXT_INDEXOF_TITLE": "۾ متن %1 %2 %3", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "متن ۾", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "وڏن اکرن ڏانهن", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "ننڍن اکر ڏانهن", + "TEXT_PRINT_TITLE": "ڇاپيو %1", + "TEXT_PRINT_TOOLTIP": "ڄاڻايل تحرير، انگ يا ڪو ٻيو قدر ڇاپيو.", + "TEXT_COUNT_MESSAGE0": "ڳڻيو %1 ۾ %2", + "LISTS_CREATE_EMPTY_TITLE": "خالي فهرست تخليق ڪريو", + "LISTS_CREATE_WITH_INPUT_WITH": "سان فهرست تخليق ڪيو", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "لسٽ", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "فهرست ۾ ڪا شي شامل ڪريو.", + "LISTS_ISEMPTY_TITLE": "%1 خالي آهي", + "LISTS_INLIST": "فهرست ۾", + "LISTS_GET_INDEX_REMOVE": "هٽايو", + "LISTS_GET_INDEX_FROM_END": "# آخر کان", + "LISTS_GET_INDEX_FIRST": "پهريون", + "LISTS_GET_INDEX_LAST": "آخري", + "LISTS_GET_INDEX_RANDOM": "بي ترتيب", + "LISTS_SET_INDEX_SET": "ميڙ", + "LISTS_SET_INDEX_INSERT": "تي داخل ڪريو", + "LISTS_SET_INDEX_INPUT_TO": "جيان", + "LISTS_GET_SUBLIST_END_FROM_START": "ڏانهن #", + "LISTS_GET_SUBLIST_END_FROM_END": "ڏانهن # آخر کان", + "LISTS_GET_SUBLIST_END_LAST": "آخري ڏانهن", + "LISTS_SORT_TITLE": "ترتيب ڏيو %1 %2 %3", + "LISTS_SORT_ORDER_ASCENDING": "اُڀو (اَسينڊنگ)", + "LISTS_SORT_TYPE_TEXT": "الف ب وار (الفابيٽڪ)", + "PROCEDURES_DEFNORETURN_TITLE": "ڏانهن", + "PROCEDURES_DEFNORETURN_PROCEDURE": "ڪجھ ڪريو", + "PROCEDURES_BEFORE_PARAMS": "سان:", + "PROCEDURES_CALL_BEFORE_PARAMS": "سان:", + "PROCEDURES_DEFRETURN_RETURN": "واپس ورو", + "PROCEDURES_MUTATORCONTAINER_TITLE": "ان پُٽس", + "PROCEDURES_CREATE_DO": "تخليق ڪريو '%1'" +} diff --git a/js/msg/json/shn.json b/js/msg/json/shn.json new file mode 100644 index 0000000..6c211e4 --- /dev/null +++ b/js/msg/json/shn.json @@ -0,0 +1,109 @@ +{ + "@metadata": { + "authors": [ + "Saosukham", + "Saimawnkham" + ] + }, + "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": "ၸွႆႈထႅမ်", + "CHANGE_VALUE_TITLE": "လႅၵ်ႈလၢႆႈၼမ်ႉၵတ်ႉ", + "RENAME_VARIABLE": "လိုမ်ႉၶိုၼ်း ဢၼ်လၢႆႈမႂ်ႇ", + "RENAME_VARIABLE_TITLE": "လိုမ်ႉၶိုၼ်း ဢၼ်လၢႆႈမႂ်ႇၸိူဝ်းၼၼ်ႉ '%1' ထိုင်", + "NEW_VARIABLE": "ၵေႃႇသၢင်ႈ တူဝ်ၼိုင်...", + "NEW_VARIABLE_TITLE": "ၸိုဝ်ႈဢၼ်လၢႆႈမႂ်ႇ", + "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/js/msg/json/sk.json b/js/msg/json/sk.json new file mode 100644 index 0000000..3d1f8b4 --- /dev/null +++ b/js/msg/json/sk.json @@ -0,0 +1,357 @@ +{ + "@metadata": { + "authors": [ + "Jaroslav.micek", + "Marian.stano", + "Mark", + "Kusavica", + "Genhis", + "Lexected", + "Adams", + "TomášPolonec", + "Pmikolas44", + "Nykta 1917" + ] + }, + "VARIABLES_DEFAULT_NAME": "prvok", + "UNNAMED_KEY": "nepomenované", + "TODAY": "Dnes", + "DUPLICATE_BLOCK": "Duplikovať", + "ADD_COMMENT": "Pridať komentár", + "REMOVE_COMMENT": "Odstrániť komentár", + "DUPLICATE_COMMENT": "Duplicitný 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?", + "CLEAN_UP": "Narovnať bloky", + "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", + "UNDO": "Späť", + "REDO": "Znova", + "CHANGE_VALUE_TITLE": "Zmeniť hodnotu:", + "RENAME_VARIABLE": "Premenovať premennú...", + "RENAME_VARIABLE_TITLE": "Premenovať všetky premenné '%1' na:", + "NEW_VARIABLE": "Vytvoriť premennú...", + "NEW_STRING_VARIABLE": "Vytvoriť reťazovú premennú...", + "NEW_NUMBER_VARIABLE": "Vytvoriť číselnú premennú...", + "NEW_COLOUR_VARIABLE": "vytvoriť farbu premennej", + "NEW_VARIABLE_TYPE_TITLE": "nový typ premennej", + "NEW_VARIABLE_TITLE": "Názov novej premennej:", + "VARIABLE_ALREADY_EXISTS": "Premenná s názvom %1 už existuje.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Premenná s názvom '%1' už existuje pre inú premennú typu '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Odstrániť %1 použití premennej '%2'?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Nie je možné zmazať premennú „%1“, pretože je súčasťou definície funkcie „%2“", + "DELETE_VARIABLE": "Odstrániť premennú '%1'", + "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.", + "IOS_OK": "OK", + "IOS_CANCEL": "Zrušiť", + "IOS_ERROR": "Chyba", + "IOS_PROCEDURES_INPUTS": "Vstupy", + "IOS_PROCEDURES_ADD_INPUT": "+ Pridať vstup", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Povoľujú príkazy", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Táto funkcia obsahuje duplikáty vstupov.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Pridať premennú", + "IOS_VARIABLES_ADD_BUTTON": "Pridať", + "IOS_VARIABLES_RENAME_BUTTON": "Premenovať", + "IOS_VARIABLES_DELETE_BUTTON": "Zmazať", + "IOS_VARIABLES_VARIABLE_NAME": "Názov premennej", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Nie je možné použiť premennú bez mena.", + "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_TRIG_ASIN": "arcsin", + "MATH_TRIG_ACOS": "arccos", + "MATH_TRIG_ATAN": "arctan", + "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.", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 of X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "Vráťte arktangent bodu (X, Y) v stupňoch od -180 do 180.", + "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_TITLE": "do %1 pridaj text %2", + "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 %1.", + "TEXT_INDEXOF_TITLE": "v texte %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "nájdi prvý výskyt textu", + "TEXT_INDEXOF_OPERATOR_LAST": "nájdi posledný výskyt textu", + "TEXT_CHARAT_TITLE": "v texte %1 %2", + "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.", + "TEXT_COUNT_MESSAGE0": "počet výskytov %1 v %2", + "TEXT_COUNT_TOOLTIP": "Počet výskytov textu nachádzajúcom sa v inom texte.", + "TEXT_REPLACE_MESSAGE0": "zameniť %1 za %2 v reťazci %3", + "TEXT_REPLACE_TOOLTIP": "Zameniť všetky výskyty textu za iný text.", + "TEXT_REVERSE_MESSAGE0": "text odzadu %1", + "TEXT_REVERSE_TOOLTIP": "Obrátiť poradie písmen v texte.", + "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 sa nič nenašlo, vráti %1.", + "LISTS_GET_INDEX_GET": "zisti", + "LISTS_GET_INDEX_GET_REMOVE": "zisti a odstráň", + "LISTS_GET_INDEX_REMOVE": "odstráň", + "LISTS_GET_INDEX_FROM_END": "# od konca", + "LISTS_GET_INDEX_FIRST": "prvý", + "LISTS_GET_INDEX_LAST": "posledný", + "LISTS_GET_INDEX_RANDOM": "náhodný", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 je počiatočný prvok.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 je posledný prvok.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Vráti prvok na určenej pozícii v zozname.", + "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": "Odstráni a vráti prvok z určenej pozície v zozname.", + "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": "Odstráni prvok na určenej pozícii v zozname.", + "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": "Nastaví prvok na určenej pozícii v zozname.", + "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": "Vsunie prvok na určenú pozíciu v zozname.", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "zoradiť %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Zoradiť kópiu zoznamu.", + "LISTS_SORT_ORDER_ASCENDING": "Vzostupne", + "LISTS_SORT_ORDER_DESCENDING": "Zostupne", + "LISTS_SORT_TYPE_NUMERIC": "numericky", + "LISTS_SORT_TYPE_TEXT": "abecedne", + "LISTS_SORT_TYPE_IGNORECASE": "abecedne, ignorovať veľkosť písmen", + "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.", + "LISTS_REVERSE_MESSAGE0": "obrátiť %1", + "LISTS_REVERSE_TOOLTIP": "Obrátiť kópiu zoznamu.", + "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_DEFNORETURN_COMMENT": "Doplň, čo robí táto funkcia...", + "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://sk.wikipedia.org/wiki/Podprogram", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Spustí používateľom definovanú funkciu '%1'.", + "PROCEDURES_CALLRETURN_HELPURL": "https://sk.wikipedia.org/wiki/Podprogram", + "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.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Povedz niečo...", + "WORKSPACE_ARIA_LABEL": "Pracovisko Bloskly" +} diff --git a/js/msg/json/skr-arab.json b/js/msg/json/skr-arab.json new file mode 100644 index 0000000..b1b0c3f --- /dev/null +++ b/js/msg/json/skr-arab.json @@ -0,0 +1,112 @@ +{ + "@metadata": { + "authors": [ + "Saraiki" + ] + }, + "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": "مدد", + "UNDO": "واپس", + "REDO": "ولدا کرو", + "CHANGE_VALUE_TITLE": "ویلیو تبدیل کرو:", + "RENAME_VARIABLE": "متغیر دا ولدا ناں رکھو۔۔۔", + "NEW_VARIABLE": "متغیر بݨاؤ۔۔۔", + "NEW_VARIABLE_TITLE": "نواں متغیر ناں:", + "VARIABLE_ALREADY_EXISTS": "'%1' نامی متغیر پہلے موجود ہے۔", + "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", + "COLOUR_RANDOM_TITLE": "بنا ترتيب رنگ", + "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": "نسبت", + "CONTROLS_REPEAT_INPUT_DO": "کرو", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "تائیں دہرائے", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "گھیرے کنوں ٻاہر نکلݨ", + "CONTROLS_IF_MSG_IF": "جے", + "CONTROLS_IF_MSG_ELSEIF": "ٻیا اگر", + "CONTROLS_IF_MSG_ELSE": "وکھرا", + "IOS_OK": "ٹھیک ہے", + "IOS_CANCEL": "منسوخ", + "IOS_ERROR": "نقص", + "IOS_PROCEDURES_INPUTS": "ان پٹ", + "IOS_VARIABLES_ADD_VARIABLE": "+ متغیر شامل کرو", + "IOS_VARIABLES_ADD_BUTTON": "شامل کرو", + "IOS_VARIABLES_RENAME_BUTTON": "نواں ناں لکھو", + "IOS_VARIABLES_DELETE_BUTTON": "مٹاؤ", + "IOS_VARIABLES_VARIABLE_NAME": "متغیر ناں", + "LOGIC_OPERATION_AND": "اتے", + "LOGIC_OPERATION_OR": "یا", + "LOGIC_NEGATE_TITLE": "%1 کائنی", + "LOGIC_BOOLEAN_TRUE": "سچ", + "LOGIC_BOOLEAN_FALSE": "غلط", + "LOGIC_NULL": "کوئی وی کائنی", + "LOGIC_TERNARY_CONDITION": "ٹیسٹ", + "LOGIC_TERNARY_IF_TRUE": "اگر سچ ہے", + "LOGIC_TERNARY_IF_FALSE": "اگر کوڑ ہے", + "MATH_NUMBER_TOOLTIP": "ہک عدد", + "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", + "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_ONLIST_OPERATOR_SUM": "لسٹ دا مجموعہ", + "MATH_ONLIST_OPERATOR_MIN": "لسٹ وچوں سب توں گھٹ", + "MATH_ONLIST_OPERATOR_MAX": "لسٹ وچوں سب توں ودھ", + "MATH_ONLIST_OPERATOR_AVERAGE": "فہرست دی اوسط", + "TEXT_CREATE_JOIN_TITLE_JOIN": "شامل تھیوو", + "TEXT_LENGTH_TITLE": "%1 دی لمباݨ", + "TEXT_ISEMPTY_TITLE": "%1 خالی ہے", + "TEXT_CHARAT_FROM_START": "# حرف گھنو", + "TEXT_CHARAT_FIRST": "پہلا حرف گھنو", + "TEXT_CHARAT_LAST": "چھیکڑی حرف گھنو", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "ٹیکسٹ وچ", + "TEXT_PRINT_TITLE": "%1 چھاپو", + "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_SET": "سیٹ", + "LISTS_SET_INDEX_INSERT": "تے درج کرو", + "LISTS_SET_INDEX_INPUT_TO": "بطور", + "LISTS_SORT_TITLE": "سارٹ کرو%1%2%3", + "LISTS_SORT_ORDER_ASCENDING": "چڑھدا ہویا", + "LISTS_SORT_ORDER_DESCENDING": "لہندا ہویا", + "LISTS_SORT_TYPE_NUMERIC": "عددی", + "LISTS_SORT_TYPE_TEXT": "الف بے دی", + "PROCEDURES_DEFNORETURN_TITLE": "کوں", + "PROCEDURES_BEFORE_PARAMS": "نال:", + "PROCEDURES_CALL_BEFORE_PARAMS": "نال:", + "PROCEDURES_DEFRETURN_RETURN": "واپس آ ونڄو", + "PROCEDURES_MUTATORARG_TITLE": "ان پُٹ ناں:" +} diff --git a/js/msg/json/sl.json b/js/msg/json/sl.json new file mode 100644 index 0000000..297fbdb --- /dev/null +++ b/js/msg/json/sl.json @@ -0,0 +1,401 @@ +{ + "@metadata": { + "authors": [ + "Anzeljg", + "Miloš Košir", + "Dbc334", + "HairyFotr", + "Igor.pesek", + "MaxiMouse", + "LoveMortuus" + ] + }, + "VARIABLES_DEFAULT_NAME": "element", + "UNNAMED_KEY": "neimenovano", + "TODAY": "Danes", + "DUPLICATE_BLOCK": "Podvoji", + "ADD_COMMENT": "Dodaj komentar", + "REMOVE_COMMENT": "Odstrani komentar", + "DUPLICATE_COMMENT": "Podvoji komentar", + "EXTERNAL_INPUTS": "Zunanji vnosi", + "INLINE_INPUTS": "Vrstični vnosi", + "DELETE_BLOCK": "Izbriši delček", + "DELETE_X_BLOCKS": "Izbriši delčke (%1)", + "DELETE_ALL_BLOCKS": "Izbrišem vse delčke (%1)?", + "CLEAN_UP": "Ponastavi delčke", + "COLLAPSE_BLOCK": "Skrči delček", + "COLLAPSE_ALL": "Skrči delčke", + "EXPAND_BLOCK": "Razširi delček", + "EXPAND_ALL": "Razširi delčke", + "DISABLE_BLOCK": "Onemogoči delček", + "ENABLE_BLOCK": "Omogoči delček", + "HELP": "Pomoč", + "UNDO": "Razveljavi", + "REDO": "Ponovi", + "CHANGE_VALUE_TITLE": "Spremeni vrednost:", + "RENAME_VARIABLE": "Preimenuj spremenljivko ...", + "RENAME_VARIABLE_TITLE": "Preimenuj vse spremenljivke »%1« v:", + "NEW_VARIABLE": "Ustvari spremenljivko ...", + "NEW_STRING_VARIABLE": "Ustvari spremenljivko niza", + "NEW_NUMBER_VARIABLE": "Ustvari spremenljivko števila", + "NEW_COLOUR_VARIABLE": "Ustvari spremenljivko barve", + "NEW_VARIABLE_TYPE_TITLE": "Novi tip spremenljivke:", + "NEW_VARIABLE_TITLE": "Ime nove spremenljivke:", + "VARIABLE_ALREADY_EXISTS": "Spremenljivka »%1« že obstaja.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Spremenljivka z imenom »%1« že obstaja za tip »%2«", + "DELETE_VARIABLE_CONFIRMATION": "Izbrišem %1 uporab spremenljivke »%2«?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Ni mogoče izbrisati spremenljivke »%1«, ker je uporabljena v definiciji funkcije »%2«", + "DELETE_VARIABLE": "Izbriši spremenljivko »%1«", + "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", + "COLOUR_PICKER_TOOLTIP": "Izberi barvo s palete.", + "COLOUR_RANDOM_TITLE": "naključna barva", + "COLOUR_RANDOM_TOOLTIP": "Izbere naključno barvo.", + "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", + "COLOUR_RGB_TITLE": "določena barva", + "COLOUR_RGB_RED": "rdeča", + "COLOUR_RGB_GREEN": "zelena", + "COLOUR_RGB_BLUE": "modra", + "COLOUR_RGB_TOOLTIP": "Ustvari barvo z določeno količino rdeče, zelene in modre. Vse vrednosti morajo biti med 0 in 100.", + "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", + "COLOUR_BLEND_TITLE": "mešanica", + "COLOUR_BLEND_COLOUR1": "barva 1", + "COLOUR_BLEND_COLOUR2": "barva 2", + "COLOUR_BLEND_RATIO": "razmerje", + "COLOUR_BLEND_TOOLTIP": "Zmeša dve barvi v danem razmerju (0.0 - 1.0).", + "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", + "CONTROLS_REPEAT_TITLE": "ponovi %1 krat", + "CONTROLS_REPEAT_INPUT_DO": "izvedi", + "CONTROLS_REPEAT_TOOLTIP": "Delčki se izvedejo večkrat.", + "CONTROLS_WHILEUNTIL_HELPURL": "https://github.com/google/blockly/wiki/Loops#repeat", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "ponavljaj dokler", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "ponavljaj dokler ni", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Delčki se izvajajo dokler je vrednost resnična.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Delčki se izvajajo dokler je vrednost neresnična.", + "CONTROLS_FOR_HELPURL": "https://github.com/google/blockly/wiki/Loops#count-with", + "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čeni delčki.", + "CONTROLS_FOR_TITLE": "štej s/z %1 od %2 do %3 po %4", + "CONTROLS_FOREACH_HELPURL": "https://github.com/google/blockly/wiki/Loops#for-each", + "CONTROLS_FOREACH_TITLE": "za vsak element %1 v seznamu %2", + "CONTROLS_FOREACH_TOOLTIP": "Za vsak element v seznamu, nastavi spremenljivko »%1« na ta element. Pri tem se izvedejo določeni delčki.", + "CONTROLS_FLOW_STATEMENTS_HELPURL": "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "izstopi iz zanke", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "nadaljuj z naslednjo ponovitvijo zanke", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Izstopi iz trenutne zanke.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Preskoči preostanek te zanke in nadaljuje z naslednjo ponovitvijo.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Pozor: Ta delček lahko uporabiš samo znotraj zanke.", + "CONTROLS_IF_HELPURL": "https://github.com/google/blockly/wiki/IfElse", + "CONTROLS_IF_TOOLTIP_1": "Če je vrednost resnična, izvedi določene delčke.", + "CONTROLS_IF_TOOLTIP_2": "Če je vrednost resnična, izvedi prvo skupino delčkov. Sicer izvedi drugo skupino delčkov.", + "CONTROLS_IF_TOOLTIP_3": "Če je prva vrednost resnična, izvedi prvo skupino delčkov. Sicer, če je resnična druga vrednost, izvedi drugo skupino delčkov.", + "CONTROLS_IF_TOOLTIP_4": "Če je prva vrednost resnična, izvedi prvo skupino delčkov. Sicer, če je resnična druga vrednost, izvedi drugo skupino delčkov. Če nobena izmed vrednosti ni resnična, izvedi zadnjo skupino delčkov.", + "CONTROLS_IF_MSG_IF": "če", + "CONTROLS_IF_MSG_ELSEIF": "sicer če", + "CONTROLS_IF_MSG_ELSE": "sicer", + "CONTROLS_IF_IF_TOOLTIP": "Dodaj, odstrani ali spremeni vrstni red odsekov za ponovno nastavitev »če« delčka.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Dodaj pogoj »če« delčku.", + "CONTROLS_IF_ELSE_TOOLTIP": "Dodaj končni pogoj »če« delčku.", + "IOS_OK": "V redu", + "IOS_CANCEL": "Prekliči", + "IOS_ERROR": "Napaka", + "IOS_PROCEDURES_INPUTS": "VNOSI", + "IOS_PROCEDURES_ADD_INPUT": "+ Dodaj vnos", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Dovoli izjave", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Ta funkcija ima podvojene vnose", + "IOS_VARIABLES_ADD_VARIABLE": "+ Dodaj spremenljivko", + "IOS_VARIABLES_ADD_BUTTON": "Dodaj", + "IOS_VARIABLES_RENAME_BUTTON": "Preimenuj", + "IOS_VARIABLES_DELETE_BUTTON": "Izbriši", + "IOS_VARIABLES_VARIABLE_NAME": "Ime spremenljivke", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Ne moreš uporabiti spremenljivke brez imena.", + "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", + "LOGIC_COMPARE_TOOLTIP_EQ": "Vrne resnično, če sta vnosa enaka.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Vrne resnično, če vnosa nista enaka.", + "LOGIC_COMPARE_TOOLTIP_LT": "Vrne resnično, če je prvi vnos manjši od drugega.", + "LOGIC_COMPARE_TOOLTIP_LTE": "Vrne resnično, če je prvi vnos manjši ali enak drugemu.", + "LOGIC_COMPARE_TOOLTIP_GT": "Vrne resnično, če je prvi vnos večji od drugega.", + "LOGIC_COMPARE_TOOLTIP_GTE": "Vrne resnično, če je prvi vnos večji ali enak drugemu.", + "LOGIC_OPERATION_HELPURL": "https://github.com/google/blockly/wiki/Logic#logical-operations", + "LOGIC_OPERATION_TOOLTIP_AND": "Vrne resnično, če sta oba vnosa resnična.", + "LOGIC_OPERATION_AND": "in", + "LOGIC_OPERATION_TOOLTIP_OR": "Vrne resnično, če je vsaj eden od vnosov resničen.", + "LOGIC_OPERATION_OR": "ali", + "LOGIC_NEGATE_HELPURL": "https://github.com/google/blockly/wiki/Logic#not", + "LOGIC_NEGATE_TITLE": "ne %1", + "LOGIC_NEGATE_TOOLTIP": "Vrne resnično, če je vnos neresničen. Vrne neresnično, če je vnos resničen.", + "LOGIC_BOOLEAN_HELPURL": "https://github.com/google/blockly/wiki/Logic#values", + "LOGIC_BOOLEAN_TRUE": "resnično", + "LOGIC_BOOLEAN_FALSE": "neresnično", + "LOGIC_BOOLEAN_TOOLTIP": "Vrne resnično ali neresnično.", + "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", + "LOGIC_NULL": "prazno", + "LOGIC_NULL_TOOLTIP": "Vrne prazno.", + "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", + "LOGIC_TERNARY_CONDITION": "test", + "LOGIC_TERNARY_IF_TRUE": "če resnično", + "LOGIC_TERNARY_IF_FALSE": "če neresnično", + "LOGIC_TERNARY_TOOLTIP": "Preveri pogoj v »testu«. Če je pogoj resničen, potem vrne vrednost »če resnično«; sicer vrne vrednost »če neresnično«.", + "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", + "MATH_NUMBER_TOOLTIP": "Število.", + "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": "Vrne vsoto dveh števil.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "Vrne razliko dveh števil.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Vrne zmnožek dveh števil.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Vrne kvocient dveh števil.", + "MATH_ARITHMETIC_TOOLTIP_POWER": "Vrne prvo število na potenco drugega števila.", + "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", + "MATH_SINGLE_OP_ROOT": "kvadratni koren", + "MATH_SINGLE_TOOLTIP_ROOT": "Vrne kvadratni koren števila.", + "MATH_SINGLE_OP_ABSOLUTE": "absolutno", + "MATH_SINGLE_TOOLTIP_ABS": "Vrne absolutno vrednost števila.", + "MATH_SINGLE_TOOLTIP_NEG": "Vrne negacijo števila.", + "MATH_SINGLE_TOOLTIP_LN": "Vrne naravni logaritem števila.", + "MATH_SINGLE_TOOLTIP_LOG10": "Vrne desetiški logaritem števila.", + "MATH_SINGLE_TOOLTIP_EXP": "Vrne e na potenco števila.", + "MATH_SINGLE_TOOLTIP_POW10": "Vrne 10 na potenco števila.", + "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", + "MATH_TRIG_TOOLTIP_SIN": "Vrne sinus kota v stopinjah (ne radianih).", + "MATH_TRIG_TOOLTIP_COS": "Vrne kosinus kota v stopinjah (ne radianih).", + "MATH_TRIG_TOOLTIP_TAN": "Vrne tangens kota v stopinjah (ne radianih).", + "MATH_TRIG_TOOLTIP_ASIN": "Vrne arkus sinus števila.", + "MATH_TRIG_TOOLTIP_ACOS": "Vrne arkus kosinus števila.", + "MATH_TRIG_TOOLTIP_ATAN": "Vrne arkus tangens števila.", + "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", + "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).", + "MATH_IS_EVEN": "je sodo", + "MATH_IS_ODD": "je liho", + "MATH_IS_PRIME": "je praštevilo", + "MATH_IS_WHOLE": "je celo", + "MATH_IS_POSITIVE": "je pozitivno", + "MATH_IS_NEGATIVE": "je negativno", + "MATH_IS_DIVISIBLE_BY": "je deljivo s/z", + "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.", + "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", + "MATH_CHANGE_TITLE": "spremeni %1 za %2", + "MATH_CHANGE_TOOLTIP": "Prišteje število k spremenljivki '%1'.", + "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", + "MATH_ROUND_TOOLTIP": "Zaokroži število navzgor ali navzdol.", + "MATH_ROUND_OPERATOR_ROUND": "zaokroži", + "MATH_ROUND_OPERATOR_ROUNDUP": "zaokroži navzgor", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "zaokroži navzdol", + "MATH_ONLIST_OPERATOR_SUM": "vsota seznama", + "MATH_ONLIST_TOOLTIP_SUM": "Vrne vsoto vseh števil na seznamu.", + "MATH_ONLIST_OPERATOR_MIN": "minimum seznama", + "MATH_ONLIST_TOOLTIP_MIN": "Vrne najmanjše število na seznamu.", + "MATH_ONLIST_OPERATOR_MAX": "maksimum seznama", + "MATH_ONLIST_TOOLTIP_MAX": "Vrne največje število na seznamu.", + "MATH_ONLIST_OPERATOR_AVERAGE": "povprečje seznama", + "MATH_ONLIST_TOOLTIP_AVERAGE": "Vrne povprečje (aritmetično sredino) števil na seznamu.", + "MATH_ONLIST_OPERATOR_MEDIAN": "mediana seznama", + "MATH_ONLIST_TOOLTIP_MEDIAN": "Vrne mediano števil na seznamu.", + "MATH_ONLIST_OPERATOR_MODE": "modus seznama", + "MATH_ONLIST_TOOLTIP_MODE": "Vrne seznam najpogostejšega elementa(-ov) na seznamu.", + "MATH_ONLIST_OPERATOR_STD_DEV": "standardni odklon seznama", + "MATH_ONLIST_TOOLTIP_STD_DEV": "Vrne standardni odklon seznama.", + "MATH_ONLIST_OPERATOR_RANDOM": "naključni element seznama", + "MATH_ONLIST_TOOLTIP_RANDOM": "Vrne naključno število izmed števil na seznamu.", + "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", + "MATH_MODULO_TITLE": "ostanek pri %1 ÷ %2", + "MATH_MODULO_TOOLTIP": "Vrne ostanek pri deljenju dveh števil.", + "MATH_CONSTRAIN_HELPURL": "https://en.wikipedia.org/wiki/Clamping_%28graphics%29", + "MATH_CONSTRAIN_TITLE": "omeji %1 na najmanj %2 in največ %3", + "MATH_CONSTRAIN_TOOLTIP": "Omeji število, da bo med določenima (vključenima) mejama.", + "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_INT_TITLE": "naključno število med %1 in %2", + "MATH_RANDOM_INT_TOOLTIP": "Vrne naključno število med dvema določenima mejama, vključno z mejama.", + "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "naključni ulomek", + "MATH_RANDOM_FLOAT_TOOLTIP": "Vrne naključni ulomek med (vključno) 0.0 in 1.0 (izključno).", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 koordinate X:%1 in Y:%2", + "MATH_ATAN2_TOOLTIP": "Vrne arkus tangens točke (X, Y) v stopinjah med -180 in 180.", + "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", + "TEXT_TEXT_TOOLTIP": "Črka, beseda ali vrstica besedila.", + "TEXT_JOIN_HELPURL": "https://github.com/google/blockly/wiki/Text#text-creation", + "TEXT_JOIN_TITLE_CREATEWITH": "ustvari besedilo iz", + "TEXT_JOIN_TOOLTIP": "Ustvari besedilo tako, da združi poljubno število elementov.", + "TEXT_CREATE_JOIN_TITLE_JOIN": "združi", + "TEXT_CREATE_JOIN_TOOLTIP": "Doda, odstrani ali spremeni vrstni red elementov tega besedila.", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Doda element k besedilu.", + "TEXT_APPEND_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", + "TEXT_APPEND_TITLE": "k %1 dodaj besedilo %2", + "TEXT_APPEND_TOOLTIP": "Doda besedilo k spremenljivki '%1'.", + "TEXT_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", + "TEXT_LENGTH_TITLE": "dolžina %1", + "TEXT_LENGTH_TOOLTIP": "Vrne število črk oz. znakov (vključno s presledki) v določenem besedilu.", + "TEXT_ISEMPTY_HELPURL": "https://github.com/google/blockly/wiki/Text#checking-for-empty-text", + "TEXT_ISEMPTY_TITLE": "%1 je prazno", + "TEXT_ISEMPTY_TOOLTIP": "Vrne resnično, če je določeno besedilo prazno.", + "TEXT_INDEXOF_HELPURL": "https://github.com/google/blockly/wiki/Text#finding-text", + "TEXT_INDEXOF_TOOLTIP": "Vrne mesto (indeks) prve/zadnje pojavitve drugega besedila v prvem besedilu. Če besedila ne najde, vrne %1.", + "TEXT_INDEXOF_TITLE": "v besedilu %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "najdi prvo pojavitev besedila", + "TEXT_INDEXOF_OPERATOR_LAST": "najdi zadnjo pojavitev besedila", + "TEXT_CHARAT_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-text", + "TEXT_CHARAT_TITLE": "v besedilu %1 %2", + "TEXT_CHARAT_FROM_START": "vrni črko št.", + "TEXT_CHARAT_FROM_END": "vrni črko št. od konca", + "TEXT_CHARAT_FIRST": "vrni prvo črko", + "TEXT_CHARAT_LAST": "vrni zadnjo črko", + "TEXT_CHARAT_RANDOM": "vrni naključno črko", + "TEXT_CHARAT_TOOLTIP": "Vrne črko na določenem mestu v besedilu.", + "TEXT_GET_SUBSTRING_TOOLTIP": "Vrne določen del besedila.", + "TEXT_GET_SUBSTRING_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "iz besedila", + "TEXT_GET_SUBSTRING_START_FROM_START": "vrni del od črke št.", + "TEXT_GET_SUBSTRING_START_FROM_END": "vrni del od črke št. od konca", + "TEXT_GET_SUBSTRING_START_FIRST": "vrni del od prve črke", + "TEXT_GET_SUBSTRING_END_FROM_START": "do črke št.", + "TEXT_GET_SUBSTRING_END_FROM_END": "do črke št. od konca", + "TEXT_GET_SUBSTRING_END_LAST": "do zadnje črke", + "TEXT_CHANGECASE_HELPURL": "https://github.com/google/blockly/wiki/Text#adjusting-text-case", + "TEXT_CHANGECASE_TOOLTIP": "Vrne kopijo besedila v drugi obliki.", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "v VELIKE ČRKE", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "v male črke", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "v Velike Začetnice", + "TEXT_TRIM_HELPURL": "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces", + "TEXT_TRIM_TOOLTIP": "Vrne kopijo besedila z odstranjenimi presledki z ene ali obeh strani.", + "TEXT_TRIM_OPERATOR_BOTH": "odstrani presledke z obeh strani", + "TEXT_TRIM_OPERATOR_LEFT": "odstrani presledke z leve strani", + "TEXT_TRIM_OPERATOR_RIGHT": "odstrani presledke z desne strani", + "TEXT_PRINT_HELPURL": "https://github.com/google/blockly/wiki/Text#printing-text", + "TEXT_PRINT_TITLE": "izpiši %1", + "TEXT_PRINT_TOOLTIP": "Izpiše določeno besedilo, število ali drugo vrednost.", + "TEXT_PROMPT_HELPURL": "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user", + "TEXT_PROMPT_TYPE_TEXT": "vprašaj za besedilo s sporočilom", + "TEXT_PROMPT_TYPE_NUMBER": "vprašaj za število s sporočilom", + "TEXT_PROMPT_TOOLTIP_NUMBER": "Vpraša uporabnika za vnos števila.", + "TEXT_PROMPT_TOOLTIP_TEXT": "Vpraša uporabnika za vnos besedila.", + "TEXT_COUNT_MESSAGE0": "preštej %1 v %2", + "TEXT_COUNT_TOOLTIP": "Prešteje kolikokrat se neko besedilo pojavi znotraj drugega besedila.", + "TEXT_REPLACE_MESSAGE0": "zamenjaj %1 z %2 v %3", + "TEXT_REPLACE_TOOLTIP": "Zamenja vse pojavitve besedila znotraj drugega besedila.", + "TEXT_REVERSE_MESSAGE0": "obrni %1", + "TEXT_REVERSE_TOOLTIP": "Obrne vrstni red znakov v besedilu.", + "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", + "LISTS_CREATE_EMPTY_TITLE": "ustvari prazen seznam", + "LISTS_CREATE_EMPTY_TOOLTIP": "Vrne seznam, dolžine 0, ki ne vsebuje nobenih podatkov.", + "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", + "LISTS_CREATE_WITH_TOOLTIP": "Ustvari seznam s poljubnim številom elementov.", + "LISTS_CREATE_WITH_INPUT_WITH": "ustvari seznam s/z", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "seznam", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Doda, odstrani ali spremeni vrstni red elementov tega seznama.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Doda element seznamu.", + "LISTS_REPEAT_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", + "LISTS_REPEAT_TOOLTIP": "Ustvari seznam z danim elementom, ki se poljubno mnogo krat ponovi.", + "LISTS_REPEAT_TITLE": "ustvari seznam z elementom %1, ki se ponovi %2 krat", + "LISTS_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Lists#length-of", + "LISTS_LENGTH_TITLE": "dolžina %1", + "LISTS_LENGTH_TOOLTIP": "Vrne dolžino seznama.", + "LISTS_ISEMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#is-empty", + "LISTS_ISEMPTY_TITLE": "%1 je prazen", + "LISTS_ISEMPTY_TOOLTIP": "Vrne resnično, če je seznam prazen.", + "LISTS_INLIST": "v seznamu", + "LISTS_INDEX_OF_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list", + "LISTS_INDEX_OF_FIRST": "najdi prvo pojavitev elementa", + "LISTS_INDEX_OF_LAST": "najdi zadnjo pojavitev elementa", + "LISTS_INDEX_OF_TOOLTIP": "Vrne mesto (indeks) prve/zadnje pojavitve elementa v seznamu. Če elementa ne najde, vrne %1.", + "LISTS_GET_INDEX_GET": "vrni", + "LISTS_GET_INDEX_GET_REMOVE": "odstrani in vrni", + "LISTS_GET_INDEX_REMOVE": "odstrani", + "LISTS_GET_INDEX_FROM_START": "št.", + "LISTS_GET_INDEX_FROM_END": "mesto št. od konca", + "LISTS_GET_INDEX_FIRST": "prvo mesto", + "LISTS_GET_INDEX_LAST": "zadnje mesto", + "LISTS_GET_INDEX_RANDOM": "naključno mesto", + "LISTS_INDEX_FROM_START_TOOLTIP": "Prvi element je št. %1.", + "LISTS_INDEX_FROM_END_TOOLTIP": "Zadnji element je št. %1.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Vrne element na določenem mestu v seznamu.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Vrne prvi element seznama.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Vrne zadnji element seznama.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Vrne naključni element seznama.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Odstrani in vrne element na določenem mestu v seznamu.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Odstrani in vrne prvi element seznama.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Odstrani in vrne zadnji element seznama.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Odstrani in vrne naključni element seznama.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Odstrani element na določenem mestu v seznamu.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Odstrani prvi element seznama.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Odstrani zadnji element seznama.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Odstrani naključni element seznama.", + "LISTS_SET_INDEX_HELPURL": "https://github.com/google/blockly/wiki/Lists#in-list--set", + "LISTS_SET_INDEX_SET": "nastavi na", + "LISTS_SET_INDEX_INSERT": "vstavi na", + "LISTS_SET_INDEX_INPUT_TO": "element", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Nastavi element na določenem mestu v seznamu.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Nastavi prvi element seznama.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Nastavi zadnji element seznama.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Nastavi naključni element seznama.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Vstavi element na določeno mesto v seznamu.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Vstavi element na začetek seznama.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Doda element na konec seznama.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Vstavi element na naključno mesto v seznamu.", + "LISTS_GET_SUBLIST_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-a-sublist", + "LISTS_GET_SUBLIST_START_FROM_START": "ustvari podseznam od mesta št.", + "LISTS_GET_SUBLIST_START_FROM_END": "ustvari podseznam od mesta št. od konca", + "LISTS_GET_SUBLIST_START_FIRST": "ustvari podseznam od prvega mesta", + "LISTS_GET_SUBLIST_END_FROM_START": "do mesta št.", + "LISTS_GET_SUBLIST_END_FROM_END": "do mesta št. od konca", + "LISTS_GET_SUBLIST_END_LAST": "do zadnjega mesta", + "LISTS_GET_SUBLIST_TOOLTIP": "Ustvari nov seznam, kot kopijo določenega dela seznama.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "uredi %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Uredi kopijo seznama.", + "LISTS_SORT_ORDER_ASCENDING": "naraščajoče", + "LISTS_SORT_ORDER_DESCENDING": "padajoče", + "LISTS_SORT_TYPE_NUMERIC": "številčno", + "LISTS_SORT_TYPE_TEXT": "abecedno", + "LISTS_SORT_TYPE_IGNORECASE": "abecedno, brez velikosti črk", + "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", + "LISTS_SPLIT_LIST_FROM_TEXT": "ustvari seznam iz besedila", + "LISTS_SPLIT_TEXT_FROM_LIST": "ustvari besedilo iz seznama", + "LISTS_SPLIT_WITH_DELIMITER": "z ločilom", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Razdruži besedilo v seznam besedil. Za razdruževanje besedila uporabi ločilo.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Združi seznam besedil v eno besedilo, ločeno z ločilom.", + "LISTS_REVERSE_MESSAGE0": "obrni %1", + "LISTS_REVERSE_TOOLTIP": "Obrne kopijo seznama.", + "VARIABLES_GET_HELPURL": "https://github.com/google/blockly/wiki/Variables#get", + "VARIABLES_GET_TOOLTIP": "Vrne vrednost spremenljivke.", + "VARIABLES_GET_CREATE_SET": "Ustvari 'nastavi %1'", + "VARIABLES_SET_HELPURL": "https://github.com/google/blockly/wiki/Variables#set", + "VARIABLES_SET": "nastavi %1 na %2", + "VARIABLES_SET_TOOLTIP": "Nastavi, da je vrednost spremenljivke enaka vnosu.", + "VARIABLES_SET_CREATE_GET": "Ustvari 'vrni %1'", + "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_DEFNORETURN_TITLE": "izvedi", + "PROCEDURES_DEFNORETURN_PROCEDURE": "nekaj", + "PROCEDURES_BEFORE_PARAMS": "s/z:", + "PROCEDURES_CALL_BEFORE_PARAMS": "s/z:", + "PROCEDURES_DEFNORETURN_TOOLTIP": "Ustvari funkcijo brez izhoda.", + "PROCEDURES_DEFNORETURN_COMMENT": "Opiši funkcijo ...", + "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_DEFRETURN_RETURN": "vrni", + "PROCEDURES_DEFRETURN_TOOLTIP": "Ustvari funkcijo z izhodom.", + "PROCEDURES_ALLOW_STATEMENTS": "dovoli korake", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Pozor: Ta funkcija ima podvojene parametre.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Izvede uporabniško funkcijo '%1'.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLRETURN_TOOLTIP": "Izvede uporabniško funkcijo '%1' in uporabi njen izhod.", + "PROCEDURES_MUTATORCONTAINER_TITLE": "vnosi", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Doda, odstrani ali spremeni vrstni red vnosov te funkcije.", + "PROCEDURES_MUTATORARG_TITLE": "ime vnosa:", + "PROCEDURES_MUTATORARG_TOOLTIP": "Funkciji doda vnos.", + "PROCEDURES_HIGHLIGHT_DEF": "Označi definicijo funkcije", + "PROCEDURES_CREATE_DO": "Ustvari '%1'", + "PROCEDURES_IFRETURN_TOOLTIP": "Če je vrednost resnična, vrne drugo vrednost.", + "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", + "PROCEDURES_IFRETURN_WARNING": "Pozor: Ta delček lahko uporabiš samo znotraj definicije funkcije.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Povej nekaj ...", + "WORKSPACE_ARIA_LABEL": "Blockly-jev delovni prostor", + "COLLAPSED_WARNINGS_WARNING": "Skrčeni delčki vsebujejo opozorila." +} diff --git a/js/msg/json/sq.json b/js/msg/json/sq.json new file mode 100644 index 0000000..187f8e4 --- /dev/null +++ b/js/msg/json/sq.json @@ -0,0 +1,359 @@ +{ + "@metadata": { + "authors": [ + "아라", + "Liridon", + "Arianit" + ] + }, + "VARIABLES_DEFAULT_NAME": "send", + "TODAY": "Sot", + "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", + "DELETE_ALL_BLOCKS": "Fshijë të gjitha %1 të blloqeve?", + "CLEAN_UP": "Pastro blloqet", + "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ë", + "UNDO": "Zhbëj", + "REDO": "Ribëj", + "CHANGE_VALUE_TITLE": "Ndrysho Vlerat:", + "RENAME_VARIABLE": "Ndrysho emrin variables...", + "RENAME_VARIABLE_TITLE": "Ndrysho emrin e te gjitha '%1' variablave ne :", + "NEW_VARIABLE": "Krijo variabël...", + "NEW_STRING_VARIABLE": "Krijo variabël varg", + "NEW_NUMBER_VARIABLE": "Krijo variabël numër", + "NEW_COLOUR_VARIABLE": "Krijo variabël ngjyrë...", + "NEW_VARIABLE_TYPE_TITLE": "Tip i ri i variablës:", + "NEW_VARIABLE_TITLE": "Emri i identifikatorit të ri:", + "VARIABLE_ALREADY_EXISTS": "Një variabël e quajtur '%1' tashmë ekziston.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Një variabël me emrin '%1' veç ekziston për një tip tjetër: '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Fshi përdorimin %1 të variablës '%2'?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Nuk mund të fshihet variabla '%1' sepse është pjesë e definicionit të funksionit '%2'", + "DELETE_VARIABLE": "Fshi variablën '%1'", + "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.", + "IOS_OK": "Në rregull", + "IOS_CANCEL": "Anulo", + "IOS_ERROR": "Gabim", + "IOS_PROCEDURES_INPUTS": "INPUTET", + "IOS_PROCEDURES_ADD_INPUT": "+ Shto Inputet", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Lejo deklaratat", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Ky funksion ka inpute të dyfishta.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Shto Variabël", + "IOS_VARIABLES_ADD_BUTTON": "Shto", + "IOS_VARIABLES_RENAME_BUTTON": "Riemro", + "IOS_VARIABLES_DELETE_BUTTON": "Grise", + "IOS_VARIABLES_VARIABLE_NAME": "Emri i variablës", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Nuk mund të përdorni variabël pa emër.", + "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_TITLE": "ne %1 shto tekst %2", + "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 %1 ne qofte se teksti nuk u gjet.", + "TEXT_INDEXOF_TITLE": "ne tekst %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "gjej rastisjen e pare te tekstit", + "TEXT_INDEXOF_OPERATOR_LAST": "gjej rastisjen e fundit te tekstit", + "TEXT_CHARAT_TITLE": "në tekst %1 %2", + "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.", + "TEXT_COUNT_MESSAGE0": "numro %1 në %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Numrin sa herë paraqitet një tekst brenda një teksti tjetër.", + "TEXT_REPLACE_MESSAGE0": "zëvendëso %1 me %2 në %3", + "TEXT_REPLACE_TOOLTIP": "Zëvendëso të gjitha paraqitjet e një teksti brenda një teksti tjetër.", + "TEXT_REVERSE_MESSAGE0": "kthe %1", + "TEXT_REVERSE_TOOLTIP": "Kthen renditjen e karaktereve në 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 %1 nëse teksti nuk është gjetur.", + "LISTS_GET_INDEX_GET": "merr", + "LISTS_GET_INDEX_GET_REMOVE": "merr dhe fshij", + "LISTS_GET_INDEX_REMOVE": "largo", + "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_INDEX_FROM_START_TOOLTIP": "%1 është sendi i parë.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 është sendi i fundit.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Kthen një send në pozicionin e specifikuar në listë.", + "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": "Fshin dhe kthen sendin në pozicionin e specifikuar në listë.", + "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": "Fshin sendin në pozicionin e specifikuar në listë.", + "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": "Vendos sendin në pozicionin e specifikuar në listë.", + "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": "Fut sendin në pozicionin e specifikuar të listës.", + "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.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "rendit %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Rendit një kopje të listës.", + "LISTS_SORT_ORDER_ASCENDING": "ngjitje", + "LISTS_SORT_ORDER_DESCENDING": "zbritje", + "LISTS_SORT_TYPE_NUMERIC": "numerike", + "LISTS_SORT_TYPE_TEXT": "alfabetike", + "LISTS_SORT_TYPE_IGNORECASE": "alfabetike, injoro madhësinë e shkronjave", + "LISTS_SPLIT_LIST_FROM_TEXT": "bëj listë nga teksti", + "LISTS_SPLIT_TEXT_FROM_LIST": "bëj tekst nga lista", + "LISTS_SPLIT_WITH_DELIMITER": "me ndarës", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Ndaj tekstin në një listë tekstesh, duke ndarë në secilin ndarës.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Ngjit një listë tekstesh në një, të ndara me ndarës.", + "LISTS_REVERSE_MESSAGE0": "kthe %1", + "LISTS_REVERSE_TOOLTIP": "Ndërro renditjen e një kopjeje 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_DEFNORETURN_COMMENT": "Përshkruaj këtë funksion...", + "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_ALLOW_STATEMENTS": "lejo deklaratat", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Paralajmërim: Ky funksion ka parametra të dyfishuar.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Lësho funksionin e definuar nga përdoruesi '%1'.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "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_MUTATORCONTAINER_TOOLTIP": "Shto, hiq, ose rirendit inputet e këtij funksioni.", + "PROCEDURES_MUTATORARG_TITLE": "Fut emrin:", + "PROCEDURES_MUTATORARG_TOOLTIP": "Shto një input në këtë funksion.", + "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/js/msg/json/sr-latn.json b/js/msg/json/sr-latn.json new file mode 100644 index 0000000..af03f28 --- /dev/null +++ b/js/msg/json/sr-latn.json @@ -0,0 +1,356 @@ +{ + "@metadata": { + "authors": [ + "Zoranzoki21" + ] + }, + "VARIABLES_DEFAULT_NAME": "stavka", + "TODAY": "Danas", + "DUPLICATE_BLOCK": "Dupliraj", + "ADD_COMMENT": "Dodaj komentar", + "REMOVE_COMMENT": "Ukloni komentar", + "EXTERNAL_INPUTS": "Spoljni ulazi", + "INLINE_INPUTS": "Unutrašnji ulazi", + "DELETE_BLOCK": "Obriši blok", + "DELETE_X_BLOCKS": "Obriši %1 blokova", + "DELETE_ALL_BLOCKS": "Da obrišem svih %1 blokova?", + "CLEAN_UP": "Ukloni blokove", + "COLLAPSE_BLOCK": "Skupi blok", + "COLLAPSE_ALL": "Skupi blokove", + "EXPAND_BLOCK": "Proširi blok", + "EXPAND_ALL": "Proširi blokove", + "DISABLE_BLOCK": "Onemogući blok", + "ENABLE_BLOCK": "Omogući blok", + "HELP": "Pomoć", + "UNDO": "Opozovi", + "REDO": "Ponovi", + "CHANGE_VALUE_TITLE": "Promeni vrednost:", + "RENAME_VARIABLE": "Preimenuj promenljivu…", + "RENAME_VARIABLE_TITLE": "Preimenuj sve „%1“ promenljive u:", + "NEW_VARIABLE": "Napravi promenljivu…", + "NEW_VARIABLE_TITLE": "Ime nove promenljive:", + "VARIABLE_ALREADY_EXISTS": "Promenljiva pod imenom '%1' već postoji.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Varijabla po imenu '%1' već postoji za drugu varijablu tipa '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Da obrišem %1 upotreba promenljive '%2'?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Ne mogu da obrišem varijablu ’%1’ jer je deo definicije funkcije ’%2’", + "DELETE_VARIABLE": "Obriši promenljivu '%1'", + "COLOUR_PICKER_HELPURL": "https://sr.wikipedia.org/wiki/Boja", + "COLOUR_PICKER_TOOLTIP": "Izaberite boju sa palete.", + "COLOUR_RANDOM_TITLE": "slučajna boja", + "COLOUR_RANDOM_TOOLTIP": "Izaberite boju nasumice.", + "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", + "COLOUR_RGB_TITLE": "boja sa", + "COLOUR_RGB_RED": "crvena", + "COLOUR_RGB_GREEN": "zelena", + "COLOUR_RGB_BLUE": "plava", + "COLOUR_RGB_TOOLTIP": "Kreiraj boju sa određenom količinom crvene,zelene, i plave. Sve vrednosti moraju biti između 0 i 100.", + "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", + "COLOUR_BLEND_TITLE": "pomešaj", + "COLOUR_BLEND_COLOUR1": "boja 1", + "COLOUR_BLEND_COLOUR2": "boja 2", + "COLOUR_BLEND_RATIO": "odnos", + "COLOUR_BLEND_TOOLTIP": "Pomešati dve boje zajedno sa datim odnosom (0.0 - 1.0).", + "CONTROLS_REPEAT_HELPURL": "https://sr.wikipedia.org/wiki/For_petlja", + "CONTROLS_REPEAT_TITLE": "ponovi %1 puta", + "CONTROLS_REPEAT_INPUT_DO": "izvrši", + "CONTROLS_REPEAT_TOOLTIP": "Odraditi neke naredbe nekoliko puta.", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "ponavljati dok", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "ponavljati do", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Dok je vrednost tačna, onda izvršite neke naredbe.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Dok vrednost nije tačna, onda izvršiti neke naredbe.", + "CONTROLS_FOR_TOOLTIP": "Imaj promenjivu \"%1\" uzmi vrednosti od početnog broja do zadnjeg broja, brojeći po određenom intervalu, i izvrši određene blokove.", + "CONTROLS_FOR_TITLE": "prebroj sa %1 od %2 do %3 od %4", + "CONTROLS_FOREACH_TITLE": "za svaku stavku %1 na spisku %2", + "CONTROLS_FOREACH_TOOLTIP": "Za svaku stavku unutar liste, podesi promenjivu '%1' po stavci, i onda načini neke izjave-naredbe.", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "Izađite iz petlje", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "nastavi sa sledećom iteracijom petlje", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Napusti sadržaj petlje.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Preskoči ostatak ove petlje, i nastavi sa sledećom iteracijom(ponavljanjem).", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Upozorenje: Ovaj blok može da se upotrebi samo unutar petlje.", + "CONTROLS_IF_TOOLTIP_1": "ako je vrednost tačna, onda izvrši neke naredbe-izjave.", + "CONTROLS_IF_TOOLTIP_2": "ako je vrednost tačna, onda izvrši prvi blok naredbi, U suprotnom, izvrši drugi blok naredbi.", + "CONTROLS_IF_TOOLTIP_3": "Ako je prva vrednost tačna, onda izvrši prvi blok naredbi, u suprotnom, ako je druga vrednost tačna , izvrši drugi blok naredbi.", + "CONTROLS_IF_TOOLTIP_4": "Ako je prva vrednost tačna, onda izvrši prvi blok naredbi, u suprotnom, ako je druga vrednost tačna , izvrši drugi blok naredbi. Ako ni jedna od vrednosti nije tačna, izvrši poslednji blok naredbi.", + "CONTROLS_IF_MSG_IF": "ako", + "CONTROLS_IF_MSG_ELSEIF": "inače-ako", + "CONTROLS_IF_MSG_ELSE": "inače", + "CONTROLS_IF_IF_TOOLTIP": "Dodaj, ukloni, ili preuredi delove kako bih rekonfigurisali ovaj if blok.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Dodajte uslov bloku „ako“.", + "CONTROLS_IF_ELSE_TOOLTIP": "Dodaj konačni, catch-all (uhvati sve) uslove if bloka.", + "IOS_OK": "U redu", + "IOS_CANCEL": "Otkaži", + "IOS_ERROR": "Greška", + "IOS_PROCEDURES_INPUTS": "UNOSI", + "IOS_PROCEDURES_ADD_INPUT": "+ Dodaj unos", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Dozvoli izjave", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Ova funkcija ima duplicirane unose.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Dodaj varijablu", + "IOS_VARIABLES_ADD_BUTTON": "Dodaj", + "IOS_VARIABLES_RENAME_BUTTON": "Preimenuj", + "IOS_VARIABLES_DELETE_BUTTON": "Obriši", + "IOS_VARIABLES_VARIABLE_NAME": "Ime varijable", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Ne možete da koristite prazno ime varijable.", + "LOGIC_COMPARE_HELPURL": "https://sr.wikipedia.org/wiki/Nejednakost", + "LOGIC_COMPARE_TOOLTIP_EQ": "Vraća vrednost „tačno“ ako su oba ulaza jednaka.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Vraća vrednost „tačno“ ako su oba ulaza nejednaka.", + "LOGIC_COMPARE_TOOLTIP_LT": "Vraća vrednost „tačno“ ako je prvi ulaz manji od drugog.", + "LOGIC_COMPARE_TOOLTIP_LTE": "Vraća vrednost „tačno“ ako je prvi ulaz manji ili jednak drugom.", + "LOGIC_COMPARE_TOOLTIP_GT": "Vraća vrednost „tačno“ ako je prvi ulaz veći od drugog.", + "LOGIC_COMPARE_TOOLTIP_GTE": "Vraća vrednost „tačno“ ako je prvi ulaz veći ili jednak drugom.", + "LOGIC_OPERATION_TOOLTIP_AND": "Vraća vrednost „tačno“ ako su oba ulaza tačna.", + "LOGIC_OPERATION_AND": "i", + "LOGIC_OPERATION_TOOLTIP_OR": "Vraća vrednost „tačno“ ako je bar jedan od ulaza tačan.", + "LOGIC_OPERATION_OR": "ili", + "LOGIC_NEGATE_TITLE": "nije %1", + "LOGIC_NEGATE_TOOLTIP": "Vraća vrednost „tačno“ ako je ulaz netačan. Vraća vrednost „netačno“ ako je ulaz tačan.", + "LOGIC_BOOLEAN_TRUE": "tačno", + "LOGIC_BOOLEAN_FALSE": "netačno", + "LOGIC_BOOLEAN_TOOLTIP": "Vraća ili tačno ili netačno.", + "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", + "LOGIC_NULL": "bez vrednosti", + "LOGIC_NULL_TOOLTIP": "Vraća „bez vrednosti“.", + "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", + "LOGIC_TERNARY_CONDITION": "proba", + "LOGIC_TERNARY_IF_TRUE": "ako je tačno", + "LOGIC_TERNARY_IF_FALSE": "ako je netačno", + "LOGIC_TERNARY_TOOLTIP": "Proveri uslov u 'test'. Ako je uslov tačan, tada vraća 'if true' vrednost; u drugom slučaju vraća 'if false' vrednost.", + "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", + "MATH_NUMBER_TOOLTIP": "Neki broj.", + "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": "arc sin", + "MATH_TRIG_ACOS": "arc cos", + "MATH_TRIG_ATAN": "arc tan", + "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", + "MATH_ARITHMETIC_TOOLTIP_ADD": "Vratite zbir dva broja.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "Vraća razliku dva broja.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Vraća proizvod dva broja.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Vraća količnik dva broja.", + "MATH_ARITHMETIC_TOOLTIP_POWER": "Vraća prvi broj stepenovan drugim.", + "MATH_SINGLE_HELPURL": "https://sr.wikipedia.org/wiki/Kvadratni_koren", + "MATH_SINGLE_OP_ROOT": "kvadratni koren", + "MATH_SINGLE_TOOLTIP_ROOT": "Vraća kvadratni koren broja.", + "MATH_SINGLE_OP_ABSOLUTE": "apsolutan", + "MATH_SINGLE_TOOLTIP_ABS": "Vraća apsolutnu vrednost broja.", + "MATH_SINGLE_TOOLTIP_NEG": "Vraća negaciju broja.", + "MATH_SINGLE_TOOLTIP_LN": "Vraća prirodni logaritam broja.", + "MATH_SINGLE_TOOLTIP_LOG10": "Vraća logaritam broja sa osnovom 10.", + "MATH_SINGLE_TOOLTIP_EXP": "vratiti e na vlasti broja.", + "MATH_SINGLE_TOOLTIP_POW10": "Vraća 10-ti stepen broja.", + "MATH_TRIG_HELPURL": "https://sr.wikipedia.org/wiki/Trigonometrijske_funkcije", + "MATH_TRIG_TOOLTIP_SIN": "Vraća sinus stepena (ne radijan).", + "MATH_TRIG_TOOLTIP_COS": "Vraća kosinus stepena (ne radijan).", + "MATH_TRIG_TOOLTIP_TAN": "Vraća tangens stepena (ne radijan).", + "MATH_TRIG_TOOLTIP_ASIN": "Vraća arkus broja.", + "MATH_TRIG_TOOLTIP_ACOS": "Vraća arkus kosinus broja.", + "MATH_TRIG_TOOLTIP_ATAN": "Vraća arkus tangens broja.", + "MATH_CONSTANT_HELPURL": "https://sr.wikipedia.org/wiki/Matematička_konstanta", + "MATH_CONSTANT_TOOLTIP": "vrati jednu od zajedničkih konstanti: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), ili ∞ (infinity).", + "MATH_IS_EVEN": "je paran", + "MATH_IS_ODD": "je neparan", + "MATH_IS_PRIME": "je prost", + "MATH_IS_WHOLE": "je ceo", + "MATH_IS_POSITIVE": "je pozitivan", + "MATH_IS_NEGATIVE": "je negativan", + "MATH_IS_DIVISIBLE_BY": "je deljiv sa", + "MATH_IS_TOOLTIP": "Provjerava da li je broj paran, neparan, prost, cio, pozitivan, negativan, ili da li je deljiv sa određenim brojem. Vraća tačno ili netačno.", + "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", + "MATH_CHANGE_TITLE": "promeni %1 za %2", + "MATH_CHANGE_TOOLTIP": "Dodajte broj promenljivoj „%1“.", + "MATH_ROUND_HELPURL": "https://sr.wikipedia.org/wiki/Zaokruživanje", + "MATH_ROUND_TOOLTIP": "Zaokružite broj na veću ili manju vrednost.", + "MATH_ROUND_OPERATOR_ROUND": "zaokruži", + "MATH_ROUND_OPERATOR_ROUNDUP": "zaokruži naviše", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "zaokruži naniže", + "MATH_ONLIST_OPERATOR_SUM": "zbir spiska", + "MATH_ONLIST_TOOLTIP_SUM": "Vraća zbir svih brojeva sa spiska.", + "MATH_ONLIST_OPERATOR_MIN": "min. spiska", + "MATH_ONLIST_TOOLTIP_MIN": "Vraća najmanji broj sa spiska.", + "MATH_ONLIST_OPERATOR_MAX": "maks. spiska", + "MATH_ONLIST_TOOLTIP_MAX": "Vraća najveći broj sa spiska.", + "MATH_ONLIST_OPERATOR_AVERAGE": "prosek spiska", + "MATH_ONLIST_TOOLTIP_AVERAGE": "Vraća prosek numeričkih vrednosti sa spiska.", + "MATH_ONLIST_OPERATOR_MEDIAN": "medijana spiska", + "MATH_ONLIST_TOOLTIP_MEDIAN": "Vraća medijanu sa spiska.", + "MATH_ONLIST_OPERATOR_MODE": "modus spiska", + "MATH_ONLIST_TOOLTIP_MODE": "Vraća najčešće stavke sa spiska.", + "MATH_ONLIST_OPERATOR_STD_DEV": "standardna devijacija spiska", + "MATH_ONLIST_TOOLTIP_STD_DEV": "Vraća standardnu devijaciju spiska.", + "MATH_ONLIST_OPERATOR_RANDOM": "slučajna stavka spiska", + "MATH_ONLIST_TOOLTIP_RANDOM": "Vraća slučajni element sa spiska.", + "MATH_MODULO_HELPURL": "https://sr.wikipedia.org/wiki/Kongruencija", + "MATH_MODULO_TITLE": "podsetnik od %1 ÷ %2", + "MATH_MODULO_TOOLTIP": "Vraća podsetnik od deljenja dva broja.", + "MATH_CONSTRAIN_TITLE": "ograniči %1 nisko %2 visoko %3", + "MATH_CONSTRAIN_TOOLTIP": "Ograničava broj na donje i gornje granice (uključivo).", + "MATH_RANDOM_INT_HELPURL": "https://sr.wikipedia.org/wiki/Generator_slučajnih_brojeva", + "MATH_RANDOM_INT_TITLE": "sličajno odabrani cijeli broj od %1 do %2", + "MATH_RANDOM_INT_TOOLTIP": "Vraća slučajno odabrani celi broj između dve određene granice, uključivo.", + "MATH_RANDOM_FLOAT_HELPURL": "https://sr.wikipedia.org/wiki/Generator_slučajnih_brojeva", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "slučajni razlomak", + "MATH_RANDOM_FLOAT_TOOLTIP": "Vraća slučajni razlomak između 0.0 (uključivo) i 1.0 (isključivo).", + "TEXT_TEXT_HELPURL": "https://sr.wikipedia.org/wiki/Niska", + "TEXT_TEXT_TOOLTIP": "Slovo, reč ili red teksta.", + "TEXT_JOIN_TITLE_CREATEWITH": "napiši tekst sa", + "TEXT_JOIN_TOOLTIP": "Napraviti dio teksta spajajući različite stavke.", + "TEXT_CREATE_JOIN_TITLE_JOIN": "spajanjem", + "TEXT_CREATE_JOIN_TOOLTIP": "Dodaj, ukloni, ili drugačije poredaj odjelke kako bi iznova postavili ovaj tekst blok.", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Dodajte stavku u tekst.", + "TEXT_APPEND_TITLE": "na %1 dodaj tekst %2", + "TEXT_APPEND_TOOLTIP": "Dodajte tekst na promenljivu „%1“.", + "TEXT_LENGTH_TITLE": "dužina teksta %1", + "TEXT_LENGTH_TOOLTIP": "Vraća broj slova (uključujući razmake) u datom tekstu.", + "TEXT_ISEMPTY_TITLE": "%1 je prazan", + "TEXT_ISEMPTY_TOOLTIP": "Vraća tačno ako je dostavljeni tekst prazan.", + "TEXT_INDEXOF_TOOLTIP": "Vraća odnos prvog/zadnjeg pojavljivanja teksta u drugom tekstu. Vrađa %1 ako tekst nije pronađen.", + "TEXT_INDEXOF_TITLE": "u tekstu %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "pronađi prvo pojavljivanje teksta", + "TEXT_INDEXOF_OPERATOR_LAST": "pronađi poslednje pojavljivanje teksta", + "TEXT_CHARAT_TITLE": "u tekstu %1 %2", + "TEXT_CHARAT_FROM_START": "preuzmi slovo #", + "TEXT_CHARAT_FROM_END": "preuzmi slovo # sa kraja", + "TEXT_CHARAT_FIRST": "preuzmi prvo slovo", + "TEXT_CHARAT_LAST": "preuzmi poslednje slovo", + "TEXT_CHARAT_RANDOM": "preuzmi slučajno slovo", + "TEXT_CHARAT_TOOLTIP": "Vraća slovo na određeni položaj.", + "TEXT_GET_SUBSTRING_TOOLTIP": "Vraća određeni deo teksta.", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "u tekstu", + "TEXT_GET_SUBSTRING_START_FROM_START": "preuzmi podnisku iz slova #", + "TEXT_GET_SUBSTRING_START_FROM_END": "preuzmi podnisku iz slova # sa kraja", + "TEXT_GET_SUBSTRING_START_FIRST": "preuzmi podnisku iz prvog slova", + "TEXT_GET_SUBSTRING_END_FROM_START": "slovu #", + "TEXT_GET_SUBSTRING_END_FROM_END": "slovu # sa kraja", + "TEXT_GET_SUBSTRING_END_LAST": "poslednjem slovu", + "TEXT_CHANGECASE_TOOLTIP": "Vraća primerak teksta sa drugačijom veličinom slova.", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "velikim slovima", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "malim slovima", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "svaka reč velikim slovom", + "TEXT_TRIM_TOOLTIP": "Vraća kopiju teksta sa uklonjenim prostorom sa jednog od dva kraja.", + "TEXT_TRIM_OPERATOR_BOTH": "trim praznine sa obe strane", + "TEXT_TRIM_OPERATOR_LEFT": "skratiti prostor sa leve strane", + "TEXT_TRIM_OPERATOR_RIGHT": "skratiti prostor sa desne strane", + "TEXT_PRINT_TITLE": "prikaži %1", + "TEXT_PRINT_TOOLTIP": "Prikažite određeni tekst, broj ili drugu vrednost na ekranu.", + "TEXT_PROMPT_TYPE_TEXT": "pitaj za tekst sa porukom", + "TEXT_PROMPT_TYPE_NUMBER": "pitaj za broj sa porukom", + "TEXT_PROMPT_TOOLTIP_NUMBER": "Pitajte korisnika za broj.", + "TEXT_PROMPT_TOOLTIP_TEXT": "Pitajte korisnika za unos teksta.", + "TEXT_COUNT_MESSAGE0": "broj %1 u %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Broji koliko puta se neki tekst pojavljuje unutar nekog drugog teksta.", + "TEXT_REPLACE_MESSAGE0": "zamena %1 sa %2 u %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "Zamena svih pojava nekog teksta unutar nekog drugog teksta.", + "TEXT_REVERSE_MESSAGE0": "obrnuto %1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "Obrće redosled karaktera u tekstu.", + "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", + "LISTS_CREATE_EMPTY_TITLE": "napravi prazan spisak", + "LISTS_CREATE_EMPTY_TOOLTIP": "vraća listu, dužine 0, ne sadržavajući evidenciju podataka", + "LISTS_CREATE_WITH_TOOLTIP": "Kreiraj listu sa bilo kojim brojem stavki.", + "LISTS_CREATE_WITH_INPUT_WITH": "napravi spisak sa", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "spisak", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Dodajte, izbrišite, ili preuredite delove kako bi se reorganizovali ovaj blok liste.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Dodajte stavku na spisak.", + "LISTS_REPEAT_TOOLTIP": "Pravi listu koja se sastoji od zadane vrednosti koju ponavljamo određeni broj šuta.", + "LISTS_REPEAT_TITLE": "Napraviti listu sa stavkom %1 koja se ponavlja %2 puta", + "LISTS_LENGTH_TITLE": "dužina spiska %1", + "LISTS_LENGTH_TOOLTIP": "Vraća dužinu spiska.", + "LISTS_ISEMPTY_TITLE": "%1 je prazan", + "LISTS_ISEMPTY_TOOLTIP": "Vraća vrednost tačno ako je lista prazna.", + "LISTS_INLIST": "na spisku", + "LISTS_INDEX_OF_FIRST": "pronađi prvo pojavljivanje stavke", + "LISTS_INDEX_OF_LAST": "pronađi poslednje pojavljivanje stavke", + "LISTS_INDEX_OF_TOOLTIP": "Vraća broj prvog i/poslednjeg ulaska elementa u listu. Vraća %1 Ako element nije pronađen.", + "LISTS_GET_INDEX_GET": "preuzmi", + "LISTS_GET_INDEX_GET_REMOVE": "preuzmi i ukloni", + "LISTS_GET_INDEX_REMOVE": "ukloni", + "LISTS_GET_INDEX_FROM_START": "#", + "LISTS_GET_INDEX_FROM_END": "# sa kraja", + "LISTS_GET_INDEX_FIRST": "prva", + "LISTS_GET_INDEX_LAST": "poslednja", + "LISTS_GET_INDEX_RANDOM": "slučajna", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 je prva stavka.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 je poslednja stavka.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Vraća stavku na određenu poziciju na listi.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Vraća prvu stavku na spisku.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Vraća poslednju stavku na spisku.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Vraća slučajnu stavku sa spiska.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Uklanja i vraća stavku sa određenog položaja na spisku.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Uklanja i vraća prvu stavku sa spiska.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Uklanja i vraća poslednju stavku sa spiska.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Uklanja i vraća slučajnu stavku sa spiska.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Uklanja stavku sa određenog položaja na spisku.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Uklanja prvu stavku sa spiska.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Uklanja poslednju stavku sa spiska.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Uklanja slučajnu stavku sa spiska.", + "LISTS_SET_INDEX_SET": "postavi", + "LISTS_SET_INDEX_INSERT": "ubaci na", + "LISTS_SET_INDEX_INPUT_TO": "kao", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Postavlja stavku na određeni položaj na spisku.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Postavlja prvu stavku na spisku.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Postavlja poslednju stavku na spisku.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Postavlja slučajnu stavku na spisku.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Ubacuje stavku na određeni položaj na spisku.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Ubacuje stavku na početak spiska.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Dodajte stavku na kraj spiska.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Ubacuje stavku na slučajno mesto na spisku.", + "LISTS_GET_SUBLIST_START_FROM_START": "preuzmi podspisak od #", + "LISTS_GET_SUBLIST_START_FROM_END": "preuzmi podspisak iz # sa kraja", + "LISTS_GET_SUBLIST_START_FIRST": "preuzmi podspisak od prve", + "LISTS_GET_SUBLIST_END_FROM_START": "do #", + "LISTS_GET_SUBLIST_END_FROM_END": "do # od kraja", + "LISTS_GET_SUBLIST_END_LAST": "do poslednje", + "LISTS_GET_SUBLIST_TOOLTIP": "Pravi kopiju određenog dela liste.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "sortiraj %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Sortirajte kopiju spiska.", + "LISTS_SORT_ORDER_ASCENDING": "rastuće", + "LISTS_SORT_ORDER_DESCENDING": "opadajuće", + "LISTS_SORT_TYPE_NUMERIC": "kao brojeve", + "LISTS_SORT_TYPE_TEXT": "azbučno", + "LISTS_SORT_TYPE_IGNORECASE": "azbučno, ignoriši mala i velika slova", + "LISTS_SPLIT_LIST_FROM_TEXT": "napravite listu sa teksta", + "LISTS_SPLIT_TEXT_FROM_LIST": "da tekst iz liste", + "LISTS_SPLIT_WITH_DELIMITER": "sa razdvajanje", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Podeliti tekst u listu tekstova, razbijanje na svakom graničnik.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Da se pridruži listu tekstova u jedan tekst, podeljenih za razdvajanje.", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "obrnuto %1", + "LISTS_REVERSE_TOOLTIP": "Obrni kopiju spiska.", + "VARIABLES_GET_TOOLTIP": "Vraća vrednost ove promenljive.", + "VARIABLES_GET_CREATE_SET": "Napravi „postavi %1“", + "VARIABLES_SET": "postavi %1 u %2", + "VARIABLES_SET_TOOLTIP": "Postavlja promenljivu tako da bude jednaka ulazu.", + "VARIABLES_SET_CREATE_GET": "Napravi „preuzmi %1“", + "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_DEFNORETURN_TITLE": "da", + "PROCEDURES_DEFNORETURN_PROCEDURE": "uradite nešto", + "PROCEDURES_BEFORE_PARAMS": "sa:", + "PROCEDURES_CALL_BEFORE_PARAMS": "sa:", + "PROCEDURES_DEFNORETURN_TOOLTIP": "Pravi funkciju bez izlaza.", + "PROCEDURES_DEFNORETURN_COMMENT": "Opisati ovu funkciju...", + "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_DEFRETURN_RETURN": "vrati", + "PROCEDURES_DEFRETURN_TOOLTIP": "Pravi funkciju sa izlazom.", + "PROCEDURES_ALLOW_STATEMENTS": "dozvoliti izreke", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Upozorenje: Ova funkcija ima duplikate parametara.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Pokrenite prilagođenu funkciju „%1“.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLRETURN_TOOLTIP": "Pokrenite prilagođenu funkciju „%1“ i koristi njen izlaz.", + "PROCEDURES_MUTATORCONTAINER_TITLE": "ulazi", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Da dodate, uklonite ili pereuporяdočitь ulaza za ovu funkciju.", + "PROCEDURES_MUTATORARG_TITLE": "naziv ulaza:", + "PROCEDURES_MUTATORARG_TOOLTIP": "Dodajte ulazna funkcija.", + "PROCEDURES_HIGHLIGHT_DEF": "Istakni definiciju funkcije", + "PROCEDURES_CREATE_DO": "Napravi „%1“", + "PROCEDURES_IFRETURN_TOOLTIP": "Ukoliko je vrednost tačna, vrati drugu vrednost.", + "PROCEDURES_IFRETURN_WARNING": "Upozorenje: Ovaj blok se može koristiti jedino u definiciji funkcije." +} diff --git a/js/msg/json/sr.json b/js/msg/json/sr.json new file mode 100644 index 0000000..a9df464 --- /dev/null +++ b/js/msg/json/sr.json @@ -0,0 +1,383 @@ +{ + "@metadata": { + "authors": [ + "Rancher", + "아라", + "Perevod16", + "Nikola Smolenski", + "Obsuser", + "Acamicamacaraca", + "BadDog", + "Милан Јелисавчић", + "Zoranzoki21" + ] + }, + "VARIABLES_DEFAULT_NAME": "ставка", + "UNNAMED_KEY": "неименовано", + "TODAY": "Данас", + "DUPLICATE_BLOCK": "Дуплирај", + "ADD_COMMENT": "Додај коментар", + "REMOVE_COMMENT": "Уклони коментар", + "DUPLICATE_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": "Помоћ", + "UNDO": "Опозови", + "REDO": "Понови", + "CHANGE_VALUE_TITLE": "Промена вредности:", + "RENAME_VARIABLE": "Преименуј променљиву…", + "RENAME_VARIABLE_TITLE": "Преименуј све ’%1’ променљиве у:", + "NEW_VARIABLE": "Направи променљиву…", + "NEW_STRING_VARIABLE": "Направи променљиву ниске...", + "NEW_NUMBER_VARIABLE": "Направи променљиву броја...", + "NEW_COLOUR_VARIABLE": "Направи променљиву боје...", + "NEW_VARIABLE_TYPE_TITLE": "Нова врста променљиве:", + "NEW_VARIABLE_TITLE": "Име нове променљиве:", + "VARIABLE_ALREADY_EXISTS": "Променљива под именом ’%1’ већ постоји.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Променљива под именом ’%1’ већ постоји за други тип: ’%2’.", + "DELETE_VARIABLE_CONFIRMATION": "Избрисати %1 употребу променљиве „%2”?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Није могуће избрисати променљиву „%1” јер је део дефиниције функције „%2”", + "DELETE_VARIABLE": "Избриши променљиву ’%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 (ухвати све) услове иф блока.", + "IOS_OK": "У реду", + "IOS_CANCEL": "Откажи", + "IOS_ERROR": "Грешка", + "IOS_PROCEDURES_INPUTS": "УНОСИ", + "IOS_PROCEDURES_ADD_INPUT": "+ Додај унос", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Дозволи изјаве", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Ова функција има дуплиране уносе.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Додај променљиву", + "IOS_VARIABLES_ADD_BUTTON": "Додај", + "IOS_VARIABLES_RENAME_BUTTON": "Преименуј", + "IOS_VARIABLES_DELETE_BUTTON": "Избриши", + "IOS_VARIABLES_VARIABLE_NAME": "Име променљиве", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Не можете да користите празно име променљиве.", + "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": "Проверите услов у „проба”. Ако је услов тачан, тада враћа „ако је тачно” вредност; у другом случају враћа „ако је нетачно” вредност.", + "MATH_NUMBER_HELPURL": "https://sr.wikipedia.org/wiki/Број", + "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://sr.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://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…), или ∞ (бесконачно).", + "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 (искључиво).", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "атан2 од X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "Врати арктангенту тачке (X, Y) у степенима од -180 до 180.", + "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_TITLE": "на %1 додај текст %2", + "TEXT_APPEND_TOOLTIP": "Додаје текст променљивој „%1”.", + "TEXT_LENGTH_TITLE": "дужина текста %1", + "TEXT_LENGTH_TOOLTIP": "Враћа број слова (уклјучујући размаке) у датом тексту.", + "TEXT_ISEMPTY_TITLE": "%1 је празан", + "TEXT_ISEMPTY_TOOLTIP": "Враћа „тачно” ако је достављени текст празан.", + "TEXT_INDEXOF_TOOLTIP": "Враћа индекс првог/задњег појављивања првог текста у другом тексту. Враћа %1 ако текст није пронађен.", + "TEXT_INDEXOF_TITLE": "у тексту %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "пронађи прво појављивање текста", + "TEXT_INDEXOF_OPERATOR_LAST": "пронађи последње појављивање текста", + "TEXT_CHARAT_TITLE": "у тексту %1 %2", + "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": "Питајте корисника за унос текста.", + "TEXT_COUNT_MESSAGE0": "број %1 у %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Броји колико пута се неки текст појављује унутар неког другог текста.", + "TEXT_REPLACE_MESSAGE0": "замена %1 са %2 у %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "Замена свих појава неког текста унутар неког другог текста.", + "TEXT_REVERSE_MESSAGE0": "обрнуто %1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "Обрће редослед карактера у тексту.", + "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": "Враћа индекс прве/последње појаве ставке на списку. Враћа %1 ако ставка није пронађена.", + "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_INDEX_FROM_START_TOOLTIP": "%1 је прва ставка.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 је последња ставка.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Враћа ставку на одређену позицију на списку.", + "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": "Уклања и враћа ставку са одређеног положаја са списка.", + "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": "Уклања ставку са одређеног положаја са списка.", + "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": "Поставља ставку на одређени положај на списку.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Поставља прву ставку на списку.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Поставља последњу ставку на списку.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Поставља случајну ставку на списку.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Убацује ставку на одређени положај на списку.", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "сортирај %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Сортирајте копију списка.", + "LISTS_SORT_ORDER_ASCENDING": "растуће", + "LISTS_SORT_ORDER_DESCENDING": "опадајуће", + "LISTS_SORT_TYPE_NUMERIC": "као бројеве", + "LISTS_SORT_TYPE_TEXT": "азбучно", + "LISTS_SORT_TYPE_IGNORECASE": "азбучно, игнориши мала и велика слова", + "LISTS_SPLIT_LIST_FROM_TEXT": "направите листу са текста", + "LISTS_SPLIT_TEXT_FROM_LIST": "направи текст из списка", + "LISTS_SPLIT_WITH_DELIMITER": "са граничником", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Раздваја текст у списак текстова, преламањем на сваком граничнику.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Спаја списак текстова у један текст, раздвојених граничником.", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "обрнуто %1", + "LISTS_REVERSE_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_DEFNORETURN_COMMENT": "Опишите ову функцију…", + "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_DEFRETURN_RETURN": "врати", + "PROCEDURES_DEFRETURN_TOOLTIP": "Прави функцију са излазом.", + "PROCEDURES_ALLOW_STATEMENTS": "дозволи изјаве", + "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_MUTATORCONTAINER_TOOLTIP": "Додајте, уклоните или преуредите уносе за ову функцију.", + "PROCEDURES_MUTATORARG_TITLE": "име параметра:", + "PROCEDURES_MUTATORARG_TOOLTIP": "Додајте улазни параметар финкцији.", + "PROCEDURES_HIGHLIGHT_DEF": "Истакни дефиницију функције", + "PROCEDURES_CREATE_DO": "Направи „%1”", + "PROCEDURES_IFRETURN_TOOLTIP": "Ако је прва вредност тачна, враћа другу вредност.", + "PROCEDURES_IFRETURN_WARNING": "Упозорење: Овај блок се може користити једино унутар дефиниције функције.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Кажите нешто…", + "WORKSPACE_ARIA_LABEL": "Блоклијев радни простор", + "COLLAPSED_WARNINGS_WARNING": "Срушени блокови садрже упозорења." +} diff --git a/js/msg/json/sv.json b/js/msg/json/sv.json new file mode 100644 index 0000000..65aa0a9 --- /dev/null +++ b/js/msg/json/sv.json @@ -0,0 +1,377 @@ +{ + "@metadata": { + "authors": [ + "Jopparn", + "WikiPhoenix", + "Abbedabb", + "Aaoo", + "아라", + "Eldaria", + "Smuda" + ] + }, + "VARIABLES_DEFAULT_NAME": "föremål", + "UNNAMED_KEY": "namnlös", + "TODAY": "Idag", + "DUPLICATE_BLOCK": "Duplicera", + "ADD_COMMENT": "Lägg till kommentar", + "REMOVE_COMMENT": "Radera kommentar", + "DUPLICATE_COMMENT": "Duplicera 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": "Städa 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", + "UNDO": "Ångra", + "REDO": "Gör om", + "CHANGE_VALUE_TITLE": "Ändra värde:", + "RENAME_VARIABLE": "Byt namn på variabel...", + "RENAME_VARIABLE_TITLE": "Byt namn på alla'%1'-variabler till:", + "NEW_VARIABLE": "Skapa variabel...", + "NEW_STRING_VARIABLE": "Skapa strängvariabel...", + "NEW_NUMBER_VARIABLE": "Skapa siffervariabel...", + "NEW_COLOUR_VARIABLE": "Skapa färgvariabel...", + "NEW_VARIABLE_TYPE_TITLE": "Ny variabeltyp:", + "NEW_VARIABLE_TITLE": "Nytt variabelnamn:", + "VARIABLE_ALREADY_EXISTS": "En variabel med namn \"%1\" finns redan.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "En variabel med namnet \"%1\" finns redan för en annan typ: \"%2\".", + "DELETE_VARIABLE_CONFIRMATION": "Radera %1 användningar av variabeln \"%2\"?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Kan inte radera variabeln '%1' eftersom den är en del av definition för funktionen '%2'", + "DELETE_VARIABLE": "Radera variabeln \"%1\"", + "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 så länge", + "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\" anta 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": "Bryt 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. Utför annars 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.", + "IOS_OK": "OK", + "IOS_CANCEL": "Avbryt", + "IOS_ERROR": "Fel", + "IOS_PROCEDURES_INPUTS": "INMATNINGAR", + "IOS_PROCEDURES_ADD_INPUT": "+ Lägg till inmatning", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Tillåt kommandon", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Denna funktion har dubblettinmatningar.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Lägg till variabel", + "IOS_VARIABLES_ADD_BUTTON": "Lägg till", + "IOS_VARIABLES_RENAME_BUTTON": "Döp om", + "IOS_VARIABLES_DELETE_BUTTON": "Radera", + "IOS_VARIABLES_VARIABLE_NAME": "Variabelnamn", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Du kan inte använda ett tomt variabelnamn.", + "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 (inkluderande).", + "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, inkluderande.", + "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).", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 av X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "Returnerar arcustangens av punkt (X, Y) i grader från -180 till 180.", + "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_TITLE": "för att %1 lägga till text %2", + "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 %1 om texten inte hittas.", + "TEXT_INDEXOF_TITLE": "i texten %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "hitta första förekomsten av texten", + "TEXT_INDEXOF_OPERATOR_LAST": "hitta sista förekomsten av texten", + "TEXT_CHARAT_TITLE": "i texten %1 %2", + "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.", + "TEXT_COUNT_MESSAGE0": "räkna %1 i %2", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Räkna hur många gånger en text förekommer inom en annan text.", + "TEXT_REPLACE_MESSAGE0": "ersätt %1 med %2 i %3", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "Ersätt alla förekomster av en text inom en annan text.", + "TEXT_REVERSE_MESSAGE0": "vänd på %1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "Vänder på teckenordningen i texten.", + "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. Returnerar %1 om objektet inte hittas.", + "LISTS_GET_INDEX_GET": "hämta", + "LISTS_GET_INDEX_GET_REMOVE": "hämta och ta bort", + "LISTS_GET_INDEX_REMOVE": "ta bort", + "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_INDEX_FROM_START_TOOLTIP": "%1 är det första objektet.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 är det sista objektet.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Ger tillbaka objektet på den efterfrågade positionen i en lista.", + "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": "Tar bort och återställer objektet på den specificerade positionen i en lista.", + "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": "Tar bort objektet på den specificerade positionen i en lista.", + "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": "Sätter in objektet vid en specificerad position i en lista.", + "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": "Sätter in objektet vid en specificerad position i en lista.", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "sortera %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Sortera en kopia av en lista.", + "LISTS_SORT_ORDER_ASCENDING": "stigande", + "LISTS_SORT_ORDER_DESCENDING": "fallande", + "LISTS_SORT_TYPE_NUMERIC": "numeriskt", + "LISTS_SORT_TYPE_TEXT": "alfabetiskt", + "LISTS_SORT_TYPE_IGNORECASE": "alfabetiskt, ignorera skiftläge", + "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.", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "vänd på %1", + "LISTS_REVERSE_TOOLTIP": "Vänd på en kopia av en lista.", + "VARIABLES_GET_TOOLTIP": "Returnerar värdet av denna variabel.", + "VARIABLES_GET_CREATE_SET": "Skapa \"välj %1\"", + "VARIABLES_SET": "ange %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_DEFNORETURN_COMMENT": "Beskriv denna funktion...", + "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://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Kör den användardefinierade funktionen \"%1\".", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "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_HELPURL": "http://c2.com/cgi/wiki?GuardClause", + "PROCEDURES_IFRETURN_WARNING": "Varning: Detta block får användas endast i en funktionsdefinition.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Säg någonting...", + "WORKSPACE_ARIA_LABEL": "Blocklys arbetsyta", + "COLLAPSED_WARNINGS_WARNING": "Hopfällda block innehåller varningar." +} diff --git a/js/msg/json/synonyms.json b/js/msg/json/synonyms.json new file mode 100644 index 0000000..944aa9b --- /dev/null +++ b/js/msg/json/synonyms.json @@ -0,0 +1 @@ +{"PROCEDURES_DEFRETURN_TITLE": "PROCEDURES_DEFNORETURN_TITLE", "CONTROLS_IF_IF_TITLE_IF": "CONTROLS_IF_MSG_IF", "CONTROLS_WHILEUNTIL_INPUT_DO": "CONTROLS_REPEAT_INPUT_DO", "CONTROLS_IF_MSG_THEN": "CONTROLS_REPEAT_INPUT_DO", "LISTS_GET_SUBLIST_INPUT_IN_LIST": "LISTS_INLIST", "CONTROLS_IF_ELSE_TITLE_ELSE": "CONTROLS_IF_MSG_ELSE", "PROCEDURES_DEFRETURN_PROCEDURE": "PROCEDURES_DEFNORETURN_PROCEDURE", "TEXT_CREATE_JOIN_ITEM_TITLE_ITEM": "VARIABLES_DEFAULT_NAME", "LISTS_GET_INDEX_INPUT_IN_LIST": "LISTS_INLIST", "PROCEDURES_DEFRETURN_COMMENT": "PROCEDURES_DEFNORETURN_COMMENT", "CONTROLS_IF_ELSEIF_TITLE_ELSEIF": "CONTROLS_IF_MSG_ELSEIF", "PROCEDURES_DEFRETURN_DO": "PROCEDURES_DEFNORETURN_DO", "CONTROLS_FOR_INPUT_DO": "CONTROLS_REPEAT_INPUT_DO", "LISTS_GET_INDEX_HELPURL": "LISTS_INDEX_OF_HELPURL", "LISTS_INDEX_OF_INPUT_IN_LIST": "LISTS_INLIST", "CONTROLS_FOREACH_INPUT_DO": "CONTROLS_REPEAT_INPUT_DO", "LISTS_CREATE_WITH_ITEM_TITLE": "VARIABLES_DEFAULT_NAME", "TEXT_APPEND_VARIABLE": "VARIABLES_DEFAULT_NAME", "MATH_CHANGE_TITLE_ITEM": "VARIABLES_DEFAULT_NAME", "LISTS_SET_INDEX_INPUT_IN_LIST": "LISTS_INLIST"} \ No newline at end of file diff --git a/js/msg/json/ta.json b/js/msg/json/ta.json new file mode 100644 index 0000000..73d636d --- /dev/null +++ b/js/msg/json/ta.json @@ -0,0 +1,301 @@ +{ + "@metadata": { + "authors": [ + "ElangoRamanujam", + "Ezhillang", + "Karuthan", + "Thangamani-arun", + "Mahir78" + ] + }, + "VARIABLES_DEFAULT_NAME": "உருப்படி", + "UNNAMED_KEY": "பெயரிடப்படாதது", + "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": "உதவி", + "CHANGE_VALUE_TITLE": "மதிப்பை மாற்றவும்:", + "RENAME_VARIABLE": "மாறிலியை மறுபெயரிடுக...", + "RENAME_VARIABLE_TITLE": "அனைத்து '%1' மாறிலிகளையும் பின்வருமாறு மறுபெயரிடுக:", + "NEW_VARIABLE": "மாறிலியை உருவாக்குக...", + "NEW_VARIABLE_TITLE": "புதிய மாறிலியின் பெயர்:", + "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": "ஆனால் தொகுப்பிற்கு விதிவிலக்கு காப்பை சேர்க்க", + "IOS_VARIABLES_ADD_BUTTON": "சேர்க்கவும்", + "IOS_VARIABLES_RENAME_BUTTON": "பெயர் மாற்றுக", + "IOS_VARIABLES_DELETE_BUTTON": "நீக்கவும்", + "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_TITLE": "இந்த மாறியிற்கு %1 உரை சேர்க்க %2", + "TEXT_APPEND_TOOLTIP": "'%1' மாறியில் உரையை சேர்", + "TEXT_LENGTH_TITLE": "%1ன் நீளம்", + "TEXT_LENGTH_TOOLTIP": "தொடரில் உள்ள எழுத்துக்களின் (இடைவெளிகளையும் சேர்த்து) எண்ணிகையை பின்கொடு.", + "TEXT_ISEMPTY_TITLE": "%1 காலியானது", + "TEXT_ISEMPTY_TOOLTIP": "காலியானது என்றால் மெய் மதிப்பை பின்கொடு", + "TEXT_INDEXOF_TOOLTIP": "இரண்டாவது உரையில் முதல் உரையின் முதல்/கடை இருக்கை குறிஎண்ணை பின்கொடு.", + "TEXT_INDEXOF_TITLE": "உரையில் %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "உரையில் முதல் தோற்ற இடத்தை பின்கொடு", + "TEXT_INDEXOF_OPERATOR_LAST": "உரையில் கடைசி தோற்ற இடத்தை பின்கொடு", + "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": "பட்டியலில் மதிப்பின் முதல், கடைசி தோற்ற இடத்தை பின்கொடு. காணாவிட்டால் %1 பின்கொடு.", + "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_INDEX_FROM_START_TOOLTIP": "%1 முதல் உருப்படி.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 கடைசி உருப்படி.ி", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "பட்டியலில் இடத்தில் உருப்படி பின்கொடு.", + "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": "பட்டியலில் கேட்ட இடத்தின் உருப்படி நீக்கி பின்கொடு.", + "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": "பட்டியலில் கேட்ட இடத்தின் உருப்படி நீக்கு.", + "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": "பட்டியலில் கேட்ட இடத்தில் உருப்படியை வை.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "மதிப்பை பட்டியலில் முதல் உருப்படியில் வை", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "மதிப்பை பட்டியலில் கடைசி உருப்படியில் வை", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "மதிப்பை பட்டியலில் சீரற்ற உருப்படியில் வை", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "பட்டியலில் கேட்ட இடத்தில் உருப்படியை நுழை.", + "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/Subroutine", + "PROCEDURES_CALLNORETURN_TOOLTIP": "பயனரின் '%1' செயற்கூற்றை ஓட்டு.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "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": "மதிப்பு உண்மையானால், இரண்டாவது மதிப்பை பின்கொடு.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "ஏதாகினும் பகர்க..." +} diff --git a/js/msg/json/tcy.json b/js/msg/json/tcy.json new file mode 100644 index 0000000..fa1883e --- /dev/null +++ b/js/msg/json/tcy.json @@ -0,0 +1,328 @@ +{ + "@metadata": { + "authors": [ + "Vishwanatha Badikana", + "Bharathesha Alasandemajalu", + "Kiranpoojary", + "BHARATHESHA ALASANDEMAJALU", + "Ravi Mundkur" + ] + }, + "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": "ಸಕಾಯೊ", + "UNDO": "ದುಂಬುದಲೆಕೊ", + "REDO": "ಕುಡ ಮಲ್ಪು", + "CHANGE_VALUE_TITLE": "ಮೌಲ್ಯೊನು ಬದಲ್ ಮಲ್ಪು", + "RENAME_VARIABLE": "ವ್ಯತ್ಯಯೊಗು ಕುಡೊರ ಪುದರ್ ದೀಲೆ", + "RENAME_VARIABLE_TITLE": "ಮಾತಾ '%1' ವ್ಯತ್ಯಯೊಲೆನ ಪುದರ್‌ನ್ ನೆಕ್ಕ್ ಬದಲ್ ಮಲ್ಪುಲೆ:", + "NEW_VARIABLE": "ವ್ಯತ್ಯಯೊನು ಉಂಡು ಮಲ್ಪುಲೆ", + "NEW_VARIABLE_TITLE": "ಪೊಸ ವ್ಯತ್ಯಯೊದ ಪುದರ್:", + "VARIABLE_ALREADY_EXISTS": "'%1' ಪನ್ಪಿ ಪುದರ್‌ದ ವ್ಯತ್ಯಯೊ ದುಂಬೆ ಅಸ್ತಿತ್ವೊಡು ಉಂಡು.", + "DELETE_VARIABLE_CONFIRMATION": "'%2' ವ್ಯತ್ಯಯೊದ %1 ಉಪಯೋಗೊಲೆನ್ ಮಾಜಾವೊಡೆ?", + "DELETE_VARIABLE": "'%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_FOR_TITLE": "%2 ಡ್ದ್ %3 ಮುಟ %4 ಸರ್ತಿ %1 ದ ಒಟ್ಟುಗು ಗೆನ್ಪು", + "CONTROLS_FOREACH_TITLE": "%2 ಪಟ್ಟಿಡ್ ಪ್ರತಿ ಒಂಜಿ ವಿಸಯ %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": "'ಒಂಜಿ ವೇಲೆ' ತಡೆಕ್ಕ್ ಒಂಜಿ ಕಡೆತ್ತ ಮಾತೆನ್ಲಾ-ಪತ್ತ್ (catch-all) ಶರ್ತನ್ ಸೇರಾವ್", + "IOS_OK": "ಸರಿ", + "IOS_CANCEL": "ವಜಾ ಮಲ್ಪುಲೆ", + "IOS_ERROR": "ದೋಷ", + "IOS_PROCEDURES_INPUTS": "ಇನ್‌ಪುಟ್‌ಲು", + "IOS_PROCEDURES_ADD_INPUT": "+ ಇನ್‌ಪುಟ್ ಸೇರಾಲೆ", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "ಹೇಳಿಕೆಗ್ ಅವಕಾಸೊ", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "ಈ ಕಾರ್ಯೊಡು ಡುಪ್ಲಿಕೇಟ್ ಇನ್‌ಪುಟ್ ಉಂಡು.", + "IOS_VARIABLES_ADD_VARIABLE": "+ ವ್ಯತ್ಯಯೊನು ಸೇರಾಲೆ", + "IOS_VARIABLES_ADD_BUTTON": "ಸೇರಾಲೆ", + "IOS_VARIABLES_RENAME_BUTTON": "ಪೊಸ ಪುದರ್", + "IOS_VARIABLES_DELETE_BUTTON": "ಮಾಜಾಲೆ", + "IOS_VARIABLES_VARIABLE_NAME": "ವ್ಯತ್ಯಯೊದ ಪುದರ್", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "ವ್ಯತ್ಯಯೊದ ಪುದರ್‌ನ್ ಖಾಲಿ ಬುಡಿಯೆರೆ ಆಪುಜಿ", + "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/ಸಂಖ್ಯೆ", + "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/ವರ್ಗಮೂಲೊ", + "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/ತ್ರಿಕೋನಮಿತಿದ_ಕಾರ್ಯೊಲು", + "MATH_TRIG_TOOLTIP_SIN": "ಒಂಜಿ ಡಿಗ್ರಿದ ಸೈನ್ (sine) ಪಿರಕೊರು (ರೇಡಿಯನ್ ಅತ್ತ್).", + "MATH_TRIG_TOOLTIP_COS": "ಒಂಜಿ ಡಿಗ್ರಿದ ಕೊಸೈನ್ (cosine) ಪಿರಕೊರು (ರೇಡಿಯನ್ ಅತ್ತ್).", + "MATH_TRIG_TOOLTIP_TAN": "ಒಂಜಿ ಡಿಗ್ರಿದ ಟ್ಯಾನ್‌ಜೆಂಟ್ (tangent) ಪಿರಕೊರು (ರೇಡಿಯನ್ ಅತ್ತ್).", + "MATH_TRIG_TOOLTIP_ASIN": "ಒಂಜಿ ಸಂಖ್ಯೆದ ಆರ್ಕ್‌ಸೈನ್ ಪಿರಕೊರು.", + "MATH_TRIG_TOOLTIP_ACOS": "ಒಂಜಿ ಸಂಖ್ಯೆದ ಆರ್ಕ್‌‌ಕೊಸೈನ್ ಪಿರಕೊರು.", + "MATH_TRIG_TOOLTIP_ATAN": "ಒಂಜಿ ಸಂಖ್ಯೆದ ಆರ್ಕ್‌ಟ್ಯಾನ್‌ಜ್ಂಟ್ ಪಿರಕೊರು.", + "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/ಗಣಿತ_ನಿರಂತರ", + "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/ಪೂರ್ಣಾಂಕೊ", + "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/ಮೋಡ್ಯುಲೊ_ಒಪರೇಶನ್", + "MATH_MODULO_TITLE": " %1 ÷ %2 ತ ಶೇಷ", + "MATH_MODULO_TOOLTIP": "ರಡ್ಡ್ ಸಂಖ್ಯೆಲೆನ್ ಭಾಗ ಮಲ್ತ್‌ದ್ ಶೇಷೊನು ಪಿರಕೊರು.", + "MATH_CONSTRAIN_TITLE": "%2 ಕಮ್ಮಿ %3 ಜಾಸ್ತಿ %1 ನಿರ್ಬಂಧ ಮಲ್ಪು", + "MATH_CONSTRAIN_TOOLTIP": "ನಿಗದಿತ ಮಿತಿತ ನಡುಟು ಒಂಜಿ ಸಂಖ್ಯೆನ್ ನಿರ್ಬಂಧ ಮಲ್ಪು", + "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/ರಾಂಡಮ್_ನಂಬರ್_ಜನರೇಶನ್", + "MATH_RANDOM_INT_TITLE": " %1 ಡ್ದ್ %2 ಯಾದೃಚ್ಛಿಕ ಪೂರ್ಣಾಂಕೊ", + "MATH_RANDOM_INT_TOOLTIP": "ರಡ್ಡ್ ನಿಗದಿತ ಮಿತಿತ ನಡುತ್ತ ಯಾದೃಚ್ಛಿಕ ಪೂರ್ಣಾಂಕೊನು ಪಿರಕೊರು", + "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/ರಾಂಡಮ್_ನಂಬರ್_ಜನರೇಶನ್", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "ಒವ್ವಾಂಡಲ ಒಂಜಿ ಭಿನ್ನರಾಶಿ", + "MATH_RANDOM_FLOAT_TOOLTIP": "0.0 (ಸೇರ್‌ದ್) ಬೊಕ್ಕ 1.0 (ಸೇರಂದೆ) ನಡುತ ಒವ್ವಾಂಡಲ ಒಂಜಿ ಭಿನ್ನರಾಶಿನ್ ಪಿರಕೊರು.", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "TEXT_TEXT_HELPURL": "https://en.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_TITLE": "ಇಂದೆಕ್ %1 ಪಟ್ಯೊನು ಸೇರವೆ %2", + "TEXT_APPEND_TOOLTIP": "%1 ವ್ಯತ್ಯಯೊಗು ಕೆಲವು ಪಟ್ಯೊಲೆನ್ ಸೇರಾವ್", + "TEXT_LENGTH_TITLE": "%1 ಉದ್ದೊ", + "TEXT_LENGTH_TOOLTIP": "ಕೊರಿನ ಪಟ್ಯೊದ ಅಕ್ಷರೊಲೆನ (ಅಂತರೊಲು ಸೇರ್‌ದ್) ಸಂಖ್ಯೆನ್ ಪಿರಕೊರು.", + "TEXT_ISEMPTY_TITLE": "%1 ಖಾಲಿ", + "TEXT_ISEMPTY_TOOLTIP": "ಕೊರಿನ ಪಟ್ಯೊ ಖಾಲಿ ಇತ್ತ್ಂಡ 'ನಿಜ'ನ್ ಪಿರಕೊರು.", + "TEXT_INDEXOF_TOOLTIP": "ರಡ್ಡನೆ ಪಟ್ಯೊಡು ಉಪ್ಪುನ ಸುರುತ ಪಟ್ಯೊ ಸುರುಕ್ಕು/ಅಕೇರಿಗ್ ಬತ್ತಿನೆತ್ತ ಸೂಚಿನ್ ಪಿರಕೊರು. ಪಟ್ಯೊ ತಿಕ್ಕಿಜ್ಜಾಂಡ %1 ನ್ ಪಿರಕೊರು.", + "TEXT_INDEXOF_TITLE": "ಪಟ್ಯೊಡು %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "ಪಟ್ಯೊ ಸುರುಕ್ಕು ಬತ್ತಿನೇನ್ ನಾಡ್", + "TEXT_INDEXOF_OPERATOR_LAST": "ಪಟ್ಯೊ ಅಕೇರಿಗ್ ಬತ್ತಿನೇನ್ ನಾಡ್", + "TEXT_CHARAT_TITLE": "%1 %2 ಪದೊಟ್ಟು", + "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": "ಪಟ್ಯೊದ ಒಂಜಿ ನಕಲ್‍ನ್ ಬೇತೆ ನಮೂನೆಡ್ (case) ಪಿರಕೊರು.", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "ಮಲ್ಲ ಅಕ್ಷರೊಗು", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "ಎಲ್ಯ ಅಕ್ಷರೊಗು", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "ತರೆಬರವುದ ಅಕ್ಷರೊಗು", + "TEXT_TRIM_TOOLTIP": "ಒಂಜಿ ಅತ್ತಂಡ ರಡ್ಡ್ ಕೊಡಿಡ್ದ್ ಅಂತರೊಲೆನ್ (space) ದೆತ್ತ್‌ದ್ ಪಟ್ಯೊದ ಪ್ರತಿನ್ ಪಿರಕೊರು.", + "TEXT_TRIM_OPERATOR_BOTH": "ರಡ್ಡ್ ಮೆಯಿತ್ತಲ ಅಂತರೊಲೆನ್ (space) ಕತ್ತೆರ್.", + "TEXT_TRIM_OPERATOR_LEFT": "ಎಡತ್ತ ಮೆಯಿತ್ತ ಅಂತರೊಲೆನ್ (space) ಕತ್ತೆರ್.", + "TEXT_TRIM_OPERATOR_RIGHT": "ಬಲತ್ತ ಮೆಯಿತ್ತ ಅಂತರೊಲೆನ್ (space) ಕತ್ತೆರ್.", + "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": "ಪಟ್ಟಿಡುಪ್ಪುನ ವಿಸಯೊ ಸುರುಕ್ಕು/ಅಕೇರಿಗ್ ಬತ್ತಿನೆತ್ತ ಸೂಚಿನ್ ಪಿರಕೊರ್ಪುಂಡು. ವಿಸಯೊ ತಿಕ್ಕಿಜ್ಜಾಂಡ %1 ನ್ ಪಿರಕೊರ್ಪುಂಡು.", + "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_INDEX_FROM_START_TOOLTIP": "%1 ಸುರುತ ವಿಸಯೊ", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 ಅಕೇರಿತ ವಿಸಯೊ", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "ಒಂಜಿ ಪಟ್ಟಿಡ್ ನಿರ್ದಿಷ್ಟ ಸ್ಥಿತಿಡ್ ವಿಸಯೊನು ಪಿರಕೊರ್ಪುಂಡು.", + "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": "ಒಂಜಿ ಪಟ್ಟಿಡ್ ನಿರ್ದಿಷ್ಟ ಸ್ಥಿತಿಡ್ ವಿಸಯೊನು ಪಿರಕೊರ್ಪುಂಡು ಬೊಕ್ಕ ದೆತ್ತ್ ಬುಡ್ಪುಂಡು.", + "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": "ಒಂಜಿ ಪಟ್ಟಿಡ್ ನಿರ್ದಿಷ್ಟ ಸ್ಥಿತಿಡ್ ವಿಸಯೊನು ದೆತ್ತ್ ಬುಡ್ಪುಂಡು.", + "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": "ಒಂಜಿ ಪಟ್ಟಿಡ್ ನಿರ್ದಿಷ್ಟ ಸ್ಥಿತಿಡ್ ವಿಸಯೊನು ಸೆಟ್ ಮಲ್ಪುಂಡು.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "ಒಂಜಿ ಪಟ್ಟಿಡ್ ಸುರುತ್ತ ವಿಸಯೊನು ಸೆಟ್ ಮಲ್ಪುಂಡು.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "ಒಂಜಿ ಪಟ್ಟಿಡ್ ಅಕೇರಿದ ವಿಸಯೊನು ಸೆಟ್ ಮಲ್ಪುಂಡು.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "ಒಂಜಿ ಪಟ್ಟಿಡ್ ಒವ್ವಾಂಡಲ ಒಂಜಿ ವಿಸಯೊನು ಸೆಟ್ ಮಲ್ಪುಂಡು.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "ಒಂಜಿ ಪಟ್ಟಿಡ್ ನಿರ್ದಿಷ್ಟ ಸ್ಥಿತಿಡ್ ವಿಸಯೊನು ಸೇರಾವುಂಡು.", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "%1 %2 %3 ಇಂಗಡಿಪು", + "LISTS_SORT_TOOLTIP": "ಒಂಜಿ ಪಟ್ಟಿದ ಒಂಜಿ ಪ್ರತಿನ್ ಇಂಗಡಿಪು", + "LISTS_SORT_ORDER_ASCENDING": "ಏರುನು", + "LISTS_SORT_ORDER_DESCENDING": "ಜಪ್ಪುನು", + "LISTS_SORT_TYPE_NUMERIC": "ಸಂಖ್ಯೆ", + "LISTS_SORT_TYPE_TEXT": "ಅಕ್ಷರೊ", + "LISTS_SORT_TYPE_IGNORECASE": "ಅಕ್ಷರೊ, ನಮೂನೆ (case) ಅಲಕ್ಷ್ಯೊ ಮಲ್ಪುಲೆ", + "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_DEFNORETURN_COMMENT": "ಈ ಕಾರ್ಯೊನು ಇವರಿಪುಲೆ...", + "PROCEDURES_DEFRETURN_RETURN": "ಪಿರಕೊರು", + "PROCEDURES_DEFRETURN_TOOLTIP": "ಔಟ್‌ಪುಟ್ ಇತ್ತಿನ ಕಾರ್ಯೊನು ಉಂಡುಮಲ್ಪುಂಡು.", + "PROCEDURES_ALLOW_STATEMENTS": "ಹೇಳಿಕೆಗ್ ಅವಕಾಸೊ", + "PROCEDURES_DEF_DUPLICATE_WARNING": "ಎಚ್ಚರಿಕೆ: ಈ ಕಾರ್ಯೊಡು ನಕಲಿ ಮಾನದಂಡೊ ಉಂಡು.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/ವರ್ಗಮೂಲೊ", + "PROCEDURES_CALLNORETURN_TOOLTIP": "'%1' ಬಳಕೆದಾರೆರೆ ಕಾರ್ಯೊನು ನಡಪಾಲೆ.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.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/js/msg/json/te.json b/js/msg/json/te.json new file mode 100644 index 0000000..cfd50cc --- /dev/null +++ b/js/msg/json/te.json @@ -0,0 +1,98 @@ +{ + "@metadata": { + "authors": [ + "Naidugari Jayanna", + "WP MANIKHANTA", + "Veeven" + ] + }, + "VARIABLES_DEFAULT_NAME": "అంశం", + "TODAY": "నేడు", + "DUPLICATE_BLOCK": "నకలు", + "ADD_COMMENT": "వ్యాఖ్య చేర్చు", + "REMOVE_COMMENT": "వ్యాఖ్యను తొలగించు", + "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": "సహాయం", + "UNDO": "రద్దుచెయ్యి", + "REDO": "మళ్ళీ చెయ్యి", + "CHANGE_VALUE_TITLE": "విలువ మార్చు", + "RENAME_VARIABLE": "పునఃనామకరణ వ్యత్యాసం...", + "RENAME_VARIABLE_TITLE": "మొత్తం వ్యత్యాసాలను '%1' దీనికి పునఃనామకరణించు:", + "NEW_VARIABLE": "కొత్త వ్యత్యాసం...", + "NEW_VARIABLE_TITLE": "కొత్త వ్యత్యాసం పేరు:", + "COLOUR_PICKER_HELPURL": "https://te.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://te.wikipedia.org/wiki/For_loop", + "CONTROLS_REPEAT_TITLE": "%1 సార్లు మళ్ళీ కొనసాగించు", + "CONTROLS_REPEAT_INPUT_DO": "చేయు", + "CONTROLS_REPEAT_TOOLTIP": "కొన్ని నివేదికలు లేదా ప్రతిపాదనలు అనేక మార్లు చెయ్యండి.", + "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_IF_MSG_IF": "అయితే", + "LOGIC_OPERATION_AND": "మరియు", + "LOGIC_OPERATION_OR": "లేదా", + "LOGIC_NEGATE_TITLE": "%1 కాదు", + "LOGIC_BOOLEAN_TRUE": "సత్యం", + "LOGIC_BOOLEAN_FALSE": "అసత్యం", + "LOGIC_NULL": "చెల్లని", + "LOGIC_TERNARY_CONDITION": "పరీక్షించు", + "LOGIC_TERNARY_IF_TRUE": "సత్యమైతే", + "LOGIC_TERNARY_IF_FALSE": "అసత్యమైతే", + "MATH_NUMBER_TOOLTIP": "ఒ సంఖ్య.", + "MATH_ARITHMETIC_HELPURL": "https://te.wikipedia.org/wiki/Arithmetic", + "MATH_ARITHMETIC_TOOLTIP_ADD": "రెండు సంఖ్యల మొత్తానికి తిరిగి వెళ్ళండి.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "రెండు సంఖ్యల తేడాకి తిరిగి వెళ్ళండి", + "MATH_IS_POSITIVE": "అనుకూలంగా ఉంది", + "MATH_IS_NEGATIVE": "ప్రతికూలంగా ఉంది", + "MATH_IS_DIVISIBLE_BY": "దీనితో భాగించబడును", + "MATH_ONLIST_OPERATOR_SUM": "జాబితా మొత్తం", + "MATH_ONLIST_OPERATOR_AVERAGE": "జాబితా సగటు", + "TEXT_CREATE_JOIN_TITLE_JOIN": "చేరు", + "TEXT_LENGTH_TITLE": "%1 పొడువు", + "TEXT_ISEMPTY_TITLE": "% 1 ఖాళీ", + "TEXT_CHARAT_FIRST": "మొదటి వర్ణాన్ని పొందు", + "TEXT_CHARAT_LAST": "చివరి వర్ణాన్ని పొందు", + "TEXT_CHARAT_RANDOM": "యాదృశ్చిక వర్ణాన్ని పొందు", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "జాబితా", + "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_INPUT_TO": "గా", + "LISTS_GET_SUBLIST_END_FROM_START": "# కు", + "LISTS_GET_SUBLIST_END_FROM_END": "చివరి నుండి # వరకు", + "LISTS_GET_SUBLIST_END_LAST": "తుదకు", + "PROCEDURES_DEFNORETURN_TITLE": "కు", + "PROCEDURES_DEFNORETURN_PROCEDURE": "ఏదో ఒకటి చేయి", + "PROCEDURES_BEFORE_PARAMS": "తో:", + "PROCEDURES_CALL_BEFORE_PARAMS": "తో:", + "PROCEDURES_DEFRETURN_RETURN": "తిరిగి వెళ్ళు" +} diff --git a/js/msg/json/th.json b/js/msg/json/th.json new file mode 100644 index 0000000..51cdbdf --- /dev/null +++ b/js/msg/json/th.json @@ -0,0 +1,350 @@ +{ + "@metadata": { + "authors": [ + "Azpirin", + "Octahedron80", + "Horus", + "Roysheng", + "Aefgh39622", + "Nantapat", + "Trisorn Triboon", + "Karit" + ] + }, + "VARIABLES_DEFAULT_NAME": "รายการ", + "UNNAMED_KEY": "ไม่มีชื่อ", + "TODAY": "วันนี้", + "DUPLICATE_BLOCK": "ทำสำเนา", + "ADD_COMMENT": "ใส่คำอธิบาย", + "REMOVE_COMMENT": "เอาคำอธิบายออก", + "DUPLICATE_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": "ช่วยเหลือ", + "UNDO": "ย้อนกลับ", + "REDO": "ทำซ้ำ", + "CHANGE_VALUE_TITLE": "เปลี่ยนค่า:", + "RENAME_VARIABLE": "เปลี่ยนชื่อตัวแปร...", + "RENAME_VARIABLE_TITLE": "เปลี่ยนชื่อตัวแปร '%1' ทั้งหมดเป็น:", + "NEW_VARIABLE": "สร้างตัวแปร...", + "NEW_STRING_VARIABLE": "สร้างตัวแปร string", + "NEW_NUMBER_VARIABLE": "สร้างตัวแปรจำนวน", + "NEW_COLOUR_VARIABLE": "สร้างตัวแปรสี", + "NEW_VARIABLE_TYPE_TITLE": "ชนิดตัวแปรใหม่", + "NEW_VARIABLE_TITLE": "ชื่อตัวแปรใหม่:", + "VARIABLE_ALREADY_EXISTS": "มีตัวแปรชื่อ '%1' อยู่แล้ว", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "ตัวแปรชื่อ '%1' มีอยู่แล้วสำหรับตัวแปรอื่นของชนิด: '%2'", + "DELETE_VARIABLE_CONFIRMATION": "ลบการใช้ตัวแปร %2 %1 ครั้งหรือไม่", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "ไม่สามารถลบตัวแปร '%1' ได้เนื่องจากเป็นส่วนหนึ่งของนิยามของฟังก์ชัน '%2'", + "DELETE_VARIABLE": "ลบตัวแปร '%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": "เพิ่มสิ่งสุดท้าย ที่จะตรวจจับความเป็นไปได้ทั้งหมดของบล็อก \"ถ้า\"", + "IOS_OK": "ตกลง", + "IOS_CANCEL": "ยกเลิก", + "IOS_ERROR": "ข้อผิดพลาด", + "IOS_PROCEDURES_INPUTS": "อินพุต", + "IOS_PROCEDURES_ADD_INPUT": "+ เพิ่มอินพุต", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "อนุญาตคำสั่ง", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "ฟังก์ชันนี้มีอินพุตที่ซ้ำกัน", + "IOS_VARIABLES_ADD_VARIABLE": "+ เพิ่มตัวแปร", + "IOS_VARIABLES_ADD_BUTTON": "เพิ่ม", + "IOS_VARIABLES_RENAME_BUTTON": "เปลี่ยนชื่อ", + "IOS_VARIABLES_DELETE_BUTTON": "ลบ", + "IOS_VARIABLES_VARIABLE_NAME": "ชื่อตัวแปร", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "คุณไม่สามารถใช้ชื่อตัวแปรที่ว่างเปล่าได้", + "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", + "MATH_ATAN2_TOOLTIP": "เปลี่ยนอาร์กแทนเจนต์ของชุด (X, Y) จากองศา 180 เป็น -180.", + "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_TITLE": "นำเอา %1 ต่อด้วยข้อความ %2", + "TEXT_APPEND_TOOLTIP": "ต่อข้อความให้ตัวแปร \"%1\"", + "TEXT_LENGTH_TITLE": "ความยาวของ %1", + "TEXT_LENGTH_TOOLTIP": "คืนค่าความยาวของข้อความ (รวมช่องว่าง)", + "TEXT_ISEMPTY_TITLE": "%1 ว่าง", + "TEXT_ISEMPTY_TOOLTIP": "คืนค่าจริง ถ้าข้อความยังว่างเปล่า", + "TEXT_INDEXOF_TOOLTIP": "คืนค่าตำแหน่งที่พบข้อความแรกอยู่ในข้อความที่สอง คืนค่า %1 ถ้าหาไม่พบ", + "TEXT_INDEXOF_TITLE": "ในข้อความ %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "หาข้อความแรกที่พบ", + "TEXT_INDEXOF_OPERATOR_LAST": "หาข้อความสุดท้ายที่พบ", + "TEXT_CHARAT_TITLE": "ในข้อความ %1 %2", + "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": "แสดงหน้าต่างให้ผู้ใช้ใส่ข้อความ", + "TEXT_COUNT_MESSAGE0": "นับ %1 ภายใน %2", + "TEXT_COUNT_TOOLTIP": "นับจำนวนข้อความแรกที่พบอยู่ในข้อความที่สอง", + "TEXT_REPLACE_MESSAGE0": "แทนที่ %1 ด้วย %2 ใน %3", + "TEXT_REPLACE_TOOLTIP": "แทนที่ข้อความแรกทั้งหมดที่พบในข้อความที่สอง", + "TEXT_REVERSE_MESSAGE0": "เรียง %1 แบบย้อนกลับ", + "TEXT_REVERSE_TOOLTIP": "เรียงตัวอักษรทั้งหมดของข้อความแบบย้อนกลับ", + "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": "คืนค่าตำแหน่งของไอเท็มอันแรก/สุดท้ายที่พบในรายการ คืนค่า %1 ถ้าหาไม่พบ", + "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_INDEX_FROM_START_TOOLTIP": "%1 คือไอเท็มอันแรกสุด", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 คือไอเท็มอันท้ายสุด", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "คืนค่าเป็นไอเท็มตามตำแหน่งที่ระบุ", + "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": "เอาออก และคืนค่าไอเท็มในตำแหน่งที่ระบุจากรายการ", + "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": "คืนค่าเป็นไอเท็มตามตำแหน่งที่ระบุ", + "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": "กำหนดไอเท็มในตำแหน่งที่ระบุในรายการ", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "กำหนดไอเท็มอันแรกในรายการ", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "กำหนดไอเท็มอันสุดท้ายในรายการ", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "กำหนดไอเท็มแบบสุ่มในรายการ", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "แทรกไอเท็มเข้าไปในตำแหน่งที่กำหนด", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "เรียงลำดับ %1 %2 %3", + "LISTS_SORT_TOOLTIP": "เรียงลำดับสำเนาของรายชื่อ", + "LISTS_SORT_ORDER_ASCENDING": "น้อยไปหามาก", + "LISTS_SORT_ORDER_DESCENDING": "มากไปหาน้อย", + "LISTS_SORT_TYPE_NUMERIC": "ตัวเลข", + "LISTS_SORT_TYPE_TEXT": "ตัวอักษร", + "LISTS_SORT_TYPE_IGNORECASE": "ตัวอักษร", + "LISTS_SPLIT_LIST_FROM_TEXT": "สร้างรายการจากข้อความ", + "LISTS_SPLIT_TEXT_FROM_LIST": "สร้างข้อความจากรายการ", + "LISTS_SPLIT_WITH_DELIMITER": "ด้วยตัวคั่น", + "LISTS_SPLIT_TOOLTIP_SPLIT": "แบ่งข้อความเป็นรายการข้อความ แยกแต่ละรายการด้วยตัวคั่น", + "LISTS_SPLIT_TOOLTIP_JOIN": "รวมรายการข้อความเป็นข้อความเดียว แบ่งด้วยตัวคั่น", + "LISTS_REVERSE_MESSAGE0": "เรียง %1 แบบย้อนกลับ", + "LISTS_REVERSE_TOOLTIP": "เรียงลำดับสำเนาของรายชื่อแบบย้อนกลับ", + "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_DEFNORETURN_COMMENT": "อธิบายฟังก์ชันนี้", + "PROCEDURES_DEFRETURN_RETURN": "คืนค่า", + "PROCEDURES_DEFRETURN_TOOLTIP": "สร้างฟังก์ชันที่มีผลลัพธ์", + "PROCEDURES_ALLOW_STATEMENTS": "ข้อความที่ใช้ได้", + "PROCEDURES_DEF_DUPLICATE_WARNING": "ระวัง: ฟังก์ชันนี้มีพารามิเตอร์ที่มีชื่อซ้ำกัน", + "PROCEDURES_CALLNORETURN_HELPURL": "https://th.wikipedia.org/wiki/ซับรู้ทีน", + "PROCEDURES_CALLNORETURN_TOOLTIP": "เรียกใช้ฟังก์ชันที่สร้างโดยผู้ใช้ \"%1\"", + "PROCEDURES_CALLRETURN_HELPURL": "https://th.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": "ระวัง: บล็อกนี้ใช้เฉพาะในการสร้างฟังก์ชันเท่านั้น", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "เขียนอะไรสักอย่าง", + "WORKSPACE_ARIA_LABEL": "พื้นที่ทำงาน Blockly", + "COLLAPSED_WARNINGS_WARNING": "บล็อกที่ถูกพับมีคำเตือนอยู่ข้างใน." +} diff --git a/js/msg/json/tl.json b/js/msg/json/tl.json new file mode 100644 index 0000000..fc643d3 --- /dev/null +++ b/js/msg/json/tl.json @@ -0,0 +1,130 @@ +{ + "@metadata": { + "authors": [ + "아라" + ] + }, + "DUPLICATE_BLOCK": "Kaparehas", + "ADD_COMMENT": "Dagdag komento", + "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:", + "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_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_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_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_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_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_AND": "at", + "LOGIC_OPERATION_OR": "o", + "LOGIC_BOOLEAN_TRUE": "tama", + "LOGIC_BOOLEAN_FALSE": "mali", + "LOGIC_BOOLEAN_TOOLTIP": "Nag babalik ng true or false.", + "LOGIC_NULL": "blangko", + "LOGIC_TERNARY_IF_TRUE": "kung tama", + "LOGIC_TERNARY_IF_FALSE": "kung mali", + "MATH_IS_POSITIVE": "ay positibo", + "MATH_IS_NEGATIVE": "ay negatibo", + "MATH_CHANGE_TITLE": "baguhin %1 by %2", + "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_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 %1 kung ang item ay hindi makita.", + "LISTS_GET_INDEX_GET": "kunin", + "LISTS_GET_INDEX_GET_REMOVE": "kunin at tanggalin", + "LISTS_GET_INDEX_REMOVE": "tanggalin", + "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_INDEX_FROM_START_TOOLTIP": "%1 ay ang unang item.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 ay ang huling item.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Ibalik ang item sa itinakdang posisyon sa list.", + "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": "Nag tatanggal at nag babalik ng mga items sa tinukoy na posisyon sa list.", + "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": "Nag tatanggal ng item sa tinukoy na posisyon sa list.", + "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_INSERT": "isingit sa", + "LISTS_SET_INDEX_INPUT_TO": "gaya ng", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Pag set ng item sa tinukoy na position sa isang list.", + "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": "Nag singit ng item sa tinukoy na posistion sa list.", + "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." +} diff --git a/js/msg/json/tlh.json b/js/msg/json/tlh.json new file mode 100644 index 0000000..4306c45 --- /dev/null +++ b/js/msg/json/tlh.json @@ -0,0 +1,180 @@ +{ + "@metadata": { + "author": "Neil Fraser ", + "lastupdated": "2014-03-24 23:00:00.000000", + "locale": "tlh", + "messagedocumentation" : "qqq" + }, + "VARIABLES_DEFAULT_NAME": "Doch", + "TODAY": "DaHjaj", + "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'?", + "CLEAN_UP": "ngoghmeyvaD tlhegh rurmoH", + "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", + "UNDO": "vangHa'", + "REDO": "vangqa'", + "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_TITLE": "chel %1 ghItlh %2", + "TEXT_LENGTH_TITLE": "chuq %1", + "TEXT_ISEMPTY_TITLE": "%1 chIm'a'", + "TEXT_INDEXOF_TITLE": "ghItlhDaq %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "ghItlh wa'DIch Sam", + "TEXT_INDEXOF_OPERATOR_LAST": "ghItlh Qav Sam", + "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", + "LISTS_SPLIT_LIST_FROM_TEXT": "tetlh ghermeH ghItlh wav", + "LISTS_SPLIT_TEXT_FROM_LIST": "ghItlh chenmoHmeH tetlh gherHa'", + "LISTS_SPLIT_WITH_DELIMITER": "rarwI'Hom lo'", + "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_DEFNORETURN_COMMENT": "mIw yIDel...", + "PROCEDURES_DEFRETURN_RETURN": "chegh", + "PROCEDURES_ALLOW_STATEMENTS": "mu'tlhegh chaw'", + "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/js/msg/json/tr.json b/js/msg/json/tr.json new file mode 100644 index 0000000..47f5fa4 --- /dev/null +++ b/js/msg/json/tr.json @@ -0,0 +1,391 @@ +{ + "@metadata": { + "authors": [ + "Meelo", + "Joseph", + "WikiBronze", + "Mavrikant", + "아라", + "Watermelon juice", + "Uğurkent", + "McAang", + "Gurkanht", + "HakanIST", + "Imabadplayer", + "Kumkumuk", + "Alpkant", + "Bulgu", + "By erdo can", + "Azerhan Özen", + "Hedda", + "BaRaN6161 TURK", + "Grkn gll" + ] + }, + "VARIABLES_DEFAULT_NAME": "öge", + "UNNAMED_KEY": "isimsiz", + "TODAY": "Bugün", + "DUPLICATE_BLOCK": "Yinelenen", + "ADD_COMMENT": "Yorum Ekle", + "REMOVE_COMMENT": "Yorumu Sil", + "DUPLICATE_COMMENT": "Yinelenen Yorum", + "EXTERNAL_INPUTS": "Harici Girişler", + "INLINE_INPUTS": "Satır içi Girişler", + "DELETE_BLOCK": "Bloğu Sil", + "DELETE_X_BLOCKS": "%1 Bloğunu Sil", + "DELETE_ALL_BLOCKS": "Tüm %1 blokları silinsin mi?", + "CLEAN_UP": "Blokları Temizle", + "COLLAPSE_BLOCK": "Bloğ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", + "UNDO": "Geri al", + "REDO": "Yinele", + "CHANGE_VALUE_TITLE": "Değeri değiştir:", + "RENAME_VARIABLE": "Değişkeni yeniden adlandır...", + "RENAME_VARIABLE_TITLE": "Tüm '%1' değişkenini yeniden adlandır:", + "NEW_VARIABLE": "Değişken oluştur...", + "NEW_STRING_VARIABLE": "Dizi değişkeni oluştur...", + "NEW_NUMBER_VARIABLE": "Sayı değişkeni oluştur...", + "NEW_COLOUR_VARIABLE": "Renk değişkeni oluştur...", + "NEW_VARIABLE_TYPE_TITLE": "Yeni değişken tipi:", + "NEW_VARIABLE_TITLE": "Yeni değişken ismi:", + "VARIABLE_ALREADY_EXISTS": "'%1' isimli değişken adı zaten var.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "'%1' isimli değişken '%2' tipli başka bir değişkende tanımlı.", + "DELETE_VARIABLE_CONFIRMATION": "'%2' değişkeninin %1 kullanımını silmek istiyor musunuz?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "'%1' değişkeni, '%2' fonksiyonunun tanımının bir parçası olduğu için silinemez", + "DELETE_VARIABLE": "'%1' değişkenini silmek istiyor musunuz?", + "COLOUR_PICKER_HELPURL": "https://tr.wikipedia.org/wiki/Renk", + "COLOUR_PICKER_TOOLTIP": "Paletten bir renk seç.", + "COLOUR_RANDOM_TITLE": "rastgele renk", + "COLOUR_RANDOM_TOOLTIP": "Rastgele bir renk seç.", + "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 belirli miktarıyla bir renk oluştur. 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": "1. renk", + "COLOUR_BLEND_COLOUR2": "2. renk", + "COLOUR_BLEND_RATIO": "oran", + "COLOUR_BLEND_TOOLTIP": "Verilen bir orana (0.0 - 1.0) bağlı olarak iki rengi karıştırır.", + "CONTROLS_REPEAT_HELPURL": "https://tr.wikipedia.org/wiki/For_döngüsü", + "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": "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.", + "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 bloktaki işlemleri yerine getir. Aksi halde ikinci bloktaki 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şlemi gerçekleştir. Eğer ikinci değişken true ise, ikinci bloktaki işlemi gerçekleştir.", + "CONTROLS_IF_TOOLTIP_4": "Eğer ilk değer true, yani olumlu ise, ilk bloktaki işlemi gerçekleştir. İlk değer true değil ama ikinci değer true ise, ikinci bloktaki işlemi gerçekleştir. Eğer değerlerin hiçbiri true değil ise son bloktaki işlemi 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.", + "IOS_OK": "Tamam", + "IOS_CANCEL": "İptal", + "IOS_ERROR": "Hata", + "IOS_PROCEDURES_INPUTS": "GİRİŞLER", + "IOS_PROCEDURES_ADD_INPUT": "+ Giriş Ekle", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Açıklamalara izin ver", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Bu fonksiyonda mükerrer girdi tanımlı.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Değişken Ekle", + "IOS_VARIABLES_ADD_BUTTON": "Ekle", + "IOS_VARIABLES_RENAME_BUTTON": "Yeniden adlandır", + "IOS_VARIABLES_DELETE_BUTTON": "Sil", + "IOS_VARIABLES_VARIABLE_NAME": "Değişken adı", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Değişken adı kısmı boş bırakılamaz.", + "LOGIC_COMPARE_HELPURL": "https://tr.wikipedia.org/wiki/Eşitsizlikler", + "LOGIC_COMPARE_TOOLTIP_EQ": "Her iki giriş de birbirine eşitse true değerini döndürün.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Her iki giriş de birbirine eşit değilse true değerini döndürün.", + "LOGIC_COMPARE_TOOLTIP_LT": "İlk giriş ikinci girişten küçükse true değerini döndürün.", + "LOGIC_COMPARE_TOOLTIP_LTE": "İlk giriş ikinci girişten küçük veya ona eşitse true değerini döndürün.", + "LOGIC_COMPARE_TOOLTIP_GT": "İlk giriş ikinci girişten büyükse true değerini döndürün.", + "LOGIC_COMPARE_TOOLTIP_GTE": "İlk giriş ikinci girişten büyük veya ona eşitse true değerini döndürün.", + "LOGIC_OPERATION_TOOLTIP_AND": "Her iki giriş de doğruysa true döndür.", + "LOGIC_OPERATION_AND": "ve", + "LOGIC_OPERATION_TOOLTIP_OR": "Girişlerden en az biri doğru olduğunda true değerini döndürün.", + "LOGIC_OPERATION_OR": "veya", + "LOGIC_NEGATE_TITLE": "%1 değil", + "LOGIC_NEGATE_TOOLTIP": "Giriş yanlışsa true değerini döndürür. Giriş doğruysa false değerini döndürür.", + "LOGIC_BOOLEAN_TRUE": "true", + "LOGIC_BOOLEAN_FALSE": "false", + "LOGIC_BOOLEAN_TOOLTIP": "True veya false değerini döndürür.", + "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", + "LOGIC_NULL": "boş", + "LOGIC_NULL_TOOLTIP": "Boş değerini döndürür.", + "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", + "LOGIC_TERNARY_CONDITION": "deneme", + "LOGIC_TERNARY_IF_TRUE": "if true", + "LOGIC_TERNARY_IF_FALSE": "if false", + "LOGIC_TERNARY_TOOLTIP": "'test' durumunu kontrol edin. Koşul true olursa, 'if true' değerini döndürür; aksi takdirde 'if false' değerini döndürür.", + "MATH_NUMBER_HELPURL": "https://tr.wikipedia.org/wiki/Numara", + "MATH_NUMBER_TOOLTIP": "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 sayının toplamını döndürün.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "İki sayının farkını döndürün.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "İki sayının çarpımını döndürün.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "İki sayının bölümünü döndürün.", + "MATH_ARITHMETIC_TOOLTIP_POWER": "Yükseltilen ilk sayıyı ikinci sayının gücüne döndürün.", + "MATH_SINGLE_HELPURL": "https://tr.wikipedia.org/wiki/Karekök", + "MATH_SINGLE_OP_ROOT": "kare kök", + "MATH_SINGLE_TOOLTIP_ROOT": "Bir sayının karekökünü döndürür.", + "MATH_SINGLE_OP_ABSOLUTE": "kesin", + "MATH_SINGLE_TOOLTIP_ABS": "Bir sayının mutlak değerini döndürür.", + "MATH_SINGLE_TOOLTIP_NEG": "Bir sayının reddini 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 logaritmasını geri döndür.", + "MATH_SINGLE_TOOLTIP_EXP": "E'yi bir sayının gücüne döndür.", + "MATH_SINGLE_TOOLTIP_POW10": "10'u sayının gücüne döndür.", + "MATH_TRIG_HELPURL": "https://tr.wikipedia.org/wiki/Trigonometrik_fonksiyonlar", + "MATH_TRIG_TOOLTIP_SIN": "Sinüsü bir derece döndürün (radyan değil).", + "MATH_TRIG_TOOLTIP_COS": "Bir derecenin kosinüsünü döndürün (radyan değil).", + "MATH_TRIG_TOOLTIP_TAN": "Bir derecenin tanjantını döndürün (radyan değil).", + "MATH_TRIG_TOOLTIP_ASIN": "Bir sayının ark sinüsünü döndürün.", + "MATH_TRIG_TOOLTIP_ACOS": "Bir sayının arkosinini döndürün.", + "MATH_TRIG_TOOLTIP_ATAN": "Bir sayının arktanjantını döndürün.", + "MATH_CONSTANT_HELPURL": "https://tr.wikipedia.org/wiki/Matematiksel_sabit", + "MATH_CONSTANT_TOOLTIP": "Ortak sabitlerden birini döndür: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (sonsuzluk).", + "MATH_IS_EVEN": "çift", + "MATH_IS_ODD": "tek", + "MATH_IS_PRIME": "asal", + "MATH_IS_WHOLE": "bütün", + "MATH_IS_POSITIVE": "pozitif", + "MATH_IS_NEGATIVE": "negatif", + "MATH_IS_DIVISIBLE_BY": "bölünebilir", + "MATH_IS_TOOLTIP": "Bir sayının çift, tek, asal, bütün, pozitif, negatif veya belirli bir sayıya bölünebilir olup olmadığını kontrol edin. True veya false değerini döndürür.", + "MATH_CHANGE_HELPURL": "https://tr.wikipedia.org/wiki/Programlama_deyimi#Sayacı_artırma", + "MATH_CHANGE_TITLE": "%1 %2 göre değiştir", + "MATH_CHANGE_TOOLTIP": "'%1' değişkenine bir sayı ekle.", + "MATH_ROUND_HELPURL": "https://tr.wikipedia.org/wiki/Yuvarlatma", + "MATH_ROUND_TOOLTIP": "Bir sayıyı yukarı veya aşağı yuvarlayın.", + "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": "Listedeki tüm sayıların toplamını döndürün.", + "MATH_ONLIST_OPERATOR_MIN": "listenin en küçüğü", + "MATH_ONLIST_TOOLTIP_MIN": "Listedeki en küçük sayıyı döndür.", + "MATH_ONLIST_OPERATOR_MAX": "maksimum liste", + "MATH_ONLIST_TOOLTIP_MAX": "Listedeki en büyük sayıyı döndürün.", + "MATH_ONLIST_OPERATOR_AVERAGE": "liste ortalaması", + "MATH_ONLIST_TOOLTIP_AVERAGE": "Listedeki sayısal değerlerin ortalamasını (aritmetik ortalama) döndürün.", + "MATH_ONLIST_OPERATOR_MEDIAN": "listenin medyanı", + "MATH_ONLIST_TOOLTIP_MEDIAN": "Listeden ortanca numarayı döndürün.", + "MATH_ONLIST_OPERATOR_MODE": "liste modları", + "MATH_ONLIST_TOOLTIP_MODE": "Listedeki en yaygın öğenin bir listesini döndürür.", + "MATH_ONLIST_OPERATOR_STD_DEV": "listenin standart sapması", + "MATH_ONLIST_TOOLTIP_STD_DEV": "Listenin standart sapmasını döndürün.", + "MATH_ONLIST_OPERATOR_RANDOM": "listenin rastgele öğesi", + "MATH_ONLIST_TOOLTIP_RANDOM": "Listeden rastgele bir öğe döndürün.", + "MATH_MODULO_HELPURL": "https://tr.wikipedia.org/wiki/Modulo_işlemi", + "MATH_MODULO_TITLE": "%1 ÷ %2 geri kalan kısım", + "MATH_MODULO_TOOLTIP": "Kalanı iki sayıyı bölmekten döndürün.", + "MATH_CONSTRAIN_TITLE": "%1 en düşük %2 en yüksek %3 ile sınırla", + "MATH_CONSTRAIN_TOOLTIP": "Bir sayıyı belirtilen sınırlar arasında (dahil) ile sınırlandırın.", + "MATH_RANDOM_INT_HELPURL": "https://tr.wikipedia.org/wiki/Rastgele_sayı_üretimi", + "MATH_RANDOM_INT_TITLE": "%1 ile %2 rastgele tam sayı üretin", + "MATH_RANDOM_INT_TOOLTIP": "Belirtilen iki sınır arasında rastgele bir tamsayı döndürün.", + "MATH_RANDOM_FLOAT_HELPURL": "https://tr.wikipedia.org/wiki/Rastgele_sayı_üretimi", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "rastgele kesir", + "MATH_RANDOM_FLOAT_TOOLTIP": "0.0 (dahil) ve 1.0 (hariç) arasında rastgele bir kesir döndürün.", + "MATH_ATAN2_HELPURL": "https://tr.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2, X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "-180'den 180'e derece cinsinden nokta (X, Y) arktanjantını döndürün.", + "TEXT_TEXT_HELPURL": "https://tr.wikipedia.org/wiki/Dize_(bilgisayar_bilimi)", + "TEXT_TEXT_TOOLTIP": "Bir harf, kelime veya metin satırı.", + "TEXT_JOIN_TITLE_CREATEWITH": "ile metin oluştur", + "TEXT_JOIN_TOOLTIP": "İstediğiniz sayıda öğeyi birleştirerek bir metin parçası oluşturun.", + "TEXT_CREATE_JOIN_TITLE_JOIN": "katıl", + "TEXT_CREATE_JOIN_TOOLTIP": "Bu metin bloğunu yeniden yapılandırmak için bölüm ekleyin, kaldırın veya yeniden sıralayın.", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Metne bir öğe ekleyin.", + "TEXT_APPEND_TITLE": "%1 için %2 metnini ekle.", + "TEXT_APPEND_TOOLTIP": "'%1' değişkenine bir metin ekleyin.", + "TEXT_LENGTH_TITLE": "%1 uzunluğu", + "TEXT_LENGTH_TOOLTIP": "Sağlanan metindeki harflerin (boşluklar dahil) sayısını döndürür.", + "TEXT_ISEMPTY_TITLE": "%1 boş", + "TEXT_ISEMPTY_TOOLTIP": "Sağlanan metin boşsa true değerini döndürür.", + "TEXT_INDEXOF_TOOLTIP": "İkinci metindeki ilk metnin ilk/son oluşumunun dizinini döndürür. Metin bulunmazsa %1 değerini döndürür.", + "TEXT_INDEXOF_TITLE": "%1 metni içinde %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "metnin ilk oluşumunu bul", + "TEXT_INDEXOF_OPERATOR_LAST": "metnin son tekrarlamasını bul", + "TEXT_CHARAT_TITLE": "%1 içinde %2", + "TEXT_CHARAT_FROM_START": "# harfini al", + "TEXT_CHARAT_FROM_END": "# sona harfleri al", + "TEXT_CHARAT_FIRST": "ilk harfini al", + "TEXT_CHARAT_LAST": "son harfi al", + "TEXT_CHARAT_RANDOM": "rastgele harf al", + "TEXT_CHARAT_TAIL": "", + "TEXT_CHARAT_TOOLTIP": "Belirtilen konumdaki harfi döndürür.", + "TEXT_GET_SUBSTRING_TOOLTIP": "Metnin belirli bir bölümünü döndürür.", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "metinde", + "TEXT_GET_SUBSTRING_START_FROM_START": "# harfinden alt dize al", + "TEXT_GET_SUBSTRING_START_FROM_END": "# harfinden alt dize al", + "TEXT_GET_SUBSTRING_START_FIRST": "ilk harfinden alt dize al", + "TEXT_GET_SUBSTRING_END_FROM_START": "# harfe", + "TEXT_GET_SUBSTRING_END_FROM_END": "en başından # harfi", + "TEXT_GET_SUBSTRING_END_LAST": "son harfe", + "TEXT_GET_SUBSTRING_TAIL": "", + "TEXT_CHANGECASE_TOOLTIP": "Metnin bir kopyasını farklı bir durumda döndürün.", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "ÜST DURUMA", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "küçük harfe", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "Başlık Vakasına", + "TEXT_TRIM_TOOLTIP": "Bir veya her iki uçtan boşluklar kaldırılmış olarak metnin bir kopyasını döndürün.", + "TEXT_TRIM_OPERATOR_BOTH": "her iki tarafından da kırpın", + "TEXT_TRIM_OPERATOR_LEFT": "sol tarafındaki boşlukları kırpın", + "TEXT_TRIM_OPERATOR_RIGHT": "sağ tarafındaki boşlukları kırp", + "TEXT_PRINT_TITLE": "%1 yaz", + "TEXT_PRINT_TOOLTIP": "Belirtilen metni, sayıyı veya başka bir değeri yazdırın.", + "TEXT_PROMPT_TYPE_TEXT": "mesaj içeren metin istemi", + "TEXT_PROMPT_TYPE_NUMBER": "mesaj içeren numara istemi", + "TEXT_PROMPT_TOOLTIP_NUMBER": "Bir numara için kullanıcı sor.", + "TEXT_PROMPT_TOOLTIP_TEXT": "Bazı metinler için kullanıcı sor.", + "TEXT_COUNT_MESSAGE0": "%1 içinde %2 say.", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "Bazı metnin başka bir metnin içinde kaç kez oluştuğunu sayın.", + "TEXT_REPLACE_MESSAGE0": "%1 yerine %3 içindeki %2 ile değiştir", + "TEXT_REPLACE_TOOLTIP": "Bazı metnin tüm tekrarlarını başka bir metnin içinde değiştirin.", + "TEXT_REVERSE_MESSAGE0": "%1 ters çevirin", + "TEXT_REVERSE_TOOLTIP": "Metindeki karakterlerin sırasını tersine çevirir.", + "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 0 uzunluğunda bir liste döndürür", + "LISTS_CREATE_WITH_TOOLTIP": "İstediğiniz sayıda öğe içeren bir liste oluşturun.", + "LISTS_CREATE_WITH_INPUT_WITH": "ile liste oluştur", + "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 ekleyin, kaldırın veya yeniden sıralayın.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Listeye bir öğe ekleyin.", + "LISTS_REPEAT_TOOLTIP": "Belirtilen sayıda tekrarlanan belirli bir değerden oluşan bir liste oluşturur.", + "LISTS_REPEAT_TITLE": "%1 tekrarlanan %2 öğeyle liste oluştur", + "LISTS_LENGTH_TITLE": "%1 uzunluğu", + "LISTS_LENGTH_TOOLTIP": "Bir listenin uzunluğunu döndürür.", + "LISTS_ISEMPTY_TITLE": "%1 boş", + "LISTS_ISEMPTY_TOOLTIP": "Liste boşsa true değerini döndürür.", + "LISTS_INLIST": "listede", + "LISTS_INDEX_OF_FIRST": "öğenin ilk oluşumunu bul", + "LISTS_INDEX_OF_LAST": "öğenin son tekrarlamasını bul", + "LISTS_INDEX_OF_TOOLTIP": "Listedeki öğenin ilk/son oluşumunun dizinini döndürür. Öğe bulunmazsa %1 değerini 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_INDEX_FROM_START_TOOLTIP": "%1 ilk öğedir.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 son öğedir.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Listede belirtilen konumda bulunan öğeyi döndürür.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Listedeki ilk öğeyi döndürür.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Listedeki son öğeyi döndürür.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Listedeki rastgele bir öğeyi döndürür.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Öğeyi bir listede belirtilen konumda kaldırır ve döndürür.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Listedeki ilk öğeyi kaldırır ve döndürür.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Listedeki son öğeyi kaldırır ve döndürür.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Listedeki rastgele bir öğeyi kaldırır ve döndürür.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Listede belirtilen konumda bulunan öğeyi kaldırır.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Listedeki ilk öğeyi kaldırır.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Listedeki son öğeyi kaldırır.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Listedeki rastgele bir öğeyi kaldırır.", + "LISTS_SET_INDEX_SET": "ayarla", + "LISTS_SET_INDEX_INSERT": "yerleştir", + "LISTS_SET_INDEX_INPUT_TO": "olarak", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Öğeyi bir listede belirtilen konuma ayarlar.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Listedeki ilk öğeyi ayarlar.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Listedeki son öğeyi ayarlar.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Listede rastgele bir öğe ayarlar.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Öğeyi bir listede belirtilen konuma ekler.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Öğeyi listenin başına ekler.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Öğeyi listenin sonuna ekleyin.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Öğeyi bir listeye rastgele ekler.", + "LISTS_GET_SUBLIST_START_FROM_START": "# listesinden alt liste al", + "LISTS_GET_SUBLIST_START_FROM_END": "# listesinden alt listeyi al", + "LISTS_GET_SUBLIST_START_FIRST": "ilk önce alt listeyi al", + "LISTS_GET_SUBLIST_END_FROM_START": "#", + "LISTS_GET_SUBLIST_END_FROM_END": "sonuna kadar #", + "LISTS_GET_SUBLIST_END_LAST": "sona", + "LISTS_GET_SUBLIST_TAIL": "", + "LISTS_GET_SUBLIST_TOOLTIP": "Listenin belirtilen bölümünün bir kopyasını oluşturur.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "sıra %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Listenin bir kopyasını sıralayın.", + "LISTS_SORT_ORDER_ASCENDING": "artan", + "LISTS_SORT_ORDER_DESCENDING": "azalan", + "LISTS_SORT_TYPE_NUMERIC": "sayısal", + "LISTS_SORT_TYPE_TEXT": "alfabetik", + "LISTS_SORT_TYPE_IGNORECASE": "alfabetik, görmezden gelin", + "LISTS_SPLIT_LIST_FROM_TEXT": "metinden liste yap", + "LISTS_SPLIT_TEXT_FROM_LIST": "listeden metin yap", + "LISTS_SPLIT_WITH_DELIMITER": "sınırlayıcı ile", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Metni, her bir sınırlayıcıyı kırarak bir metin listesine bölün.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Metin listesini bir sınırlayıcı ile ayrılmış tek bir metinde birleştirin.", + "LISTS_REVERSE_MESSAGE0": "%1 ters çevirin", + "LISTS_REVERSE_TOOLTIP": "Listenin bir kopyasını ters çevirin.", + "ORDINAL_NUMBER_SUFFIX": "", + "VARIABLES_GET_TOOLTIP": "Bu değişkenin değerini döndürür.", + "VARIABLES_GET_CREATE_SET": "'set %1' oluştur", + "VARIABLES_SET": "%1 %2 ayarla", + "VARIABLES_SET_TOOLTIP": "Bu değişkeni girişe eşit olacak şekilde ayarlar.", + "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": "Çıkışı olmayan bir işlev oluşturur.", + "PROCEDURES_DEFNORETURN_COMMENT": "Bu işlevi açıklayın...", + "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", + "PROCEDURES_DEFRETURN_RETURN": "dönüş", + "PROCEDURES_DEFRETURN_TOOLTIP": "Çıkışa sahip bir işlev oluşturur.", + "PROCEDURES_ALLOW_STATEMENTS": "ifadelere izin ver", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Uyarı: Bu işlev yinelenen parametrelere sahiptir.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Alt program", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Kullanıcı tanımlı '%1' işlevini çalıştırın.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Alt program", + "PROCEDURES_CALLRETURN_TOOLTIP": "Kullanıcı tanımlı '%1' işlevini çalıştırın ve çıkışını kullanın.", + "PROCEDURES_MUTATORCONTAINER_TITLE": "girişler", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Bu işleve giriş ekleyin, kaldırın veya yeniden sıralayın.", + "PROCEDURES_MUTATORARG_TITLE": "giriş adı:", + "PROCEDURES_MUTATORARG_TOOLTIP": "İşleve bir giriş ekleyin.", + "PROCEDURES_HIGHLIGHT_DEF": "Vurgulama işlevi tanımı", + "PROCEDURES_CREATE_DO": "'%1' oluştur", + "PROCEDURES_IFRETURN_TOOLTIP": "Bir değer true ise, ikinci bir değer döndürün.", + "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", + "PROCEDURES_IFRETURN_WARNING": "Uyarı: Bu blok yalnızca bir işlev tanımı içinde kullanılabilir.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Bir şeyler söyle...", + "WORKSPACE_ARIA_LABEL": "Blockly Çalışma Alanı", + "COLLAPSED_WARNINGS_WARNING": "Daraltılmış bloklar uyarı içerir." +} diff --git a/js/msg/json/ug-arab.json b/js/msg/json/ug-arab.json new file mode 100644 index 0000000..9c9aebd --- /dev/null +++ b/js/msg/json/ug-arab.json @@ -0,0 +1,143 @@ +{ + "@metadata": { + "authors": [ + "HushBeg", + "Uzdil", + "چۈشكۈن" + ] + }, + "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": "ياردەم", + "UNDO": "يېنىۋال", + "REDO": "قايتىلاش", + "CHANGE_VALUE_TITLE": "قىممەت ئۆزگەرتىش:", + "RENAME_VARIABLE": "ئۆزگەرگۈچى مىقدارغا قايتا نام قويۇش", + "RENAME_VARIABLE_TITLE": "بارلىق بۆلەك “%1\" ئۆزگەرگۈچى مىقدار قايتا ناملىنىپ :", + "NEW_VARIABLE": "ئۆزگەرگۈچى مىقدار ... قۇرۇش", + "NEW_VARIABLE_TITLE": "يېڭى ئۆزگەرگۈچى مىقدار نامى:", + "VARIABLE_ALREADY_EXISTS": "ئىسم مەۋجۇت “%1” ئۆزگەرگۈچى", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "ئىسىملىك“%1” ئۆزگەرگۈچى مىقدار مەۋجۇت بولۇپ تۇرىدۇ ، لېكىن يەنە بىر ئۆزگەرگۈچى مىقدار تىپى بولۇش سۈپىتى بىلەن “%2” مەۋجۇت .", + "DELETE_VARIABLE_CONFIRMATION": "ئۆچۈرۈش “%2” ئۆزگەرگۈچى مىقدار%1 ئىشلىتىلىش ئورنى بارمۇ؟", + "DELETE_VARIABLE": "“%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_BLEND_TITLE": "ئارىلاش", + "COLOUR_BLEND_COLOUR1": "رەڭ 1", + "COLOUR_BLEND_COLOUR2": "رەڭ 2", + "COLOUR_BLEND_RATIO": "نىسبەت", + "CONTROLS_REPEAT_HELPURL": "https://zh.wikipedia.org/wiki/Forئايلىنىش", + "CONTROLS_REPEAT_TITLE": "تەكرار %1قېتىم", + "CONTROLS_REPEAT_INPUT_DO": "ئىجرا", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "تەكرار بولۇش", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "تەكرارلىقى", + "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پارچىلىرى .", + "IOS_OK": "ماقۇل", + "IOS_CANCEL": "ۋاز كەچ", + "IOS_ERROR": "خاتالىق", + "IOS_PROCEDURES_INPUTS": "كىرگۈزۈش", + "IOS_PROCEDURES_ADD_INPUT": "+ كىرگۈزۈپ قوشۇش", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "كېلىشىمگە قوشۇلۇش", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "بۇنىڭدا مەزمۇننى قايتا كىرگۈزۈش ئىقتىدارى بار .", + "IOS_VARIABLES_ADD_VARIABLE": "+ ئۆزگەرگۈچى مىقدار قوشۇش", + "IOS_VARIABLES_ADD_BUTTON": "قوشۇش", + "IOS_VARIABLES_RENAME_BUTTON": "ئىسىم ئۆزگەرتىش", + "IOS_VARIABLES_DELETE_BUTTON": "ئۆچۈرۈش", + "IOS_VARIABLES_VARIABLE_NAME": "ئۆزگەرگۈچى مىقدارنىڭ نامى", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "سىز ئۆزگەرگۈچى مىقدار نامى ئىشلىتىشكە بولمايدۇ .", + "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_AND": "ۋە", + "LOGIC_OPERATION_OR": "ياكى", + "LOGIC_NEGATE_TITLE": "ئەمەس%1", + "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://zh.wikipedia.org/wiki/سان", + "MATH_NUMBER_TOOLTIP": "بىر سان.", + "MATH_ARITHMETIC_HELPURL": "https://zh.wikipedia.org/wiki/ئارىفمېتىكىلىق", + "MATH_SINGLE_HELPURL": "https://zh.wikipedia.org/wiki/كۋادرات يىلتىز", + "MATH_SINGLE_OP_ROOT": " كۋادرات يىلتىز", + "MATH_SINGLE_OP_ABSOLUTE": "مۇتلەق", + "MATH_TRIG_HELPURL": "https://zh.wikipedia.org/wiki/ترىگونومېتىرىيىلىك فۇنكسىيە", + "MATH_CONSTANT_HELPURL": "https://zh.wikipedia.org/wiki/ماتېماتىكا تۇراقلىق سانى", + "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://zh.wikipedia.org/wiقوشۇش", + "MATH_CHANGE_TITLE": " ئۆزگەرتىش %1 دىن %2", + "MATH_ROUND_HELPURL": "https://zh.wikipedia.org/wiki/سانلىق قىممەت تۈزىتىش", + "MATH_ROUND_OPERATOR_ROUND": "تۆۋەنگە تارتىڭ", + "MATH_ROUND_OPERATOR_ROUNDUP": " تۆۋەنگە تارتىڭ", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "تۆۋەنگە تارتىڭ", + "MATH_ONLIST_OPERATOR_MIN": "جەدۋەل ئىچىدىكى ئەڭ كىچىك قىممەت", + "MATH_ONLIST_TOOLTIP_MIN": " جەدۋەلدىكى ئەڭ كىچىك سانغا قايتىش", + "MATH_ONLIST_OPERATOR_MAX": " جەدۋەلدىكى ئەڭ چوڭ قىممەت", + "MATH_ONLIST_OPERATOR_AVERAGE": "جەدۋەل ئىچىدىكى ئوتتۇرىچە سان", + "MATH_ONLIST_OPERATOR_MEDIAN": "جەدۋەلدىكى ئوتتۇرا سان", + "MATH_ONLIST_TOOLTIP_MEDIAN": " جەدۋەلدىكى ئوتتۇرا سانغا قايتىش", + "MATH_ONLIST_OPERATOR_MODE": " جەدۋەل ھالىتى", + "MATH_MODULO_HELPURL": "https://zh.wikipedia.org/wiki/مودېل ھېسابى", + "TEXT_CREATE_JOIN_TITLE_JOIN": " قوشۇش", + "LISTS_GET_INDEX_GET": "قولغا كەلتۈرۈش", + "LISTS_GET_INDEX_REMOVE": "چىقىرىۋىتىش", + "LISTS_GET_INDEX_FIRST": "تۇنجى", + "LISTS_GET_INDEX_LAST": "ئاخىرقى", + "LISTS_GET_INDEX_RANDOM": "خالىغانچە", + "LISTS_SET_INDEX_SET": "تەڭشەك", + "LISTS_SET_INDEX_INSERT": "قىستۇرۇڭ", + "LISTS_SORT_ORDER_ASCENDING": "يۇقىرىغا", + "LISTS_SORT_ORDER_DESCENDING": "تۆۋەنگە", + "LISTS_SORT_TYPE_NUMERIC": "سان بويىچە تىزىل", + "LISTS_SORT_TYPE_TEXT": " ھەرپ بويىچە تىزىل", + "LISTS_SORT_TYPE_IGNORECASE": "ھەرب بويىچە تىزىل، چوڭ كىچىك يېزىلىش ھېساپ قىلىنمايدۇ" +} diff --git a/js/msg/json/uk.json b/js/msg/json/uk.json new file mode 100644 index 0000000..9b2e02d --- /dev/null +++ b/js/msg/json/uk.json @@ -0,0 +1,372 @@ +{ + "@metadata": { + "authors": [ + "Andriykopanytsia", + "Base", + "Igor Zavadsky", + "Lxlalexlxl", + "아라", + "Visem", + "Piramidion", + "SimondR", + "Movses", + "Gzhegozh" + ] + }, + "VARIABLES_DEFAULT_NAME": "елемент", + "UNNAMED_KEY": "без назви", + "TODAY": "Сьогодні", + "DUPLICATE_BLOCK": "Дублювати", + "ADD_COMMENT": "Додати коментар", + "REMOVE_COMMENT": "Видалити коментар", + "DUPLICATE_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": "Довідка", + "UNDO": "Скасувати", + "REDO": "Повторити", + "CHANGE_VALUE_TITLE": "Змінити значення:", + "RENAME_VARIABLE": "Перейменувати змінну...", + "RENAME_VARIABLE_TITLE": "Перейменувати усі змінні \"%1\" до:", + "NEW_VARIABLE": "Створити змінну...", + "NEW_STRING_VARIABLE": "Створити рядкову змінну...", + "NEW_NUMBER_VARIABLE": "Створити числову змінну...", + "NEW_COLOUR_VARIABLE": "Створити колірну змінну...", + "NEW_VARIABLE_TYPE_TITLE": "Тип нової змінної:", + "NEW_VARIABLE_TITLE": "Нова назва змінної:", + "VARIABLE_ALREADY_EXISTS": "Змінна з назвою '%1' вже існує.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Змінна з назвою '%1' вже існує в іншому типі: '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Вилучити %1 використання змінної '%2'?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Неможливо видалити змінну '%1', тому що це частина визначення функції '%2'", + "DELETE_VARIABLE": "Вилучити змінну '%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": "Додати остаточну, всеосяжну умову до блоку 'якщо'.", + "IOS_OK": "Готово", + "IOS_CANCEL": "Скасувати", + "IOS_ERROR": "Помилка", + "IOS_PROCEDURES_INPUTS": "ВХОДИ", + "IOS_PROCEDURES_ADD_INPUT": "+ Додати вхідну змінну", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Дозволити оператори", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "У цієї функції є вхідні змінні, що дублюються.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Додати змінну", + "IOS_VARIABLES_ADD_BUTTON": "Додати", + "IOS_VARIABLES_RENAME_BUTTON": "Перейменувати", + "IOS_VARIABLES_DELETE_BUTTON": "Видалити", + "IOS_VARIABLES_VARIABLE_NAME": "Назва змінної", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Ви не можете використовувати порожню назву змінної.", + "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 (не включно).", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 по X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "Повертає арктангенс точки (X, Y) у градусах від -180 до 180.", + "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_TITLE": "до %1 додати текст %2", + "TEXT_APPEND_TOOLTIP": "Додати деякий текст до змінної '%1'.", + "TEXT_LENGTH_TITLE": "довжина %1", + "TEXT_LENGTH_TOOLTIP": "Повертає число символів (включно з пропусками) у даному тексті.", + "TEXT_ISEMPTY_TITLE": "%1 є порожнім", + "TEXT_ISEMPTY_TOOLTIP": "Повертає істину, якщо вказаний текст порожній.", + "TEXT_INDEXOF_TOOLTIP": "Повертає індекс першого/останнього входження першого тексту в другий. Повертає %1, якщо текст не знайдено.", + "TEXT_INDEXOF_TITLE": "у тексті %1 %2 %3.", + "TEXT_INDEXOF_OPERATOR_FIRST": "знайти перше входження тексту", + "TEXT_INDEXOF_OPERATOR_LAST": "знайти останнє входження тексту", + "TEXT_CHARAT_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", + "TEXT_CHARAT_TITLE": "з тексту %1 %2", + "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": "Запитати у користувача деякий текст.", + "TEXT_COUNT_MESSAGE0": "кількість %1 в %2", + "TEXT_COUNT_TOOLTIP": "Підраховує, скільки разів деякий текст з'являється в іншому тексті.", + "TEXT_REPLACE_MESSAGE0": "замінити %1 на %2 в %3", + "TEXT_REPLACE_TOOLTIP": "Замінює всі входження деякого тексту іншим текстом.", + "TEXT_REVERSE_MESSAGE0": "розвернути %1", + "TEXT_REVERSE_TOOLTIP": "Змінює на протилежний порядок символів у тексті.", + "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": "Повертає індекс першого/останнього входження елемента у списку. Повертає %1, якщо елемент не знайдено.", + "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_INDEX_FROM_START_TOOLTIP": "%1 - це перший елемент.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 - це останній елемент.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Повертає елемент у заданій позиції у списку.", + "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": "Видаляє і повертає елемент у заданій позиції у списку.", + "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": "Вилучає зі списку елемент у вказаній позиції.", + "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": "Задає елемент списку у вказаній позиції.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Задає перший елемент списку.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Задає останній елемент списку.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Задає випадковий елемент у списку.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Вставка елемента у вказану позицію списку.", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "сортувати %3 %1 %2", + "LISTS_SORT_TOOLTIP": "Сортувати копію списку.", + "LISTS_SORT_ORDER_ASCENDING": "за зростанням", + "LISTS_SORT_ORDER_DESCENDING": "за спаданням", + "LISTS_SORT_TYPE_NUMERIC": "як числа", + "LISTS_SORT_TYPE_TEXT": "за абеткою", + "LISTS_SORT_TYPE_IGNORECASE": "за абеткою, ігноруючи регістр", + "LISTS_SPLIT_LIST_FROM_TEXT": "зробити з тексту список", + "LISTS_SPLIT_TEXT_FROM_LIST": "зробити зі списку текст", + "LISTS_SPLIT_WITH_DELIMITER": "з розділювачем", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Поділити текст на список текстів, розриваючи на кожному розділювачі.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Злити список текстів у єдиний текст, відокремивши розділювачами.", + "LISTS_REVERSE_MESSAGE0": "розвернути %1", + "LISTS_REVERSE_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://uk.wikipedia.org/wiki/Підпрограма", + "PROCEDURES_DEFNORETURN_TITLE": "до", + "PROCEDURES_DEFNORETURN_PROCEDURE": "щось зробити", + "PROCEDURES_BEFORE_PARAMS": "з:", + "PROCEDURES_CALL_BEFORE_PARAMS": "з:", + "PROCEDURES_DEFNORETURN_DO": "блок тексту", + "PROCEDURES_DEFNORETURN_TOOLTIP": "Створює функцію без виводу.", + "PROCEDURES_DEFNORETURN_COMMENT": "Опишіть цю функцію...", + "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_HELPURL": "http://c2.com/cgi/wiki?GuardClause", + "PROCEDURES_IFRETURN_WARNING": "Попередження: цей блок може використовуватися лише в межах визначення функції.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Скажіть щось...", + "WORKSPACE_ARIA_LABEL": "Робоча область Blockly", + "COLLAPSED_WARNINGS_WARNING": "Звернуті блоки містять попередження." +} diff --git a/js/msg/json/ur.json b/js/msg/json/ur.json new file mode 100644 index 0000000..e39e9a4 --- /dev/null +++ b/js/msg/json/ur.json @@ -0,0 +1,117 @@ +{ + "@metadata": { + "authors": [ + "Abdulq", + "Obaid Raza", + "عثمان خان شاہ", + "محمد افضل", + "Sayam Asjad", + "NajeebKhan" + ] + }, + "VARIABLES_DEFAULT_NAME": "آئٹم", + "TODAY": "آج", + "DUPLICATE_BLOCK": "ڈپلیکیٹ", + "ADD_COMMENT": "کمنٹ کریں", + "REMOVE_COMMENT": "تبصرہ حذف کریں", + "DUPLICATE_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": "معاونت", + "UNDO": "کیا ہوا کام کینسل کرے", + "REDO": "دہرائیں", + "CHANGE_VALUE_TITLE": "ویلیو تبدیل کریں:", + "RENAME_VARIABLE": "دوبار نام دیں ویریابل کو...", + "RENAME_VARIABLE_TITLE": "تمام %1 متغیروں کو دوبارہ نام دے:", + "NEW_VARIABLE": "متغیر بنائیں", + "NEW_STRING_VARIABLE": "متغیر بنائیں String", + "NEW_NUMBER_VARIABLE": "عدد متغیر بناییں", + "NEW_COLOUR_VARIABLE": "رنگ متغیر بنائیں", + "NEW_VARIABLE_TYPE_TITLE": " نئی متغیر قسم", + "NEW_VARIABLE_TITLE": "نیا ویریابل نام:", + "VARIABLE_ALREADY_EXISTS": "ایک متغیر نام '٪ 1' پہلے سے ہی موجود ہے.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "ایک متغیر نام '٪ 1' کسی دوسرے قسم کے لئے پہلے ہی موجود ہے: '٪ 2'.", + "DELETE_VARIABLE_CONFIRMATION": "'٪ 2' متغیر کے٪ 1 استعمال کو حذف کریں؟", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "متغیر '٪ 1' کو حذف نہیں کر سکتا کیونکہ یہ فنکشن کی تعریف کا حصہ ہے '٪ 2'", + "DELETE_VARIABLE": "'٪ 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": "کیا چر '%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_TOOLTIP_BREAK": "مشتمل لوپ کے باہر توڑ.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "انتباہ: اس بلاک کو صرف لوپ میں استعمال کیا جاسکتا ہے۔", + "CONTROLS_IF_TOOLTIP_1": "اگر ایک ویلیو صحیح ہے، تو کچھ سٹیٹمنٹ کریں", + "CONTROLS_IF_MSG_IF": "اگر", + "CONTROLS_IF_MSG_ELSEIF": "دوسراں اگر", + "CONTROLS_IF_MSG_ELSE": "دوسراں", + "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", + "LOGIC_OPERATION_AND": "اور", + "LOGIC_OPERATION_OR": "یا", + "LOGIC_NEGATE_TITLE": "%1 نہیں", + "LOGIC_BOOLEAN_TRUE": "سچ", + "LOGIC_BOOLEAN_FALSE": "غلط", + "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_SINGLE_OP_ROOT": "اسکویر روٹ", + "MATH_SINGLE_OP_ABSOLUTE": "بالکل", + "TEXT_CHARAT_FROM_START": "# حرف حاصل کریں", + "LISTS_CREATE_WITH_INPUT_WITH": "کے ساتھ فہرست بنائیں", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "فہرست", + "LISTS_LENGTH_TITLE": "%1 کی لمبائی", + "LISTS_INLIST": "فہرست میں", + "LISTS_GET_INDEX_GET": "حاصل کریں", + "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_SET_INDEX_SET": "تعین کریں", + "LISTS_SET_INDEX_INSERT": "میں درج کریں", + "LISTS_SET_INDEX_INPUT_TO": "بطور", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "فہرست میں پہلا آئٹم کا تعین کریں", + "PROCEDURES_DEFNORETURN_TITLE": "کو", + "PROCEDURES_DEFNORETURN_PROCEDURE": "کچھ کرو", + "PROCEDURES_BEFORE_PARAMS": "سمیت:", + "PROCEDURES_CALL_BEFORE_PARAMS": "سمیت:", + "PROCEDURES_DEFNORETURN_TOOLTIP": "بغیر آوٹ پٹ کا فنکشن بنائیں", + "PROCEDURES_DEFRETURN_RETURN": "واپس آ جائیں", + "PROCEDURES_DEFRETURN_TOOLTIP": "بغیر آوٹ پٹ کا فنکشن بنائیں" +} diff --git a/js/msg/json/vi.json b/js/msg/json/vi.json new file mode 100644 index 0000000..e6d00c3 --- /dev/null +++ b/js/msg/json/vi.json @@ -0,0 +1,354 @@ +{ + "@metadata": { + "authors": [ + "Baonguyen21022003", + "Espertus", + "Qneutron", + "Withoutaname", + "Dstream", + "Nguyenvanduocit", + "Leducthn", + "SierraNguyen" + ] + }, + "VARIABLES_DEFAULT_NAME": "vật", + "TODAY": "Hôm nay", + "DUPLICATE_BLOCK": "Tạo Bản Sao", + "ADD_COMMENT": "Thêm Chú Giải", + "REMOVE_COMMENT": "Xóa Chú Giải", + "DUPLICATE_COMMENT": "Bình luận trùng", + "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?", + "CLEAN_UP": "Sắp xếp lại các khối", + "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", + "UNDO": "Hoàn tác", + "REDO": "Làm lại", + "CHANGE_VALUE_TITLE": "Thay giá trị thành:", + "RENAME_VARIABLE": "Thay tên biến...", + "RENAME_VARIABLE_TITLE": "Thay tên tất cả các biến \"%1\" thành:", + "NEW_VARIABLE": "Tạo biến...", + "NEW_STRING_VARIABLE": "Tạo một giá trị dạng chuỗi...", + "NEW_NUMBER_VARIABLE": "Tạo một giá trị số...", + "NEW_COLOUR_VARIABLE": "Tạo một giá trị màu sắc...", + "NEW_VARIABLE_TYPE_TITLE": "Kiểu giá trị mới:", + "NEW_VARIABLE_TITLE": "Tên của biến mới:", + "VARIABLE_ALREADY_EXISTS": "Một biến có tên '%1' đã tồn tại.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Giá trị '%1' đã tồn tại dưới dạng: '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Xóa %1 lần dùng của giá trị '%2'?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Không thể xóa giá trị '%1' vì nó được bao gồm trong định nghĩa của chức năng '%2'", + "DELETE_VARIABLE": "Xóa giá trị '%1'", + "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": "Cho biến '%1' lấy các giá trị từ số bắt đầu đến số kết thúc, đếm theo khoảng thời gian đã chỉ định và thực hiện các khối được chỉ đị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.", + "IOS_OK": "Đồng ý", + "IOS_CANCEL": "Hủy bỏ", + "IOS_ERROR": "Lỗi", + "IOS_PROCEDURES_INPUTS": "NHẬP VÀO", + "IOS_PROCEDURES_ADD_INPUT": "+ Thêm đầu vào", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Cho phép báo cáo", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Hàm này có chứa các input trùng nhau.", + "IOS_VARIABLES_ADD_VARIABLE": "+ Thêm biến", + "IOS_VARIABLES_ADD_BUTTON": "Thêm", + "IOS_VARIABLES_RENAME_BUTTON": "Đổi tên", + "IOS_VARIABLES_DELETE_BUTTON": "Xóa", + "IOS_VARIABLES_VARIABLE_NAME": "Tên biến", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "Bạn không thể không nhập tên biến.", + "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": "là số chẵn", + "MATH_IS_ODD": "là số 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.", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 của X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "Trả về arctangent của điểm (X, Y) trong khoảng từ -180 độ đến 180 độ.", + "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_TITLE": "ở cuối %1 thêm văn bản %2", + "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ố %1.", + "TEXT_INDEXOF_TITLE": "trong văn bản %1 %2 %3", + "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_TITLE": "trong văn bản %1 %2", + "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_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_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.", + "TEXT_COUNT_MESSAGE0": "đến %1 trong %2", + "TEXT_COUNT_TOOLTIP": "Đếm số lần một đoạn văn bản xuất hiện trong một đoạn văn bản khác.", + "TEXT_REPLACE_MESSAGE0": "thay thế %1 bằng %2 trong %3", + "TEXT_REPLACE_TOOLTIP": "Thay thế tất cả các lần xuất hiện của văn bản bằng văn bản khác.", + "TEXT_REVERSE_MESSAGE0": "đảo ngược %1", + "TEXT_REVERSE_TOOLTIP": "Đảo ngược thứ tự của các chữ cái trong 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 tiên/cuối cùng của vật trong danh sách. Nếu không tìm thấy thì hoàn trả số %1.", + "LISTS_GET_INDEX_GET": "lấy thành tố", + "LISTS_GET_INDEX_GET_REMOVE": "lấy và xóa thành tố", + "LISTS_GET_INDEX_REMOVE": "xóa thành tố", + "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_INDEX_FROM_START_TOOLTIP": "%1 là thành tố đầu tiên.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 là thành tố cuối cùng.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Hoàn trả thành tố trong danh sách ở vị trí ấn định.", + "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": "Hoàn trả và xóa thành tố trong danh sách ở vị trí ấn định.", + "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": "Xóa thành tố trong danh sách ở vị trí ấn định.", + "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", + "LISTS_SET_INDEX_INSERT": "chèn vào vị trí", + "LISTS_SET_INDEX_INPUT_TO": "giá trị", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Đặt giá trị của thành tố ở vị trí ấn định trong một danh sách.", + "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": "Chèn vật vào danh sách theo vị trí ấn định.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "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ừ vị trí thứ", + "LISTS_GET_SUBLIST_START_FROM_END": "lấy một danh sách con từ (đếm từ cuối) từ vị trí 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.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "sắp xếp %1 %2 %3", + "LISTS_SORT_TOOLTIP": "Sắp xếp một bản sao của một danh sách.", + "LISTS_SORT_ORDER_ASCENDING": "tăng dần", + "LISTS_SORT_ORDER_DESCENDING": "giảm dần", + "LISTS_SORT_TYPE_NUMERIC": "số", + "LISTS_SORT_TYPE_TEXT": "chữ cái", + "LISTS_SORT_TYPE_IGNORECASE": "chữ cái, không phân biệt hoa/thường", + "LISTS_SPLIT_LIST_FROM_TEXT": "tạo danh sách từ văn bản", + "LISTS_SPLIT_TEXT_FROM_LIST": "tạo văn bản từ danh sách", + "LISTS_SPLIT_WITH_DELIMITER": "với ký tự phân cách", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Tách văn bản thành một danh sách các văn bản nhỏ, ngắt bởi các ký tự phân cách.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Liên kết một danh sách các văn bản vào một văn bản, cách nhau bằng dấu phân cách.", + "LISTS_REVERSE_MESSAGE0": "đảo ngược %1", + "LISTS_REVERSE_TOOLTIP": "Đảo ngược bản sao chép của một danh sách.", + "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": "thủ tục để", + "PROCEDURES_DEFNORETURN_PROCEDURE": "làm gì đó", + "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_DEFNORETURN_COMMENT": "Mô tả hàm này...", + "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_HELPURL": "https://vi.wikipedia.org/wiki/Ch%C6%B0%C6%A1ng_tr%C3%ACnh_con", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Chạy một thủ tục không có giá trị hoàn trả.", + "PROCEDURES_CALLRETURN_HELPURL": "https://vi.wikipedia.org/wiki/Ch%C6%B0%C6%A1ng_tr%C3%ACnh_con", + "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.", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Hãy nói gì đó...", + "COLLAPSED_WARNINGS_WARNING": "Các khối bị sập có chứa cảnh báo." +} diff --git a/js/msg/json/xmf.json b/js/msg/json/xmf.json new file mode 100644 index 0000000..a34d866 --- /dev/null +++ b/js/msg/json/xmf.json @@ -0,0 +1,91 @@ +{ + "@metadata": { + "authors": [ + "Silovan" + ] + }, + "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": "მოხვარა", + "UNDO": "გოუქვაფა", + "REDO": "ოშხონაფა", + "CHANGE_VALUE_TITLE": "შანულობაშ თირუა:", + "RENAME_VARIABLE": "ჯოხოშ თირუა მათირეფონი…", + "RENAME_VARIABLE_TITLE": "არძა მათირეფონი '%1' ჯოხოშ თირუა -შა:", + "NEW_VARIABLE": "აკოქიმინი მათირეფონი...", + "NEW_VARIABLE_TITLE": "ახალი მათირეფონიშ ჯოხო:", + "VARIABLE_ALREADY_EXISTS": "მათირეფონი ჯოხოთი '%1' უკვე არსენებს.", + "DELETE_VARIABLE_CONFIRMATION": "'%2' მათირეფონიშ გჷმორინაფა %1 ბლასათო?", + "DELETE_VARIABLE": "'%1' მათირეფონიშ ლასუა", + "COLOUR_PICKER_HELPURL": "https://xmf.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_FLOW_STATEMENTS_OPERATOR_BREAK": "ციკლშე გიშულა", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "ციკლიშ გეჸვენჯი ბიჯგშა გინულა", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "თე ციკლიშ მეჭყორიდუა.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "ხვილაფა: თე ბლოკიშ გჷმორინაფა ხვალე ციკლიშ დინოხოლე შილებე.", + "CONTROLS_IF_TOOLTIP_1": "პიჯალეფი ნანდული ქორე-და, ზოჯუეფს არსულენს.", + "CONTROLS_IF_MSG_IF": "თუ", + "CONTROLS_IF_MSG_ELSEIF": "შხვანერო თუ", + "CONTROLS_IF_MSG_ELSE": "შხვანერო", + "IOS_OK": "OK", + "IOS_CANCEL": "გოუქვაფა", + "IOS_ERROR": "ჩილათა", + "IOS_PROCEDURES_INPUTS": "მიშულა", + "IOS_VARIABLES_ADD_BUTTON": "გეძინა", + "IOS_VARIABLES_RENAME_BUTTON": "ჯოხოშ თირუა", + "IOS_VARIABLES_DELETE_BUTTON": "ლასუა", + "LOGIC_OPERATION_AND": "დო", + "LOGIC_OPERATION_OR": "ვარდა", + "LOGIC_BOOLEAN_TRUE": "ნანდული", + "LOGIC_BOOLEAN_FALSE": "ტყურა", + "LOGIC_NULL": "მუთუნ ვარი", + "LOGIC_NULL_TOOLTIP": "დჷთმართინუანს მუთუნ ვარს.", + "MATH_NUMBER_HELPURL": "https://xmf.wikipedia.org/wiki/რიცხუ", + "MATH_NUMBER_TOOLTIP": "რიცხუ.", + "MATH_ARITHMETIC_HELPURL": "https://xmf.wikipedia.org/wiki/არითმეტიკა", + "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": "უარყოფითი რე", + "LISTS_ISEMPTY_TITLE": "%1 ცარიელი რე" +} diff --git a/js/msg/json/yo.json b/js/msg/json/yo.json new file mode 100644 index 0000000..678a678 --- /dev/null +++ b/js/msg/json/yo.json @@ -0,0 +1,342 @@ +{ + "@metadata": { + "authors": [ + "Mapmeld" + ] + }, + "VARIABLES_DEFAULT_NAME": "nkan", + "TODAY": "Loni", + "DUPLICATE_BLOCK": "Ṣe ẹẹda", + "ADD_COMMENT": "Ṣe afikun ọrọ iwoye", + "REMOVE_COMMENT": "Yọ afikun ọrọ iwoye", + "DUPLICATE_COMMENT": "Ṣe ẹẹda afikun ọrọ iwoye", + "EXTERNAL_INPUTS": "Awon afikun okeere", + "INLINE_INPUTS": "Afiku tẹle n tẹle", + "DELETE_BLOCK": "Paa Bulọọku rẹ", + "DELETE_X_BLOCKS": "Paa %1 awọn Bulọọku rẹ", + "DELETE_ALL_BLOCKS": "Paa gbogbo %1 bulọọku rẹ?", + "CLEAN_UP": "Nu Bulọọku kuro", + "COLLAPSE_BLOCK": "Bi Bulọọku ṣubu", + "COLLAPSE_ALL": "Bi awọn Bulọọku ṣubu", + "EXPAND_BLOCK": "Fẹ Bulọọku", + "EXPAND_ALL": "Fẹ awọn Bulọọku", + "DISABLE_BLOCK": "Sọ Bulọọku di alaiṣiṣẹ", + "ENABLE_BLOCK": "Muu Bulọọku ṣiṣẹ", + "HELP": "Iranwọ", + "UNDO": "Maa ṣe", + "REDO": "Tun ṣe", + "CHANGE_VALUE_TITLE": "Ṣe ayipada iye:", + "RENAME_VARIABLE": "Tun orukọ oniruuru kọ...", + "RENAME_VARIABLE_TITLE": "Tun orukọ gbogbo '%1' v oniruru kọ si:", + "NEW_VARIABLE": "Ṣe idasile oniruuru...", + "NEW_STRING_VARIABLE": "Ṣe idasile asopọ oniruru...", + "NEW_NUMBER_VARIABLE": "Ṣe idasile nọ́mbà oniruru...", + "NEW_COLOUR_VARIABLE": "Ṣe idasile awọ oniruuru...", + "NEW_VARIABLE_TYPE_TITLE": "Iru oniruuru tuntun:", + "NEW_VARIABLE_TITLE": "Orukọ oniruuru tuntun:", + "VARIABLE_ALREADY_EXISTS": "Oniruuru ti a darukọ '%1' ti wa tẹlẹtẹlẹ.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Oniruuru ti a darukọ '%1' ti wa tẹlẹtẹlẹ fun iru miran: '%2'.", + "DELETE_VARIABLE_CONFIRMATION": "Paa %1 lilo '%2' oniruuru rẹ?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "E ko lee paa Oniruuru rẹ ' %1' nitori wipe o je ara itumọ isise eto yi '%2'", + "DELETE_VARIABLE": "Paa awon '%1' Oniruuru rẹ", + "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", + "COLOUR_PICKER_TOOLTIP": "Yan awọ kan lati inu patako awọ.", + "COLOUR_RANDOM_TITLE": "awọ àrìnàkò", + "COLOUR_RANDOM_TOOLTIP": "Yan awọ kan ni ọna àrìnàkò.", + "COLOUR_RGB_TITLE": "awọ pelu:", + "COLOUR_RGB_RED": "awọ pupu", + "COLOUR_RGB_GREEN": "alawọ ewe", + "COLOUR_RGB_BLUE": "alawọ omi aro", + "COLOUR_RGB_TOOLTIP": "Ṣe idasile awọ kan pelu iye awọ pupu, alawọ ewe, ati alawọ omi aro. Gbogbo iye re gbọdọ je laarin 0 and 100.", + "COLOUR_BLEND_TITLE": "apapọ", + "COLOUR_BLEND_COLOUR1": "awọ 1", + "COLOUR_BLEND_COLOUR2": "awọ 2", + "COLOUR_BLEND_RATIO": "ipin", + "COLOUR_BLEND_TOOLTIP": "Da awo meji papo pelu ipin (0.0 - 1.0).", + "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", + "CONTROLS_REPEAT_TITLE": "Iye igba %1 ti tun ṣe", + "CONTROLS_REPEAT_INPUT_DO": "ṣe", + "CONTROLS_REPEAT_TOOLTIP": "Ṣe awon alaye ni igba pupo.", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "tun ṣe nigbati", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "tun ṣe titi ti", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Nigbati iye kan ba je otito, tun awon koodu kan ṣe.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Nigbati awon iye kan ba iro, tun awon koodu kan ṣe.", + "CONTROLS_FOR_TOOLTIP": "Ni awon oriṣiriṣi '%1' ṣe imulo lori iye kọọkan lati ori nọmba tio beere titi de eyin to pari nọmba, kaa ni pase aarin kan pato. Tun koodu yi se nigba kọọkan:", + "CONTROLS_FOR_TITLE": "iyipada %1 lati %2 si %3 fifi kun %4", + "CONTROLS_FOREACH_TITLE": "fun nigba kọọkan %1 ni akojọ %2", + "CONTROLS_FOREACH_TOOLTIP": "Fun nkan kọọkan ninu akojọ kan, ṣe eto oriṢiriṢi '%1' si nkan naa, ki o si tun koodu naa ṣe.", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "ya kuro ninu lupu", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "beere pelu aṣiṣe lupu", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Ya kuro ninu akojọ lupu.", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Ṣe afoda awon lupu to ku yii, kii o si tesiwaju pelu awon aṣiṣe lupu.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "Ikilo: Bulọọku yii se lo ninu aṣiṣe lupu yii nikan.", + "CONTROLS_IF_TOOLTIP_1": "Bi iye yii ba je otito, lẹyinna ṣe awọn alaye.", + "CONTROLS_IF_TOOLTIP_2": "Bi iye yii ba je otito, lẹyinna ṣe alaye bulọọku akọkọ. Bibẹẹkọ, ṣe alaye akọkọ bulọọku keji.", + "CONTROLS_IF_TOOLTIP_3": "Bi iye akọkọ yii ba je otito, lẹyinna ṣe alaye bulọọku akọkọ. Bibẹẹkọ, Bi iye keji yii ba je otito, ṣe alaye akọkọ bulọọku keji.", + "CONTROLS_IF_TOOLTIP_4": "Bi iye akọkọ yii ba je otito, lẹyinna ṣe alaye bulọọku akọkọ. Bi iye keji yii ba je otito, ṣe alaye akọkọ bulọọku keji. Bi eyikeyi iye naa ko ba je otito, ṣe alaye akọkọ bulọọku ti o gbeyin.", + "CONTROLS_IF_MSG_IF": "bi", + "CONTROLS_IF_MSG_ELSEIF": "bibẹẹkọ bi", + "CONTROLS_IF_MSG_ELSE": "bibẹẹkọ", + "CONTROLS_IF_IF_TOOLTIP": "Ṣe afikun, se ayọkuro, tabi se a tun beere abala yii lati se a tun gbejade bulọọku yii.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Ṣe afikun si ipo yii bi bulọọku.", + "CONTROLS_IF_ELSE_TOOLTIP": "Ṣe afikun ipari, mu-gbogbo ipo si bulọọku.", + "IOS_OK": "O DARA", + "IOS_CANCEL": "Fagilee", + "IOS_ERROR": "Aṣiṣe", + "IOS_PROCEDURES_INPUTS": "SII", + "IOS_PROCEDURES_ADD_INPUT": "+ Fi afikun sii", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "Gba koodu laaye", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "Awon afikun okeere", + "IOS_VARIABLES_ADD_VARIABLE": "+ Ṣe afikun orisirisi", + "IOS_VARIABLES_ADD_BUTTON": "Ìròpọ̀", + "IOS_VARIABLES_RENAME_BUTTON": "Àtúnṣọlọ́rúkọ", + "IOS_VARIABLES_DELETE_BUTTON": "Paarẹ", + "IOS_VARIABLES_VARIABLE_NAME": "Oruko orisirisi", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "O ko le lo oruko orisirisi ti o sofo.", + "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", + "LOGIC_COMPARE_TOOLTIP_EQ": "Da otito pada b iafikun mejeji ba dogba bakanna.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "Da otito pada bi afikun mejeji ko ba dogba bakanna.", + "LOGIC_COMPARE_TOOLTIP_LT": "Da otito pada bi afikun akooko ba kere ju afiku keji lo.", + "LOGIC_COMPARE_TOOLTIP_LTE": "Da otito pada bi afikun akooko ba kere ju tabi dogba pelu afiku keji lo.", + "LOGIC_COMPARE_TOOLTIP_GT": "Da otito pada bi afikun akooko ba tobi ju afiku keji lo.", + "LOGIC_COMPARE_TOOLTIP_GTE": "Da otito pada bi afikun akooko ba tobi ju tabi dogba pelu afiku keji lo.", + "LOGIC_OPERATION_TOOLTIP_AND": "Da otito pada bi afikun mejeji ba je otito.", + "LOGIC_OPERATION_AND": "ati", + "LOGIC_OPERATION_TOOLTIP_OR": "Da otitọ pada bi o kere ju afikun kan ba je otito.", + "LOGIC_OPERATION_OR": "tabi", + "LOGIC_NEGATE_TITLE": "kii ṣe %1", + "LOGIC_NEGATE_TOOLTIP": "Da otitọ pada bi afikun ba je irọ. Da iro pada bi afikun ba je otito.", + "LOGIC_BOOLEAN_TRUE": "otitọ", + "LOGIC_BOOLEAN_FALSE": "irọ", + "LOGIC_BOOLEAN_TOOLTIP": "Da pada bi o je otito tabi iro.", + "LOGIC_NULL": "ofo", + "LOGIC_NULL_TOOLTIP": "Da ofo pada.", + "LOGIC_TERNARY_CONDITION": "idanwo", + "LOGIC_TERNARY_IF_TRUE": "bi otitọ", + "LOGIC_TERNARY_IF_FALSE": "bi irọ", + "LOGIC_TERNARY_TOOLTIP": "Ṣe ayewo ipo naa ni 'idanwo'. Bi ipo nab a je otito, Da pada 'bi otito' iye; bibẹẹkọ da pada 'bi iro' iye.", + "MATH_NUMBER_HELPURL": "https://yo.wikipedia.org/wiki/Nọ́mbà", + "MATH_NUMBER_TOOLTIP": "Nọ́mbà kan.", + "MATH_ARITHMETIC_HELPURL": "https://yo.wikipedia.org/wiki/Ìṣírò", + "MATH_ARITHMETIC_TOOLTIP_ADD": "Da apapo awọn nọmba meji pada.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "Da iyatọ awọn nọmba meji naa pada.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Da abajade awọn nọmba meji naa pada.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Da adarọ iye ti awọn nọmba meji pada.", + "MATH_ARITHMETIC_TOOLTIP_POWER": "Da nọmba akọkọ ti a gbe si agbara ti nọmba keji pada.", + "MATH_SINGLE_HELPURL": "https://yo.wikipedia.org/wiki/Gb%C3%B2ngb%C3%B2_al%C3%A1gb%C3%A1ram%C3%A9j%C3%AC", + "MATH_SINGLE_OP_ROOT": "Ipilẹ onihamẹrin", + "MATH_SINGLE_TOOLTIP_ROOT": "Da Ipilẹ onihamẹrin nọmba kan pada.", + "MATH_SINGLE_OP_ABSOLUTE": "patapata", + "MATH_SINGLE_TOOLTIP_ABS": "Da iye patapata ti nọmba kan pada.", + "MATH_SINGLE_TOOLTIP_NEG": "Da ilodisi ti nọmba kan pada", + "MATH_SINGLE_TOOLTIP_LN": "Da lọgaridimu adayeba ti nọmba kan pada.", + "MATH_SINGLE_TOOLTIP_LOG10": "Da ipilẹ 10 lọgaridimu nọmba kan pada.", + "MATH_SINGLE_TOOLTIP_EXP": "Da e pada si agbara ti nọmba kan.", + "MATH_SINGLE_TOOLTIP_POW10": "Da 10 pada si agbara nọmba kan.", + "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", + "MATH_TRIG_TOOLTIP_SIN": "Da sine ti digiri pada (kii ṣe Radian).", + "MATH_TRIG_TOOLTIP_COS": "Da cosine ti digiri pada (kii ṣe Radian).", + "MATH_TRIG_TOOLTIP_TAN": "Da tangent ti digiri pada (kii ṣe Radian).", + "MATH_TRIG_TOOLTIP_ASIN": "Da arcsine ti digiri pada.", + "MATH_TRIG_TOOLTIP_ACOS": "Da arccosine ti digiri pada.", + "MATH_TRIG_TOOLTIP_ATAN": "Da arctangent ti digiri pada.", + "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", + "MATH_CONSTANT_TOOLTIP": "Da ọkan ninu awọn aiyipada ti o wọpọ pada: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (ailopin).", + "MATH_IS_EVEN": "je se e pin", + "MATH_IS_ODD": "je ai se e pin", + "MATH_IS_PRIME": "je nọ́mbà àkọ́kọ́", + "MATH_IS_WHOLE": "je odidi", + "MATH_IS_POSITIVE": "je di dara", + "MATH_IS_NEGATIVE": "je ai dara", + "MATH_IS_DIVISIBLE_BY": "je sisee pin pẹlu", + "MATH_IS_TOOLTIP": "Ṣe ayẹwo boya nọmba jẹ eyi to se pin, ai se pin, akori, odidi, ti o dara, ti ko dara, tabi ti o ba se e pin pelu nọmba kan. Pada otitọ tabi irọ.", + "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", + "MATH_CHANGE_TITLE": "iyipada %1 nipasẹ %2", + "MATH_CHANGE_TOOLTIP": "Se afiku si nọmba orisirisi '%1'.", + "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", + "MATH_ROUND_TOOLTIP": "Pa oju nọmba de soke tabi si isalẹ.", + "MATH_ROUND_OPERATOR_ROUND": "pa ju de", + "MATH_ROUND_OPERATOR_ROUNDUP": "pa ju de soke", + "MATH_ROUND_OPERATOR_ROUNDDOWN": "pa ju de si isalẹ", + "MATH_ONLIST_OPERATOR_SUM": "apao akojọ", + "MATH_ONLIST_TOOLTIP_SUM": "Da apapo gbogbo awọn nọmba inu akojọ pada.", + "MATH_ONLIST_OPERATOR_MIN": "akojọ ti o kere ju", + "MATH_ONLIST_TOOLTIP_MIN": "Da nọmba ti o kere julọ ninu akojọ pada.", + "MATH_ONLIST_OPERATOR_MAX": "akojọ ti o pọ ju", + "MATH_ONLIST_TOOLTIP_MAX": "Da nọmba ti o tobi julọ ninu akojọ pada.", + "MATH_ONLIST_OPERATOR_AVERAGE": "idameji akojọ", + "MATH_ONLIST_TOOLTIP_AVERAGE": "Da idameji pada (ipin isiro) ti awọn nọmba iye inu akojọ.", + "MATH_ONLIST_OPERATOR_MEDIAN": "agbedemeji akojọ", + "MATH_ONLIST_TOOLTIP_MEDIAN": "Da agbedemeji nọmba inu akojọ pada.", + "MATH_ONLIST_OPERATOR_MODE": "awọn ipo ti akojọ", + "MATH_ONLIST_TOOLTIP_MODE": "Da akojọ ti eyi ti o wọpọ julọ ninu akojọ.", + "MATH_ONLIST_OPERATOR_STD_DEV": "iṣiro deede ti akojọ", + "MATH_ONLIST_TOOLTIP_STD_DEV": "Da iṣiro deede ti akojọ pada.", + "MATH_ONLIST_OPERATOR_RANDOM": "àrìnàkò nkan ti akojọ", + "MATH_ONLIST_TOOLTIP_RANDOM": "Da àrìnàkò ida ipilẹ nkan lati inu akojọ.", + "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", + "MATH_MODULO_TITLE": "iyokù %1 ÷ %2", + "MATH_MODULO_TOOLTIP": "Da iyokù lati pinpin awọn nọmba meji pada.", + "MATH_CONSTRAIN_TITLE": "atokọ %1 kukuru %2 giga %3", + "MATH_CONSTRAIN_TOOLTIP": "Ṣe atokọ nọmba laarin awọn nọmba kukuru ati giga. (ini afikun).", + "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_INT_TITLE": "oniruru abala lati %1 si %2", + "MATH_RANDOM_INT_TOOLTIP": "Da àrìnàkò abala laarin awon opin pato meji pada, ini afikun.", + "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "oniruru ipin", + "MATH_RANDOM_FLOAT_TOOLTIP": "Da àrìnàkò ida pada laarin 0.0 (ini afikun) ati 1.0 (iyasọtọ).", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 X:%1 Y:%2", + "MATH_ATAN2_TOOLTIP": "Da ojuami arctangent pada (X, Y) ni awon digiri lati -180 si 180.", + "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", + "TEXT_TEXT_TOOLTIP": "Lẹta, ọrọ, tabi ila ọrọ.", + "TEXT_JOIN_TITLE_CREATEWITH": "ṣẹ ẹda ọrọ pẹlu", + "TEXT_JOIN_TOOLTIP": "Ṣẹda ọrọ kan nipa ṣiṣepọ gbogbo awọn ohun kan.", + "TEXT_CREATE_JOIN_TITLE_JOIN": "darapọ", + "TEXT_CREATE_JOIN_TOOLTIP": "Fikun, yọ kuro, tabi ṣe atunṣe awọn apakan lati se atunkọ ọrọ bulooku yii.", + "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Ṣe afikun nkan si ọrọ naa.", + "TEXT_APPEND_TITLE": "si %1 fikun ọrọ %2", + "TEXT_APPEND_TOOLTIP": "Ṣe afikun awon ọrọ oniruru '%1'.", + "TEXT_LENGTH_TITLE": "Gigun ti %1", + "TEXT_LENGTH_TOOLTIP": "Da nọmba awọn lẹta pada (pẹlu awọn alafo) ninu ọrọ ti a pese.", + "TEXT_ISEMPTY_TITLE": "%1 je isofo", + "TEXT_ISEMPTY_TOOLTIP": "Da otitọ pada ti ọrọ ti a pese ba ṣofo.", + "TEXT_INDEXOF_TOOLTIP": "Da atọka ti akọkọ / iṣẹlẹ to kẹhin ti akojọ. Da %1 akojọ pada ti o ko ba ri.", + "TEXT_INDEXOF_TITLE": "ninu %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "wa isele akọkọ ti o wa ninu ọrọ", + "TEXT_INDEXOF_OPERATOR_LAST": "wa isele igbeyin ti o wa ninu ọrọ", + "TEXT_CHARAT_TITLE": "ninu %1 %2", + "TEXT_CHARAT_FROM_START": "gba lẹta #", + "TEXT_CHARAT_FROM_END": "gba lẹta # lati opin", + "TEXT_CHARAT_FIRST": "gba lẹta akọkọ", + "TEXT_CHARAT_LAST": "gba lẹta ti o kẹhin", + "TEXT_CHARAT_RANDOM": "gba lẹta àrìnàkò", + "TEXT_CHARAT_TOOLTIP": "Da lẹta naa pada si ipo ti a ti sọ tẹlẹ.", + "TEXT_GET_SUBSTRING_TOOLTIP": "Da ipin kan pato ti ọrọ naa pada.", + "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "ninu", + "TEXT_GET_SUBSTRING_START_FROM_START": "gba substring lati lẹta #", + "TEXT_GET_SUBSTRING_START_FROM_END": "gba substring lati lẹta # lati opin", + "TEXT_GET_SUBSTRING_START_FIRST": "gba substring lati lẹta akọkọ", + "TEXT_GET_SUBSTRING_END_FROM_START": "si lẹta #", + "TEXT_GET_SUBSTRING_END_FROM_END": "si lẹta # lati opin", + "TEXT_GET_SUBSTRING_END_LAST": "si lẹta kẹhin", + "TEXT_CHANGECASE_TOOLTIP": "aa <-> AA", + "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "si ALFABETI NLA", + "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "si alfabeti kekere", + "TEXT_CHANGECASE_OPERATOR_TITLECASE": "si Alfabeti Aarin", + "TEXT_TRIM_TOOLTIP": "Da ẹda ti ọrọ naa pada pẹlu awọn alafo miiran ti o kuro lati ọkan tabi awọn opin mejeeji.", + "TEXT_TRIM_OPERATOR_BOTH": "ge awọn alafo lati awọn igun mejeji ti", + "TEXT_TRIM_OPERATOR_LEFT": "ge awọn alafo lati apa osi ti", + "TEXT_TRIM_OPERATOR_RIGHT": "ge awọn alafo lati apa otun ti", + "TEXT_PRINT_TITLE": "tẹ ọrọ %1", + "TEXT_PRINT_TOOLTIP": "Tẹ ọrọ kan pato, nọmba tabi iye awon miiran.", + "TEXT_PROMPT_TYPE_TEXT": "kiakia fun ọrọ pẹlu ifiranṣẹ", + "TEXT_PROMPT_TYPE_NUMBER": "kiakia fun nọmba pẹlu ifiranṣẹ", + "TEXT_PROMPT_TOOLTIP_NUMBER": "Kiakia fun olumulo fun nọmba.", + "TEXT_PROMPT_TOOLTIP_TEXT": "Kiakia fun olumulo fun awon ifiranṣẹ.", + "TEXT_COUNT_MESSAGE0": "ka %1 ni %2", + "TEXT_COUNT_TOOLTIP": "Ka iye igba diẹ ninu awọn ọrọ kan waye laarin awọn ọrọ miiran.", + "TEXT_REPLACE_MESSAGE0": "Ṣe iropọ %1 pelu %2 in %3", + "TEXT_REPLACE_TOOLTIP": "Ṣe iropo gbogbo awọn iṣẹlẹ ti o sele ninu awọn ọrọ laarin awọn ọrọ miiran.", + "TEXT_REVERSE_MESSAGE0": "Ṣe iyipada %1", + "TEXT_REVERSE_TOOLTIP": "Ṣe iyipada aṣẹ awọn ohun kikọ inu ọrọ naa.", + "LISTS_CREATE_EMPTY_TITLE": "Ṣẹda akojọ aṣayan tio ṣofo", + "LISTS_CREATE_EMPTY_TOOLTIP": "Da akojọ pada, ti gigun 0, ko ni awon akosile alaye", + "LISTS_CREATE_WITH_TOOLTIP": "Ṣẹda akojọ pẹlu nọmba eyikeyi ti awọn akojo.", + "LISTS_CREATE_WITH_INPUT_WITH": "ṣẹda akojọ", + "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "akojọ", + "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Fikun, yọ, tabi yọ, tunṣe awọn apakan lati akojọ bulooku yii.", + "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Fi nkan kun akojọ.", + "LISTS_REPEAT_TOOLTIP": "Ṣẹda akojọ kan ti o wa fun iye tun nọmba kan pato ti akoko ti a ti yan.", + "LISTS_REPEAT_TITLE": "ṣẹda akojọ pẹlu nkan %1 tun ṣe %2 igba", + "LISTS_LENGTH_TITLE": "gigun ti %1", + "LISTS_LENGTH_TOOLTIP": "Da gigun ti akojo pada.", + "LISTS_ISEMPTY_TITLE": "%1 je ofo", + "LISTS_ISEMPTY_TOOLTIP": "Da otitọ pada nigbati akojọ ba ṣofo.", + "LISTS_INLIST": "ni akojọ", + "LISTS_INDEX_OF_FIRST": "wa awon nkan akọkọ ti o sele", + "LISTS_INDEX_OF_LAST": "wa iṣẹlẹ ti o kẹhin ti akojọ", + "LISTS_INDEX_OF_TOOLTIP": "Da atọka ti akọkọ / iṣẹlẹ to kẹhin ti akojọ. Da %1 akojọ pada ti o ko ba ri.", + "LISTS_GET_INDEX_GET": "gba", + "LISTS_GET_INDEX_GET_REMOVE": "gba ati yọ", + "LISTS_GET_INDEX_REMOVE": "yọ", + "LISTS_GET_INDEX_FROM_END": "# lati opin", + "LISTS_GET_INDEX_FIRST": "àkọ́kọ́", + "LISTS_GET_INDEX_LAST": "tógbẹ̀yìn", + "LISTS_GET_INDEX_RANDOM": "àrìnàkò", + "LISTS_INDEX_FROM_START_TOOLTIP": "%1 jẹ ohun akọkọ.", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 jẹ ohun ti o kẹhin.", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Returns the item at the specified position in a list.", + "LISTS_GET_INDEX_TOOLTIP_GET_FIRST": "Da akojọ akọkọ pada.", + "LISTS_GET_INDEX_TOOLTIP_GET_LAST": "Da akojọ ti o kẹhin pada.", + "LISTS_GET_INDEX_TOOLTIP_GET_RANDOM": "Da ohun àrìnàkò kan pada ninu akojọ", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM": "Yọ ki o si da akojọ naa pada kuro ni ipo kan pato ti o wa.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST": "Yọ ki o si da akojọ kuro ni akọkọ pada.", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST": "Yọ ki o si da akojọ ti o kẹhin pada", + "LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM": "Yọ ki o si da akojọ ti o kẹhin àrìnàkò pada", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM": "Yọ ki o si da akojọ naa pada kuro ni ipo kan pato ti o wa.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Da akojọ akọkọ pada.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Da akojọ ti o kẹhin pada.", + "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Da ohun àrìnàkò kan pada ninu akojọ", + "LISTS_SET_INDEX_SET": "ṣeto", + "LISTS_SET_INDEX_INSERT": "fi sii ni", + "LISTS_SET_INDEX_INPUT_TO": "bii", + "LISTS_SET_INDEX_TOOLTIP_SET_FROM": "Ṣeto ohun akọkọ sii ipo kan pato ti a ti yan ni akojọ.", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "Fi ohun kan sii ni ibẹrẹ akojọ.", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "Fi ohun kan kun si opin akojọ.", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "Fi ohun kan kun si àrìnàkò akojọ.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "Fi ohun kan sii ipo kan pato ti a ti yan ni akojọ.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Fi ohun kan sii ni ibẹrẹ akojọ.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Fi ohun kan kun si opin akojọ.", + "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Fi ohun kan kun si àrìnàkò akojọ.", + "LISTS_GET_SUBLIST_START_FROM_START": "gba ipin -akojọ lati #", + "LISTS_GET_SUBLIST_START_FROM_END": "gba ipin -akojọ lati # lati opin", + "LISTS_GET_SUBLIST_START_FIRST": "gba ipin -akojọ lati akọkọ", + "LISTS_GET_SUBLIST_END_FROM_START": "sii #", + "LISTS_GET_SUBLIST_END_FROM_END": "sii # lati opin", + "LISTS_GET_SUBLIST_END_LAST": "sii opin", + "LISTS_GET_SUBLIST_TOOLTIP": "Ṣẹda ẹda ti apa kan ti o wa ninu akojọ.", + "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "to %1 %2 %3", + "LISTS_SORT_TOOLTIP": "To ẹda akojọ lẹsẹẹsẹ.", + "LISTS_SORT_ORDER_ASCENDING": "si oke", + "LISTS_SORT_ORDER_DESCENDING": "si isalẹ", + "LISTS_SORT_TYPE_NUMERIC": "awọn nọmba", + "LISTS_SORT_TYPE_TEXT": "awon alfabeti", + "LISTS_SORT_TYPE_IGNORECASE": "awon alfabeti, fojufo irufe", + "LISTS_SPLIT_LIST_FROM_TEXT": "ṣe akojọ lati inu ọrọ", + "LISTS_SPLIT_TEXT_FROM_LIST": "ṣe ọrọ lati akojọ", + "LISTS_SPLIT_WITH_DELIMITER": "pẹlu dẹlimita", + "LISTS_SPLIT_TOOLTIP_SPLIT": "Pin ọrọ sinu akojọ awọn ọrọ kan, fọ ni dẹlimita kọọkan.", + "LISTS_SPLIT_TOOLTIP_JOIN": "Darapọ mọ akojọ awọn ọrọ sinu ọrọ kan, ti a pin nipase delimita.", + "LISTS_REVERSE_MESSAGE0": "Ṣe iyipada %1", + "LISTS_REVERSE_TOOLTIP": "Ṣe iyipada ẹda ti akojọ kan.", + "VARIABLES_GET_TOOLTIP": "Da iye orisirisi yii pada.", + "VARIABLES_GET_CREATE_SET": "Ṣe idasile 'ṣeto %1'", + "VARIABLES_SET": "ṣeto %1 sii %2", + "VARIABLES_SET_TOOLTIP": "Ṣeto oniruru yii lati je bakanna sii igbasilẹ.", + "VARIABLES_SET_CREATE_GET": "Ṣe idasile 'gba %1'", + "PROCEDURES_DEFNORETURN_TITLE": "sii", + "PROCEDURES_DEFNORETURN_PROCEDURE": "Ṣe awon alaye ni igba pupo.", + "PROCEDURES_BEFORE_PARAMS": "pẹlu:", + "PROCEDURES_CALL_BEFORE_PARAMS": "pẹlu:", + "PROCEDURES_DEFNORETURN_TOOLTIP": "Ṣẹda iṣẹ kan lai si iṣagbejade.", + "PROCEDURES_DEFNORETURN_COMMENT": "Ṣe apejuwe iṣẹ yii...", + "PROCEDURES_DEFRETURN_RETURN": "tun tẹ", + "PROCEDURES_DEFRETURN_TOOLTIP": "Ṣẹda iṣẹ pẹlu iṣagbejade kan.", + "PROCEDURES_ALLOW_STATEMENTS": "gba alaye laaye", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Ikilo: Isẹ yii ni awọn ẹda odiwọn.", + "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Ṣe ṣalaye-iṣẹ ti olumulo '%1'.", + "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", + "PROCEDURES_CALLRETURN_TOOLTIP": "Ṣe ṣalaye-iṣẹ ti olumulo '%1' kii o sii lo iṣagbejade rẹ.", + "PROCEDURES_MUTATORCONTAINER_TITLE": "igbewọle", + "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Fikun, yọ kuro, tabi tun beere awọn igbewọle si iṣẹ yii.", + "PROCEDURES_MUTATORARG_TITLE": "igbewọle orukọ:", + "PROCEDURES_MUTATORARG_TOOLTIP": "Ṣe afikun kan sii igbewọle si iṣẹ yii.", + "PROCEDURES_HIGHLIGHT_DEF": "Ṣafihan iṣẹ isọtunmọ", + "PROCEDURES_CREATE_DO": "Ṣe idasile '%1'", + "PROCEDURES_IFRETURN_TOOLTIP": "Ti iye ba jẹ otitọ, lẹhinna da iye keji pada.", + "PROCEDURES_IFRETURN_WARNING": "Ikilo: Bulọọki yii le ṣee lo nikan laarin itumọ iṣẹ kan", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "Sọ nkankan..." +} diff --git a/js/msg/json/zh-hans.json b/js/msg/json/zh-hans.json new file mode 100644 index 0000000..c3b11cc --- /dev/null +++ b/js/msg/json/zh-hans.json @@ -0,0 +1,382 @@ +{ + "@metadata": { + "authors": [ + "Espertus", + "Liuxinyu970226", + "Luotiancheng", + "Qiyue2001", + "Xiaomingyan", + "Yfdyh000", + "아라", + "Hudafu", + "Shatteredwind", + "Duzc2", + "Tonylianlong", + "WindWood", + "Deathkon", + "Muhaoying", + "佛壁灯", + "Htq110219891", + "Ambeta", + "A Chinese Wikipedian", + "沈澄心" + ] + }, + "VARIABLES_DEFAULT_NAME": "项目", + "UNNAMED_KEY": "匿名", + "TODAY": "今天", + "DUPLICATE_BLOCK": "复制", + "ADD_COMMENT": "添加注释", + "REMOVE_COMMENT": "删除注释", + "DUPLICATE_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": "帮助", + "UNDO": "撤销", + "REDO": "重做", + "CHANGE_VALUE_TITLE": "更改值:", + "RENAME_VARIABLE": "重命名变量...", + "RENAME_VARIABLE_TITLE": "将所有“%1”变量重命名为:", + "NEW_VARIABLE": "创建变量...", + "NEW_STRING_VARIABLE": "创建字符串变量...", + "NEW_NUMBER_VARIABLE": "创建数字变量...", + "NEW_COLOUR_VARIABLE": "创建颜色变量...", + "NEW_VARIABLE_TYPE_TITLE": "新变量的类型:", + "NEW_VARIABLE_TITLE": "新变量的名称:", + "VARIABLE_ALREADY_EXISTS": "名字叫“%1”的变量已经存在了。", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "名字叫“%1”的变量已经有了另一个类型:“%2”。", + "DELETE_VARIABLE_CONFIRMATION": "要删除对变量“%2”的%1个引用吗?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "不能删除变量“%1”,因为它是函数“%2”定义的一部分", + "DELETE_VARIABLE": "删除变量“%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": "为列表 %2 里的每一项 %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": "增加、删除或重新排列各节来重新配置这个if语句块。", + "CONTROLS_IF_ELSEIF_TOOLTIP": "在这个if语句块中增加一个条件。", + "CONTROLS_IF_ELSE_TOOLTIP": "在这个if语句块中添加一个最终的,包括所有其余情况的条件。", + "IOS_OK": "确定", + "IOS_CANCEL": "取消", + "IOS_ERROR": "错误", + "IOS_PROCEDURES_INPUTS": "输入", + "IOS_PROCEDURES_ADD_INPUT": "+添加输入", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "允许的语句", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "这个函数有多个输入。", + "IOS_VARIABLES_ADD_VARIABLE": "+添加变量", + "IOS_VARIABLES_ADD_BUTTON": "添加", + "IOS_VARIABLES_RENAME_BUTTON": "重命名", + "IOS_VARIABLES_DELETE_BUTTON": "删除", + "IOS_VARIABLES_VARIABLE_NAME": "变量名", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "你不能使用空白的变量名。", + "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://github.com/google/blockly/wiki/Logic#not", + "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": "检查“断言”里的条件语句。如果条件为真,则返回“如果为真”的值,否则,则返回“如果为假”的值。", + "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": "返回一个数值的以10为底的对数。", + "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…)、平方根 (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之间(含边界)的随机数。", + "MATH_ATAN2_HELPURL": "https://zh.wikipedia.org/wiki/反正切2", + "MATH_ATAN2_TITLE": "点(x:%1,y:%2)的方位角", + "MATH_ATAN2_TOOLTIP": "返回点(X,Y)的反正切值,范围为-180到180度。", + "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_TITLE": "向%1附加文本%2", + "TEXT_APPEND_TOOLTIP": "将一些文本追加到变量“%1”里。", + "TEXT_LENGTH_TITLE": "%1的长度", + "TEXT_LENGTH_TOOLTIP": "返回给定文本的字母数(包括空格)。", + "TEXT_ISEMPTY_TITLE": "%1是空的", + "TEXT_ISEMPTY_TOOLTIP": "如果给定的文本为空,则返回真。", + "TEXT_INDEXOF_TOOLTIP": "返回第一个文本段在第二个文本段中的第一/最后一个匹配项的起始位置。如果未找到,则返回%1。", + "TEXT_INDEXOF_TITLE": "在文本 %1 里 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "寻找第一次出现的文本", + "TEXT_INDEXOF_OPERATOR_LAST": "寻找最后一次出现的文本", + "TEXT_CHARAT_TITLE": "在文本%1 里 %2", + "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": "要求用户输入一些文本。", + "TEXT_COUNT_MESSAGE0": "计算%1在%2里出现的次数", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "计算在一段文本中,某个部分文本重复出现了多少次。", + "TEXT_REPLACE_MESSAGE0": "在%3中,将%1替换为%2", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "在一段文本中,将出现过的某部分文本都替换掉。", + "TEXT_REVERSE_MESSAGE0": "翻转文本%1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "将文本中各个字符的顺序倒转。", + "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": "返回在列表中的第一/最后一个匹配项的索引值。如果找不到项目则返回%1。", + "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_INDEX_FROM_START_TOOLTIP": "%1是第一项。", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1是最后一项。", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "返回在列表中的指定位置的项。", + "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": "移除并返回列表中的指定位置的项。", + "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": "移除在列表中的指定位置的项。", + "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": "设置在列表中指定位置的项。", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "设置列表中的第一项。", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "设置列表中的最后一项。", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "设置列表中的随机一项。", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "插入在列表中指定位置的项。", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "排序%1 %2 %3", + "LISTS_SORT_TOOLTIP": "排序一个列表的拷贝。", + "LISTS_SORT_ORDER_ASCENDING": "升序", + "LISTS_SORT_ORDER_DESCENDING": "降序", + "LISTS_SORT_TYPE_NUMERIC": "按数字排序", + "LISTS_SORT_TYPE_TEXT": "按字母排序", + "LISTS_SORT_TYPE_IGNORECASE": "按字母排序,忽略大小写", + "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": "加入文本列表至一个文本,由分隔符分隔。", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "倒转%1", + "LISTS_REVERSE_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://zh.wikipedia.org/wiki/子程序", + "PROCEDURES_DEFNORETURN_TITLE": "至", + "PROCEDURES_DEFNORETURN_PROCEDURE": "做点什么", + "PROCEDURES_BEFORE_PARAMS": "与:", + "PROCEDURES_CALL_BEFORE_PARAMS": "与:", + "PROCEDURES_DEFNORETURN_DO": "-", + "PROCEDURES_DEFNORETURN_TOOLTIP": "创建一个不带输出值的函数。", + "PROCEDURES_DEFNORETURN_COMMENT": "描述该功能...", + "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_HELPURL": "http://c2.com/cgi/wiki?GuardClause", + "PROCEDURES_IFRETURN_WARNING": "警告:这个块只能在函数内部使用。", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "说点什么...", + "WORKSPACE_ARIA_LABEL": "Blockly工作区", + "COLLAPSED_WARNINGS_WARNING": "已收起的信息块内包含警告。" +} diff --git a/js/msg/json/zh-hant.json b/js/msg/json/zh-hant.json new file mode 100644 index 0000000..2a010d6 --- /dev/null +++ b/js/msg/json/zh-hant.json @@ -0,0 +1,363 @@ +{ + "@metadata": { + "authors": [ + "Gasolin", + "Wehwei", + "Liuxinyu970226", + "LNDDYL", + "Cwlin0416", + "Kasimtan", + "Kly", + "Dnowba", + "Dnow", + "和平至上", + "Jessica1213", + "沈澄心" + ] + }, + "VARIABLES_DEFAULT_NAME": "項目", + "UNNAMED_KEY": "未命名", + "TODAY": "今天", + "DUPLICATE_BLOCK": "複製", + "ADD_COMMENT": "加入註解", + "REMOVE_COMMENT": "移除註解", + "DUPLICATE_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": "說明", + "UNDO": "還原", + "REDO": "重做", + "CHANGE_VALUE_TITLE": "修改值:", + "RENAME_VARIABLE": "重新命名變數...", + "RENAME_VARIABLE_TITLE": "將所有「%1」變數重新命名為:", + "NEW_VARIABLE": "建立變數…", + "NEW_STRING_VARIABLE": "建立字串變數……", + "NEW_NUMBER_VARIABLE": "建立數值變數……", + "NEW_COLOUR_VARIABLE": "建立顏色變數……", + "NEW_VARIABLE_TYPE_TITLE": "新變數類型:", + "NEW_VARIABLE_TITLE": "新變數名稱:", + "VARIABLE_ALREADY_EXISTS": "已存在變數「%1」。", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "已存在名為「%1」,且用於其它類型「%2」的變數。", + "DELETE_VARIABLE_CONFIRMATION": "刪除使用%1次的「%2」變數?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "無法刪除變數「%1」,因為這是功能「%2」定義的一部份內容", + "DELETE_VARIABLE": "刪除變數「%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": "當值為 true 時,執行一些陳述式。", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "當值為 false 時,執行一些陳述式。", + "CONTROLS_FOR_TOOLTIP": "從起始數到結尾數中取出變數「%1」的值,按指定的時間間隔,執行指定的區塊。", + "CONTROLS_FOR_TITLE": "循環計數 %1 從 %2 到 %3 每次增加 %4", + "CONTROLS_FOREACH_TITLE": "為列表 %2 裡的每一項 %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": "當值為 true 時,執行一些陳述式。", + "CONTROLS_IF_TOOLTIP_2": "當值為 true 時,執行第一個陳述式。否則,執行第二個陳述式。", + "CONTROLS_IF_TOOLTIP_3": "如果第一個值為 true,則執行第一個陳述式。否則,當第二個值為 true 時,則執行第二個陳述式。", + "CONTROLS_IF_TOOLTIP_4": "如果第一個值為 true,則執行第一個陳述式。否則當第二個值為 true 時,則執行第二個陳述式。如果前幾個敘述都不為 ture,則執行最後一個陳述式。", + "CONTROLS_IF_MSG_IF": "如果", + "CONTROLS_IF_MSG_ELSEIF": "否則,如果", + "CONTROLS_IF_MSG_ELSE": "否則", + "CONTROLS_IF_IF_TOOLTIP": "添加、刪除或重新排列各部份以重新配置這個「如果」區塊。", + "CONTROLS_IF_ELSEIF_TOOLTIP": "添加條件到「如果」積木。", + "CONTROLS_IF_ELSE_TOOLTIP": "加入一個最終、所有條件都執行的部份到「如果」區塊中。", + "IOS_OK": "確定", + "IOS_CANCEL": "取消", + "IOS_ERROR": "錯誤", + "IOS_PROCEDURES_INPUTS": "輸入", + "IOS_PROCEDURES_ADD_INPUT": "+ 添加輸入", + "IOS_PROCEDURES_ALLOW_STATEMENTS": "允許加入陳述式", + "IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR": "此功能有多個輸入內容。", + "IOS_VARIABLES_ADD_VARIABLE": "+ 添加變數", + "IOS_VARIABLES_ADD_BUTTON": "添加", + "IOS_VARIABLES_RENAME_BUTTON": "重新命名", + "IOS_VARIABLES_DELETE_BUTTON": "刪除", + "IOS_VARIABLES_VARIABLE_NAME": "變數名稱", + "IOS_VARIABLES_EMPTY_NAME_ERROR": "您不能使用空的變數名稱。", + "LOGIC_COMPARE_HELPURL": "https://zh.wikipedia.org/wiki/不等", + "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_TOOLTIP_AND": "如果兩個輸入結果都為 true,則返回 true。", + "LOGIC_OPERATION_AND": "和", + "LOGIC_OPERATION_TOOLTIP_OR": "如果至少一個輸入結果為 true,返回 true。", + "LOGIC_OPERATION_OR": "或", + "LOGIC_NEGATE_TITLE": "%1 不成立", + "LOGIC_NEGATE_TOOLTIP": "如果輸入結果是 false,則返回 true。如果輸入結果是 true,則返回 false。", + "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": "檢查「測試」中的條件。如果條件為真,將返回「如果為真」的值;否則,返回「如果為假」的值。", + "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...)、 開方(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": "如果數字是偶數,奇數,非負整數,正數、 負數,或如果它是可被某數字整除,則返回 true 或 false。", + "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(不包含)之間隨機取一個數。", + "MATH_ATAN2_HELPURL": "https://zh.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "X:%1 Y:%2 的 Atan2", + "MATH_ATAN2_TOOLTIP": "回傳點(X,Y)從 -180 至 180 度的反正切值。", + "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_TITLE": "至 %1 套用文字 %2", + "TEXT_APPEND_TOOLTIP": "添加一些文字到變數「%1」之後。", + "TEXT_LENGTH_TITLE": "長度 %1", + "TEXT_LENGTH_TOOLTIP": "返回這串文字的字元數(包含空格)。", + "TEXT_ISEMPTY_TITLE": "%1 為空", + "TEXT_ISEMPTY_TOOLTIP": "如果提供的字串為空,則返回 true。", + "TEXT_INDEXOF_TOOLTIP": "在字串1中檢索是否有包含字串2,如果有,返回從頭/倒數算起的索引值。如果沒有則返回 %1。", + "TEXT_INDEXOF_TITLE": "在文字 %1 %2 %3", + "TEXT_INDEXOF_OPERATOR_FIRST": "從 最前面 索引字串", + "TEXT_INDEXOF_OPERATOR_LAST": "從 最後面 索引字串", + "TEXT_CHARAT_TITLE": "在文字 %1 %2", + "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": "輸入文字", + "TEXT_COUNT_MESSAGE0": "在%2計算%1", + "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", + "TEXT_COUNT_TOOLTIP": "計算某些文字在內容裡的出現次數。", + "TEXT_REPLACE_MESSAGE0": "在%3以%2取代%1", + "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", + "TEXT_REPLACE_TOOLTIP": "取代在內容裡的全部某些文字。", + "TEXT_REVERSE_MESSAGE0": "反轉%1", + "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", + "TEXT_REVERSE_TOOLTIP": "反轉排序在文字裡的字元。", + "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": "如果該清單為空,則返回 true。", + "LISTS_INLIST": "自清單", + "LISTS_INDEX_OF_FIRST": "從 最前面 索引項目", + "LISTS_INDEX_OF_LAST": "從 最後面 索引項目", + "LISTS_INDEX_OF_TOOLTIP": "在清單中檢索是否有包含項目,如果有,返回從頭/倒數算起的索引值。如果沒有則返回 %1。", + "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_INDEX_FROM_START_TOOLTIP": "%1 是第一個項目。", + "LISTS_INDEX_FROM_END_TOOLTIP": "%1 是最後一個項目。", + "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "返回在清單中指定位置的項目。", + "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": "移除並返回清單中的指定位置的項目。", + "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": "移除在清單中指定位置的項目。", + "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": "設定清單中指定位置的項目。", + "LISTS_SET_INDEX_TOOLTIP_SET_FIRST": "設定清單中的第一個項目。", + "LISTS_SET_INDEX_TOOLTIP_SET_LAST": "設定清單中的最後一個項目。", + "LISTS_SET_INDEX_TOOLTIP_SET_RANDOM": "設定清單中隨機一個項目。", + "LISTS_SET_INDEX_TOOLTIP_INSERT_FROM": "添加一個項目到清單中的指定位置。", + "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_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", + "LISTS_SORT_TITLE": "排列 %1 %2 %3", + "LISTS_SORT_TOOLTIP": "排序清單的複製內容。", + "LISTS_SORT_ORDER_ASCENDING": "升序", + "LISTS_SORT_ORDER_DESCENDING": "降序", + "LISTS_SORT_TYPE_NUMERIC": "依數字", + "LISTS_SORT_TYPE_TEXT": "依字母", + "LISTS_SORT_TYPE_IGNORECASE": "依字母排序,忽略大小寫", + "LISTS_SPLIT_LIST_FROM_TEXT": "從文本製作清單", + "LISTS_SPLIT_TEXT_FROM_LIST": "從清單拆出文本", + "LISTS_SPLIT_WITH_DELIMITER": "用分隔符", + "LISTS_SPLIT_TOOLTIP_SPLIT": "將文本變成清單項目,按分隔符號拆分。", + "LISTS_SPLIT_TOOLTIP_JOIN": "串起清單項目成一個文本,並用分隔符號分開。", + "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", + "LISTS_REVERSE_MESSAGE0": "反轉%1", + "LISTS_REVERSE_TOOLTIP": "反轉清單的複製內容。", + "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_TOOLTIP": "創建一個無回傳值的函式。", + "PROCEDURES_DEFNORETURN_COMMENT": "描述此函式...", + "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/%E5%AD%90%E7%A8%8B%E5%BA%8F", + "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": "如果值為 true,則返回第二個值。", + "PROCEDURES_IFRETURN_WARNING": "警告:這個區塊只可以在定義函式時使用。", + "WORKSPACE_COMMENT_DEFAULT_TEXT": "來說些事情...", + "WORKSPACE_ARIA_LABEL": "Blockly工作區", + "COLLAPSED_WARNINGS_WARNING": "收合含有警告的區塊。" +} diff --git a/js/msg/messages.js b/js/msg/messages.js new file mode 100644 index 0000000..ef3f46b --- /dev/null +++ b/js/msg/messages.js @@ -0,0 +1,1641 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview English strings. + * @author fraser@google.com (Neil Fraser) + * + * After modifying this file, either run "build.py" from the parent directory, + * or run (from this directory): + * ../i18n/js_to_json.py + * to regenerate json/{en,qqq,synonyms}.json. + * + * To convert all of the json files to .js files, run: + * ../i18n/create_messages.py json/*.json + */ +'use strict'; + + +/** + * Due to the frequency of long strings, the 80-column wrap rule need not apply + * to message files. + */ + +/** + * Each message is preceded with a triple-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. + */ + +/** @type {string} */ +/// {{Notranslate}} Hue value for all logic blocks. +Blockly.Msg.LOGIC_HUE = '210'; +/** @type {string} */ +/// {{Notranslate}} Hue value for all loop blocks. +Blockly.Msg.LOOPS_HUE = '120'; +/** @type {string} */ +/// {{Notranslate}} Hue value for all math blocks. +Blockly.Msg.MATH_HUE = '230'; +/** @type {string} */ +/// {{Notranslate}} Hue value for all text blocks. +Blockly.Msg.TEXTS_HUE = '160'; +/** @type {string} */ +/// {{Notranslate}} Hue value for all list blocks. +Blockly.Msg.LISTS_HUE = '260'; +/** @type {string} */ +/// {{Notranslate}} Hue value for all colour blocks. +Blockly.Msg.COLOUR_HUE = '20'; +/** @type {string} */ +/// {{Notranslate}} Hue value for all variable blocks. +Blockly.Msg.VARIABLES_HUE = '330'; +/** @type {string} */ +/// {{Notranslate}} Hue value for all variable dynamic blocks. +Blockly.Msg.VARIABLES_DYNAMIC_HUE = '310'; +/** @type {string} */ +/// {{Notranslate}} Hue value for all procedure blocks. +Blockly.Msg.PROCEDURES_HUE = '290'; + +/** @type {string} */ +/// 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'; +/** @type {string} */ +/// default name - A simple, default name for an unnamed function or variable. Preferably indicates that the item is unnamed. +Blockly.Msg.UNNAMED_KEY = 'unnamed'; +/** @type {string} */ +/// button text - Button that sets a calendar to today's date.\n{{Identical|Today}} +Blockly.Msg.TODAY = 'Today'; + +// Context menus. +/** @type {string} */ +/// context menu - Make a copy of the selected block (and any blocks it contains).\n{{Identical|Duplicate}} +Blockly.Msg.DUPLICATE_BLOCK = 'Duplicate'; +/** @type {string} */ +/// context menu - Add a descriptive comment to the selected block. +Blockly.Msg.ADD_COMMENT = 'Add Comment'; +/** @type {string} */ +/// context menu - Remove the descriptive comment from the selected block. +Blockly.Msg.REMOVE_COMMENT = 'Remove Comment'; +/** @type {string} */ +/// context menu - Make a copy of the selected workspace comment.\n{{Identical|Duplicate}} +Blockly.Msg.DUPLICATE_COMMENT = 'Duplicate Comment'; +/** @type {string} */ +/// context menu - Change from 'external' to 'inline' mode for displaying blocks used as inputs to the selected block. See [[Translating:Blockly#context_menus]]. +Blockly.Msg.EXTERNAL_INPUTS = 'External Inputs'; +/** @type {string} */ +/// context menu - Change from 'internal' to 'external' mode for displaying blocks used as inputs to the selected block. See [[Translating:Blockly#context_menus]]. +Blockly.Msg.INLINE_INPUTS = 'Inline Inputs'; +/** @type {string} */ +/// context menu - Permanently delete the selected block. +Blockly.Msg.DELETE_BLOCK = 'Delete Block'; +/** @type {string} */ +/// context menu - Permanently delete the %1 selected blocks.\n\nParameters:\n* %1 - an integer greater than 1. +Blockly.Msg.DELETE_X_BLOCKS = 'Delete %1 Blocks'; +/** @type {string} */ +/// confirmation prompt - Question the user if they really wanted to permanently delete all %1 blocks.\n\nParameters:\n* %1 - an integer greater than 1. +Blockly.Msg.DELETE_ALL_BLOCKS = 'Delete all %1 blocks?'; +/** @type {string} */ +/// context menu - Reposition all the blocks so that they form a neat line. +Blockly.Msg.CLEAN_UP = 'Clean up Blocks'; +/** @type {string} */ +/// context menu - Make the appearance of the selected block smaller by hiding some information about it. +Blockly.Msg.COLLAPSE_BLOCK = 'Collapse Block'; +/** @type {string} */ +/// context menu - Make the appearance of all blocks smaller by hiding some information about it. Use the same terminology as in the previous message. +Blockly.Msg.COLLAPSE_ALL = 'Collapse Blocks'; +/** @type {string} */ +/// context menu - Restore the appearance of the selected block by showing information about it that was hidden (collapsed) earlier. +Blockly.Msg.EXPAND_BLOCK = 'Expand Block'; +/** @type {string} */ +/// context menu - Restore the appearance of all blocks by showing information about it that was hidden (collapsed) earlier. Use the same terminology as in the previous message. +Blockly.Msg.EXPAND_ALL = 'Expand Blocks'; +/** @type {string} */ +/// context menu - Make the selected block have no effect (unless reenabled). +Blockly.Msg.DISABLE_BLOCK = 'Disable Block'; +/** @type {string} */ +/// context menu - Make the selected block have effect (after having been disabled earlier). +Blockly.Msg.ENABLE_BLOCK = 'Enable Block'; +/** @type {string} */ +/// context menu - Provide helpful information about the selected block.\n{{Identical|Help}} +Blockly.Msg.HELP = 'Help'; +/** @type {string} */ +/// context menu - Undo the previous action.\n{{Identical|Undo}} +Blockly.Msg.UNDO = 'Undo'; +/** @type {string} */ +/// context menu - Undo the previous undo action.\n{{Identical|Redo}} +Blockly.Msg.REDO = 'Redo'; + +// Variable renaming. +/** @type {string} */ +/// prompt - This message is only seen in the Opera browser. With most browsers, users can edit numeric values in blocks by just clicking and typing. Opera does not allows this, so we have to open a new window and prompt users with this message to chanage a value. +Blockly.Msg.CHANGE_VALUE_TITLE = 'Change value:'; +/** @type {string} */ +/// dropdown choice - When the user clicks on a variable block, this is one of the dropdown menu choices. It is used to rename the current variable. See [https://github.com/google/blockly/wiki/Variables#dropdown-menu https://github.com/google/blockly/wiki/Variables#dropdown-menu]. +Blockly.Msg.RENAME_VARIABLE = 'Rename variable...'; +/** @type {string} */ +/// prompt - Prompts the user to enter the new name for the selected variable. See [https://github.com/google/blockly/wiki/Variables#dropdown-menu https://github.com/google/blockly/wiki/Variables#dropdown-menu].\n\nParameters:\n* %1 - the name of the variable to be renamed. +Blockly.Msg.RENAME_VARIABLE_TITLE = 'Rename all "%1" variables to:'; + +// Variable creation +/** @type {string} */ +/// button text - Text on the button used to launch the variable creation dialogue. +Blockly.Msg.NEW_VARIABLE = 'Create variable...'; +/** @type {string} */ +/// button text - Text on the button used to launch the variable creation dialogue. +Blockly.Msg.NEW_STRING_VARIABLE = 'Create string variable...'; +/** @type {string} */ +/// button text - Text on the button used to launch the variable creation dialogue. +Blockly.Msg.NEW_NUMBER_VARIABLE = 'Create number variable...'; +/** @type {string} */ +/// button text - Text on the button used to launch the variable creation dialogue. +Blockly.Msg.NEW_COLOUR_VARIABLE = 'Create colour variable...'; +/** @type {string} */ +/// prompt - Prompts the user to enter the type for a variable. +Blockly.Msg.NEW_VARIABLE_TYPE_TITLE = 'New variable type:'; +/** @type {string} */ +/// prompt - Prompts the user to enter the name for a new variable. See [https://github.com/google/blockly/wiki/Variables#dropdown-menu https://github.com/google/blockly/wiki/Variables#dropdown-menu]. +Blockly.Msg.NEW_VARIABLE_TITLE = 'New variable name:'; +/** @type {string} */ +/// alert - Tells the user that the name they entered is already in use. +Blockly.Msg.VARIABLE_ALREADY_EXISTS = 'A variable named "%1" already exists.'; +/** @type {string} */ +/// alert - Tells the user that the name they entered is already in use for another type. +Blockly.Msg.VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE = 'A variable named "%1" already exists for another type: "%2".'; + +// Variable deletion. +/** @type {string} */ +/// confirm - Ask the user to confirm their deletion of multiple uses of a variable. +Blockly.Msg.DELETE_VARIABLE_CONFIRMATION = 'Delete %1 uses of the "%2" variable?'; +/** @type {string} */ +/// alert - Tell the user that they can't delete a variable because it's part of the definition of a function. +Blockly.Msg.CANNOT_DELETE_VARIABLE_PROCEDURE = 'Can\'t delete the variable "%1" because it\'s part of the definition of the function "%2"'; +/** @type {string} */ +/// dropdown choice - Delete the currently selected variable. +Blockly.Msg.DELETE_VARIABLE = 'Delete the "%1" variable'; + +// Colour Blocks. +/** @type {string} */ +/// {{Optional}} url - Information about colour. +Blockly.Msg.COLOUR_PICKER_HELPURL = 'https://en.wikipedia.org/wiki/Color'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Colour#picking-a-colour-from-a-palette https://github.com/google/blockly/wiki/Colour#picking-a-colour-from-a-palette]. +Blockly.Msg.COLOUR_PICKER_TOOLTIP = 'Choose a colour from the palette.'; +/** @type {string} */ +/// {{Optional}} url - A link that displays a random colour each time you visit it. +Blockly.Msg.COLOUR_RANDOM_HELPURL = 'http://randomcolour.com'; +/** @type {string} */ +/// block text - Title of block that generates a colour at random. +Blockly.Msg.COLOUR_RANDOM_TITLE = 'random colour'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Colour#generating-a-random-colour https://github.com/google/blockly/wiki/Colour#generating-a-random-colour]. +Blockly.Msg.COLOUR_RANDOM_TOOLTIP = 'Choose a colour at random.'; +/** @type {string} */ +/// {{Optional}} url - A link for colour codes with percentages (0-100%) for each component, instead of the more common 0-255, which may be more difficult for beginners. +Blockly.Msg.COLOUR_RGB_HELPURL = 'https://www.december.com/html/spec/colorpercompact.html'; +/** @type {string} */ +/// block text - Title of block for [https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components]. +Blockly.Msg.COLOUR_RGB_TITLE = 'colour with'; +/** @type {string} */ +/// block input text - The amount of red (from 0 to 100) to use when [https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components].\n{{Identical|Red}} +Blockly.Msg.COLOUR_RGB_RED = 'red'; +/** @type {string} */ +/// block input text - The amount of green (from 0 to 100) to use when [https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components]. +Blockly.Msg.COLOUR_RGB_GREEN = 'green'; +/** @type {string} */ +/// block input text - The amount of blue (from 0 to 100) to use when [https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components].\n{{Identical|Blue}} +Blockly.Msg.COLOUR_RGB_BLUE = 'blue'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components]. +Blockly.Msg.COLOUR_RGB_TOOLTIP = 'Create a colour with the specified amount of red, green, and blue. All values must be between 0 and 100.'; +/** @type {string} */ +/// {{Optional}} url - A useful link that displays blending of two colours. +Blockly.Msg.COLOUR_BLEND_HELPURL = 'https://meyerweb.com/eric/tools/color-blend/#:::rgbp'; +/** @type {string} */ +/// block text - A verb for blending two shades of paint. +Blockly.Msg.COLOUR_BLEND_TITLE = 'blend'; +/** @type {string} */ +/// block input text - The first of two colours to [https://github.com/google/blockly/wiki/Colour#blending-colours blend]. +Blockly.Msg.COLOUR_BLEND_COLOUR1 = 'colour 1'; +/** @type {string} */ +/// block input text - The second of two colours to [https://github.com/google/blockly/wiki/Colour#blending-colours blend]. +Blockly.Msg.COLOUR_BLEND_COLOUR2 = 'colour 2'; +/** @type {string} */ +/// block input text - The proportion of the [https://github.com/google/blockly/wiki/Colour#blending-colours blend] containing the first colour; the remaining proportion is of the second colour. For example, if the first colour is red and the second colour blue, a ratio of 1 would yield pure red, a ratio of .5 would yield purple (equal amounts of red and blue), and a ratio of 0 would yield pure blue.\n{{Identical|Ratio}} +Blockly.Msg.COLOUR_BLEND_RATIO = 'ratio'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Colour#blending-colours https://github.com/google/blockly/wiki/Colour#blending-colours]. +Blockly.Msg.COLOUR_BLEND_TOOLTIP = 'Blends two colours together with a given ratio (0.0 - 1.0).'; + +// Loop Blocks. +/** @type {string} */ +/// {{Optional}} url - Describes 'repeat loops' in computer programs; consider using the translation of the page [https://en.wikipedia.org/wiki/Control_flow https://en.wikipedia.org/wiki/Control_flow]. +Blockly.Msg.CONTROLS_REPEAT_HELPURL = 'https://en.wikipedia.org/wiki/For_loop'; +/** @type {string} */ +/// block input text - Title of [https://github.com/google/blockly/wiki/Loops#repeat repeat block].\n\nParameters:\n* %1 - the number of times the body of the loop should be repeated. +Blockly.Msg.CONTROLS_REPEAT_TITLE = 'repeat %1 times'; +/** @type {string} */ +/// block text - Preceding the blocks in the body of the loop. See [https://github.com/google/blockly/wiki/Loops https://github.com/google/blockly/wiki/Loops].\n{{Identical|Do}} +Blockly.Msg.CONTROLS_REPEAT_INPUT_DO = 'do'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Loops#repeat https://github.com/google/blockly/wiki/Loops#repeat]. +Blockly.Msg.CONTROLS_REPEAT_TOOLTIP = 'Do some statements several times.'; +/** @type {string} */ +/// {{Optional}} url - Describes 'while loops' in computer programs; consider using the translation of [https://en.wikipedia.org/wiki/While_loop https://en.wikipedia.org/wiki/While_loop], if present, or [https://en.wikipedia.org/wiki/Control_flow https://en.wikipedia.org/wiki/Control_flow]. +Blockly.Msg.CONTROLS_WHILEUNTIL_HELPURL = 'https://github.com/google/blockly/wiki/Loops#repeat'; +/** @type {string} */ +Blockly.Msg.CONTROLS_WHILEUNTIL_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +/** @type {string} */ +/// dropdown - Specifies that a loop should [https://github.com/google/blockly/wiki/Loops#repeat-while repeat while] the following condition is true. +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_WHILE = 'repeat while'; +/** @type {string} */ +/// dropdown - Specifies that a loop should [https://github.com/google/blockly/wiki/Loops#repeat-until repeat until] the following condition becomes true. +Blockly.Msg.CONTROLS_WHILEUNTIL_OPERATOR_UNTIL = 'repeat until'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Loops#repeat-while Loops#repeat-while https://github.com/google/blockly/wiki/Loops#repeat-while Loops#repeat-while]. +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_WHILE = 'While a value is true, then do some statements.'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Loops#repeat-until https://github.com/google/blockly/wiki/Loops#repeat-until]. +Blockly.Msg.CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL = 'While a value is false, then do some statements.'; + +/** @type {string} */ +/// {{Optional}} url - Describes 'for loops' in computer programs. Consider using your language's translation of [https://en.wikipedia.org/wiki/For_loop https://en.wikipedia.org/wiki/For_loop], if present. +Blockly.Msg.CONTROLS_FOR_HELPURL = 'https://github.com/google/blockly/wiki/Loops#count-with'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Loops#count-with https://github.com/google/blockly/wiki/Loops#count-with].\n\nParameters:\n* %1 - the name of the loop variable. +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.'; +/** @type {string} */ +/// block text - Repeatedly counts a variable (%1) +/// starting with a (usually lower) number in a range (%2), +/// ending with a (usually higher) number in a range (%3), and counting the +/// iterations by a number of steps (%4). As in +/// [https://github.com/google/blockly/wiki/Loops#count-with +/// https://github.com/google/blockly/wiki/Loops#count-with]. +/// [[File:Blockly-count-with.png]] +Blockly.Msg.CONTROLS_FOR_TITLE = 'count with %1 from %2 to %3 by %4'; +/** @type {string} */ +Blockly.Msg.CONTROLS_FOR_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; + +/** @type {string} */ +/// {{Optional}} url - Describes 'for-each loops' in computer programs. Consider using your language's translation of [https://en.wikipedia.org/wiki/Foreach https://en.wikipedia.org/wiki/Foreach] if present. +Blockly.Msg.CONTROLS_FOREACH_HELPURL = 'https://github.com/google/blockly/wiki/Loops#for-each'; +/** @type {string} */ +/// block text - Title of [https://github.com/google/blockly/wiki/Loops#for-each for each block]. +/// Sequentially assigns every item in array %2 to the valiable %1. +Blockly.Msg.CONTROLS_FOREACH_TITLE = 'for each item %1 in list %2'; +/** @type {string} */ +Blockly.Msg.CONTROLS_FOREACH_INPUT_DO = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +/** @type {string} */ +/// block text - Description of [https://github.com/google/blockly/wiki/Loops#for-each for each blocks].\n\nParameters:\n* %1 - the name of the loop variable. +Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = 'For each item in a list, set the variable "%1" to the item, and then do some statements.'; + +/** @type {string} */ +/// {{Optional}} url - Describes control flow in computer programs. Consider using your language's translation of [https://en.wikipedia.org/wiki/Control_flow https://en.wikipedia.org/wiki/Control_flow], if it exists. +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = 'https://github.com/google/blockly/wiki/Loops#loop-termination-blocks'; +/** @type {string} */ +/// dropdown - The current loop should be exited. See [https://github.com/google/blockly/wiki/Loops#break https://github.com/google/blockly/wiki/Loops#break]. +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = 'break out of loop'; +/** @type {string} */ +/// dropdown - The current iteration of the loop should be ended and the next should begin. See [https://github.com/google/blockly/wiki/Loops#continue-with-next-iteration https://github.com/google/blockly/wiki/Loops#continue-with-next-iteration]. +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = 'continue with next iteration of loop'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Loops#break-out-of-loop https://github.com/google/blockly/wiki/Loops#break-out-of-loop]. +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = 'Break out of the containing loop.'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Loops#continue-with-next-iteration https://github.com/google/blockly/wiki/Loops#continue-with-next-iteration]. +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = 'Skip the rest of this loop, and continue with the next iteration.'; +/** @type {string} */ +/// warning - The user has tried placing a block outside of a loop (for each, while, repeat, etc.), but this type of block may only be used within a loop. See [https://github.com/google/blockly/wiki/Loops#loop-termination-blocks https://github.com/google/blockly/wiki/Loops#loop-termination-blocks]. +Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = 'Warning: This block may only be used within a loop.'; + +// Logic Blocks. +/** @type {string} */ +/// {{Optional}} url - Describes conditional statements (if-then-else) in computer programs. Consider using your language's translation of [https://en.wikipedia.org/wiki/If_else https://en.wikipedia.org/wiki/If_else], if present. +Blockly.Msg.CONTROLS_IF_HELPURL = 'https://github.com/google/blockly/wiki/IfElse'; +/** @type {string} */ +/// tooltip - Describes [https://github.com/google/blockly/wiki/IfElse#if-blocks 'if' blocks]. Consider using your language's translation of [https://en.wikipedia.org/wiki/If_statement https://en.wikipedia.org/wiki/If_statement], if present. +Blockly.Msg.CONTROLS_IF_TOOLTIP_1 = 'If a value is true, then do some statements.'; +/** @type {string} */ +/// tooltip - Describes [https://github.com/google/blockly/wiki/IfElse#if-else-blocks if-else blocks]. Consider using your language's translation of [https://en.wikipedia.org/wiki/If_statement https://en.wikipedia.org/wiki/If_statement], if present. +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.'; +/** @type {string} */ +/// tooltip - Describes [https://github.com/google/blockly/wiki/IfElse#if-else-if-blocks if-else-if blocks]. Consider using your language's translation of [https://en.wikipedia.org/wiki/If_statement https://en.wikipedia.org/wiki/If_statement], if present. +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.'; +/** @type {string} */ +/// tooltip - Describes [https://github.com/google/blockly/wiki/IfElse#if-else-if-else-blocks if-else-if-else blocks]. Consider using your language's translation of [https://en.wikipedia.org/wiki/If_statement https://en.wikipedia.org/wiki/If_statement], if present. +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.'; +/** @type {string} */ +/// block text - See [https://github.com/google/blockly/wiki/IfElse https://github.com/google/blockly/wiki/IfElse]. +/// It is recommended, but not essential, that this have text in common with the translation of 'else if'\n{{Identical|If}} +Blockly.Msg.CONTROLS_IF_MSG_IF = 'if'; +/** @type {string} */ +/// block text - See [https://github.com/google/blockly/wiki/IfElse https://github.com/google/blockly/wiki/IfElse]. The English words "otherwise if" would probably be clearer than "else if", but the latter is used because it is traditional and shorter. +Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = 'else if'; +/** @type {string} */ +/// block text - See [https://github.com/google/blockly/wiki/IfElse https://github.com/google/blockly/wiki/IfElse]. The English word "otherwise" would probably be superior to "else", but the latter is used because it is traditional and shorter. +Blockly.Msg.CONTROLS_IF_MSG_ELSE = 'else'; +/** @type {string} */ +Blockly.Msg.CONTROLS_IF_MSG_THEN = Blockly.Msg.CONTROLS_REPEAT_INPUT_DO; +/** @type {string} */ +Blockly.Msg.CONTROLS_IF_IF_TITLE_IF = Blockly.Msg.CONTROLS_IF_MSG_IF; +/** @type {string} */ +/// tooltip - Describes [https://github.com/google/blockly/wiki/IfElse#block-modification if block modification]. +Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = 'Add, remove, or reorder sections to reconfigure this if block.'; +/** @type {string} */ +Blockly.Msg.CONTROLS_IF_ELSEIF_TITLE_ELSEIF = Blockly.Msg.CONTROLS_IF_MSG_ELSEIF; +/** @type {string} */ +/// tooltip - Describes the 'else if' subblock during [https://github.com/google/blockly/wiki/IfElse#block-modification if block modification]. +Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = 'Add a condition to the if block.'; +/** @type {string} */ +Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE; +/** @type {string} */ +/// tooltip - Describes the 'else' subblock during [https://github.com/google/blockly/wiki/IfElse#block-modification if block modification]. +Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = 'Add a final, catch-all condition to the if block.'; + +/** @type {string} */ +/// button text - Text on a button inside a dialogue window, which will accept or acknowledge the contents of the dialogue when pressed.\n{{Identical|OK}} +Blockly.Msg.IOS_OK = 'OK'; +/** @type {string} */ +/// button text - Text on a button inside a dialogue window, which will close or cancel the dialogue when pressed.\n{{Identical|Cancel}} +Blockly.Msg.IOS_CANCEL = 'Cancel'; +/** @type {string} */ +/// alert - Title text for an error dialogue.\n{{Identical|Error}} +Blockly.Msg.IOS_ERROR = 'Error'; +/** @type {string} */ +/// header text - Title of a section that displays a list of parameters (aka. "inputs") that have been defined for a procedure. This is used inside a dialogue window to configure a procedure.\n{{Identical|Input}} +Blockly.Msg.IOS_PROCEDURES_INPUTS = 'INPUTS'; +/** @type {string} */ +/// button text - Text on a button which will add a parameter (aka. "input") to a procedure. This is used inside a dialogue window to configure a procedure. NOTE: The "+" should be preserved at the beginning of the text. +Blockly.Msg.IOS_PROCEDURES_ADD_INPUT = '+ Add Input'; +/** @type {string} */ +/// option text - Text describing an option to allow statements to be added within a procedure. This is used inside a dialogue window to configure a procedure. +Blockly.Msg.IOS_PROCEDURES_ALLOW_STATEMENTS = 'Allow statements'; +/** @type {string} */ +/// alert - Error message when duplicate parameters (aka. "inputs") have been defined on a procedure. This is used inside a dialogue window to configure procedure parameters. +Blockly.Msg.IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR = 'This function has duplicate inputs.'; +/** @type {string} */ +/// button text - Text on a button which will open a variable creation dialogue when pressed. NOTE: The "+" should be preserved at the beginning of the text. +Blockly.Msg.IOS_VARIABLES_ADD_VARIABLE = '+ Add Variable'; +/** @type {string} */ +/// button text - Text on a button inside a variable creation dialogue, which will add a variable when pressed.\n{{Identical|Add}} +Blockly.Msg.IOS_VARIABLES_ADD_BUTTON = 'Add'; +/** @type {string} */ +/// button text - Text on a button inside a variable rename dialogue, which will rename a variable when pressed.\n{{Identical|Rename}} +Blockly.Msg.IOS_VARIABLES_RENAME_BUTTON = 'Rename'; +/** @type {string} */ +/// button text - Text on a button inside a variable deletion dialogue, which will delete a variable when pressed.\n{{Identical|Delete}} +Blockly.Msg.IOS_VARIABLES_DELETE_BUTTON = 'Delete'; +/** @type {string} */ +/// placeholder text - Placeholder text used inside a text input, where a variable name should be entered. +Blockly.Msg.IOS_VARIABLES_VARIABLE_NAME = 'Variable name'; +/** @type {string} */ +/// alert - Error message that is displayed when the user attempts to create a variable without a name. +Blockly.Msg.IOS_VARIABLES_EMPTY_NAME_ERROR = 'You can\'t use an empty variable name.'; + +/** @type {string} */ +/// {{Optional}} url - Information about comparisons. +Blockly.Msg.LOGIC_COMPARE_HELPURL = 'https://en.wikipedia.org/wiki/Inequality_(mathematics)'; +/** @type {string} */ +/// tooltip - Describes the equals (=) block. +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_EQ = 'Return true if both inputs equal each other.'; +/** @type {string} */ +/// tooltip - Describes the not equals (≠) block. +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_NEQ = 'Return true if both inputs are not equal to each other.'; +/** @type {string} */ +/// tooltip - Describes the less than (<) block. +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LT = 'Return true if the first input is smaller than the second input.'; +/** @type {string} */ +/// tooltip - Describes the less than or equals (≤) block. +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_LTE = 'Return true if the first input is smaller than or equal to the second input.'; +/** @type {string} */ +/// tooltip - Describes the greater than (>) block. +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GT = 'Return true if the first input is greater than the second input.'; +/** @type {string} */ +/// tooltip - Describes the greater than or equals (≥) block. +Blockly.Msg.LOGIC_COMPARE_TOOLTIP_GTE = 'Return true if the first input is greater than or equal to the second input.'; + +/** @type {string} */ +/// {{Optional}} 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. +Blockly.Msg.LOGIC_OPERATION_HELPURL = 'https://github.com/google/blockly/wiki/Logic#logical-operations'; +/** @type {string} */ +/// 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.'; +/** @type {string} */ +/// 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'; +/** @type {string} */ +/// 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.'; +/** @type {string} */ +/// block text - See [https://en.wikipedia.org/wiki/Disjunction https://en.wikipedia.org/wiki/Disjunction].\n{{Identical|Or}} +Blockly.Msg.LOGIC_OPERATION_OR = 'or'; + +/** @type {string} */ +/// {{Optional}} 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. +Blockly.Msg.LOGIC_NEGATE_HELPURL = 'https://github.com/google/blockly/wiki/Logic#not'; +/** @type {string} */ +/// 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") +Blockly.Msg.LOGIC_NEGATE_TITLE = 'not %1'; +/** @type {string} */ +/// tooltip - See [https://en.wikipedia.org/wiki/Logical_negation https://en.wikipedia.org/wiki/Logical_negation]. +Blockly.Msg.LOGIC_NEGATE_TOOLTIP = 'Returns true if the input is false. Returns false if the input is true.'; + +/** @type {string} */ +/// {{Optional}} 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'; +/** @type {string} */ +/// 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'; +/** @type {string} */ +/// 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'; +/** @type {string} */ +/// 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.'; + +/** @type {string} */ +/// {{Optional}} 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. +Blockly.Msg.LOGIC_NULL_HELPURL = 'https://en.wikipedia.org/wiki/Nullable_type'; +/** @type {string} */ +/// 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".\n{{Identical|Null}} +Blockly.Msg.LOGIC_NULL = 'null'; +/** @type {string} */ +/// tooltip - This should use the word from the previous message. +Blockly.Msg.LOGIC_NULL_TOOLTIP = 'Returns null.'; + +/** @type {string} */ +/// {{Optional}} url - Describes the programming language operator known as the ''ternary'' or ''conditional'' operator. It is recommended that you use the translation of [https://en.wikipedia.org/wiki/%3F: https://en.wikipedia.org/wiki/%3F:] if it exists. +Blockly.Msg.LOGIC_TERNARY_HELPURL = 'https://en.wikipedia.org/wiki/%3F:'; +/** @type {string} */ +/// block input text - Label for the input whose value determines which of the other two inputs is returned. In some programming languages, this is called a ''''predicate''''. +Blockly.Msg.LOGIC_TERNARY_CONDITION = 'test'; +/** @type {string} */ +/// block input text - Indicates that the following input should be returned (used as output) if the test input is true. Remember to try to keep block text terse (short). +Blockly.Msg.LOGIC_TERNARY_IF_TRUE = 'if true'; +/** @type {string} */ +/// block input text - Indicates that the following input should be returned (used as output) if the test input is false. +Blockly.Msg.LOGIC_TERNARY_IF_FALSE = 'if false'; +/** @type {string} */ +/// tooltip - See [https://en.wikipedia.org/wiki/%3F: https://en.wikipedia.org/wiki/%3F:]. +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.'; + +// Math Blocks. +/** @type {string} */ +/// {{Optional}} url - Information about (real) numbers. +Blockly.Msg.MATH_NUMBER_HELPURL = 'https://en.wikipedia.org/wiki/Number'; +/** @type {string} */ +/// tooltip - Any positive or negative number, not necessarily an integer. +Blockly.Msg.MATH_NUMBER_TOOLTIP = 'A number.'; + +/** @type {string} */ +/// {{Optional}} math - The symbol for the binary operation addition. +Blockly.Msg.MATH_ADDITION_SYMBOL = '+'; +/** @type {string} */ +/// {{Optional}} math - The symbol for the binary operation indicating that the right operand should be +/// subtracted from the left operand. +Blockly.Msg.MATH_SUBTRACTION_SYMBOL = '-'; +/** @type {string} */ +/// {{Optional}} math - The binary operation indicating that the left operand should be divided by +/// the right operand. +Blockly.Msg.MATH_DIVISION_SYMBOL = '÷'; +/** @type {string} */ +/// {{Optional}} math - The symbol for the binary operation multiplication. +Blockly.Msg.MATH_MULTIPLICATION_SYMBOL = '×'; +/** @type {string} */ +/// {{Optional}} math - The symbol for the binary operation exponentiation. Specifically, if the +/// value of the left operand is L and the value of the right operand (the exponent) is +/// R, multiply L by itself R times. (Fractional and negative exponents are also legal.) +Blockly.Msg.MATH_POWER_SYMBOL = '^'; + +/** @type {string} */ +/// math - The short name of the trigonometric function +/// [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent sine]. +Blockly.Msg.MATH_TRIG_SIN = 'sin'; +/** @type {string} */ +/// math - The short name of the trigonometric function +/// [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent cosine]. +Blockly.Msg.MATH_TRIG_COS = 'cos'; +/** @type {string} */ +/// math - The short name of the trigonometric function +/// [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent tangent]. +Blockly.Msg.MATH_TRIG_TAN = 'tan'; +/** @type {string} */ +/// math - The short name of the ''inverse of'' the trigonometric function +/// [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent sine]. +Blockly.Msg.MATH_TRIG_ASIN = 'asin'; +/** @type {string} */ +/// math - The short name of the ''inverse of'' the trigonometric function +/// [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent cosine]. +Blockly.Msg.MATH_TRIG_ACOS = 'acos'; +/** @type {string} */ +/// math - The short name of the ''inverse of'' the trigonometric function +/// [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent tangent]. +Blockly.Msg.MATH_TRIG_ATAN = 'atan'; + +/** @type {string} */ +/// {{Optional}} url - Information about addition, subtraction, multiplication, division, and exponentiation. +Blockly.Msg.MATH_ARITHMETIC_HELPURL = 'https://en.wikipedia.org/wiki/Arithmetic'; +/** @type {string} */ +/// tooltip - See [https://en.wikipedia.org/wiki/Addition https://en.wikipedia.org/wiki/Addition]. +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD = 'Return the sum of the two numbers.'; +/** @type {string} */ +/// tooltip - See [https://en.wikipedia.org/wiki/Subtraction https://en.wikipedia.org/wiki/Subtraction]. +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS = 'Return the difference of the two numbers.'; +/** @type {string} */ +/// tooltip - See [https://en.wikipedia.org/wiki/Multiplication https://en.wikipedia.org/wiki/Multiplication]. +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY = 'Return the product of the two numbers.'; +/** @type {string} */ +/// tooltip - See [https://en.wikipedia.org/wiki/Division_(mathematics) https://en.wikipedia.org/wiki/Division_(mathematics)]. +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE = 'Return the quotient of the two numbers.'; +/** @type {string} */ +/// tooltip - See [https://en.wikipedia.org/wiki/Exponentiation https://en.wikipedia.org/wiki/Exponentiation]. +Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER = 'Return the first number raised to the power of the second number.'; + +/** @type {string} */ +/// {{Optional}} url - Information about the square root operation. +Blockly.Msg.MATH_SINGLE_HELPURL = 'https://en.wikipedia.org/wiki/Square_root'; +/** @type {string} */ +/// dropdown - This computes the positive [https://en.wikipedia.org/wiki/Square_root square root] of its input. For example, the square root of 16 is 4. +Blockly.Msg.MATH_SINGLE_OP_ROOT = 'square root'; +/** @type {string} */ +/// tooltip - Please use the same term as in the previous message. +Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = 'Return the square root of a number.'; +/** @type {string} */ +/// dropdown - This leaves positive numeric inputs changed and inverts negative inputs. For example, the absolute value of 5 is 5; the absolute value of -5 is also 5. For more information, see [https://en.wikipedia.org/wiki/Absolute_value https://en.wikipedia.org/wiki/Absolute_value]. +Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = 'absolute'; +/** @type {string} */ +/// tooltip - Please use the same term as in the previous message. +Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = 'Return the absolute value of a number.'; + +/** @type {string} */ +/// tooltip - Calculates '''0-n''', where '''n''' is the single numeric input. +Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = 'Return the negation of a number.'; +/** @type {string} */ +/// tooltip - Calculates the [https://en.wikipedia.org/wiki/Natural_logarithm|natural logarithm] of its single numeric input. +Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = 'Return the natural logarithm of a number.'; +/** @type {string} */ +/// tooltip - Calculates the [https://en.wikipedia.org/wiki/Common_logarithm common logarithm] of its single numeric input. +Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = 'Return the base 10 logarithm of a number.'; +/** @type {string} */ +/// tooltip - Multiplies [https://en.wikipedia.org/wiki/E_(mathematical_constant) e] by itself n times, where n is the single numeric input. +Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = 'Return e to the power of a number.'; +/** @type {string} */ +/// tooltip - Multiplies 10 by itself n times, where n is the single numeric input. +Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = 'Return 10 to the power of a number.'; + +/** @type {string} */ +/// {{Optional}} url - Information about the trigonometric functions sine, cosine, tangent, and their inverses (ideally using degrees, not radians). +Blockly.Msg.MATH_TRIG_HELPURL = 'https://en.wikipedia.org/wiki/Trigonometric_functions'; +/** @type {string} */ +/// tooltip - Return the [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent sine] of an [https://en.wikipedia.org/wiki/Degree_(angle) angle in degrees], not radians. +Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = 'Return the sine of a degree (not radian).'; +/** @type {string} */ +/// tooltip - Return the [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent cosine] of an [https://en.wikipedia.org/wiki/Degree_(angle) angle in degrees], not radians. +Blockly.Msg.MATH_TRIG_TOOLTIP_COS = 'Return the cosine of a degree (not radian).'; +/** @type {string} */ +/// tooltip - Return the [https://en.wikipedia.org/wiki/Trigonometric_functions#Sine.2C_cosine_and_tangent tangent] of an [https://en.wikipedia.org/wiki/Degree_(angle) angle in degrees], not radians. +Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = 'Return the tangent of a degree (not radian).'; +/** @type {string} */ +/// tooltip - The [https://en.wikipedia.org/wiki/Inverse_trigonometric_functions inverse] of the [https://en.wikipedia.org/wiki/Cosine#Sine.2C_cosine_and_tangent sine function], using [https://en.wikipedia.org/wiki/Degree_(angle) degrees], not radians. +Blockly.Msg.MATH_TRIG_TOOLTIP_ASIN = 'Return the arcsine of a number.'; +/** @type {string} */ +/// tooltip - The [https://en.wikipedia.org/wiki/Inverse_trigonometric_functions inverse] of the [https://en.wikipedia.org/wiki/Cosine#Sine.2C_cosine_and_tangent cosine] function, using [https://en.wikipedia.org/wiki/Degree_(angle) degrees], not radians. +Blockly.Msg.MATH_TRIG_TOOLTIP_ACOS = 'Return the arccosine of a number.'; +/** @type {string} */ +/// tooltip - The [https://en.wikipedia.org/wiki/Inverse_trigonometric_functions inverse] of the [https://en.wikipedia.org/wiki/Cosine#Sine.2C_cosine_and_tangent tangent] function, using [https://en.wikipedia.org/wiki/Degree_(angle) degrees], not radians. +Blockly.Msg.MATH_TRIG_TOOLTIP_ATAN = 'Return the arctangent of a number.'; + +/** @type {string} */ +/// {{Optional}} url - Information about the mathematical constants Pi (π), e, the golden ratio (φ), √ 2, √ 1/2, and infinity (∞). +Blockly.Msg.MATH_CONSTANT_HELPURL = 'https://en.wikipedia.org/wiki/Mathematical_constant'; +/** @type {string} */ +/// tooltip - Provides the specified [https://en.wikipedia.org/wiki/Mathematical_constant mathematical constant]. +Blockly.Msg.MATH_CONSTANT_TOOLTIP = 'Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity).'; +/** @type {string} */ +/// dropdown - A number is '''even''' if it is a multiple of 2. For example, 4 is even (yielding true), but 3 is not (false). +Blockly.Msg.MATH_IS_EVEN = 'is even'; +/** @type {string} */ +/// dropdown - A number is '''odd''' if it is not a multiple of 2. For example, 3 is odd (yielding true), but 4 is not (false). The opposite of "odd" is "even". +Blockly.Msg.MATH_IS_ODD = 'is odd'; +/** @type {string} */ +/// dropdown - A number is [https://en.wikipedia.org/wiki/Prime prime] if it cannot be evenly divided by any positive integers except for 1 and itself. For example, 5 is prime, but 6 is not because 2 × 3 = 6. +Blockly.Msg.MATH_IS_PRIME = 'is prime'; +/** @type {string} */ +/// dropdown - A number is '''whole''' if it is an [https://en.wikipedia.org/wiki/Integer integer]. For example, 5 is whole, but 5.1 is not. +Blockly.Msg.MATH_IS_WHOLE = 'is whole'; +/** @type {string} */ +/// dropdown - A number is '''positive''' if it is greater than 0. (0 is neither negative nor positive.) +Blockly.Msg.MATH_IS_POSITIVE = 'is positive'; +/** @type {string} */ +/// dropdown - A number is '''negative''' if it is less than 0. (0 is neither negative nor positive.) +Blockly.Msg.MATH_IS_NEGATIVE = 'is negative'; +/** @type {string} */ +/// dropdown - A number x is divisible by y if y goes into x evenly. For example, 10 is divisible by 5, but 10 is not divisible by 3. +Blockly.Msg.MATH_IS_DIVISIBLE_BY = 'is divisible by'; +/** @type {string} */ +/// tooltip - This block lets the user specify via a dropdown menu whether to check if the numeric input is even, odd, prime, whole, positive, negative, or divisible by a given value. +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.'; + +/** @type {string} */ +/// {{Optional}} url - Information about incrementing (increasing the value of) a variable. +/// For other languages, just use the translation of the Wikipedia page about +/// addition ([https://en.wikipedia.org/wiki/Addition https://en.wikipedia.org/wiki/Addition]). +Blockly.Msg.MATH_CHANGE_HELPURL = 'https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter'; +/** @type {string} */ +/// - As in: ''change'' [the value of variable] ''item'' ''by'' 1 (e.g., if the variable named 'item' had the value 5, change it to 6). +/// %1 is a variable name. +/// %2 is the amount of change. +Blockly.Msg.MATH_CHANGE_TITLE = 'change %1 by %2'; +/** @type {string} */ +Blockly.Msg.MATH_CHANGE_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +/** @type {string} */ +/// tooltip - This updates the value of the variable by adding to it the following numeric input.\n\nParameters:\n* %1 - the name of the variable whose value should be increased. +Blockly.Msg.MATH_CHANGE_TOOLTIP = 'Add a number to variable "%1".'; + +/** @type {string} */ +/// {{Optional}} url - Information about how numbers are rounded to the nearest integer +Blockly.Msg.MATH_ROUND_HELPURL = 'https://en.wikipedia.org/wiki/Rounding'; +/** @type {string} */ +/// tooltip - See [https://en.wikipedia.org/wiki/Rounding https://en.wikipedia.org/wiki/Rounding]. +Blockly.Msg.MATH_ROUND_TOOLTIP = 'Round a number up or down.'; +/** @type {string} */ +/// dropdown - This rounds its input to the nearest whole number. For example, 3.4 is rounded to 3. +Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = 'round'; +/** @type {string} */ +/// dropdown - This rounds its input up to the nearest whole number. For example, if the input was 2.2, the result would be 3. +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = 'round up'; +/** @type {string} */ +/// dropdown - This rounds its input down to the nearest whole number. For example, if the input was 3.8, the result would be 3. +Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = 'round down'; + +/** @type {string} */ +/// {{Optional}} url - Information about applying a function to a list of numbers. (We were unable to find such information in English. Feel free to skip this and any other URLs that are difficult.) +Blockly.Msg.MATH_ONLIST_HELPURL = ''; +/** @type {string} */ +/// dropdown - This computes the sum of the numeric elements in the list. For example, the sum of the list {1, 4} is 5. +Blockly.Msg.MATH_ONLIST_OPERATOR_SUM = 'sum of list'; +/** @type {string} */ +/// tooltip - Please use the same term for "sum" as in the previous message. +Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = 'Return the sum of all the numbers in the list.'; +/** @type {string} */ +/// dropdown - This finds the smallest (minimum) number in a list. For example, the smallest number in the list [-5, 0, 3] is -5. +Blockly.Msg.MATH_ONLIST_OPERATOR_MIN = 'min of list'; +/** @type {string} */ +/// tooltip - Please use the same term for "min" or "minimum" as in the previous message. +Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = 'Return the smallest number in the list.'; +/** @type {string} */ +/// dropdown - This finds the largest (maximum) number in a list. For example, the largest number in the list [-5, 0, 3] is 3. +Blockly.Msg.MATH_ONLIST_OPERATOR_MAX = 'max of list'; +/** @type {string} */ +/// tooltip +Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = 'Return the largest number in the list.'; +/** @type {string} */ +/// dropdown - This adds up all of the numbers in a list and divides the sum by the number of elements in the list. For example, the [https://en.wikipedia.org/wiki/Arithmetic_mean average] of the list [1, 2, 3, 4] is 2.5 (10/4). +Blockly.Msg.MATH_ONLIST_OPERATOR_AVERAGE = 'average of list'; +/** @type {string} */ +/// tooltip - See [https://en.wikipedia.org/wiki/Arithmetic_mean https://en.wikipedia.org/wiki/Arithmetic_mean] for more informatin. +Blockly.Msg.MATH_ONLIST_TOOLTIP_AVERAGE = 'Return the average (arithmetic mean) of the numeric values in the list.'; +/** @type {string} */ +/// dropdown - This finds the [https://en.wikipedia.org/wiki/Median median] of the numeric values in a list. For example, the median of the list {1, 2, 7, 12, 13} is 7. +Blockly.Msg.MATH_ONLIST_OPERATOR_MEDIAN = 'median of list'; +/** @type {string} */ +/// tooltip - See [https://en.wikipedia.org/wiki/Median median https://en.wikipedia.org/wiki/Median median] for more information. +Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN = 'Return the median number in the list.'; +/** @type {string} */ +/// dropdown - This finds the most common numbers ([https://en.wikipedia.org/wiki/Mode_(statistics) modes]) in a list. For example, the modes of the list {1, 3, 9, 3, 9} are {3, 9}. +Blockly.Msg.MATH_ONLIST_OPERATOR_MODE = 'modes of list'; +/** @type {string} */ +/// tooltip - See [https://en.wikipedia.org/wiki/Mode_(statistics) https://en.wikipedia.org/wiki/Mode_(statistics)] for more information. +Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE = 'Return a list of the most common item(s) in the list.'; +/** @type {string} */ +/// dropdown - This finds the [https://en.wikipedia.org/wiki/Standard_deviation standard deviation] of the numeric values in a list. +Blockly.Msg.MATH_ONLIST_OPERATOR_STD_DEV = 'standard deviation of list'; +/** @type {string} */ +/// tooltip - See [https://en.wikipedia.org/wiki/Standard_deviation https://en.wikipedia.org/wiki/Standard_deviation] for more information. +Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV = 'Return the standard deviation of the list.'; +/** @type {string} */ +/// dropdown - This choose an element at random from a list. Each element is chosen with equal probability. +Blockly.Msg.MATH_ONLIST_OPERATOR_RANDOM = 'random item of list'; +/** @type {string} */ +/// tooltip - Please use same term for 'random' as in previous entry. +Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = 'Return a random element from the list.'; + +/** @type {string} */ +/// {{Optional}} url - information about the modulo (remainder) operation. +Blockly.Msg.MATH_MODULO_HELPURL = 'https://en.wikipedia.org/wiki/Modulo_operation'; +/** @type {string} */ +/// block text - Title of block providing the remainder when dividing the first numerical input by the second. For example, the remainder of 10 divided by 3 is 1.\n\nParameters:\n* %1 - the dividend (10, in our example)\n* %2 - the divisor (3 in our example). +Blockly.Msg.MATH_MODULO_TITLE = 'remainder of %1 ÷ %2'; +/** @type {string} */ +/// tooltip - For example, the remainder of 10 divided by 3 is 1. +Blockly.Msg.MATH_MODULO_TOOLTIP = 'Return the remainder from dividing the two numbers.'; + +/** @type {string} */ +/// {{Optional}} url - Information about constraining a numeric value to be in a specific range. (The English URL is not ideal. Recall that translating URLs is the lowest priority.) +Blockly.Msg.MATH_CONSTRAIN_HELPURL = 'https://en.wikipedia.org/wiki/Clamping_(graphics)'; +/** @type {string} */ +/// block text - The title of the block that '''constrain'''s (forces) a number to be in a given range. +///For example, if the number 150 is constrained to be between 5 and 100, the result will be 100. +///\n\nParameters:\n* %1 - the value to constrain (e.g., 150)\n* %2 - the minimum value (e.g., 5)\n* %3 - the maximum value (e.g., 100). +Blockly.Msg.MATH_CONSTRAIN_TITLE = 'constrain %1 low %2 high %3'; +/** @type {string} */ +/// tooltip - This compares a number ''x'' to a low value ''L'' and a high value ''H''. If ''x'' is less then ''L'', the result is ''L''. If ''x'' is greater than ''H'', the result is ''H''. Otherwise, the result is ''x''. +Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = 'Constrain a number to be between the specified limits (inclusive).'; + +/** @type {string} */ +/// {{Optional}} url - Information about how computers generate random numbers. +Blockly.Msg.MATH_RANDOM_INT_HELPURL = 'https://en.wikipedia.org/wiki/Random_number_generation'; +/** @type {string} */ +/// block text - The title of the block that generates a random integer (whole number) in the specified range. For example, if the range is from 5 to 7, this returns 5, 6, or 7 with equal likelihood. %1 is a placeholder for the lower number, %2 is the placeholder for the larger number. +Blockly.Msg.MATH_RANDOM_INT_TITLE = 'random integer from %1 to %2'; +/** @type {string} */ +/// tooltip - Return a random integer between two values specified as inputs. For example, if one input was 7 and another 9, any of the numbers 7, 8, or 9 could be produced. +Blockly.Msg.MATH_RANDOM_INT_TOOLTIP = 'Return a random integer between the two specified limits, inclusive.'; + +/** @type {string} */ +/// {{Optional}} url - Information about how computers generate random numbers (specifically, numbers in the range from 0 to just below 1). +Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = 'https://en.wikipedia.org/wiki/Random_number_generation'; +/** @type {string} */ +/// block text - The title of the block that generates a random number greater than or equal to 0 and less than 1. +Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = 'random fraction'; +/** @type {string} */ +/// tooltip - Return a random fraction between 0 and 1. The value may be equal to 0 but must be less than 1. +Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP = 'Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive).'; + +/** @type {string} */ +/// {{Optional}} url - Information about how to calculate atan2. +Blockly.Msg.MATH_ATAN2_HELPURL = 'https://en.wikipedia.org/wiki/Atan2'; +/** @type {string} */ +/// block text - The title of the block that calculates atan2 of point (X, Y). For example, if the point is (-1, -1), this returns -135. %1 is a placeholder for the X coordinate, %2 is the placeholder for the Y coordinate. +Blockly.Msg.MATH_ATAN2_TITLE = 'atan2 of X:%1 Y:%2'; +/** @type {string} */ +/// tooltip - Return the arctangent of point (X, Y) in degrees from -180 to 180. For example, if the point is (-1, -1) this returns -135. +Blockly.Msg.MATH_ATAN2_TOOLTIP = 'Return the arctangent of point (X, Y) in degrees from -180 to 180.'; + +// Text Blocks. +/** @type {string} */ +/// {{Optional}} url - Information about how computers represent text (sometimes referred to as ''string''s). +Blockly.Msg.TEXT_TEXT_HELPURL = 'https://en.wikipedia.org/wiki/String_(computer_science)'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Text https://github.com/google/blockly/wiki/Text]. +Blockly.Msg.TEXT_TEXT_TOOLTIP = 'A letter, word, or line of text.'; + +/** @type {string} */ +/// {{Optional}} url - Information on concatenating/appending pieces of text. +Blockly.Msg.TEXT_JOIN_HELPURL = 'https://github.com/google/blockly/wiki/Text#text-creation'; +/** @type {string} */ +/// block text - See [https://github.com/google/blockly/wiki/Text#text-creation https://github.com/google/blockly/wiki/Text#text-creation]. +Blockly.Msg.TEXT_JOIN_TITLE_CREATEWITH = 'create text with'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Text#text-creation create text with] for more information. +Blockly.Msg.TEXT_JOIN_TOOLTIP = 'Create a piece of text by joining together any number of items.'; + +/** @type {string} */ +/// block text - This is shown when the programmer wants to change the number of pieces of text being joined together. See [https://github.com/google/blockly/wiki/Text#text-creation https://github.com/google/blockly/wiki/Text#text-creation], specifically the last picture in the 'Text creation' section.\n{{Identical|Join}} +Blockly.Msg.TEXT_CREATE_JOIN_TITLE_JOIN = 'join'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Text#text-creation https://github.com/google/blockly/wiki/Text#text-creation], specifically the last picture in the 'Text creation' section. +Blockly.Msg.TEXT_CREATE_JOIN_TOOLTIP = 'Add, remove, or reorder sections to reconfigure this text block.'; +/** @type {string} */ +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TITLE_ITEM = Blockly.Msg.VARIABLES_DEFAULT_NAME; +/** @type {string} */ +/// block text - See [https://github.com/google/blockly/wiki/Text#text-creation https://github.com/google/blockly/wiki/Text#text-creation], specifically the last picture in the 'Text creation' section. +Blockly.Msg.TEXT_CREATE_JOIN_ITEM_TOOLTIP = 'Add an item to the text.'; + +/** @type {string} */ +/// {{Optional}} url - This and the other text-related URLs are going to be hard to translate. As always, it is okay to leave untranslated or paste in the English-language URL. For these URLs, you might also consider a general URL about how computers represent text (such as the translation of [https://en.wikipedia.org/wiki/String_(computer_science) this Wikipedia page]). +Blockly.Msg.TEXT_APPEND_HELPURL = 'https://github.com/google/blockly/wiki/Text#text-modification'; +/** @type {string} */ +/// block input text - Message that the variable name at %1 will have the item at %2 appended to it. +/// [[File:blockly-append-text.png]] +Blockly.Msg.TEXT_APPEND_TITLE = 'to %1 append text %2'; +/** @type {string} */ +Blockly.Msg.TEXT_APPEND_VARIABLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Text#text-modification https://github.com/google/blockly/wiki/Text#text-modification] for more information.\n\nParameters:\n* %1 - the name of the variable to which text should be appended +Blockly.Msg.TEXT_APPEND_TOOLTIP = 'Append some text to variable "%1".'; + +/** @type {string} */ +/// {{Optional}} url - Information about text on computers (usually referred to as 'strings'). +Blockly.Msg.TEXT_LENGTH_HELPURL = 'https://github.com/google/blockly/wiki/Text#text-modification'; +/** @type {string} */ +/// block text - See [https://github.com/google/blockly/wiki/Text#text-length https://github.com/google/blockly/wiki/Text#text-length]. +/// \n\nParameters:\n* %1 - the piece of text to take the length of +Blockly.Msg.TEXT_LENGTH_TITLE = 'length of %1'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Text#text-length https://github.com/google/blockly/wiki/Text#text-length]. +Blockly.Msg.TEXT_LENGTH_TOOLTIP = 'Returns the number of letters (including spaces) in the provided text.'; + +/** @type {string} */ +/// {{Optional}} url - Information about empty pieces of text on computers (usually referred to as 'empty strings'). +Blockly.Msg.TEXT_ISEMPTY_HELPURL = 'https://github.com/google/blockly/wiki/Text#checking-for-empty-text'; +/** @type {string} */ +/// block text - See [https://github.com/google/blockly/wiki/Text#checking-for-empty-text https://github.com/google/blockly/wiki/Text#checking-for-empty-text]. +/// \n\nParameters:\n* %1 - the piece of text to test for emptiness +Blockly.Msg.TEXT_ISEMPTY_TITLE = '%1 is empty'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Text#checking-for-empty-text https://github.com/google/blockly/wiki/Text#checking-for-empty-text]. +Blockly.Msg.TEXT_ISEMPTY_TOOLTIP = 'Returns true if the provided text is empty.'; + +/** @type {string} */ +/// {{Optional}} url - Information about finding a character in a piece of text. +Blockly.Msg.TEXT_INDEXOF_HELPURL = 'https://github.com/google/blockly/wiki/Text#finding-text'; +/** @type {string} */ +/// tooltip - %1 will be replaced by either the number 0 or -1 depending on the indexing mode. See [https://github.com/google/blockly/wiki/Text#finding-text https://github.com/google/blockly/wiki/Text#finding-text]. +Blockly.Msg.TEXT_INDEXOF_TOOLTIP = 'Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found.'; +/** @type {string} */ +/// block text - Title of blocks allowing users to find text. See +/// [https://github.com/google/blockly/wiki/Text#finding-text +/// https://github.com/google/blockly/wiki/Text#finding-text]. +/// [[File:Blockly-find-text.png]]. +/// In English the expanded message is "in text %1 find (first|last) occurance of text %3" +/// where %1 and %3 are added by the user. See TEXT_INDEXOF_OPERATOR_FIRST and +/// TEXT_INDEXOF_OPERATOR_LAST for the dropdown text that replaces %2. +Blockly.Msg.TEXT_INDEXOF_TITLE = 'in text %1 %2 %3'; +/** @type {string} */ +/// dropdown - See [https://github.com/google/blockly/wiki/Text#finding-text +/// https://github.com/google/blockly/wiki/Text#finding-text]. +/// [[File:Blockly-find-text.png]]. +Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = 'find first occurrence of text'; +/** @type {string} */ +/// dropdown - See [https://github.com/google/blockly/wiki/Text#finding-text +/// https://github.com/google/blockly/wiki/Text#finding-text]. This would +/// replace "find first occurrence of text" below. (For more information on +/// how common text is factored out of dropdown menus, see +/// [https://translatewiki.net/wiki/Translating:Blockly#Drop-Down_Menus +/// https://translatewiki.net/wiki/Translating:Blockly#Drop-Down_Menus)].) +/// [[File:Blockly-find-text.png]]. +Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = 'find last occurrence of text'; +/** @type {string} */ + +/// {{Optional}} url - Information about extracting characters (letters, number, symbols, etc.) from text. +Blockly.Msg.TEXT_CHARAT_HELPURL = 'https://github.com/google/blockly/wiki/Text#extracting-text'; +/** @type {string} */ +/// block text - Text for a block to extract a letter (or number, +/// punctuation character, etc.) from a string, as shown below. %1 is added by +/// the user and %2 is replaced by a dropdown of options, possibly followed by +/// another user supplied string. TEXT_CHARAT_TAIL is then added to the end. See +/// [https://github.com/google/blockly/wiki/Text#extracting-a-single-character +/// https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. +/// [[File:Blockly-text-get.png]] +Blockly.Msg.TEXT_CHARAT_TITLE = 'in text %1 %2'; +/** @type {string} */ +/// dropdown - Indicates that the letter (or number, punctuation character, etc.) with the +/// specified index should be obtained from the preceding piece of text. See +/// [https://github.com/google/blockly/wiki/Text#extracting-a-single-character +/// https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. +/// [[File:Blockly-text-get.png]] +Blockly.Msg.TEXT_CHARAT_FROM_START = 'get letter #'; +/** @type {string} */ +/// block text - Indicates that the letter (or number, punctuation character, etc.) with the +/// specified index from the end of a given piece of text should be obtained. See +/// [https://github.com/google/blockly/wiki/Text#extracting-a-single-character +/// https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. +/// [[File:Blockly-text-get.png]] +Blockly.Msg.TEXT_CHARAT_FROM_END = 'get letter # from end'; +/** @type {string} */ +/// block text - Indicates that the first letter of the following piece of text should be +/// retrieved. See [https://github.com/google/blockly/wiki/Text#extracting-a-single-character +/// https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. +/// [[File:Blockly-text-get.png]] +Blockly.Msg.TEXT_CHARAT_FIRST = 'get first letter'; +/** @type {string} */ +/// block text - Indicates that the last letter (or number, punctuation mark, etc.) of the +/// following piece of text should be retrieved. See +/// [https://github.com/google/blockly/wiki/Text#extracting-a-single-character +/// https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. +/// [[File:Blockly-text-get.png]] +Blockly.Msg.TEXT_CHARAT_LAST = 'get last letter'; +/** @type {string} */ +/// block text - Indicates that any letter (or number, punctuation mark, etc.) in the +/// following piece of text should be randomly selected. See +/// [https://github.com/google/blockly/wiki/Text#extracting-a-single-character +/// https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. +/// [[File:Blockly-text-get.png]] +Blockly.Msg.TEXT_CHARAT_RANDOM = 'get random letter'; +/** @type {string} */ +/// block text - Text that goes after the rightmost block/dropdown when getting a single letter from +/// a piece of text, as in [https://blockly-demo.appspot.com/static/apps/code/index.html#3m23km these +/// blocks] or shown below. For most languages, this will be blank. +/// [[File:Blockly-text-get.png]] +Blockly.Msg.TEXT_CHARAT_TAIL = ''; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Text#extracting-a-single-character +/// https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. +/// [[File:Blockly-text-get.png]] +Blockly.Msg.TEXT_CHARAT_TOOLTIP = 'Returns the letter at the specified position.'; + +/** @type {string} */ +/// See [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text +/// https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. +Blockly.Msg.TEXT_GET_SUBSTRING_TOOLTIP = 'Returns a specified portion of the text.'; +/** @type {string} */ +/// {{Optional}} url - Information about extracting characters from text. Reminder: urls are the +/// lowest priority translations. Feel free to skip. +Blockly.Msg.TEXT_GET_SUBSTRING_HELPURL = 'https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text'; +/** @type {string} */ +/// block text - Precedes a piece of text from which a portion should be extracted. +/// [[File:Blockly-get-substring.png]] +Blockly.Msg.TEXT_GET_SUBSTRING_INPUT_IN_TEXT = 'in text'; +/** @type {string} */ +/// dropdown - Indicates that the following number specifies the position (relative to the start +/// position) of the beginning of the region of text that should be obtained from the preceding +/// piece of text. See [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text +/// https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. +/// [[File:Blockly-get-substring.png]] +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_START = 'get substring from letter #'; +/** @type {string} */ +/// dropdown - Indicates that the following number specifies the position (relative to the end +/// position) of the beginning of the region of text that should be obtained from the preceding +/// piece of text. See [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text +/// https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. +/// Note: If {{msg-blockly|ORDINAL_NUMBER_SUFFIX}} is defined, it will +/// automatically appear ''after'' this and any other +/// [https://translatewiki.net/wiki/Translating:Blockly#Ordinal_numbers ordinal numbers] +/// on this block. +/// [[File:Blockly-get-substring.png]] +Blockly.Msg.TEXT_GET_SUBSTRING_START_FROM_END = 'get substring from letter # from end'; +/** @type {string} */ +/// block text - Indicates that a region starting with the first letter of the preceding piece +/// of text should be extracted. See +/// [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text +/// https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. +/// [[File:Blockly-get-substring.png]] +Blockly.Msg.TEXT_GET_SUBSTRING_START_FIRST = 'get substring from first letter'; +/** @type {string} */ +/// dropdown - Indicates that the following number specifies the position (relative to +/// the start position) of the end of the region of text that should be obtained from the +/// preceding piece of text. See +/// [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text +/// https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. +/// [[File:Blockly-get-substring.png]] +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_START = 'to letter #'; +/** @type {string} */ +/// dropdown - Indicates that the following number specifies the position (relative to the +/// end position) of the end of the region of text that should be obtained from the preceding +/// piece of text. See +/// [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text +/// https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. +/// [[File:Blockly-get-substring.png]] +Blockly.Msg.TEXT_GET_SUBSTRING_END_FROM_END = 'to letter # from end'; +/** @type {string} */ +/// block text - Indicates that a region ending with the last letter of the preceding piece +/// of text should be extracted. See +/// [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text +/// https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. +/// [[File:Blockly-get-substring.png]] +Blockly.Msg.TEXT_GET_SUBSTRING_END_LAST = 'to last letter'; +/** @type {string} */ +/// block text - Text that should go after the rightmost block/dropdown when +/// [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text +/// extracting a region of text]. In most languages, this will be the empty string. +/// [[File:Blockly-get-substring.png]] +Blockly.Msg.TEXT_GET_SUBSTRING_TAIL = ''; + +/** @type {string} */ +/// {{Optional}} url - Information about the case of letters (upper-case and lower-case). +Blockly.Msg.TEXT_CHANGECASE_HELPURL = 'https://github.com/google/blockly/wiki/Text#adjusting-text-case'; +/** @type {string} */ +/// tooltip - Describes a block to adjust the case of letters. For more information on this block, +/// see [https://github.com/google/blockly/wiki/Text#adjusting-text-case +/// https://github.com/google/blockly/wiki/Text#adjusting-text-case]. +Blockly.Msg.TEXT_CHANGECASE_TOOLTIP = 'Return a copy of the text in a different case.'; +/** @type {string} */ +/// block text - Indicates that all of the letters in the following piece of text should be +/// capitalized. If your language does not use case, you may indicate that this is not +/// applicable to your language. For more information on this block, see +/// [https://github.com/google/blockly/wiki/Text#adjusting-text-case +/// https://github.com/google/blockly/wiki/Text#adjusting-text-case]. +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_UPPERCASE = 'to UPPER CASE'; +/** @type {string} */ +/// block text - Indicates that all of the letters in the following piece of text should be converted to lower-case. If your language does not use case, you may indicate that this is not applicable to your language. For more information on this block, see [https://github.com/google/blockly/wiki/Text#adjusting-text-case https://github.com/google/blockly/wiki/Text#adjusting-text-case]. +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_LOWERCASE = 'to lower case'; +/** @type {string} */ +/// block text - Indicates that the first letter of each of the following words should be capitalized and the rest converted to lower-case. If your language does not use case, you may indicate that this is not applicable to your language. For more information on this block, see [https://github.com/google/blockly/wiki/Text#adjusting-text-case https://github.com/google/blockly/wiki/Text#adjusting-text-case]. +Blockly.Msg.TEXT_CHANGECASE_OPERATOR_TITLECASE = 'to Title Case'; + +/** @type {string} */ +/// {{Optional}} url - Information about trimming (removing) text off the beginning and ends of pieces of text. +Blockly.Msg.TEXT_TRIM_HELPURL = 'https://github.com/google/blockly/wiki/Text#trimming-removing-spaces'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Text#trimming-removing-spaces +/// https://github.com/google/blockly/wiki/Text#trimming-removing-spaces]. +Blockly.Msg.TEXT_TRIM_TOOLTIP = 'Return a copy of the text with spaces removed from one or both ends.'; +/** @type {string} */ +/// dropdown - Removes spaces from the beginning and end of a piece of text. See +/// [https://github.com/google/blockly/wiki/Text#trimming-removing-spaces +/// https://github.com/google/blockly/wiki/Text#trimming-removing-spaces]. Note that neither +/// this nor the other options modify the original piece of text (that follows); +/// the block just returns a version of the text without the specified spaces. +Blockly.Msg.TEXT_TRIM_OPERATOR_BOTH = 'trim spaces from both sides of'; +/** @type {string} */ +/// dropdown - Removes spaces from the beginning of a piece of text. See +/// [https://github.com/google/blockly/wiki/Text#trimming-removing-spaces +/// https://github.com/google/blockly/wiki/Text#trimming-removing-spaces]. +/// Note that in right-to-left scripts, this will remove spaces from the right side. +Blockly.Msg.TEXT_TRIM_OPERATOR_LEFT = 'trim spaces from left side of'; +/** @type {string} */ +/// dropdown - Removes spaces from the end of a piece of text. See +/// [https://github.com/google/blockly/wiki/Text#trimming-removing-spaces +/// https://github.com/google/blockly/wiki/Text#trimming-removing-spaces]. +/// Note that in right-to-left scripts, this will remove spaces from the left side. +Blockly.Msg.TEXT_TRIM_OPERATOR_RIGHT = 'trim spaces from right side of'; + +/** @type {string} */ +/// {{Optional}} url - Information about displaying text on computers. +Blockly.Msg.TEXT_PRINT_HELPURL = 'https://github.com/google/blockly/wiki/Text#printing-text'; +/** @type {string} */ +/// block text - Display the input on the screen. See +/// [https://github.com/google/blockly/wiki/Text#printing-text +/// https://github.com/google/blockly/wiki/Text#printing-text]. +/// \n\nParameters:\n* %1 - the value to print +Blockly.Msg.TEXT_PRINT_TITLE = 'print %1'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Text#printing-text +/// https://github.com/google/blockly/wiki/Text#printing-text]. +Blockly.Msg.TEXT_PRINT_TOOLTIP = 'Print the specified text, number or other value.'; +/** @type {string} */ +/// {{Optional}} url - Information about getting text from users. +Blockly.Msg.TEXT_PROMPT_HELPURL = 'https://github.com/google/blockly/wiki/Text#getting-input-from-the-user'; +/** @type {string} */ +/// dropdown - Specifies that a piece of text should be requested from the user with +/// the following message. See [https://github.com/google/blockly/wiki/Text#printing-text +/// https://github.com/google/blockly/wiki/Text#printing-text]. +Blockly.Msg.TEXT_PROMPT_TYPE_TEXT = 'prompt for text with message'; +/** @type {string} */ +/// dropdown - Specifies that a number should be requested from the user with the +/// following message. See [https://github.com/google/blockly/wiki/Text#printing-text +/// https://github.com/google/blockly/wiki/Text#printing-text]. +Blockly.Msg.TEXT_PROMPT_TYPE_NUMBER = 'prompt for number with message'; +/** @type {string} */ +/// dropdown - Precedes the message with which the user should be prompted for +/// a number. See [https://github.com/google/blockly/wiki/Text#printing-text +/// https://github.com/google/blockly/wiki/Text#printing-text]. +Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = 'Prompt for user for a number.'; +/** @type {string} */ +/// dropdown - Precedes the message with which the user should be prompted for some text. +/// See [https://github.com/google/blockly/wiki/Text#printing-text +/// https://github.com/google/blockly/wiki/Text#printing-text]. +Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = 'Prompt for user for some text.'; + +/** @type {string} */ +/// block text - Title of a block that counts the number of instances of +/// a smaller pattern (%1) inside a longer string (%2). +Blockly.Msg.TEXT_COUNT_MESSAGE0 = 'count %1 in %2'; +/** @type {string} */ +/// {{Optional}} url - Information about counting how many times a string appears in another string. +Blockly.Msg.TEXT_COUNT_HELPURL = 'https://github.com/google/blockly/wiki/Text#counting-substrings'; +/** @type {string} */ +/// tooltip - Short description of a block that counts how many times some text occurs within some other text. +Blockly.Msg.TEXT_COUNT_TOOLTIP = 'Count how many times some text occurs within some other text.'; + +/** @type {string} */ +/// block text - Title of a block that returns a copy of text (%3) with all +/// instances of some smaller text (%1) replaced with other text (%2). +Blockly.Msg.TEXT_REPLACE_MESSAGE0 = 'replace %1 with %2 in %3'; +/** @type {string} */ +/// {{Optional}} url - Information about replacing each copy text (or string, in computer lingo) with other text. +Blockly.Msg.TEXT_REPLACE_HELPURL = 'https://github.com/google/blockly/wiki/Text#replacing-substrings'; +/** @type {string} */ +/// tooltip - Short description of a block that replaces copies of text in a large text with other text. +Blockly.Msg.TEXT_REPLACE_TOOLTIP = 'Replace all occurances of some text within some other text.'; + +/** @type {string} */ +/// block text - Title of block that returns a copy of text (%1) with the order +/// of letters and characters reversed. +Blockly.Msg.TEXT_REVERSE_MESSAGE0 = 'reverse %1'; +/** @type {string} */ +/// {{Optional}} url - Information about reversing a letters/characters in text. +Blockly.Msg.TEXT_REVERSE_HELPURL = 'https://github.com/google/blockly/wiki/Text#reversing-text'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Text]. +Blockly.Msg.TEXT_REVERSE_TOOLTIP = 'Reverses the order of the characters in the text.'; + +// Lists Blocks. +/** @type {string} */ +/// {{Optional}} url - Information on empty lists. +Blockly.Msg.LISTS_CREATE_EMPTY_HELPURL = 'https://github.com/google/blockly/wiki/Lists#create-empty-list'; +/** @type {string} */ +/// block text - See [https://github.com/google/blockly/wiki/Lists#create-empty-list https://github.com/google/blockly/wiki/Lists#create-empty-list]. +Blockly.Msg.LISTS_CREATE_EMPTY_TITLE = 'create empty list'; +/** @type {string} */ +/// block text - See [https://github.com/google/blockly/wiki/Lists#create-empty-list https://github.com/google/blockly/wiki/Lists#create-empty-list]. +Blockly.Msg.LISTS_CREATE_EMPTY_TOOLTIP = 'Returns a list, of length 0, containing no data records'; + +/** @type {string} */ +/// {{Optional}} url - Information on building lists. +Blockly.Msg.LISTS_CREATE_WITH_HELPURL = 'https://github.com/google/blockly/wiki/Lists#create-list-with'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#create-list-with https://github.com/google/blockly/wiki/Lists#create-list-with]. +Blockly.Msg.LISTS_CREATE_WITH_TOOLTIP = 'Create a list with any number of items.'; +/** @type {string} */ +/// block text - See [https://github.com/google/blockly/wiki/Lists#create-list-with https://github.com/google/blockly/wiki/Lists#create-list-with]. +Blockly.Msg.LISTS_CREATE_WITH_INPUT_WITH = 'create list with'; +/** @type {string} */ +/// block text - This appears in a sub-block when [https://github.com/google/blockly/wiki/Lists#changing-number-of-inputs changing the number of inputs in a ''''create list with'''' block].\n{{Identical|List}} +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TITLE_ADD = 'list'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#changing-number-of-inputs https://github.com/google/blockly/wiki/Lists#changing-number-of-inputs]. +Blockly.Msg.LISTS_CREATE_WITH_CONTAINER_TOOLTIP = 'Add, remove, or reorder sections to reconfigure this list block.'; +/** @type {string} */ +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TITLE = Blockly.Msg.VARIABLES_DEFAULT_NAME; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#changing-number-of-inputs https://github.com/google/blockly/wiki/Lists#changing-number-of-inputs]. +Blockly.Msg.LISTS_CREATE_WITH_ITEM_TOOLTIP = 'Add an item to the list.'; + +/** @type {string} */ +/// {{Optional}} url - Information about [https://github.com/google/blockly/wiki/Lists#create-list-with creating a list with multiple copies of a single item]. +Blockly.Msg.LISTS_REPEAT_HELPURL = 'https://github.com/google/blockly/wiki/Lists#create-list-with'; +/** @type {string} */ +/// {{Optional}} url - See [https://github.com/google/blockly/wiki/Lists#create-list-with creating a list with multiple copies of a single item]. +Blockly.Msg.LISTS_REPEAT_TOOLTIP = 'Creates a list consisting of the given value repeated the specified number of times.'; +/** @type {string} */ +/// block text - See [https://github.com/google/blockly/wiki/Lists#create-list-with +/// https://github.com/google/blockly/wiki/Lists#create-list-with]. +///\n\nParameters:\n* %1 - the item (text) to be repeated\n* %2 - the number of times to repeat it +Blockly.Msg.LISTS_REPEAT_TITLE = 'create list with item %1 repeated %2 times'; + +/** @type {string} */ +/// {{Optional}} url - Information about how the length of a list is computed (i.e., by the total number of elements, not the number of different elements). +Blockly.Msg.LISTS_LENGTH_HELPURL = 'https://github.com/google/blockly/wiki/Lists#length-of'; +/** @type {string} */ +/// block text - See [https://github.com/google/blockly/wiki/Lists#length-of https://github.com/google/blockly/wiki/Lists#length-of]. +/// \n\nParameters:\n* %1 - the list whose length is desired +Blockly.Msg.LISTS_LENGTH_TITLE = 'length of %1'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#length-of https://github.com/google/blockly/wiki/Lists#length-of Blockly:Lists:length of]. +Blockly.Msg.LISTS_LENGTH_TOOLTIP = 'Returns the length of a list.'; + +/** @type {string} */ +/// {{Optional}} url - See [https://github.com/google/blockly/wiki/Lists#is-empty https://github.com/google/blockly/wiki/Lists#is-empty]. +Blockly.Msg.LISTS_ISEMPTY_HELPURL = 'https://github.com/google/blockly/wiki/Lists#is-empty'; +/** @type {string} */ +/// block text - See [https://github.com/google/blockly/wiki/Lists#is-empty +/// https://github.com/google/blockly/wiki/Lists#is-empty]. +/// \n\nParameters:\n* %1 - the list to test +Blockly.Msg.LISTS_ISEMPTY_TITLE = '%1 is empty'; +/** @type {string} */ +/// block tooltip - See [https://github.com/google/blockly/wiki/Lists#is-empty +/// https://github.com/google/blockly/wiki/Lists#is-empty]. +Blockly.Msg.LISTS_ISEMPTY_TOOLTIP = 'Returns true if the list is empty.'; + +/** @type {string} */ +/// block text - Title of blocks operating on [https://github.com/google/blockly/wiki/Lists lists]. +Blockly.Msg.LISTS_INLIST = 'in list'; + +/** @type {string} */ +/// {{Optional}} url - See [https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list +/// https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list]. +Blockly.Msg.LISTS_INDEX_OF_HELPURL = 'https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list'; +/** @type {string} */ +Blockly.Msg.LISTS_INDEX_OF_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +/** @type {string} */ +/// dropdown - See [https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list +/// Lists#finding-items-in-a-list]. +/// [[File:Blockly-list-find.png]] +Blockly.Msg.LISTS_INDEX_OF_FIRST = 'find first occurrence of item'; +/** @type {string} */ +/// dropdown - See [https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list +/// https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list]. +/// [[File:Blockly-list-find.png]] +Blockly.Msg.LISTS_INDEX_OF_LAST = 'find last occurrence of item'; +/** @type {string} */ +/// tooltip - %1 will be replaced by either the number 0 or -1 depending on the indexing mode. See [https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list +/// https://github.com/google/blockly/wiki/Lists#finding-items-in-a-list]. +/// [[File:Blockly-list-find.png]] +Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = 'Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found.'; + +/** @type {string} */ +Blockly.Msg.LISTS_GET_INDEX_HELPURL = Blockly.Msg.LISTS_INDEX_OF_HELPURL; +/** @type {string} */ +/// dropdown - Indicates that the user wishes to +/// [https://github.com/google/blockly/wiki/Lists#getting-a-single-item +/// get an item from a list] without removing it from the list. +Blockly.Msg.LISTS_GET_INDEX_GET = 'get'; +/** @type {string} */ +/// dropdown - Indicates that the user wishes to +/// [https://github.com/google/blockly/wiki/Lists#getting-a-single-item +/// get and remove an item from a list], as opposed to merely getting +/// it without modifying the list. +Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = 'get and remove'; +/** @type {string} */ +/// dropdown - Indicates that the user wishes to +/// [https://github.com/google/blockly/wiki/Lists#removing-an-item +/// remove an item from a list].\n{{Identical|Remove}} +Blockly.Msg.LISTS_GET_INDEX_REMOVE = 'remove'; +/** @type {string} */ +/// dropdown - Indicates that an index relative to the front of the list should be used to +/// [https://github.com/google/blockly/wiki/Lists#getting-a-single-item get and/or remove +/// an item from a list]. Note: If {{msg-blockly|ORDINAL_NUMBER_SUFFIX}} is defined, it will +/// automatically appear ''after'' this number (and any other ordinal numbers on this block). +/// See [[Translating:Blockly#Ordinal_numbers]] for more information on ordinal numbers in Blockly. +/// [[File:Blockly-list-get-item.png]] +Blockly.Msg.LISTS_GET_INDEX_FROM_START = '#'; +/** @type {string} */ +/// dropdown - Indicates that an index relative to the end of the list should be used +/// to [https://github.com/google/blockly/wiki/Lists#getting-a-single-item access an item in a list]. +/// [[File:Blockly-list-get-item.png]] +Blockly.Msg.LISTS_GET_INDEX_FROM_END = '# from end'; +/** @type {string} */ +/// dropdown - Indicates that the '''first''' item should be +/// [https://github.com/google/blockly/wiki/Lists#getting-a-single-item accessed in a list]. +/// [[File:Blockly-list-get-item.png]] +Blockly.Msg.LISTS_GET_INDEX_FIRST = 'first'; +/** @type {string} */ +/// dropdown - Indicates that the '''last''' item should be +/// [https://github.com/google/blockly/wiki/Lists#getting-a-single-item accessed in a list]. +/// [[File:Blockly-list-get-item.png]] +Blockly.Msg.LISTS_GET_INDEX_LAST = 'last'; +/** @type {string} */ +/// dropdown - Indicates that a '''random''' item should be +/// [https://github.com/google/blockly/wiki/Lists#getting-a-single-item accessed in a list]. +/// [[File:Blockly-list-get-item.png]] +Blockly.Msg.LISTS_GET_INDEX_RANDOM = 'random'; +/** @type {string} */ +/// block text - Text that should go after the rightmost block/dropdown when +/// [https://github.com/google/blockly/wiki/Lists#getting-a-single-item +/// accessing an item from a list]. In most languages, this will be the empty string. +/// [[File:Blockly-list-get-item.png]] +Blockly.Msg.LISTS_GET_INDEX_TAIL = ''; +/** @type {string} */ +Blockly.Msg.LISTS_GET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +/** @type {string} */ +/// tooltip - Indicates the ordinal number that the first item in a list is referenced by. %1 will be replaced by either "#0" or "#1" depending on the indexing mode. +Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = '%1 is the first item.'; +/** @type {string} */ +/// tooltip - Indicates the ordinal number that the last item in a list is referenced by. %1 will be replaced by either "#0" or "#1" depending on the indexing mode. +Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = '%1 is the last item.'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for more information. +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = 'Returns the item at the specified position in a list.'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for more information. +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = 'Returns the first item in a list.'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for more information. +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = 'Returns the last item in a list.'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for more information. +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_RANDOM = 'Returns a random item in a list.'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for '#' or '# from end'. +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM = 'Removes and returns the item at the specified position in a list.'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'first'. +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST = 'Removes and returns the first item in a list.'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'last'. +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST = 'Removes and returns the last item in a list.'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'random'. +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM = 'Removes and returns a random item in a list.'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for '#' or '# from end'. +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM = 'Removes the item at the specified position in a list.'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'first'. +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST = 'Removes the first item in a list.'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'last'. +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST = 'Removes the last item in a list.'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-and-removing-an-item] (for remove and return) and [https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for 'random'. +Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM = 'Removes a random item in a list.'; +/** @type {string} */ +/// {{Optional}} url - Information about putting items in lists. +Blockly.Msg.LISTS_SET_INDEX_HELPURL = 'https://github.com/google/blockly/wiki/Lists#in-list--set'; +/** @type {string} */ +Blockly.Msg.LISTS_SET_INDEX_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +/** @type {string} */ +/// block text - [https://github.com/google/blockly/wiki/Lists#in-list--set +/// Replaces an item in a list]. +/// [[File:Blockly-in-list-set-insert.png]] +Blockly.Msg.LISTS_SET_INDEX_SET = 'set'; +/** @type {string} */ +/// block text - [https://github.com/google/blockly/wiki/Lists#in-list--insert-at +/// Inserts an item into a list]. +/// [[File:Blockly-in-list-set-insert.png]] +Blockly.Msg.LISTS_SET_INDEX_INSERT = 'insert at'; +/** @type {string} */ +/// block text - The word(s) after the position in the list and before the item to be set/inserted. +/// [[File:Blockly-in-list-set-insert.png]] +Blockly.Msg.LISTS_SET_INDEX_INPUT_TO = 'as'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the "get" block, the idea is the same for the "set" block). +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FROM = 'Sets the item at the specified position in a list.'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the "get" block, the idea is the same for the "set" block). +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_FIRST = 'Sets the first item in a list.'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the "get" block, the idea is the same for the "set" block). +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_LAST = 'Sets the last item in a list.'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the "get" block, the idea is the same for the "set" block). +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_SET_RANDOM = 'Sets a random item in a list.'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the "get" block, the idea is the same for the "insert" block). +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FROM = 'Inserts the item at the specified position in a list.'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the "get" block, the idea is the same for the "insert" block). +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST = 'Inserts the item at the start of a list.'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the "get" block, the idea is the same for the "insert" block). +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_LAST = 'Append the item to the end of a list.'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item} (even though the page describes the "get" block, the idea is the same for the "insert" block). +Blockly.Msg.LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM = 'Inserts the item randomly in a list.'; + +/** @type {string} */ +/// {{Optional}} url - Information describing extracting a sublist from an existing list. +Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = 'https://github.com/google/blockly/wiki/Lists#getting-a-sublist'; +/** @type {string} */ +Blockly.Msg.LISTS_GET_SUBLIST_INPUT_IN_LIST = Blockly.Msg.LISTS_INLIST; +/** @type {string} */ +/// dropdown - Indicates that an index relative to the front of the list should be used +/// to specify the beginning of the range from which to +/// [https://github.com/google/blockly/wiki/Lists#getting-a-sublist get a sublist]. +/// [[File:Blockly-get-sublist.png]] +/// Note: If {{msg-blockly|ORDINAL_NUMBER_SUFFIX}} is defined, it will +/// automatically appear ''after'' this number (and any other ordinal numbers on this block). +/// See [[Translating:Blockly#Ordinal_numbers]] for more information on ordinal numbers in Blockly. +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = 'get sub-list from #'; +/** @type {string} */ +/// dropdown - Indicates that an index relative to the end of the list should be used +/// to specify the beginning of the range from which to +/// [https://github.com/google/blockly/wiki/Lists#getting-a-sublist get a sublist]. +Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = 'get sub-list from # from end'; +/** @type {string} */ +/// dropdown - Indicates that the +/// [https://github.com/google/blockly/wiki/Lists#getting-a-sublist sublist to extract] +/// should begin with the list's first item. +Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = 'get sub-list from first'; +/** @type {string} */ +/// dropdown - Indicates that an index relative to the front of the list should be +/// used to specify the end of the range from which to +/// [https://github.com/google/blockly/wiki/Lists#getting-a-sublist get a sublist]. +/// [[File:Blockly-get-sublist.png]] +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_START = 'to #'; +/** @type {string} */ +/// dropdown - Indicates that an index relative to the end of the list should be +/// used to specify the end of the range from which to +/// [https://github.com/google/blockly/wiki/Lists#getting-a-sublist get a sublist]. +/// [[File:Blockly-get-sublist.png]] +Blockly.Msg.LISTS_GET_SUBLIST_END_FROM_END = 'to # from end'; +/** @type {string} */ +/// 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]] +Blockly.Msg.LISTS_GET_SUBLIST_END_LAST = 'to last'; +/** @type {string} */ +/// 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]] +Blockly.Msg.LISTS_GET_SUBLIST_TAIL = ''; +/** @type {string} */ +/// 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]] +Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = 'Creates a copy of the specified portion of a list.'; + +/** @type {string} */ +/// {{Optional}} url - Information describing sorting a list. +Blockly.Msg.LISTS_SORT_HELPURL = 'https://github.com/google/blockly/wiki/Lists#sorting-a-list'; +/** @type {string} */ +/// Sort as type %1 (numeric or alphabetic) in order %2 (ascending or descending) a list of items %3.\n{{Identical|Sort}} +Blockly.Msg.LISTS_SORT_TITLE = 'sort %1 %2 %3'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#sorting-a-list]. +Blockly.Msg.LISTS_SORT_TOOLTIP = 'Sort a copy of a list.'; +/** @type {string} */ +/// sorting order or direction from low to high value for numeric, or A-Z for alphabetic.\n{{Identical|Ascending}} +Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = 'ascending'; +/** @type {string} */ +/// sorting order or direction from high to low value for numeric, or Z-A for alphabetic.\n{{Identical|Descending}} +Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = 'descending'; +/** @type {string} */ +/// sort by treating each item as a number. +Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = 'numeric'; +/** @type {string} */ +/// sort by treating each item alphabetically, case-sensitive. +Blockly.Msg.LISTS_SORT_TYPE_TEXT = 'alphabetic'; +/** @type {string} */ +/// sort by treating each item alphabetically, ignoring differences in case. +Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = 'alphabetic, ignore case'; + +/** @type {string} */ +/// {{Optional}} 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'; +/** @type {string} */ +/// dropdown - Indicates that text will be split up into a list (e.g. "a-b-c" -> ["a", "b", "c"]). +Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = 'make list from text'; +/** @type {string} */ +/// dropdown - Indicates that a list will be joined together to form text (e.g. ["a", "b", "c"] -> "a-b-c"). +Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = 'make text from list'; +/** @type {string} */ +/// block text - Prompts for a letter to be used as a separator when splitting or joining text. +Blockly.Msg.LISTS_SPLIT_WITH_DELIMITER = 'with delimiter'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#make-list-from-text +/// https://github.com/google/blockly/wiki/Lists#make-list-from-text] for more information. +Blockly.Msg.LISTS_SPLIT_TOOLTIP_SPLIT = 'Split text into a list of texts, breaking at each delimiter.'; +/** @type {string} */ +/// tooltip - See [https://github.com/google/blockly/wiki/Lists#make-text-from-list +/// https://github.com/google/blockly/wiki/Lists#make-text-from-list] for more information. +Blockly.Msg.LISTS_SPLIT_TOOLTIP_JOIN = 'Join a list of texts into one text, separated by a delimiter.'; + +/** @type {string} */ +/// {{Optional}} url - Information describing reversing a list. +Blockly.Msg.LISTS_REVERSE_HELPURL = 'https://github.com/google/blockly/wiki/Lists#reversing-a-list'; +/** @type {string} */ +/// block text - Title of block that returns a copy of a list (%1) with the order of items reversed. +Blockly.Msg.LISTS_REVERSE_MESSAGE0 = 'reverse %1'; +/** @type {string} */ +/// tooltip - Short description for a block that reverses a copy of a list. +Blockly.Msg.LISTS_REVERSE_TOOLTIP = 'Reverse a copy of a list.'; + +/** @type {string} */ +/// grammar - Text that follows an ordinal number (a number that indicates +/// position relative to other numbers). In most languages, such text appears +/// before the number, so this should be blank. An exception is Hungarian. +/// See [[Translating:Blockly#Ordinal_numbers]] for more information. +Blockly.Msg.ORDINAL_NUMBER_SUFFIX = ''; + +// Variables Blocks. +/** @type {string} */ +/// {{Optional}} url - Information about ''variables'' in computer programming. Consider using your language's translation of [https://en.wikipedia.org/wiki/Variable_(computer_science) https://en.wikipedia.org/wiki/Variable_(computer_science)], if it exists. +Blockly.Msg.VARIABLES_GET_HELPURL = 'https://github.com/google/blockly/wiki/Variables#get'; +/** @type {string} */ +/// tooltip - This gets the value of the named variable without modifying it. +Blockly.Msg.VARIABLES_GET_TOOLTIP = 'Returns the value of this variable.'; +/** @type {string} */ +/// context menu - Selecting this creates a block to set (change) the value of this variable. +/// \n\nParameters:\n* %1 - the name of the variable. +Blockly.Msg.VARIABLES_GET_CREATE_SET = 'Create "set %1"'; + +/** @type {string} */ +/// {{Optional}} url - Information about ''variables'' in computer programming. Consider using your language's translation of [https://en.wikipedia.org/wiki/Variable_(computer_science) https://en.wikipedia.org/wiki/Variable_(computer_science)], if it exists. +Blockly.Msg.VARIABLES_SET_HELPURL = 'https://github.com/google/blockly/wiki/Variables#set'; +/** @type {string} */ +/// block text - Change the value of a mathematical variable: '''set [the value of] x to 7'''.\n\nParameters:\n* %1 - the name of the variable.\n* %2 - the value to be assigned. +Blockly.Msg.VARIABLES_SET = 'set %1 to %2'; +/** @type {string} */ +/// tooltip - This initializes or changes the value of the named variable. +Blockly.Msg.VARIABLES_SET_TOOLTIP = 'Sets this variable to be equal to the input.'; +/** @type {string} */ +/// context menu - Selecting this creates a block to get (change) the value of +/// this variable.\n\nParameters:\n* %1 - the name of the variable. +Blockly.Msg.VARIABLES_SET_CREATE_GET = 'Create "get %1"'; + +// Procedures Blocks. +/** @type {string} */ +/// {{Optional}} url - Information about defining [https://en.wikipedia.org/wiki/Subroutine functions] that do not have return values. +Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = 'https://en.wikipedia.org/wiki/Subroutine'; +/** @type {string} */ +/// block text - This precedes the name of the function when defining it. See +/// [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#c84aoc this sample +/// function definition]. +Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = 'to'; +/** @type {string} */ +/// default name - This acts as a placeholder for the name of a function on a +/// function definition block, as shown on +/// [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#w7cfju this block]. +/// The user will replace it with the function's name. +Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = 'do something'; +/** @type {string} */ +/// block text - This precedes the list of parameters on a function's definition block. See +/// [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#voztpd this sample +/// function with parameters]. +Blockly.Msg.PROCEDURES_BEFORE_PARAMS = 'with:'; +/** @type {string} */ +/// block text - This precedes the list of parameters on a function's caller block. See +/// [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#voztpd this sample +/// function with parameters]. +Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = 'with:'; +/** @type {string} */ +/// block text - This appears next to the function's "body", the blocks that should be +/// run when the function is called, as shown in +/// [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#voztpd this sample +/// function definition]. +Blockly.Msg.PROCEDURES_DEFNORETURN_DO = ''; +/** @type {string} */ +/// tooltip +Blockly.Msg.PROCEDURES_DEFNORETURN_TOOLTIP = 'Creates a function with no output.'; +/** @type {string} */ +/// Placeholder text that the user is encouraged to replace with a description of what their function does. +Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = 'Describe this function...'; +/** @type {string} */ +/// {{Optional}} url - Information about defining [https://en.wikipedia.org/wiki/Subroutine functions] that have return values. +Blockly.Msg.PROCEDURES_DEFRETURN_HELPURL = 'https://en.wikipedia.org/wiki/Subroutine'; +/** @type {string} */ +Blockly.Msg.PROCEDURES_DEFRETURN_TITLE = Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE; +/** @type {string} */ +Blockly.Msg.PROCEDURES_DEFRETURN_PROCEDURE = Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE; +/** @type {string} */ +Blockly.Msg.PROCEDURES_DEFRETURN_DO = Blockly.Msg.PROCEDURES_DEFNORETURN_DO; +/** @type {string} */ +Blockly.Msg.PROCEDURES_DEFRETURN_COMMENT = Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT; +/** @type {string} */ +/// block text - This imperative or infinite verb precedes the value that is used as the return value +/// (output) of this function. See +/// [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#6ot5y5 this sample +/// function that returns a value]. +Blockly.Msg.PROCEDURES_DEFRETURN_RETURN = 'return'; +/** @type {string} */ +/// tooltip +Blockly.Msg.PROCEDURES_DEFRETURN_TOOLTIP = 'Creates a function with an output.'; +/** @type {string} */ +/// Label for a checkbox that controls if statements are allowed in a function. +Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = 'allow statements'; + +/** @type {string} */ +/// alert - The user has created a function with two parameters that have the same name. Every parameter must have a different name. +Blockly.Msg.PROCEDURES_DEF_DUPLICATE_WARNING = 'Warning: This function has duplicate parameters.'; + +/** @type {string} */ +/// {{Optional}} url - Information about calling [https://en.wikipedia.org/wiki/Subroutine functions] that do not return values. +Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = 'https://en.wikipedia.org/wiki/Subroutine'; +/** @type {string} */ +/// tooltip - This block causes the body (blocks inside) of the named function definition to be run. +Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = 'Run the user-defined function "%1".'; + +/** @type {string} */ +/// {{Optional}} url - Information about calling [https://en.wikipedia.org/wiki/Subroutine functions] that return values. +Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = 'https://en.wikipedia.org/wiki/Subroutine'; +/** @type {string} */ +/// tooltip - This block causes the body (blocks inside) of the named function definition to be run.\n\nParameters:\n* %1 - the name of the function. +Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = 'Run the user-defined function "%1" and use its output.'; + +/** @type {string} */ +/// block text - This text appears on a block in a window that appears when the user clicks +/// on the plus sign or star on a function definition block. It refers to the set of parameters +/// (referred to by the simpler term "inputs") to the function. See +/// [[Translating:Blockly#function_definitions]].\n{{Identical|Input}} +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TITLE = 'inputs'; +/** @type {string} */ +/// tooltip +Blockly.Msg.PROCEDURES_MUTATORCONTAINER_TOOLTIP = 'Add, remove, or reorder inputs to this function.'; +/** @type {string} */ +/// block text - This text appears on a block in a window that appears when the user clicks +/// on the plus sign or star on a function definition block]. It appears on the block for +/// adding an individual parameter (referred to by the simpler term "inputs") to the function. +/// See [[Translating:Blockly#function_definitions]]. +Blockly.Msg.PROCEDURES_MUTATORARG_TITLE = 'input name:'; +/** @type {string} */ +/// tooltip +Blockly.Msg.PROCEDURES_MUTATORARG_TOOLTIP = 'Add an input to the function.'; + +/** @type {string} */ +/// context menu - This appears on the context menu for function calls. Selecting +/// it causes the corresponding function definition to be highlighted (as shown at +/// [[Translating:Blockly#context_menus]]. +Blockly.Msg.PROCEDURES_HIGHLIGHT_DEF = 'Highlight function definition'; +/** @type {string} */ +/// context menu - This appears on the context menu for function definitions. +/// Selecting it creates a block to call the function.\n\nParameters:\n* %1 - the name of the function.\n{{Identical|Create}} +Blockly.Msg.PROCEDURES_CREATE_DO = 'Create "%1"'; + +/** @type {string} */ +/// tooltip - If the first value is true, this causes the second value to be returned +/// immediately from the enclosing function. +Blockly.Msg.PROCEDURES_IFRETURN_TOOLTIP = 'If a value is true, then return a second value.'; +/** @type {string} */ +/// {{Optional}} url - Information about guard clauses. +Blockly.Msg.PROCEDURES_IFRETURN_HELPURL = 'http://c2.com/cgi/wiki?GuardClause'; +/** @type {string} */ +/// warning - This appears if the user tries to use this block outside of a function definition. +Blockly.Msg.PROCEDURES_IFRETURN_WARNING = 'Warning: This block may be used only within a function definition.'; + +/** @type {string} */ +/// comment text - This text appears in a new workspace comment, to hint that +/// the user can type here. +Blockly.Msg.WORKSPACE_COMMENT_DEFAULT_TEXT = 'Say something...'; + +/** @type {string} */ +/// workspace - This text is read out when a user navigates to the workspace while +/// using a screen reader. +Blockly.Msg.WORKSPACE_ARIA_LABEL = 'Blockly Workspace'; + +/** @type {string} */ +/// warning - This appears if the user collapses a block, and blocks inside +/// that block have warnings attached to them. It should inform the user that the +/// block they collapsed contains blocks that have warnings. +Blockly.Msg.COLLAPSED_WARNINGS_WARNING = 'Collapsed blocks contain warnings.'; diff --git a/js/package-lock.json b/js/package-lock.json new file mode 100644 index 0000000..9378085 --- /dev/null +++ b/js/package-lock.json @@ -0,0 +1,7037 @@ +{ + "name": "blockly", + "version": "3.20200123.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.0.tgz", + "integrity": "sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ==", + "dev": true + }, + "@wdio/config": { + "version": "5.13.0-alpha.0", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-5.13.0-alpha.0.tgz", + "integrity": "sha512-rcwtVtvmvN/F0HXhxVVv5YxPdJrrOODIZDmk/ftkwbwzpmPyIuP787YSGNgrVflLdXaDy0yIoew0rb5hPAq3bw==", + "dev": true, + "requires": { + "@wdio/logger": "^5.12.1", + "deepmerge": "^4.0.0", + "glob": "^7.1.2" + } + }, + "@wdio/logger": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-5.12.1.tgz", + "integrity": "sha512-KUmdS0Scj0T5UQGtcWFiQRqc0NpFLQ/vSvRxlDzzkoeGwwPINqTRkLT103KL7Lyitlm9uLfaFfYc2KSzynTung==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "loglevel": "^1.6.0", + "loglevel-plugin-prefix": "^0.8.4", + "strip-ansi": "^5.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "@wdio/protocols": { + "version": "5.13.0-alpha.0", + "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-5.13.0-alpha.0.tgz", + "integrity": "sha512-1/7PhkRv3dCB8P+/yVVMXubus3xVcLh30wPcxSJS//rvcu9EU6hU4XEzJro3Ja0ixCFP4WIqnKda7Vre5EaOoQ==", + "dev": true + }, + "@wdio/repl": { + "version": "5.13.0-alpha.0", + "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-5.13.0-alpha.0.tgz", + "integrity": "sha512-yjMMhfqX58Drha6OsQuFUGdRwx58F4E42zp8M4DLJU1sD9Mg0uqRjmF8TPSUoYn3QqUNCclhL+UHU5lEuAWlSg==", + "dev": true, + "requires": { + "@wdio/config": "^5.13.0-alpha.0" + } + }, + "@wdio/utils": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-5.13.0.tgz", + "integrity": "sha512-SUzI694Vu8a8IMRgVpglyOlJ2JzSSrZT+YnbSgk+A1QpT/Azv1xnGJ6t48bpK3XrxpYBGOajADdOWoOydO86pg==", + "dev": true, + "requires": { + "@wdio/logger": "^5.12.1", + "deepmerge": "^4.0.0" + } + }, + "abab": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.1.tgz", + "integrity": "sha512-1zSbbCuoIjafKZ3mblY5ikvAb0ODUbqBnFuUb7f6uLeQhhGJ0vEV4ntmtxKLT2WgXCO94E07BjunsIw1jOMPZw==" + }, + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==" + }, + "acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + } + }, + "acorn-jsx": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.2.tgz", + "integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==", + "dev": true + }, + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "^0.1.0" + } + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "dev": true, + "requires": { + "buffer-equal": "^1.0.0" + } + }, + "archiver": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-3.1.1.tgz", + "integrity": "sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg==", + "dev": true, + "requires": { + "archiver-utils": "^2.1.0", + "async": "^2.6.3", + "buffer-crc32": "^0.2.1", + "glob": "^7.1.4", + "readable-stream": "^3.4.0", + "tar-stream": "^2.1.0", + "zip-stream": "^2.1.2" + }, + "dependencies": { + "bl": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.0.tgz", + "integrity": "sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A==", + "dev": true, + "requires": { + "readable-stream": "^3.0.1" + } + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "tar-stream": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.0.tgz", + "integrity": "sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw==", + "dev": true, + "requires": { + "bl": "^3.0.0", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + } + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "requires": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + } + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "dev": true, + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "dev": true, + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" + }, + "array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "dev": true, + "requires": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "dev": true, + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true + }, + "array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "dev": true, + "requires": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "dev": true, + "requires": { + "async-done": "^1.2.2" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + }, + "bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "dev": true, + "requires": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "binaryextensions": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.1.2.tgz", + "integrity": "sha512-xVNN69YGDghOqCCtA6FI7avYrr02mTJjOgB0/f1VPD3pJC8QEvjTKWc4epDx8AqxxA75NI0QpVM2gPJXUbE4Tg==", + "dev": true + }, + "bl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.0.tgz", + "integrity": "sha512-wbgvOpqopSr7uq6fJrLH8EsvYMJf9gzfo2jCsL2eTy75qXPukA4pCgHamOQkZtY5vmfVtjB+P3LNlMHW5CEZXA==", + "dev": true, + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "bluebird": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "browser-process-hrtime": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==" + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "buffer": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", + "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "catharsis": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.11.tgz", + "integrity": "sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + } + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", + "dev": true, + "requires": { + "exit": "0.1.2", + "glob": "^7.1.1" + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "dev": true, + "requires": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "compress-commons": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-2.1.1.tgz", + "integrity": "sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q==", + "dev": true, + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^3.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^2.3.6" + }, + "dependencies": { + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + } + }, + "concurrently": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-4.1.2.tgz", + "integrity": "sha512-Kim9SFrNr2jd8/0yNYqDTFALzUX1tvimmwFWxmp/D4mRI+kbqIIwE2RkBDrxS2ic25O1UgQMI5AtBqdtX3ynYg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "date-fns": "^1.30.1", + "lodash": "^4.17.15", + "read-pkg": "^4.0.1", + "rxjs": "^6.5.2", + "spawn-command": "^0.0.2-1", + "supports-color": "^4.5.0", + "tree-kill": "^1.2.1", + "yargs": "^12.0.5" + }, + "dependencies": { + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + } + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-props": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", + "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", + "dev": true, + "requires": { + "each-props": "^1.3.0", + "is-plain-object": "^2.0.1" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dev": true, + "requires": { + "buffer": "^5.1.0" + } + }, + "crc32-stream": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-3.0.1.tgz", + "integrity": "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w==", + "dev": true, + "requires": { + "crc": "^3.4.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "css-value": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", + "integrity": "sha1-Xv1sLupeof1rasV+wEJ7GEUkJOo=", + "dev": true + }, + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + }, + "cssstyle": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "requires": { + "cssom": "0.3.x" + } + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + } + }, + "date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "deepmerge": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.0.0.tgz", + "integrity": "sha512-YZ1rOP5+kHor4hMAH+HRQnBQHg+wvS1un1hAOuIcxcBy0hzcUf6Jg2a1w65kpoOUnurOfZbERwjI1TfZxNjcww==", + "dev": true + }, + "default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "dev": true, + "requires": { + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-serializer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.1.tgz", + "integrity": "sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + }, + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "editions": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", + "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.2.tgz", + "integrity": "sha512-gUSUszrsxlDnUbUwEI9Oygyrk4ZEWtVaHQc+uZHphVeNxl+qeqMV/jDWoTkjN1RmGlZ5QWAP7o458p/JMlikQg==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.14.2.tgz", + "integrity": "sha512-DgoQmbpFNOofkjJtKwr87Ma5EW4Dc8fWhD0R+ndq7Oc456ivUfGOOP6oAZTTKl5/CcNMP+EN+e3/iUzgE0veZg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.0", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.6.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.0.0", + "string.prototype.trimright": "^2.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.51", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.51.tgz", + "integrity": "sha512-oRpWzM2WcLHVKpnrcyB7OW8j/s67Ba04JCm0WnNv3RiABSvs7mrQlutB8DBv793gKcp0XENR8Il8WxGTlZ73gQ==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "^1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.2.tgz", + "integrity": "sha512-/ZypxQsArlv+KHpGvng52/Iz8by3EQPxhmbuz8yFG89N/caTFBSbcXONDw0aMjy827gQg26XAjP4uXFvnfINmQ==", + "dev": true, + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.51" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", + "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "eslint": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", + "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.9.1", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^4.0.3", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^5.0.1", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^6.2.2", + "js-yaml": "^3.13.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0" + } + }, + "eslint-plugin-es5": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es5/-/eslint-plugin-es5-1.4.1.tgz", + "integrity": "sha512-kktkmkF2O7pnSZYgrMiYMbt3wCKRIiXePwILv8USDG95YgP0PzhIxSIROLLKmiQQ/Z6LuhDGWTHK04gnbXBvkg==", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", + "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.0.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "espree": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "dev": true, + "requires": { + "acorn": "^6.0.7", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" + } + }, + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true + }, + "flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", + "dev": true + } + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=", + "dev": true + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "dev": true, + "requires": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + } + }, + "glob-watcher": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", + "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "object.defaults": "^1.1.0" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "google-closure-compiler": { + "version": "20200101.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20200101.0.0.tgz", + "integrity": "sha512-UVDxedg7jbi1F+R4KSWezIZcjB4+4EJSvd2Tf/+J8vw5+6BjBFaIv5E3vy9nTpSXorKIUheJPzE+lt9GRc3Fdg==", + "dev": true, + "requires": { + "chalk": "2.x", + "google-closure-compiler-java": "^20200101.0.0", + "google-closure-compiler-js": "^20200101.0.0", + "google-closure-compiler-linux": "^20200101.0.0", + "google-closure-compiler-osx": "^20200101.0.0", + "google-closure-compiler-windows": "^20200101.0.0", + "minimist": "1.x", + "vinyl": "2.x", + "vinyl-sourcemaps-apply": "^0.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "google-closure-compiler-java": { + "version": "20200101.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-java/-/google-closure-compiler-java-20200101.0.0.tgz", + "integrity": "sha512-hW4FjcEO3wAu7p/Cz8zwQIggvVio0SmnVzImukK8A6suAyHLiLDX5vhFPC31a/jyZ8uxfUSEImWrt/SFdKt0eA==", + "dev": true + }, + "google-closure-compiler-js": { + "version": "20200101.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-js/-/google-closure-compiler-js-20200101.0.0.tgz", + "integrity": "sha512-0PdYhSU2FWkLU7eUg+0+BlnJHcGLMhWB69SzQ/0z7qBES/tuor7ruHi7HUopKaxQwhblC4DtDb8IDinieY+R1w==", + "dev": true + }, + "google-closure-compiler-linux": { + "version": "20200101.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-linux/-/google-closure-compiler-linux-20200101.0.0.tgz", + "integrity": "sha512-8S1WMbRPrBXV6SUi0DyzHa9EPmyNJ8FcBUG3tIrS6hoQIP71kZl+TrSOwwUAZYKf7KhXl41P3HPMFnI4LXbtrw==", + "dev": true, + "optional": true + }, + "google-closure-compiler-osx": { + "version": "20200101.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-osx/-/google-closure-compiler-osx-20200101.0.0.tgz", + "integrity": "sha512-rZh2+4/JwhKLVSwOWKBp+WJnLZCfOq6MQW06ayulhvq3WjJ0Ny9XZTpLUKiEbnMQf7+ARcFb8zIeiUp0Q2aFqg==", + "dev": true, + "optional": true + }, + "google-closure-compiler-windows": { + "version": "20200101.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-windows/-/google-closure-compiler-windows-20200101.0.0.tgz", + "integrity": "sha512-WcH6BPPSiQq1NnOO7PxKfS0FZ+mQRz4pIoRkrItafTKXWtBCL5NZWd8BjPayBJKxsmoiVFsOpkjzLe8ryBXciQ==", + "dev": true, + "optional": true + }, + "google-closure-deps": { + "version": "20200101.0.0", + "resolved": "https://registry.npmjs.org/google-closure-deps/-/google-closure-deps-20200101.0.0.tgz", + "integrity": "sha512-iumjDwrhL9XTcBbiHUmFL9IzskZxNShQM4kEk6/NTTAhXvxxov3/IxFLetA62dHCIO9xBhnjrzlhb4CfOszqag==", + "dev": true, + "requires": { + "argparse": "^1.0.9", + "google-closure-compiler": "^v20200101.0.0", + "yargs": "^12.0.2" + }, + "dependencies": { + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + } + } + }, + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "dev": true + }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "gulp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", + "dev": true, + "requires": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "gulp-cli": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz", + "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.1.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.0.1", + "yargs": "^7.1.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } + } + } + }, + "gulp-concat": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz", + "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=", + "dev": true, + "requires": { + "concat-with-sourcemaps": "^1.0.0", + "through2": "^2.0.0", + "vinyl": "^2.0.0" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "gulp-insert": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/gulp-insert/-/gulp-insert-0.5.0.tgz", + "integrity": "sha1-MjE/E+SiPPWsylzl8MCAkjx3hgI=", + "dev": true, + "requires": { + "readable-stream": "^1.0.26-4", + "streamqueue": "0.0.6" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "gulp-rename": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.4.0.tgz", + "integrity": "sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg==", + "dev": true + }, + "gulp-replace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-1.0.0.tgz", + "integrity": "sha512-lgdmrFSI1SdhNMXZQbrC75MOl1UjYWlOWNbNRnz+F/KHmgxt3l6XstBoAYIdadwETFyG/6i+vWUSCawdC3pqOw==", + "dev": true, + "requires": { + "istextorbinary": "2.2.1", + "readable-stream": "^2.0.1", + "replacestream": "^4.0.0" + } + }, + "gulp-series": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/gulp-series/-/gulp-series-1.0.2.tgz", + "integrity": "sha1-gWGZA1AXh13QDUiIklBP659jCgs=", + "dev": true + }, + "gulp-shell": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/gulp-shell/-/gulp-shell-0.7.1.tgz", + "integrity": "sha512-5dKf1eJDdBiUS4LKCt4tm9IkDnWeXKGCKjQG5EJj/bVeVOisAPse5RLxccGh1OtfbzQdOWCywu936DTB8isZRw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "fancy-log": "^1.3.3", + "lodash.template": "^4.4.0", + "plugin-error": "^1.0.1", + "through2": "^3.0.1", + "tslib": "^1.9.3" + }, + "dependencies": { + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "dev": true, + "requires": { + "readable-stream": "2 || 3" + } + } + } + }, + "gulp-umd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gulp-umd/-/gulp-umd-2.0.0.tgz", + "integrity": "sha512-zA0RDIITdOwpVUBQ6vy2R+iCsTXwDImPnWreNBmVJQAg3nDGefowV7KYwWoIeEVoxyHZT2CR50nEF6ovUh5/2A==", + "dev": true, + "requires": { + "concat-stream": "^1.6.2", + "lodash.template": "^4.4.0", + "through2": "^2.0.3" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "^1.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", + "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dev": true, + "requires": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", + "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "istextorbinary": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.2.1.tgz", + "integrity": "sha512-TS+hoFl8Z5FAFMK38nhBkdLt44CclNRgDHWeMgsV8ko3nDlr/9UI2Sf839sW7enijf8oKsZYXRvM8g0it9Zmcw==", + "dev": true, + "requires": { + "binaryextensions": "2", + "editions": "^1.3.3", + "textextensions": "2" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + } + } + }, + "js2xmlparser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.0.tgz", + "integrity": "sha512-WuNgdZOXVmBk5kUPMcTcVUpbGRzLfNkv7+7APq7WiDihpXVKrgxo6wwRpRl9OQeEBgKCVk9mR7RbzrnNWC8oBw==", + "dev": true, + "requires": { + "xmlcreate": "^2.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "jsdoc": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.3.tgz", + "integrity": "sha512-Yf1ZKA3r9nvtMWHO1kEuMZTlHOF8uoQ0vyo5eH7SQy5YeIiHM+B0DgKnn+X6y6KDYZcF7G2SPkKF+JORCXWE/A==", + "dev": true, + "requires": { + "@babel/parser": "^7.4.4", + "bluebird": "^3.5.4", + "catharsis": "^0.8.11", + "escape-string-regexp": "^2.0.0", + "js2xmlparser": "^4.0.0", + "klaw": "^3.0.0", + "markdown-it": "^8.4.2", + "markdown-it-anchor": "^5.0.2", + "marked": "^0.7.0", + "mkdirp": "^0.5.1", + "requizzle": "^0.2.3", + "strip-json-comments": "^3.0.1", + "taffydb": "2.6.2", + "underscore": "~1.9.1" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true + } + } + }, + "jsdom": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.1.1.tgz", + "integrity": "sha512-cQZRBB33arrDAeCrAEWn1U3SvrvC8XysBua9Oqg1yWrsY/gYcusloJC3RZJXuY5eehSCmws8f2YeliCqGSkrtQ==", + "requires": { + "abab": "^2.0.0", + "acorn": "^6.1.1", + "acorn-globals": "^4.3.2", + "array-equal": "^1.0.0", + "cssom": "^0.3.6", + "cssstyle": "^1.2.2", + "data-urls": "^1.1.0", + "domexception": "^1.0.1", + "escodegen": "^1.11.1", + "html-encoding-sniffer": "^1.0.2", + "nwsapi": "^2.1.4", + "parse5": "5.1.0", + "pn": "^1.1.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.7", + "saxes": "^3.1.9", + "symbol-tree": "^3.2.2", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^7.0.0", + "xml-name-validator": "^3.0.0" + } + }, + "jshint": { + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.10.2.tgz", + "integrity": "sha512-e7KZgCSXMJxznE/4WULzybCMNXNAd/bf5TSrvVEq78Q/K8ZwFpmBqQeDtNiHc3l49nV4E/+YeHU/JZjSUIrLAA==", + "dev": true, + "requires": { + "cli": "~1.0.0", + "console-browserify": "1.1.x", + "exit": "0.1.x", + "htmlparser2": "3.8.x", + "lodash": "~4.17.11", + "minimatch": "~3.0.2", + "shelljs": "0.3.x", + "strip-json-comments": "1.0.x" + }, + "dependencies": { + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true + } + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "just-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", + "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "klaw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "dev": true, + "requires": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + } + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + } + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "dev": true, + "requires": { + "flush-write-stream": "^1.0.2" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", + "dev": true, + "requires": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + } + }, + "linkify-it": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", + "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "dev": true, + "requires": { + "uc.micro": "^1.0.1" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", + "dev": true + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", + "dev": true + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true + }, + "lodash.isobject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", + "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=", + "dev": true + }, + "lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "loglevel": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.4.tgz", + "integrity": "sha512-p0b6mOGKcGa+7nnmKbpzR6qloPbrgLcnio++E+14Vo/XffOGwZtRpUhr8dTH/x2oCMmEoIU0Zwm3ZauhvYD17g==", + "dev": true + }, + "loglevel-plugin-prefix": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz", + "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==", + "dev": true + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "markdown-it": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", + "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "entities": "~1.1.1", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + } + } + }, + "markdown-it-anchor": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.2.4.tgz", + "integrity": "sha512-n8zCGjxA3T+Mx1pG8HEgbJbkB8JFUuRkeTZQuIM8iPY6oQ8sWOPRZJDFC9a/pNg2QkHEjjGkhBEl/RSyzaDZ3A==", + "dev": true + }, + "marked": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz", + "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==", + "dev": true + }, + "matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", + "dev": true, + "requires": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "dependencies": { + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "dev": true + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "requires": { + "mime-db": "1.40.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.0.tgz", + "integrity": "sha512-qwfFgY+7EKAAUAdv7VYMZQknI7YJSGesxHyhn6qD52DV8UcSZs5XwCifcZGMVIE4a5fbmhvbotxC0DLQ0oKohQ==", + "dev": true, + "requires": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "2.2.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "ms": "2.1.1", + "node-environment-flags": "1.0.5", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.2.2", + "yargs-parser": "13.0.0", + "yargs-unparser": "1.5.0" + }, + "dependencies": { + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "yargs": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", + "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.0.0" + } + }, + "yargs-parser": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", + "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-environment-flags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", + "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dev": true, + "requires": { + "once": "^1.3.2" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nwsapi": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", + "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", + "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pixelmatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", + "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=", + "dev": true, + "requires": { + "pngjs": "^3.0.0" + } + }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + } + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" + }, + "pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "psl": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", + "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "read-pkg": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", + "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", + "dev": true, + "requires": { + "normalize-package-data": "^2.3.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + } + }, + "remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "dev": true, + "requires": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + } + }, + "replacestream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", + "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.3", + "object-assign": "^4.0.1", + "readable-stream": "^2.0.2" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + } + } + }, + "request-promise-core": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", + "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", + "requires": { + "lodash": "^4.17.11" + } + }, + "request-promise-native": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", + "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", + "requires": { + "request-promise-core": "1.1.2", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "requizzle": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz", + "integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dev": true, + "requires": { + "value-or-function": "^3.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "resq": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/resq/-/resq-1.6.0.tgz", + "integrity": "sha512-8A4CsNY52RoSU4rpSfnEGPK2mkMO9kz0hi+SYhbKnSq7AFYxZFPTb2C7u6aEchD3vzFjotuCLnDfS81K/UsAmg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rgb2hex": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.1.9.tgz", + "integrity": "sha512-32iuQzhOjyT+cv9aAFRBJ19JgHwzQwbjUhH3Fj2sWW2EEGAW8fpFrDFP5ndoKDxJaLO06x1hE3kyuIFrUQtybQ==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "rxjs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "saxes": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "requires": { + "xmlchars": "^2.1.1" + } + }, + "selenium-standalone": { + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-6.16.0.tgz", + "integrity": "sha512-tl7HFH2FOxJD1is7Pzzsl0pY4vuePSdSWiJdPn+6ETBkpeJDiuzou8hBjvWYWpD+eIVcOrmy3L0R3GzkdHLzDw==", + "dev": true, + "requires": { + "async": "^2.6.2", + "commander": "^2.19.0", + "cross-spawn": "^6.0.5", + "debug": "^4.1.1", + "lodash": "^4.17.11", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "progress": "2.0.3", + "request": "2.88.0", + "tar-stream": "2.0.0", + "urijs": "^1.19.1", + "which": "^1.3.1", + "yauzl": "^2.10.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "dev": true, + "requires": { + "sver-compat": "^1.5.0" + } + }, + "serialize-error": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-4.1.0.tgz", + "integrity": "sha512-5j9GgyGsP9vV9Uj1S0lDCvlsd+gc2LEPVK7HHHte7IyPwOD4lVQFeaX143gx3U5AnoCi+wbcb3mvaxVysjpxEw==", + "dev": true, + "requires": { + "type-fest": "^0.3.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shelljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", + "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true + }, + "spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" + }, + "stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", + "dev": true + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "streamqueue": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/streamqueue/-/streamqueue-0.0.6.tgz", + "integrity": "sha1-ZvX17JTpuK8knkrsLdH3Qb/pTeM=", + "dev": true, + "requires": { + "readable-stream": "^1.0.26-2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string.prototype.trimleft": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", + "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", + "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + }, + "dependencies": { + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + } + } + }, + "sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "dev": true, + "requires": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "taffydb": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", + "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=", + "dev": true + }, + "tar-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.0.0.tgz", + "integrity": "sha512-n2vtsWshZOVr/SY4KtslPoUlyNh06I2SGgAOCZmquCEjlbV/LjY2CY80rDtdQRHFOYXNlgBDo6Fr3ww2CWPOtA==", + "dev": true, + "requires": { + "bl": "^2.2.0", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "textextensions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.5.0.tgz", + "integrity": "sha512-1IkVr355eHcomgK7fgj1Xsokturx6L5S2JRT5WcRdA6v5shk9sxWuO/w/VbpQexwkXJMQIa/j1dBi3oo7+HhcA==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "dev": true, + "requires": { + "readable-stream": "2 || 3" + } + }, + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + } + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dev": true, + "requires": { + "through2": "^2.0.3" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "requires": { + "punycode": "^2.1.0" + } + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript-closure-tools": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/typescript-closure-tools/-/typescript-closure-tools-0.0.7.tgz", + "integrity": "sha512-trz9OhHC8d96c8aqlolk7ckNWlxqqgLPkeSqwi4PuEPu5zMjQqTg8m0E2gNpS3uUPyL0wwBTQOVB/rigFCPJPw==", + "dev": true, + "requires": { + "colors": "*", + "doctrine": "github:fivetran/doctrine", + "escodegen": "*", + "esprima": "*", + "jsdoc": "*", + "mkdirp": "*" + }, + "dependencies": { + "doctrine": { + "version": "github:fivetran/doctrine#169ebc1cbf23492363f9442543d1e78e1df9c3d5", + "from": "github:fivetran/doctrine", + "dev": true + } + } + }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "underscore": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", + "dev": true + }, + "undertaker": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", + "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + } + }, + "undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "requires": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urijs": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.1.tgz", + "integrity": "sha512-xVrGVi94ueCJNrBSTjWqjvtgvl3cyOTThp2zaMaFNGp3F542TR6sM3f2o8RqZl+AwteClSVmoCyt0ka4RjQOQg==", + "dev": true + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" + }, + "v8flags": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", + "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + }, + "vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, + "requires": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "dev": true, + "requires": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "dev": true, + "requires": { + "source-map": "^0.5.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "requires": { + "browser-process-hrtime": "^0.1.2" + } + }, + "w3c-xmlserializer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", + "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "requires": { + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" + } + }, + "webdriver": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-5.13.1.tgz", + "integrity": "sha512-Gvsf2o8jrfZMgLWIC9C9bcT5T0OZvNHq7WO5PhNSB2pbg3ypSj4kk4zJZSyP331FTgib+qxneRtg7r/3Ea7mLw==", + "dev": true, + "requires": { + "@wdio/config": "^5.13.0-alpha.0", + "@wdio/logger": "^5.12.1", + "@wdio/protocols": "^5.13.0-alpha.0", + "@wdio/utils": "^5.13.0", + "lodash.merge": "^4.6.1", + "request": "^2.83.0" + } + }, + "webdriverio": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-5.13.1.tgz", + "integrity": "sha512-Orx521tRUPqGGJH5fPbZLZ7ipm6RRpCg9s/puaFkl79cIQoNaO7wcbDCktr6jGNGbihNxwj8f6qaSmDYNE6Ang==", + "dev": true, + "requires": { + "@wdio/config": "^5.13.0-alpha.0", + "@wdio/logger": "^5.12.1", + "@wdio/repl": "^5.13.0-alpha.0", + "@wdio/utils": "^5.13.0", + "archiver": "^3.0.0", + "css-value": "^0.0.1", + "grapheme-splitter": "^1.0.2", + "lodash.clonedeep": "^4.5.0", + "lodash.isobject": "^3.0.2", + "lodash.isplainobject": "^4.0.6", + "lodash.zip": "^4.2.0", + "resq": "^1.6.0", + "rgb2hex": "^0.1.0", + "serialize-error": "^4.1.0", + "webdriver": "^5.13.1" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, + "whatwg-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", + "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "ws": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.1.2.tgz", + "integrity": "sha512-gftXq3XI81cJCgkUiAVixA0raD9IVmXqsylCrjRygw4+UOOGzPoxnQ6r/CnVL9i+mDncJo94tSkyrtuuQVBmrg==", + "requires": { + "async-limiter": "^1.0.0" + } + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "xmlcreate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.1.tgz", + "integrity": "sha512-MjGsXhKG8YjTKrDCXseFo3ClbMGvUD4en29H2Cev1dv4P/chlpw6KdYmlCWDkhosBVKRDjM836+3e3pm1cBNJA==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yargs": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.0.0.tgz", + "integrity": "sha512-ssa5JuRjMeZEUjg7bEL99AwpitxU/zWGAGpdj0di41pOEmJti8NR6kyUIJBkR78DTYNPZOU08luUo0GTHuB+ow==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", + "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.11", + "yargs": "^12.0.5" + }, + "dependencies": { + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + } + } + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "zip-stream": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-2.1.2.tgz", + "integrity": "sha512-ykebHGa2+uzth/R4HZLkZh3XFJzivhVsjJt8bN3GvBzLaqqrUdRacu+c4QtnUgjkkQfsOuNE1JgLKMCPNmkKgg==", + "dev": true, + "requires": { + "archiver-utils": "^2.1.0", + "compress-commons": "^2.1.1", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + } + } +} diff --git a/js/package.json b/js/package.json new file mode 100644 index 0000000..4d6cde8 --- /dev/null +++ b/js/package.json @@ -0,0 +1,99 @@ +{ + "name": "blockly", + "version": "3.20200123.1", + "description": "Blockly is a library for building visual programming editors.", + "keywords": [ + "blockly" + ], + "repository": { + "type": "git", + "url": "https://github.com/google/blockly.git" + }, + "bugs": { + "url": "https://github.com/google/blockly/issues" + }, + "homepage": "https://developers.google.com/blockly/", + "author": { + "name": "Neil Fraser" + }, + "scripts": { + "build": "gulp build", + "build:blocks": "gulp build-blocks", + "build:compressed": "gulp build-compressed", + "build:core": "gulp build-core", + "build:debug": "gulp build-compressed --verbose --strict", + "build:debug:log": "npm run build:debug > build-debug.log 2>&1 && tail -3 build-debug.log", + "build:generators": "gulp build-generators", + "build:langfiles": "gulp build-langfiles", + "build:uncompressed": "gulp build-uncompressed", + "bump": "npm version 3.$(date +'%Y%m%d').0", + "lint": "eslint .", + "package": "gulp package", + "postversion": "gulp postversion", + "prepare": "npm run package", + "preversion": "gulp preversion", + "prerelease": "gulp git-recompile", + "release": "gulp git-create-rc", + "test": "concurrently 'npm run test:prepare' 'sleep 5 && npm run test:run'", + "test:prepare": "npm run test:setupselenium && npm run test:startselenium", + "test:run": "tests/run_all_tests.sh", + "test:setupselenium": "selenium-standalone install --config=./tests/scripts/selenium-config.js", + "test:startselenium": "selenium-standalone start --config=./tests/scripts/selenium-config.js", + "typings": "gulp typings", + "version": "gulp build && git add -A" + }, + "main": "./index.js", + "umd": "./blockly.min.js", + "unpkg": "./blockly.min.js", + "types": "./blockly.d.ts", + "browser": { + "./node.js": "./browser.js", + "./core.js": "./core-browser.js", + "./blockly-node.js": "./blockly.js" + }, + "license": "Apache-2.0", + "devDependencies": { + "chai": "^4.2.0", + "concurrently": "^4.1.2", + "eslint": "^5.13.0", + "eslint-plugin-es5": "^1.4.1", + "fs": "0.0.1-security", + "google-closure-compiler": "^20200101.0.0", + "google-closure-deps": "^20200101.0.0", + "gulp": "^4.0.2", + "gulp-concat": "^2.6.1", + "gulp-insert": "^0.5.0", + "gulp-series": "^1.0.2", + "gulp-shell": "^0.7.1", + "gulp-rename": "^1.4.0", + "gulp-replace": "^1.0.0", + "gulp-umd": "^2.0.0", + "jshint": "^2.10.2", + "mocha": "^6.1.4", + "pixelmatch": "^4.0.2", + "pngjs": "^3.4.0", + "selenium-standalone": "^6.16.0", + "rimraf": "^2.6.3", + "through2": "^3.0.1", + "typescript-closure-tools": "^0.0.7", + "webdriverio": "^5.11.5", + "yargs": "^14.0.0" + }, + "jshintConfig": { + "globalstrict": true, + "predef": [ + "Blockly", + "goog", + "window", + "document", + "soy", + "XMLHttpRequest" + ], + "sub": true, + "undef": true, + "unused": true + }, + "dependencies": { + "jsdom": "^15.1.1" + } +} diff --git a/js/package/README.md b/js/package/README.md new file mode 100644 index 0000000..b4f0cf3 --- /dev/null +++ b/js/package/README.md @@ -0,0 +1,77 @@ +# Blockly + +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. + +The source for this module is in the [Blockly repo](http://github.com/google/blockly). + +## Installation + +You can install this package either via ``npm`` or ``unpkg``. + +### npm +```bash +npm install blockly +``` + +### unpkg +```html + +``` + +## Example Usage + +```js +import Blockly from 'blockly'; +Blockly.inject('blocklyDiv', { + ... +}) +``` + +## Samples + +For samples on how to integrate Blockly into your project, view the list of samples at [blockly-samples](https://github.com/google/blockly-samples). + + +### Importing Blockly + +When you import Blockly with ``import * as Blockly from 'blockly';`` you'll get the default modules: +Blockly core, Blockly built-in blocks, the JavaScript generator and the English lang files. + +If you need more flexibility, you'll want to define your imports more carefully: + +#### Blockly Core + +```js +import * as Blockly from 'blockly/core'; +``` + +#### Blockly built in blocks + +```js +import 'blockly/blocks'; +``` + +#### Blockly Generators +If your application needs to generate code from the Blockly blocks, you'll want to include a generator. + +```js +import 'blockly/python'; +``` +to include the Python generator, you can also import ``blockly/javascript``, ``blockly/php``, ``blockly/dart`` and ``blockly/lua``. + +#### Blockly Languages + +```js +import * as Fr from 'blockly/msg/fr'; +Blockly.setLocale(Fr); +``` + +To import the French lang files. Once you've imported the specific lang module, you'll also want to set the locale in Blockly. + +For a full list of supported Blockly locales, see: [https://github.com/google/blockly/tree/master/msg/js](https://github.com/google/blockly/tree/master/msg/js) + + +## License + +Apache 2.0 diff --git a/js/package/browser/core.js b/js/package/browser/core.js new file mode 100644 index 0000000..3dde181 --- /dev/null +++ b/js/package/browser/core.js @@ -0,0 +1,32 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Blockly core module for the browser. It includes blockly.js + * and adds a helper method for setting the locale. + */ + +/* eslint-disable */ +'use strict'; + +// Add a helper method to set the Blockly locale. +Blockly.setLocale = function (locale) { + Blockly.Msg = Blockly.Msg || {}; + Object.keys(locale).forEach(function (k) { + Blockly.Msg[k] = locale[k]; + }); +}; diff --git a/js/package/browser/index.js b/js/package/browser/index.js new file mode 100644 index 0000000..32fac24 --- /dev/null +++ b/js/package/browser/index.js @@ -0,0 +1,35 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Blockly module for the browser. This includes Blockly core + * and built in blocks, the JavaScript code generator and the English block + * localization files. + */ + +/* eslint-disable */ +'use strict'; + +// Include the EN Locale by default. +Blockly.setLocale(En); + +Blockly.Blocks = Blockly.Blocks || {}; +Object.keys(BlocklyBlocks).forEach(function (k) { + Blockly.Blocks[k] = BlocklyBlocks[k]; +}); + +Blockly.JavaScript = BlocklyJS; \ No newline at end of file diff --git a/js/package/index.js b/js/package/index.js new file mode 100644 index 0000000..0b5658e --- /dev/null +++ b/js/package/index.js @@ -0,0 +1,23 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Blockly module. + */ + +/* eslint-disable */ +'use strict'; \ No newline at end of file diff --git a/js/package/node/core.js b/js/package/node/core.js new file mode 100644 index 0000000..41d6ff6 --- /dev/null +++ b/js/package/node/core.js @@ -0,0 +1,32 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Blockly core module for Node. It includes blockly-node.js + * and adds a helper method for setting the locale. + */ + +/* eslint-disable */ +'use strict'; + +// Add a helper method to set the Blockly locale. +Blockly.setLocale = function (locale) { + Blockly.Msg = Blockly.Msg || {}; + Object.keys(locale).forEach(function (k) { + Blockly.Msg[k] = locale[k]; + }); +}; diff --git a/js/package/node/index.js b/js/package/node/index.js new file mode 100644 index 0000000..003e5bf --- /dev/null +++ b/js/package/node/index.js @@ -0,0 +1,42 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Blockly module for Node. It includes Blockly core, + * built-in blocks, all the generators and the English locale. + */ + +/* eslint-disable */ +'use strict'; + +// Include the EN Locale by default. +Blockly.setLocale(En); + +Blockly.Blocks = Blockly.Blocks || {}; +Object.keys(BlocklyBlocks).forEach(function (k) { + Blockly.Blocks[k] = BlocklyBlocks[k]; +}); + +Blockly.JavaScript = BlocklyJS; + +Blockly.Python = BlocklyPython; + +Blockly.Lua = BlocklyLua; + +Blockly.PHP = BlocklyPHP; + +Blockly.Dart = BlocklyDart; \ No newline at end of file diff --git a/js/package/templates/node.template b/js/package/templates/node.template new file mode 100644 index 0000000..eef05d7 --- /dev/null +++ b/js/package/templates/node.template @@ -0,0 +1,5 @@ +/* eslint-disable */ +(function (<%= param %>){ +<%= contents %> +module.exports = <%= exports %>; +})(<%= cjs %>); diff --git a/js/package/templates/umd.template b/js/package/templates/umd.template new file mode 100644 index 0000000..ab62e10 --- /dev/null +++ b/js/package/templates/umd.template @@ -0,0 +1,13 @@ +/* eslint-disable */ +;(function(root, factory) { + if (typeof define === 'function' && define.amd) { // AMD + define(<%= amd %>, factory); + } else if (typeof exports === 'object') { // Node.js + module.exports = factory(<%= cjs %>); + } else { // Browser + root.<%= namespace %> = factory(<%= global %>); + } +}(this, function(<%= param %>) { +<%= contents %> +return <%= exports %>; +})); diff --git a/js/php_compressed.js b/js/php_compressed.js new file mode 100644 index 0000000..9f2b3f9 --- /dev/null +++ b/js/php_compressed.js @@ -0,0 +1,90 @@ +// Do not edit this file; automatically generated by gulp. +'use strict'; + + +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.1;Blockly.PHP.ORDER_FUNCTION_CALL=2.2;Blockly.PHP.ORDER_POWER=3;Blockly.PHP.ORDER_INCREMENT=4;Blockly.PHP.ORDER_DECREMENT=4;Blockly.PHP.ORDER_BITWISE_NOT=4;Blockly.PHP.ORDER_CAST=4;Blockly.PHP.ORDER_SUPPRESS_ERROR=4;Blockly.PHP.ORDER_INSTANCEOF=5;Blockly.PHP.ORDER_LOGICAL_NOT=6;Blockly.PHP.ORDER_UNARY_PLUS=7.1;Blockly.PHP.ORDER_UNARY_NEGATION=7.2;Blockly.PHP.ORDER_MULTIPLICATION=8.1; +Blockly.PHP.ORDER_DIVISION=8.2;Blockly.PHP.ORDER_MODULUS=8.3;Blockly.PHP.ORDER_ADDITION=9.1;Blockly.PHP.ORDER_SUBTRACTION=9.2;Blockly.PHP.ORDER_STRING_CONCAT=9.3;Blockly.PHP.ORDER_BITWISE_SHIFT=10;Blockly.PHP.ORDER_RELATIONAL=11;Blockly.PHP.ORDER_EQUALITY=12;Blockly.PHP.ORDER_REFERENCE=13;Blockly.PHP.ORDER_BITWISE_AND=13;Blockly.PHP.ORDER_BITWISE_XOR=14;Blockly.PHP.ORDER_BITWISE_OR=15;Blockly.PHP.ORDER_LOGICAL_AND=16;Blockly.PHP.ORDER_LOGICAL_OR=17;Blockly.PHP.ORDER_IF_NULL=18; +Blockly.PHP.ORDER_CONDITIONAL=19;Blockly.PHP.ORDER_ASSIGNMENT=20;Blockly.PHP.ORDER_LOGICAL_AND_WEAK=21;Blockly.PHP.ORDER_LOGICAL_XOR=22;Blockly.PHP.ORDER_LOGICAL_OR_WEAK=23;Blockly.PHP.ORDER_COMMA=24;Blockly.PHP.ORDER_NONE=99; +Blockly.PHP.ORDER_OVERRIDES=[[Blockly.PHP.ORDER_MEMBER,Blockly.PHP.ORDER_FUNCTION_CALL],[Blockly.PHP.ORDER_MEMBER,Blockly.PHP.ORDER_MEMBER],[Blockly.PHP.ORDER_LOGICAL_NOT,Blockly.PHP.ORDER_LOGICAL_NOT],[Blockly.PHP.ORDER_MULTIPLICATION,Blockly.PHP.ORDER_MULTIPLICATION],[Blockly.PHP.ORDER_ADDITION,Blockly.PHP.ORDER_ADDITION],[Blockly.PHP.ORDER_LOGICAL_AND,Blockly.PHP.ORDER_LOGICAL_AND],[Blockly.PHP.ORDER_LOGICAL_OR,Blockly.PHP.ORDER_LOGICAL_OR]]; +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_,"$");Blockly.PHP.variableDB_.setVariableMap(a.getVariableMap());for(var b=[],c=Blockly.Variables.allDeveloperVariables(a),d=0;dc?Blockly.PHP.valueToCode(a,b,Blockly.PHP.ORDER_SUBTRACTION)||f:d?Blockly.PHP.valueToCode(a,b,Blockly.PHP.ORDER_UNARY_NEGATION)||f:Blockly.PHP.valueToCode(a,b,e)||f;if(Blockly.isNumber(a))a=Number(a)+c,d&&(a=-a);else{if(0c&& +(a=a+" - "+-c,g=Blockly.PHP.ORDER_SUBTRACTION);d&&(a=c?"-("+a+")":"-"+a,g=Blockly.PHP.ORDER_UNARY_NEGATION);g=Math.floor(g);e=Math.floor(e);g&&e>=g&&(a="("+a+")")}return a};Blockly.PHP.colour={};Blockly.PHP.colour_picker=function(a){return[Blockly.PHP.quote_(a.getFieldValue("COLOUR")),Blockly.PHP.ORDER_ATOMIC]};Blockly.PHP.colour_random=function(a){return[Blockly.PHP.provideFunction_("colour_random",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"() {"," return '#' . str_pad(dechex(mt_rand(0, 0xFFFFFF)), 6, '0', STR_PAD_LEFT);","}"])+"()",Blockly.PHP.ORDER_FUNCTION_CALL]}; +Blockly.PHP.colour_rgb=function(a){var b=Blockly.PHP.valueToCode(a,"RED",Blockly.PHP.ORDER_COMMA)||0,c=Blockly.PHP.valueToCode(a,"GREEN",Blockly.PHP.ORDER_COMMA)||0;a=Blockly.PHP.valueToCode(a,"BLUE",Blockly.PHP.ORDER_COMMA)||0;return[Blockly.PHP.provideFunction_("colour_rgb",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($r, $g, $b) {"," $r = round(max(min($r, 100), 0) * 2.55);"," $g = round(max(min($g, 100), 0) * 2.55);"," $b = round(max(min($b, 100), 0) * 2.55);"," $hex = '#';"," $hex .= str_pad(dechex($r), 2, '0', STR_PAD_LEFT);", +" $hex .= str_pad(dechex($g), 2, '0', STR_PAD_LEFT);"," $hex .= str_pad(dechex($b), 2, '0', STR_PAD_LEFT);"," return $hex;","}"])+"("+b+", "+c+", "+a+")",Blockly.PHP.ORDER_FUNCTION_CALL]}; +Blockly.PHP.colour_blend=function(a){var b=Blockly.PHP.valueToCode(a,"COLOUR1",Blockly.PHP.ORDER_COMMA)||"'#000000'",c=Blockly.PHP.valueToCode(a,"COLOUR2",Blockly.PHP.ORDER_COMMA)||"'#000000'";a=Blockly.PHP.valueToCode(a,"RATIO",Blockly.PHP.ORDER_COMMA)||.5;return[Blockly.PHP.provideFunction_("colour_blend",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($c1, $c2, $ratio) {"," $ratio = max(min($ratio, 1), 0);"," $r1 = hexdec(substr($c1, 1, 2));"," $g1 = hexdec(substr($c1, 3, 2));"," $b1 = hexdec(substr($c1, 5, 2));", +" $r2 = hexdec(substr($c2, 1, 2));"," $g2 = hexdec(substr($c2, 3, 2));"," $b2 = hexdec(substr($c2, 5, 2));"," $r = round($r1 * (1 - $ratio) + $r2 * $ratio);"," $g = round($g1 * (1 - $ratio) + $g2 * $ratio);"," $b = round($b1 * (1 - $ratio) + $b2 * $ratio);"," $hex = '#';"," $hex .= str_pad(dechex($r), 2, '0', STR_PAD_LEFT);"," $hex .= str_pad(dechex($g), 2, '0', STR_PAD_LEFT);"," $hex .= str_pad(dechex($b), 2, '0', STR_PAD_LEFT);"," return $hex;","}"])+"("+b+", "+c+", "+a+")",Blockly.PHP.ORDER_FUNCTION_CALL]};Blockly.PHP.lists={};Blockly.PHP.lists_create_empty=function(a){return["array()",Blockly.PHP.ORDER_FUNCTION_CALL]};Blockly.PHP.lists_create_with=function(a){for(var b=Array(a.itemCount_),c=0;c "strnatcasecmp",',' "TEXT" => "strcmp",',' "IGNORE_CASE" => "strcasecmp"'," );"," $sortCmp = $sortCmpFuncs[$type];"," $list2 = $list;"," usort($list2, $sortCmp);", +" if ($direction == -1) {"," $list2 = array_reverse($list2);"," }"," return $list2;","}"])+"("+b+', "'+a+'", '+c+")",Blockly.PHP.ORDER_FUNCTION_CALL]};Blockly.PHP.lists_split=function(a){var b=Blockly.PHP.valueToCode(a,"INPUT",Blockly.PHP.ORDER_COMMA),c=Blockly.PHP.valueToCode(a,"DELIM",Blockly.PHP.ORDER_COMMA)||"''";a=a.getFieldValue("MODE");if("SPLIT"==a)b||(b="''"),a="explode";else if("JOIN"==a)b||(b="array()"),a="implode";else throw Error("Unknown mode: "+a);return[a+"("+c+", "+b+")",Blockly.PHP.ORDER_FUNCTION_CALL]}; +Blockly.PHP.lists_reverse=function(a){return["array_reverse("+(Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_COMMA)||"[]")+")",Blockly.PHP.ORDER_FUNCTION_CALL]};Blockly.PHP.logic={}; +Blockly.PHP.controls_if=function(a){var b=0,c="";Blockly.PHP.STATEMENT_PREFIX&&(c+=Blockly.PHP.injectId(Blockly.PHP.STATEMENT_PREFIX,a));do{var d=Blockly.PHP.valueToCode(a,"IF"+b,Blockly.PHP.ORDER_NONE)||"false";var e=Blockly.PHP.statementToCode(a,"DO"+b);Blockly.PHP.STATEMENT_SUFFIX&&(e=Blockly.PHP.prefixLines(Blockly.PHP.injectId(Blockly.PHP.STATEMENT_SUFFIX,a),Blockly.PHP.INDENT)+e);c+=(0",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);a="";var d=Blockly.PHP.variableDB_.getDistinctName("count",Blockly.VARIABLE_CATEGORY_NAME),e=b;b.match(/^\w+$/)||Blockly.isNumber(b)||(e=Blockly.PHP.variableDB_.getDistinctName("repeat_end",Blockly.VARIABLE_CATEGORY_NAME),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);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.VARIABLE_CATEGORY_NAME),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",f=Blockly.PHP.statementToCode(a,"DO");f=Blockly.PHP.addLoopTrap(f,a);if(Blockly.isNumber(c)&&Blockly.isNumber(d)&&Blockly.isNumber(e)){var g=Number(c)<=Number(d);a="for ("+ +b+" = "+c+"; "+b+(g?" <= ":" >= ")+d+"; "+b;b=Math.abs(Number(e));a=(1==b?a+(g?"++":"--"):a+((g?" += ":" -= ")+b))+(") {\n"+f+"}\n")}else a="",g=c,c.match(/^\w+$/)||Blockly.isNumber(c)||(g=Blockly.PHP.variableDB_.getDistinctName(b+"_start",Blockly.VARIABLE_CATEGORY_NAME),a+=g+" = "+c+";\n"),c=d,d.match(/^\w+$/)||Blockly.isNumber(d)||(c=Blockly.PHP.variableDB_.getDistinctName(b+"_end",Blockly.VARIABLE_CATEGORY_NAME),a+=c+" = "+d+";\n"),d=Blockly.PHP.variableDB_.getDistinctName(b+"_inc",Blockly.VARIABLE_CATEGORY_NAME), +a+=d+" = ",a=Blockly.isNumber(e)?a+(Math.abs(e)+";\n"):a+("abs("+e+");\n"),a=a+("if ("+g+" > "+c+") {\n")+(Blockly.PHP.INDENT+d+" = -"+d+";\n"),a+="}\n",a+="for ("+b+" = "+g+"; "+d+" >= 0 ? "+b+" <= "+c+" : "+b+" >= "+c+"; "+b+" += "+d+") {\n"+f+"}\n";return a}; +Blockly.PHP.controls_forEach=function(a){var b=Blockly.PHP.variableDB_.getName(a.getFieldValue("VAR"),Blockly.VARIABLE_CATEGORY_NAME),c=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_ASSIGNMENT)||"[]",d=Blockly.PHP.statementToCode(a,"DO");d=Blockly.PHP.addLoopTrap(d,a);return"foreach ("+c+" as "+b+") {\n"+d+"}\n"}; +Blockly.PHP.controls_flow_statements=function(a){var b="";Blockly.PHP.STATEMENT_PREFIX&&(b+=Blockly.PHP.injectId(Blockly.PHP.STATEMENT_PREFIX,a));Blockly.PHP.STATEMENT_SUFFIX&&(b+=Blockly.PHP.injectId(Blockly.PHP.STATEMENT_SUFFIX,a));if(Blockly.PHP.STATEMENT_PREFIX){var c=Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN.getSurroundLoop(a);c&&!c.suppressPrefixSuffix&&(b+=Blockly.PHP.injectId(Blockly.PHP.STATEMENT_PREFIX,c))}switch(a.getFieldValue("FLOW")){case "BREAK":return b+"break;\n";case "CONTINUE":return b+ +"continue;\n"}throw Error("Unknown flow statement.");};Blockly.PHP.math={};Blockly.PHP.math_number=function(a){a=Number(a.getFieldValue("NUM"));var b=0<=a?Blockly.PHP.ORDER_ATOMIC:Blockly.PHP.ORDER_UNARY_NEGATION;Infinity==a?a="INF":-Infinity==a&&(a="-INF");return[a,b]}; +Blockly.PHP.math_arithmetic=function(a){var b={ADD:[" + ",Blockly.PHP.ORDER_ADDITION],MINUS:[" - ",Blockly.PHP.ORDER_SUBTRACTION],MULTIPLY:[" * ",Blockly.PHP.ORDER_MULTIPLICATION],DIVIDE:[" / ",Blockly.PHP.ORDER_DIVISION],POWER:[" ** ",Blockly.PHP.ORDER_POWER]}[a.getFieldValue("OP")],c=b[0];b=b[1];var d=Blockly.PHP.valueToCode(a,"A",b)||"0";a=Blockly.PHP.valueToCode(a,"B",b)||"0";return[d+c+a,b]}; +Blockly.PHP.math_single=function(a){var b=a.getFieldValue("OP");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":var 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 Error("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");if("PRIME"==c)return[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+")",Blockly.PHP.ORDER_FUNCTION_CALL];switch(c){case "EVEN":var 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.VARIABLE_CATEGORY_NAME)+" += "+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) {"," if (empty($values)) return array();"," $counts = array_count_values($values);"," arsort($counts); // Sort counts in descending order"," $modes = array_keys($counts, current($counts), true);"," return $modes;","}"]);a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "STD_DEV":b=Blockly.PHP.provideFunction_("math_standard_deviation", +["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($numbers) {"," $n = count($numbers);"," if (!$n) return null;"," $mean = array_sum($numbers) / count($numbers);"," foreach($numbers as $key => $num) $devs[$key] = pow($num - $mean, 2);"," return sqrt(array_sum($devs) / (count($devs) - 1));","}"]);a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "RANDOM":b=Blockly.PHP.provideFunction_("math_random_list",["function "+Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+ +"($list) {"," $x = rand(0, count($list)-1);"," return $list[$x];","}"]);a=Blockly.PHP.valueToCode(a,"LIST",Blockly.PHP.ORDER_NONE)||"[]";a=b+"("+a+")";break;default:throw Error("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.math_atan2=function(a){var b=Blockly.PHP.valueToCode(a,"X",Blockly.PHP.ORDER_COMMA)||"0";return["atan2("+(Blockly.PHP.valueToCode(a,"Y",Blockly.PHP.ORDER_COMMA)||"0")+", "+b+") / pi() * 180",Blockly.PHP.ORDER_DIVISION]};Blockly.PHP.procedures={}; +Blockly.PHP.procedures_defreturn=function(a){for(var b=[],c,d=a.workspace,e=Blockly.Variables.allUsedVarModels(d)||[],f=0;c=e[f];f++)c=c.name,-1==a.arguments_.indexOf(c)&&b.push(Blockly.PHP.variableDB_.getName(c,Blockly.VARIABLE_CATEGORY_NAME));d=Blockly.Variables.allDeveloperVariables(d);for(f=0;fc?"int("+a+" - "+-c+")":"int("+a+")",d&&(a="-"+a));return a};Blockly.Python.colour={};Blockly.Python.colour_picker=function(a){return[Blockly.Python.quote_(a.getFieldValue("COLOUR")),Blockly.Python.ORDER_ATOMIC]};Blockly.Python.colour_random=function(a){Blockly.Python.definitions_.import_random="import random";return["'#%06x' % random.randint(0, 2**24 - 1)",Blockly.Python.ORDER_FUNCTION_CALL]}; +Blockly.Python.colour_rgb=function(a){var b=Blockly.Python.provideFunction_("colour_rgb",["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(r, g, b):"," r = round(min(100, max(0, r)) * 2.55)"," g = round(min(100, max(0, g)) * 2.55)"," b = round(min(100, max(0, b)) * 2.55)"," return '#%02x%02x%02x' % (r, g, b)"]),c=Blockly.Python.valueToCode(a,"RED",Blockly.Python.ORDER_NONE)||0,d=Blockly.Python.valueToCode(a,"GREEN",Blockly.Python.ORDER_NONE)||0;a=Blockly.Python.valueToCode(a,"BLUE",Blockly.Python.ORDER_NONE)|| +0;return[b+"("+c+", "+d+", "+a+")",Blockly.Python.ORDER_FUNCTION_CALL]}; +Blockly.Python.colour_blend=function(a){var b=Blockly.Python.provideFunction_("colour_blend",["def "+Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(colour1, colour2, ratio):"," r1, r2 = int(colour1[1:3], 16), int(colour2[1:3], 16)"," g1, g2 = int(colour1[3:5], 16), int(colour2[3:5], 16)"," b1, b2 = int(colour1[5:7], 16), int(colour2[5:7], 16)"," ratio = min(1, max(0, ratio))"," r = round(r1 * (1 - ratio) + r2 * ratio)"," g = round(g1 * (1 - ratio) + g2 * ratio)"," b = round(b1 * (1 - ratio) + b2 * ratio)", +" return '#%02x%02x%02x' % (r, g, b)"]),c=Blockly.Python.valueToCode(a,"COLOUR1",Blockly.Python.ORDER_NONE)||"'#000000'",d=Blockly.Python.valueToCode(a,"COLOUR2",Blockly.Python.ORDER_NONE)||"'#000000'";a=Blockly.Python.valueToCode(a,"RATIO",Blockly.Python.ORDER_NONE)||0;return[b+"("+c+", "+d+", "+a+")",Blockly.Python.ORDER_FUNCTION_CALL]};Blockly.Python.lists={};Blockly.Python.lists_create_empty=function(a){return["[]",Blockly.Python.ORDER_ATOMIC]};Blockly.Python.lists_create_with=function(a){for(var b=Array(a.itemCount_),c=0;c",GTE:">="}[a.getFieldValue("OP")],c=Blockly.Python.ORDER_RELATIONAL,d=Blockly.Python.valueToCode(a,"A",c)||"0";a=Blockly.Python.valueToCode(a,"B",c)||"0";return[d+" "+b+" "+a,c]}; +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+")";var c=Blockly.Python.statementToCode(a,"DO");c=Blockly.Python.addLoopTrap(c,a)||Blockly.Python.PASS;return"for "+Blockly.Python.variableDB_.getDistinctName("count",Blockly.VARIABLE_CATEGORY_NAME)+" 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)||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.VARIABLE_CATEGORY_NAME),c=Blockly.Python.valueToCode(a,"FROM",Blockly.Python.ORDER_NONE)||"0",d=Blockly.Python.valueToCode(a,"TO",Blockly.Python.ORDER_NONE)||"0",e=Blockly.Python.valueToCode(a,"BY",Blockly.Python.ORDER_NONE)||"1",f=Blockly.Python.statementToCode(a,"DO");f=Blockly.Python.addLoopTrap(f,a)||Blockly.Python.PASS;var h="",g=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 "+g()+"("+a+", "+b+", "+c+") or "+k()+"("+a+", "+b+", "+c+")"};if(Blockly.isNumber(c)&&Blockly.isNumber(d)&& +Blockly.isNumber(e))c=Number(c),d=Number(d),e=Math.abs(Number(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];var 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");if("NEG"==b){var c=Blockly.Python.valueToCode(a,"NUM",Blockly.Python.ORDER_UNARY_SIGN)||"0";return["-"+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 Error("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");if("PRIME"==c)return Blockly.Python.definitions_.import_math="import math",Blockly.Python.definitions_.from_numbers_import_Number="from numbers import Number",[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+")",Blockly.Python.ORDER_FUNCTION_CALL];switch(c){case "EVEN":var 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.VARIABLE_CATEGORY_NAME);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 Error("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.math_atan2=function(a){Blockly.Python.definitions_.import_math="import math";var b=Blockly.Python.valueToCode(a,"X",Blockly.Python.ORDER_NONE)||"0";return["math.atan2("+(Blockly.Python.valueToCode(a,"Y",Blockly.Python.ORDER_NONE)||"0")+", "+b+") / math.pi * 180",Blockly.Python.ORDER_MULTIPLICATIVE]};Blockly.Python.procedures={}; +Blockly.Python.procedures_defreturn=function(a){for(var b=[],c,d=a.workspace,e=Blockly.Variables.allUsedVarModels(d)||[],f=0;c=e[f];f++)c=c.name,-1==a.arguments_.indexOf(c)&&b.push(Blockly.Python.variableDB_.getName(c,Blockly.VARIABLE_CATEGORY_NAME));d=Blockly.Variables.allDeveloperVariables(d);for(f=0;f + + + + Unit Tests for Blockly Blocks + + + + + + + + + + + + + + + + + + + + + + + diff --git a/js/tests/blocks/logic_ternary_test.js b/js/tests/blocks/logic_ternary_test.js new file mode 100644 index 0000000..9e28c13 --- /dev/null +++ b/js/tests/blocks/logic_ternary_test.js @@ -0,0 +1,313 @@ +/** + * @license + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + +function test_logic_ternary_structure() { + var workspace = new Blockly.Workspace(); + try { + var block = workspace.newBlock('logic_ternary'); + assertEquals(3, block.inputList && block.inputList.length); + assertEquals(1, block.getInput('IF').connection.check_.length); + assertEquals('Boolean', block.getInput('IF').connection.check_[0]); + assertTrue(!!block.onchangeWrapper_); // Has onchange handler + } finally { + workspace.dispose(); + } +} + +function test_logic_ternary_attachSameTypeCheckInThenAndElseWithoutParent() { + var workspace = new Blockly.Workspace(); + try { + var block = workspace.newBlock('logic_ternary'); + + var string1 = workspace.newBlock('text'); + var string2 = workspace.newBlock('text_charAt'); + + block.getInput('THEN').connection.connect(string1.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + assertEquals(block, string1.getRootBlock()); + block.getInput('ELSE').connection.connect(string2.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + assertEquals(block, string1.getRootBlock()); // Still connected. + assertEquals(block, string2.getRootBlock()); + } finally { + workspace.dispose(); + } +} + +function test_logic_ternary_attachDifferectTypeChecksInThenAndElseWithoutParent() { + var workspace = new Blockly.Workspace(); + try { + var block = workspace.newBlock('logic_ternary'); + + var string = workspace.newBlock('text'); + var number = workspace.newBlock('math_number'); + + block.getInput('THEN').connection.connect(string.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + assertEquals(block, string.getRootBlock()); + block.getInput('ELSE').connection.connect(number.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + assertEquals(block, string.getRootBlock()); // Input THEN still connected. + assertEquals(block, number.getRootBlock()); + } finally { + workspace.dispose(); + } +} + +function test_logic_ternary_attachSameTypeCheckInThenAndElseWithMatchingParent() { + var workspace = new Blockly.Workspace(); + try { + var block = workspace.newBlock('logic_ternary'); + var parent = workspace.newBlock('text_trim'); + + parent.getInput('TEXT').connection.connect(block.outputConnection); + assertEquals(parent, block.getRootBlock()); + + var string1 = workspace.newBlock('text'); + var string2 = workspace.newBlock('text_charAt'); + + block.getInput('THEN').connection.connect(string1.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + assertEquals(parent, block.getRootBlock()); // Still connected to parent. + assertEquals(parent, string1.getRootBlock()); + block.getInput('ELSE').connection.connect(string2.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + assertEquals(parent, block.getRootBlock()); // Still connected to parent. + assertEquals(parent, string1.getRootBlock()); // Input THEN still connected. + assertEquals(parent, string2.getRootBlock()); + } finally { + workspace.dispose(); + } +} + +function test_logic_ternary_attachDifferectTypeChecksInThenAndElseWithUncheckedParent() { + var workspace = new Blockly.Workspace(); + try { + var block = workspace.newBlock('logic_ternary'); + var parent = workspace.newBlock('text_print'); + + parent.getInput('TEXT').connection.connect(block.outputConnection); + assertEquals(parent, block.parentBlock_); + + var string = workspace.newBlock('text'); + var number = workspace.newBlock('math_number'); + + block.getInput('THEN').connection.connect(string.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + assertEquals(parent, block.getRootBlock()); // Still connected to parent. + assertEquals(parent, string.getRootBlock()); + block.getInput('ELSE').connection.connect(number.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + assertEquals(parent, block.getRootBlock()); // Still connected to parent. + assertEquals(parent, string.getRootBlock()); // Input THEN still connected. + assertEquals(parent, number.getRootBlock()); + } finally { + workspace.dispose(); + } +} + +function test_logic_ternary_attachDifferectTypeChecksInThenAndElseWithPermissiveParent() { + var workspace = new Blockly.Workspace(); + try { + var block = workspace.newBlock('logic_ternary'); + var parent = workspace.newBlock('text_length'); // Allows String or Array + + parent.getInput('VALUE').connection.connect(block.outputConnection); + assertEquals(parent, block.parentBlock_); + + var string = workspace.newBlock('text'); + var array = workspace.newBlock('lists_create_empty'); + + block.getInput('THEN').connection.connect(string.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + assertEquals(parent, block.getRootBlock()); // Still connected to parent. + assertEquals(parent, string.getRootBlock()); + block.getInput('ELSE').connection.connect(array.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + assertEquals(parent, block.getRootBlock()); // Still connected to parent. + assertEquals(parent, string.getRootBlock()); // Input THEN still connected. + assertEquals(parent, array.getRootBlock()); + } finally { + workspace.dispose(); + } +} + +function test_logic_ternary_attachMismatchTypeToThen_breakWithParent() { + var workspace = new Blockly.Workspace(); + try { + var block = workspace.newBlock('logic_ternary'); + var parent = workspace.newBlock('text_length'); // Allows String or Array + + parent.getInput('VALUE').connection.connect(block.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + assertEquals(parent, block.parentBlock_); + + var string = workspace.newBlock('text'); + var number = workspace.newBlock('math_number'); + + block.getInput('ELSE').connection.connect(string.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + assertEquals(parent, block.getRootBlock()); // Still connected to parent. + assertEquals(parent, string.getRootBlock()); + + // Adding mismatching number. + block.getInput('THEN').connection.connect(number.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + assertEquals(block, block.getRootBlock()); // Disconnected from parent. + assertEquals(block, number.getRootBlock()); + assertEquals(block, string.getRootBlock()); // ELSE string still connected. + } finally { + workspace.dispose(); + } +} + +function test_logic_ternary_attachMismatchTypeToElse_breakWithParent() { + var workspace = new Blockly.Workspace(); + try { + var block = workspace.newBlock('logic_ternary'); + var parent = workspace.newBlock('text_length'); // Allows String or Array + + parent.getInput('VALUE').connection.connect(block.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + assertEquals(parent, block.parentBlock_); + + var string = workspace.newBlock('text'); + var number = workspace.newBlock('math_number'); + + block.getInput('THEN').connection.connect(string.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + assertEquals(parent, block.getRootBlock()); // Still connected to parent. + assertEquals(parent, string.getRootBlock()); + + // Adding mismatching number. + block.getInput('ELSE').connection.connect(number.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + assertEquals(block, block.getRootBlock()); // Disconnected from parent. + assertEquals(block, number.getRootBlock()); + assertEquals(block, string.getRootBlock()); // THEN string still connected. + } finally { + workspace.dispose(); + } +} + +function test_logic_ternary_attachToUncheckedParentWithDifferentTypes() { + var workspace = new Blockly.Workspace(); + try { + var block = workspace.newBlock('logic_ternary'); + var string = workspace.newBlock('text'); + var number = workspace.newBlock('math_number'); + + block.getInput('THEN').connection.connect(string.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + assertEquals(block, string.getRootBlock()); + block.getInput('ELSE').connection.connect(number.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + assertEquals(block, string.getRootBlock()); // Input THEN still connected. + assertEquals(block, number.getRootBlock()); + + // Attaching to parent. + var parent = workspace.newBlock('text_print'); + parent.getInput('TEXT').connection.connect(block.outputConnection); + assertEquals(parent, block.getRootBlock()); + assertEquals(parent, string.getRootBlock()); // Input THEN still connected. + assertEquals(parent, number.getRootBlock()); // Input ELSE still connected. + } finally { + workspace.dispose(); + } +} + +function test_logic_ternary_attachToPermissiveParentWithDifferentTypes() { + var workspace = new Blockly.Workspace(); + try { + var block = workspace.newBlock('logic_ternary'); + var string = workspace.newBlock('text'); + var array = workspace.newBlock('lists_create_empty'); + + block.getInput('THEN').connection.connect(string.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + assertEquals(block, string.getRootBlock()); + block.getInput('ELSE').connection.connect(array.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + assertEquals(block, string.getRootBlock()); // Input THEN still connected. + assertEquals(block, array.getRootBlock()); + + // Attaching to parent. + var parent = workspace.newBlock('text_print'); + parent.getInput('TEXT').connection.connect(block.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + assertEquals(parent, block.getRootBlock()); + assertEquals(parent, string.getRootBlock()); // Input THEN still connected. + assertEquals(parent, array.getRootBlock()); // Input ELSE still connected. + } finally { + workspace.dispose(); + } +} + +function test_logic_ternary_attachToParentWithMismatchingThen_disconnectThen() { + var workspace = new Blockly.Workspace(); + try { + var block = workspace.newBlock('logic_ternary'); + var number = workspace.newBlock('math_number'); + var string = workspace.newBlock('text'); + + block.getInput('THEN').connection.connect(number.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + assertEquals(block, number.getRootBlock()); + block.getInput('ELSE').connection.connect(string.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + assertEquals(block, number.getRootBlock()); // Input THEN still connected. + assertEquals(block, string.getRootBlock()); + + // Attaching to parent. + var parent = workspace.newBlock('text_trim'); + parent.getInput('TEXT').connection.connect(block.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + assertEquals(parent, block.getRootBlock()); // Successful connection to parent. + assertEquals(parent, string.getRootBlock()); // Input ELSE still connected. + assertEquals(number, number.getRootBlock()); // Input THEN disconnected. + } finally { + workspace.dispose(); + } +} + +function test_logic_ternary_attachToParentWithMismatchingElse_disconnectElse() { + var workspace = new Blockly.Workspace(); + try { + var block = workspace.newBlock('logic_ternary'); + var string = workspace.newBlock('text'); + var number = workspace.newBlock('math_number'); + + block.getInput('THEN').connection.connect(string.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + assertEquals(block, string.getRootBlock()); + block.getInput('ELSE').connection.connect(number.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + assertEquals(block, string.getRootBlock()); // Input THEN still connected. + assertEquals(block, number.getRootBlock()); + + // Attaching to parent. + var parent = workspace.newBlock('text_trim'); + parent.getInput('TEXT').connection.connect(block.outputConnection); + Blockly.Events.fireNow_(); // Force synchronous onchange() call. + assertEquals(parent, block.getRootBlock()); // Successful connection to parent. + assertEquals(parent, string.getRootBlock()); // Input THEN still connected. + assertEquals(number, number.getRootBlock()); // Input ELSE disconnected. + } finally { + workspace.dispose(); + } +} diff --git a/js/tests/blocks/test_blocks.js b/js/tests/blocks/test_blocks.js new file mode 100644 index 0000000..ff9b8a0 --- /dev/null +++ b/js/tests/blocks/test_blocks.js @@ -0,0 +1,1894 @@ +/** + * @license + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + +goog.provide('Blockly.TestBlocks'); + +Blockly.defineBlocksWithJsonArray([ // BEGIN JSON EXTRACT + { + "type": "test_basic_empty", + "message0": "", + "args0": [] + }, + { + "type": "test_basic_stack", + "message0": "stack block", + "previousStatement": null, + "nextStatement": null, + "colour": "120" + }, + { + "type": "test_basic_dummy", + "message0": "dummy input %1", + "args0": [ + { + "type": "input_dummy" + } + ], + "style": "math_blocks" + }, + { + "type": "test_basic_multiple_dummy", + "message0": "first dummy %1 second dummy %2", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_dummy" + } + ], + "style": "math_blocks" + }, + { + "type": "test_basic_row", + "message0": "row block %1", + "args0": [ + { + "type": "input_value", + "name": "INPUT" + } + ], + "output": null, + "style": "math_blocks" + }, + { + "type": "test_basic_value_to_stack", + "message0": "value to stack", + "nextStatement": null, + "output": null, + "style": "math_blocks" + }, + { + "type": "test_basic_value_to_statement", + "message0": "value to statement %1", + "args0": [ + { + "type": "input_statement", + "name": "STATEMENT" + } + ], + "output": null, + "style": "math_blocks" + }, + { + "type": "test_basic_limit_instances", + "message0": "limit 3 instances %1 %2", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "STATEMENT" + } + ], + "previousStatement": null, + "nextStatement": null, + "style": "math_blocks", + }, + { + "type": "test_basic_tooltips", + "message0": "%1 %2 %3", + "args0": [ + { + "type": "field_label", + "name": "NAME", + "text": "field tooltip", + "tooltip": "This is a JSON tooltip for the *field*." + }, + { + "type": "input_dummy" + }, + { + "type": "field_label", + "name": "NAME", + "text": "block tooltip" + } + ], + "tooltip": "This is a JSON tooltip for the *block*.", + "style": "math_blocks" + }, + { + "type": "test_basic_javascript", + "message0": "function %1(%2) { %3 %4 return %5 }", + "args0": [ + "foo", + "args", + { + "type": "input_dummy" + }, + { + "type": "input_statement", + "name": "STACK" + }, + { + "type": "input_value", + "check": "number", + "align": "right", + "name": "RETURN" + } + ], + "inputsInline": true, + "colour": 200, + "tooltip": "Hello world." + }, + { + "type": "test_align_dummy_right", + "message0": "text right %1 long text right %2", + "args0": [ + { + "type": "input_dummy", + "align": "RIGHT", + }, + { + "type": "input_dummy", + "align": "RIGHT", + }, + ], + "style": "math_blocks" + }, + { + "type": "test_align_all", + "message0": "text %1 long text left %2 text centre %3 much longer text right %4", + "args0": [ + { + "type": "input_dummy", + }, + { + "type": "input_dummy", + "align": "LEFT", + }, + { + "type": "input_dummy", + "align": "CENTRE", + }, + { + "type": "input_dummy", + "align": "RIGHT", + }, + ], + "style": "math_blocks" + }, + { + "type": "test_align_with_external_input", + "message0": "text right %1 long text centre %2 text left %3 much longer text %4", + "args0": [ + { + "type": "input_dummy", + "align": "RIGHT", + }, + { + "type": "input_dummy", + "align": "CENTRE", + }, + { + "type": "input_dummy", + "align": "LEFT", + }, + { + "type": "input_value", + "name": "VALUE" + }, + ], + "inputsInline": false, + "style": "math_blocks" + }, + { + "type": "test_connections_row_input", + "message0": "%1", + "args0": [ + { + "type": "input_value", + "name": "NAME", + } + ], + "colour": '#aaaaaa', + "tooltip": "No Checks\n" + + "Can connect to any output connection." + }, + { + "type": "test_connections_row_blue", + "message0": "%1", + "args0": [ + { + "type": "input_value", + "name": "NAME", + "check": "greenRel" + } + ], + "output": "noneOut", + "colour": 230, + "tooltip": "Output: noneOut\n" + + "Input: greenRel\n" + + "Input connection can accept yellow blocks but not red blocks." + }, + { + "type": "test_connections_row_yellow", + "message0": "%1", + "args0": [ + { + "type": "input_value", + "name": "NAME", + "check": [ + "orangeRel", + "yellowRel" + ] + } + ], + "output": [ + "yellowRel", + "greenRel" + ], + "colour": 60, + "tooltip": "Output: yellowRel, greenRel\n" + + "Input: yellowRel, orangeRel\n" + + "Output can connect to yellow blocks and blue blocks, but not red blocks.\n" + + "Input can connect to yellow blocks and red blocks, but not blue blocks." + }, + { + "type": "test_connections_row_red", + "message0": "%1", + "args0": [ + { + "type": "input_value", + "name": "NAME", + "check": "noneIn" + } + ], + "output": "orangeRel", + "colour": 0, + "tooltip": "Output: orangeRel\n" + + "Input: noneIn\n" + + "Output can connect to yellow blocks, but not blue blocks." + }, + { + "type": "test_connections_row_output", + "message0": "", + "output": null, + "colour": '#aaaaaa', + "tooltip": "No Checks\n" + + "Can connect to any input connection." + }, + { + "type": "test_connections_multivalue_1valid", + "message0": "none %1 both %2", + "args0": [ + { + "type": "input_value", + "name": "NAME1", + "align": "RIGHT", + "check": "noneIn" + }, + { + "type": "input_value", + "name": "NAME2", + "align": "RIGHT", + "check": [ + "yellowRel", + "orangeRel" + ] + } + ], + "output": [ + "yellowRel", + "greenRel" + ], + "colour": 60, + "tooltip": "Output: yellowRel, greenRel\n" + + "Input Top: noneIn\n" + + "Input Bottom: yellowRel, orangeRel\n" + + "Output can connect to yellow blocks and blue blocks, but not red blocks.\n" + + "Top Input can connect to nothing, except grey blocks.\n" + + "Bottom Input can connect to yellow blocks and red blocks, but not blue" + + " blocks." + }, + { + "type": "test_connections_multivalue_2valid", + "message0": "both %1 both %2", + "args0": [ + { + "type": "input_value", + "name": "NAME1", + "align": "RIGHT", + "check": [ + "yellowRel", + "orangeRel" + ] + }, + { + "type": "input_value", + "name": "NAME2", + "align": "RIGHT", + "check": [ + "yellowRel", + "orangeRel" + ] + } + ], + "output": [ + "yellowRel", + "greenRel" + ], + "colour": 60, + "tooltip": "Output: yellowRel, greenRel\n" + + "Input Top: yellowRel, orangeRel\n" + + "Input Bottom: yellowRel, orangeRel\n" + + "Output can connect to yellow blocks and blue blocks, but not red blocks.\n" + + "Top Input can connect to yellow blocks and red blocks, but not blue" + + " blocks.\n" + + "Bottom Input can connect to yellow blocks and red blocks, but not blue" + + " blocks." + }, + { + "type": "test_connections_stack_next", + "message0": "", + "nextStatement": null, + "colour": '#aaaaaa', + "tooltip": "No Checks\n" + + "Can connect to any previous connection." + }, + { + "type": "test_connections_stack_blue", + "message0": "", + "previousStatement": "nonePrev", + "nextStatement": "greenRel", + "colour": 230, + "tooltip": "Prev: nonePrev\n" + + "Next: greenRel\n" + + "Next connection can accept yellow blocks but not red blocks." + }, + { + "type": "test_connections_stack_yellow", + "message0": "", + "previousStatement": [ + "greenRel", + "yellowRel" + ], + "nextStatement": [ + "yellowRel", + "orangeRel" + ], + "colour": 60, + "tooltip": "Prev: yellowRel, greenRel\n" + + "Next: yellowRel, orangeRel\n" + + "Prev can connect to yellow blocks and blue blocks, but not red blocks.\n" + + "Next can connect to yellow blocks and red blocks, but not blue blocks." + }, + { + "type": "test_connections_stack_red", + "message0": "", + "previousStatement": "orangeRel", + "nextStatement": "noneNext", + "colour": 0, + "tooltip": "Prev: orangeRel\n" + + "Next: noneNext\n" + + "Prev can connect to yellow blocks, but not blue blocks." + }, + { + "type": "test_connections_stack_prev", + "message0": "", + "previousStatement": null, + "colour": '#aaaaaa', + "tooltip": "No Checks\n" + + "Can connect to any input connection." + }, + { + "type": "test_connections_statement_blue", + "message0": "%1", + "args0": [ + { + "type": "input_statement", + "name": "NAME", + "check": "greenRel" + } + ], + "previousStatement": "nonePrev", + "nextStatement": "greenRel", + "colour": 230, + "tooltip": "Prev: nonePrev\n" + + "Next: greenRel\n" + + "Statement: greenRel\n" + + "Next connection can accept yellow blocks but not red blocks.\n" + + "Statement connection can accept yellow blocks but not red blocks." + }, + { + "type": "test_connections_statement_yellow", + "message0": "%1", + "args0": [ + { + "type": "input_statement", + "name": "NAME", + "check": [ + "yellowRel", + "orangeRel" + ] + } + ], + "previousStatement": [ + "greenRel", + "yellowRel" + ], + "nextStatement": [ + "yellowRel", + "orangeRel" + ], + "colour": 60, + "tooltip": "Prev: yellowRel, greenRel\n" + + "Next: yellowRel, orangeRel\n" + + "Statement: orangeRel\n" + + "Prev can connect to yellow blocks and blue blocks, but not red" + + " blocks.\n" + + "Next can connect to yellow blocks and red blocks, but not blue" + + " blocks.\n" + + "Statement connection can accept yellow blocks and red blocks but not" + + " blue blocks.\n" + }, + { + "type": "test_connections_statement_red", + "message0": "%1", + "args0": [ + { + "type": "input_statement", + "name": "NAME", + "check": "noneNext" + } + ], + "previousStatement": "orangeRel", + "nextStatement": "noneNext", + "colour": 0, + "tooltip": "Prev: orangeRel\n" + + "Next: noneNext\n" + + "Statement: noneNext\n" + + "Prev connection can accept yellow blocks but not blue blocks.\n" + + "Statement connection accepts none." + }, + { + "type": "test_connections_statement_nonext", + "message0": "%1", + "args0": [ + { + "type": "input_statement", + "name": "NAME", + "check": [ + "yellowRel", + "orangeRel" + ] + } + ], + "previousStatement": [ + "greenRel", + "yellowRel" + ], + "colour": 60, + "tooltip": "Prev: yellowRel, greenRel\n" + + "Next: yellowRel, orangeRel\n" + + "Statement: orangeRel\n" + + "Prev can connect to yellow blocks and blue blocks, but not red" + + " blocks.\n" + + "Statement connection can accept yellow blocks and red blocks but not" + + " blue blocks.\n" + }, + { + "type": "test_connections_multistatement_1valid", + "message0": "none %1 both %2", + "args0": [ + { + "type": "input_statement", + "name": "NAME", + "check": "noneNext" + }, + { + "type": "input_statement", + "name": "NAME", + "check": [ + "yellowRel", + "orangeRel" + ] + } + ], + "previousStatement": [ + "greenRel", + "yellowRel" + ], + "colour": 60, + "tooltip": "Prev: yellowRel, greenRel\n" + + "Next: yellowRel, orangeRel\n" + + "Statement: orangeRel\n" + + "Prev can connect to yellow blocks and blue blocks, but not red" + + " blocks.\n" + + "Top Statement cannot connect to anything, except grey blocks.\n" + + "Bottom Statement connection can accept yellow blocks and red blocks" + + " but not blue blocks.\n" + }, + { + "type": "test_connections_multistatement_2valid", + "message0": "both %1 both %2", + "args0": [ + { + "type": "input_statement", + "name": "NAME", + "check": [ + "yellowRel", + "orangeRel" + ] + }, + { + "type": "input_statement", + "name": "NAME", + "check": [ + "yellowRel", + "orangeRel" + ] + } + ], + "previousStatement": [ + "greenRel", + "yellowRel" + ], + "colour": 60, + "tooltip": "Prev: yellowRel, greenRel\n" + + "Next: yellowRel, orangeRel\n" + + "Statement: orangeRel\n" + + "Prev can connect to yellow blocks and blue blocks, but not red" + + " blocks.\n" + + "Top Statement connection can accept yellow blocks and red blocks but" + + " not blue blocks.\n" + + "Bottom Statement connection can accept yellow blocks and red blocks" + + " but not blue blocks.\n" + }, + { + "type": "test_dropdowns_long", + "message0": "long: %1", + "args0": [ + { + "type": "field_dropdown", + "name": "FIELDNAME", + "options": [ + [ "first item", "ITEM1" ], + [ "second item", "ITEM2" ], + [ "third item", "ITEM3" ], + [ "fourth item", "ITEM4" ], + [ "fifth item", "ITEM5" ], + [ "sixth item", "ITEM6" ], + [ "seventh item", "ITEM7" ], + [ "eighth item", "ITEM8" ], + [ "ninth item", "ITEM9" ], + [ "tenth item", "ITEM10" ], + [ "eleventh item", "ITEM11" ], + [ "twelfth item", "ITEM12" ], + [ "thirteenth item", "ITEM13" ], + [ "fourteenth item", "ITEM14" ], + [ "fifteenth item", "ITEM15" ], + [ "sixteenth item", "ITEM16" ], + [ "seventeenth item", "ITEM17" ], + [ "eighteenth item", "ITEM18" ], + [ "nineteenth item", "ITEM19" ], + [ "twentieth item", "ITEM20" ], + [ "twenty-first item", "ITEM21" ], + [ "twenty-second item", "ITEM22" ], + [ "twenty-third item", "ITEM23" ], + [ "twenty-fourth item", "ITEM24" ], + [ "twenty-fifth item", "ITEM25" ], + [ "twenty-sixth item", "ITEM26" ], + [ "twenty-seventh item", "ITEM27" ], + [ "twenty-eighth item", "ITEM28" ], + [ "twenty-ninth item", "ITEM29" ], + [ "thirtieth item", "ITEM30" ], + [ "thirty-first item", "ITEM31" ], + [ "thirty-second item", "ITEM32" ] + ] + } + ] + }, + { + "type": "test_dropdowns_images", + "message0": "%1", + "args0": [ + { + "NOTE": "The following paths are relative to playground.html", + "type": "field_dropdown", + "name": "FIELDNAME", + "options": [ + [{"src": "media/a.png", "width": 32, "height": 32, "alt": "A"}, "A"], + [{"src": "media/b.png", "width": 32, "height": 32, "alt": "B"}, "B"], + [{"src": "media/c.png", "width": 32, "height": 32, "alt": "C"}, "C"], + [{"src": "media/d.png", "width": 32, "height": 32, "alt": "D"}, "D"], + [{"src": "media/e.png", "width": 32, "height": 32, "alt": "E"}, "E"], + [{"src": "media/f.png", "width": 32, "height": 32, "alt": "F"}, "F"], + [{"src": "media/g.png", "width": 32, "height": 32, "alt": "G"}, "G"], + [{"src": "media/h.png", "width": 32, "height": 32, "alt": "H"}, "H"], + [{"src": "media/i.png", "width": 32, "height": 32, "alt": "I"}, "I"], + [{"src": "media/j.png", "width": 32, "height": 32, "alt": "J"}, "J"], + [{"src": "media/k.png", "width": 32, "height": 32, "alt": "K"}, "K"], + [{"src": "media/l.png", "width": 32, "height": 32, "alt": "L"}, "L"], + [{"src": "media/m.png", "width": 32, "height": 32, "alt": "M"}, "M"] + ] + } + ] + }, + { + "type": "test_dropdowns_images_and_text", + "message0": "%1", + "args0": [ + { + "type": "field_dropdown", + "name": "FIELDNAME", + "options": [ + ["images and text", "IMAGES AND TEXT"], + [{"src": "media/a.png", "width": 32, "height": 32, "alt": "A"}, "A"], + [{"src": "media/b.png", "width": 32, "height": 32, "alt": "B"}, "B"], + [{"src": "media/c.png", "width": 32, "height": 32, "alt": "C"}, "C"], + [{"src": "media/d.png", "width": 32, "height": 32, "alt": "D"}, "D"], + [{"src": "media/e.png", "width": 32, "height": 32, "alt": "E"}, "E"], + [{"src": "media/f.png", "width": 32, "height": 32, "alt": "F"}, "F"], + [{"src": "media/g.png", "width": 32, "height": 32, "alt": "G"}, "G"], + [{"src": "media/h.png", "width": 32, "height": 32, "alt": "H"}, "H"], + ["xyz", "LMNOP"], + [{"src": "media/i.png", "width": 32, "height": 32, "alt": "I"}, "I"], + [{"src": "media/j.png", "width": 32, "height": 32, "alt": "J"}, "J"], + [{"src": "media/k.png", "width": 32, "height": 32, "alt": "K"}, "K"], + [{"src": "media/l.png", "width": 32, "height": 32, "alt": "L"}, "L"], + [{"src": "media/m.png", "width": 32, "height": 32, "alt": "M"}, "M"] + ] + } + ] + }, + { + "type": "test_fields_angle", + "message0": "angle: %1", + "args0": [ + { + "type": "field_angle", + "name": "FIELDNAME", + "angle": "90", + "alt": + { + "type": "field_label", + "text": "NO ANGLE FIELD" + } + } + ], + "style": "math_blocks", + }, + { + "type": "test_fields_date", + "message0": "date: %1", + "args0": [ + { + "type": "field_date", + "name": "FIELDNAME", + "date": "2020-02-20", + "alt": + { + "type": "field_label", + "text": "NO DATE FIELD" + } + } + ], + "style": "math_blocks", + }, + { + "type": "test_fields_text_input", + "message0": "text input %1", + "args0": [ + { + "type": "field_input", + "name": "TEXT_INPUT", + "text": "default" + } + ], + "style": "math_blocks", + "tooltip": "", + "helpUrl": "" + }, + { + "type": "test_fields_only_text_input", + "message0": "%1", + "args0": [ + { + "type": "field_input", + "name": "TEXT_INPUT", + "text": "default" + } + ], + "style": "textInput", + "tooltip": "", + "helpUrl": "", + "output": "String" + }, + { + "type": "test_fields_multilinetext", + "message0": "code %1", + "args0": [ + { + "type": "field_multilinetext", + "name": "CODE", + "text": "default1\ndefault2" + } + ], + "style": "math_blocks", + "tooltip": "test tooltip" + }, + { + "type": "test_fields_checkbox", + "message0": "checkbox %1", + "args0": [ + { + "type": "field_checkbox", + "name": "CHECKBOX", + "checked": true + } + ], + "style": "math_blocks", + "tooltip": "", + "helpUrl": "" + }, + { + "type": "test_fields_colour", + "message0": "colour %1", + "args0": [ + { + "type": "field_colour", + "name": "COLOUR", + "colour": "#ff0000" + } + ], + "style": "math_blocks", + "tooltip": "", + "helpUrl": "" + }, + { + "type": "test_fields_colour_options", + "message0": "colour options %1", + "args0": [ + { + "type": "field_colour", + "name": "COLOUR", + "colour": "#ff4040", + "colourOptions": + ['#ff4040', '#ff8080', '#ffc0c0', + '#4040ff', '#8080ff', '#c0c0ff'], + "colourTitles": + ['dark pink', 'pink', 'light pink', + 'dark blue', 'blue', 'light blue'], + "columns": 3 + } + ], + "style": "math_blocks", + "tooltip": "test tooltip" + }, + { + "type": "test_fields_variable", + "message0": "variable %1", + "args0": [ + { + "type": "field_variable", + "name": "VARIABLE", + "variable": "item" + } + ], + "style": "math_blocks", + "tooltip": "", + "helpUrl": "" + }, + { + "type": "test_fields_label_serializable", + "message0": "label serializable %1", + "args0": [ + { + "type": "field_label_serializable", + "name": "LABEL", + "text": "default" + } + ], + "style": "math_blocks", + "tooltip": "", + "helpUrl": "" + }, + { + "type": "test_fields_image", + "message0": "image %1", + "args0": [ + { + "type": "field_image", + "name": "IMAGE", + "src": "https://blockly-demo.appspot.com/static/tests/media/a.png", + "width": 32, + "height": 32, + "alt": "A" + } + ], + "colour": 230 + }, + { + "type": "test_numbers_float", + "message0": "float %1", + "args0": [ + { + "type": "field_number", + "name": "NUM", + "text": "0" + } + ], + "style": "math_blocks", + "output": "Number", + "tooltip": "A number." + }, + { + "type": "test_numbers_whole", + "message0": "precision 1 %1", + "args0": [ + { + "type": "field_number", + "name": "NUM", + "precision": 1, + "text": "0" + } + ], + "style": "math_blocks", + "output": "Number", + "tooltip": "The number should be rounded to multiples of 1" + }, + { + "type": "test_numbers_hundredths", + "message0": "precision 0.01 %1", + "args0": [ + { + "type": "field_number", + "name": "NUM", + "precision": 0.01, + "text": "0" + } + ], + "style": "math_blocks", + "output": "Number", + "tooltip": "The number should be rounded to multiples of 0.01" + }, + { + "type": "test_numbers_halves", + "message0": "precision 0.5 %1", + "args0": [ + { + "type": "field_number", + "name": "NUM", + "precision": 0.5, + "text": "0" + } + ], + "style": "math_blocks", + "output": "Number", + "tooltip": "The number should be rounded to multiples of 0.5" + }, + { + "type": "test_numbers_three_halves", + "message0": "precision 1.5 %1", + "args0": [ + { + "type": "field_number", + "name": "NUM", + "precision": 1.5, + "text": "0" + } + ], + "style": "math_blocks", + "output": "Number", + "tooltip": "The number should be rounded to multiples of 1.5" + }, + { + "type": "test_numbers_whole_bounded", + "message0": "midi note %1", + "args0": [ + { + "type": "field_number", + "name": "NOTE", + "precision": 1, + "min": 1, + "max": 127, + "text": "0" + } + ], + "style": "math_blocks", + "output": "Note", + "tooltip": "A midi note." + }, + { + "type": "test_angles_protractor", + "message0": "protractor %1", + "args0": [ + { + "type": "field_angle", + "name": "FIELDNAME", + "angle": 0, + "mode": "protractor" + } + ], + "style": "math_blocks", + "tooltip": "test tooltip" + }, + { + "type": "test_angles_compass", + "message0": "compass %1", + "args0": [ + { + "type": "field_angle", + "name": "FIELDNAME", + "angle": 0, + "mode": "compass" + } + ], + "style": "math_blocks", + "tooltip": "test tooltip" + }, + { + "type": "test_angles_clockwise", + "message0": "clockwise %1", + "args0": [ + { + "type": "field_angle", + "name": "FIELDNAME", + "angle": 0, + "clockwise": true + } + ], + "style": "math_blocks", + "tooltip": "test tooltip" + }, + { + "type": "test_angles_offset", + "message0": "offset 90 %1", + "args0": [ + { + "type": "field_angle", + "name": "FIELDNAME", + "angle": 0, + "offset": 90 + } + ], + "style": "math_blocks", + "tooltip": "test tooltip" + }, + { + "type": "test_angles_wrap", + "message0": "wrap %1", + "args0": [ + { + "type": "field_angle", + "name": "FIELDNAME", + "angle": 0, + "wrap": 180 + } + ], + "style": "math_blocks", + "tooltip": "test tooltip" + }, + { + "type": "test_angles_round_30", + "message0": "round 30 %1", + "args0": [ + { + "type": "field_angle", + "name": "FIELDNAME", + "angle": 0, + "round": 30 + } + ], + "style": "math_blocks", + "tooltip": "test tooltip" + }, + { + "type": "test_angles_round_0", + "message0": "no round %1", + "args0": [ + { + "type": "field_angle", + "name": "FIELDNAME", + "angle": 0, + "round": 0 + } + ], + "style": "math_blocks", + "tooltip": "test tooltip" + }, + { + "type": "test_images_datauri", + "message0": "Image data: URI %1", + "args0": [ + { + "type": "field_image", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAVlpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KTMInWQAABHZJREFUaAXtmEuPDFEUx8cwJIx4jQjxSGYt4pWQiGSIz4A1O2FtLyx8B4+MxIKEtQkRsZBIEF/AAgki3gzjNfx/Xfc/rkpVd1dXdU13OMm/z73ndc+5r6rqgYHu01wNAfqa5kTZx+1I3PtNJ35Aqe4P6VrW+9mnEl6o/g/hu0Ab6koxg0nsjn+dVF6c+Yr8SZgUaGeRfR0ry6alzEFaGuYY/AryafFODjQ++EKOlfRq+nXSxzTeY2FHGHcocM/uIvXZWoA2ZJ1td0pGjKMoRY6d9Nr8ndemXdrMyayVYr1wQ9gn3BVIhNklNluKg06fNslTFDacG4q4LgwLxIIcO+nV+HtOY5HoF2FbgXG3y3ZKwPdsAb/KTeOZIxESOhRG2SB+SrgvfBDeC/cEZKwgdFjA5wydQHFMy2rh8WWxOYx4UJybiiTBR+Fzqu/nin2kHohj0a+dmEWfNYpwAefV3iSMCiMC5+GSYD0PSgjfWVkJDmoaJLRO8EocUXulMC68EW4KpuNqUAy2+EDpePRnjdj/JMhKUASH37N/S+0FgrePV+akZLWTl3+jRt4j7BbGhCUC9EAgcbbThdC+KL5aMA2Fxi5xbLkMoKXCmEBMYjMG5DGTXgW/XuqtiuVZNr8S4nM7cbBHBbYTehcxqDZJOTGv2DvJoKuC45lvaWiSbRea+cyHNN8i0UwHgyfilwUS+SYsFkiCmSYWD7tXwkOB5J8H7uRcCL48EPEDTMYqgYngneyl8FSAPHbSq+DXSWSFYmuwIhzg4WDgSYr93GY7kjQ++OaR7fP0M3IPNiNo0mBWCcxMm+izCtbBHRM5emR5FOvxi21ZibifF6Mh96BNjSIlgX9GfRJJkwen4CLbgrj2Tcds2Y9nt6VxQYOOkyo4TsO86IrkjRGvjNvmsQ8yCox1cTu2LdQuW4gT4wYyuZ21rbxKtsHHbcdynEK8TCEM7GS5jp3k8pAB16plQdRYCRLHxjp8JwVilSpG/h0TA08IXwUSAyTFNdwM2Nge32sCsTqmTp09c8zsM4H3KB6EJMcqW5+Oj946X88jklHMGoE3AuvVbJ/KbC1G4crkW4Ptsld4KzimZ1yiGSJJF0chy4Q7Av7xta5uMfKgxbz+WPMOxv9VrMhtwcmTJDqADKIAkgVeNWS8CbAi2M4akciEMCXwusFrB0WQPJy+z0qWDh98S58RxeiYvEXgnJUVIdIJcQqBQ8ib6fCNY+FTmMpsLZIlATiH1MQHFWT+Oun+JcvSOVZk3n5zsH3TTEuKgEjCf4k6pjnyZjqvhmMRrzCVWZF4MJLwwzGW086TW1eqAA/mWXO/b/n/Qnpt6f6vyL++Ir6hzCubj7q3lscz79tC/DVoXlkhVT0QWyXkV/TxYGhueSv/lvq6CuFM8CryQjgdsqJf2VmpfK+GJLOYi+FbvtIiGKwbK+JZNo+LQlb5+WCAbqyIY5rHhXSt3Y3BPOPmXUs+Dlzld7K30iMNwD8q3Ex85lquZv8QhzimdD/W9Xyb5H0z1Zbsb+OT/8HoqhrfAAAAAElFTkSuQmCC", + "width": 50, + "height": 50, + "alt": "*" + } + ], + "style": "text_blocks" + }, + { + "type": "test_images_small", + "message0": "Image too small %1", + "args0": [ + { + "type": "field_image", + "src": "media/30px.png", + "width": 50, + "height": 50, + "alt": "*" + } + ], + "style": "text_blocks" + }, + { + "type": "test_images_large", + "message0": "Image too large %1", + "args0": [ + { + "type": "field_image", + "src": "media/200px.png", + "width": 50, + "height": 50, + "alt": "*" + } + ], + "style": "text_blocks" + }, + { + "type": "test_images_fliprtl", + "message0": "Image flipped RTL %1", + "args0": [ + { + "type": "field_image", + "src": "media/arrow.png", + "width": 50, + "height": 50, + "alt": "*", + "flipRtl": true + } + ], + "colour": 160 + }, + { + "type": "test_images_missing", + "message0": "Image missing %1", + "args0": [ + { + "type": "field_image", + "src": "missing.png", + "width": 50, + "height": 50, + "alt": "*" + } + ], + "style": "text_blocks" + }, + { + "type": "test_images_many_icons", + "message0": "Lots of network icons: %1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11 %12 %13 %14 %15 %16 %17 %18", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "field_image", + "src": "https://blockly-demo.appspot.com/static/tests/media/a.png", + "width": 32, + "height": 32, + "alt": "A" + }, + { + "type": "field_image", + "src": "https://blockly-demo.appspot.com/static/tests/media/b.png", + "width": 32, + "height": 32, + "alt": "B" + }, + { + "type": "field_image", + "src": "https://blockly-demo.appspot.com/static/tests/media/c.png", + "width": 32, + "height": 32, + "alt": "C" + }, + { + "type": "field_image", + "src": "https://blockly-demo.appspot.com/static/tests/media/d.png", + "width": 32, + "height": 32, + "alt": "D" + }, + { + "type": "field_image", + "src": "https://blockly-demo.appspot.com/static/tests/media/e.png", + "width": 32, + "height": 32, + "alt": "E" + }, + { + "type": "field_image", + "src": "https://blockly-demo.appspot.com/static/tests/media/f.png", + "width": 32, + "height": 32, + "alt": "F" + }, + { + "type": "field_image", + "src": "https://blockly-demo.appspot.com/static/tests/media/g.png", + "width": 32, + "height": 32, + "alt": "G" + }, + { + "type": "field_image", + "src": "https://blockly-demo.appspot.com/static/tests/media/h.png", + "width": 32, + "height": 32, + "alt": "H" + }, + { + "type": "input_dummy" + }, + { + "type": "field_image", + "src": "https://blockly-demo.appspot.com/static/tests/media/a.png", + "width": 32, + "height": 32, + "alt": "A" + }, + { + "type": "field_image", + "src": "https://blockly-demo.appspot.com/static/tests/media/b.png", + "width": 32, + "height": 32, + "alt": "B" + }, + { + "type": "field_image", + "src": "https://blockly-demo.appspot.com/static/tests/media/c.png", + "width": 32, + "height": 32, + "alt": "C" + }, + { + "type": "field_image", + "src": "https://blockly-demo.appspot.com/static/tests/media/d.png", + "width": 32, + "height": 32, + "alt": "D" + }, + { + "type": "field_image", + "src": "https://blockly-demo.appspot.com/static/tests/media/e.png", + "width": 32, + "height": 32, + "alt": "E" + }, + { + "type": "field_image", + "src": "https://blockly-demo.appspot.com/static/tests/media/f.png", + "width": 32, + "height": 32, + "alt": "F" + }, + { + "type": "field_image", + "src": "https://blockly-demo.appspot.com/static/tests/media/g.png", + "width": 32, + "height": 32, + "alt": "G" + }, + { + "type": "field_image", + "src": "https://blockly-demo.appspot.com/static/tests/media/h.png", + "width": 32, + "height": 32, + "alt": "H" + } + ], + "style": "text_blocks" + }, + { + "type": "test_style_hat", + "message0": "Hat block (event)", + "nextStatement": null, + "style": "hat_blocks" + }, + { + "type": "test_style_hex1", + "message0": "Block color: Bright purple %1 %2 %3 %4", + "args0": [ + { + "type": "field_input", + "name": "TEXT", + "text": "#992aff" + }, + { + "type": "field_dropdown", + "name": "DROPDOWN", + "options": [ + [ "option", "ONE" ], + [ "option", "TWO" ] + ] + }, + { + "type": "field_checkbox", + "name": "NAME", + "checked": true + }, + { + "type": "input_value", + "name": "NAME" + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": "#992aff" + }, + { + "type": "test_style_hex2", + "message0": "Block color: White %1 %2 %3 %4", + "args0": [ + { + "type": "field_input", + "name": "TEXT", + "text": "#fefefe" + }, + { + "type": "field_dropdown", + "name": "DROPDOWN", + "options": [ + [ "option", "ONE" ], + [ "option", "TWO" ] + ] + }, + { + "type": "field_checkbox", + "name": "NAME", + "checked": true + }, + { + "type": "input_value", + "name": "NAME" + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": "#fefefe" + }, + { + "type": "test_style_hex3", + "message0": "Block color: Black %1 %2 %3 %4", + "args0": [ + { + "type": "field_input", + "name": "TEXT", + "text": "#010101" + }, + { + "type": "field_dropdown", + "name": "DROPDOWN", + "options": [ + [ "option", "ONE" ], + [ "option", "TWO" ] + ] + }, + { + "type": "field_checkbox", + "name": "NAME", + "checked": true + }, + { + "type": "input_value", + "name": "NAME" + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": "#010101" + }, + { + "type": "test_style_no_colour", + "message0": "Block color: unset" + }, + { + "type": "test_style_hex4", + "message0": "Block color: #RRGGBBAA (invalid)", + "colour": "#992aff99" + }, + { + "type": "test_style_hex5", + "message0": "Block color: #RRGGBB (invalid)", + "colour": "#NotHex" + }, + { + "type": "test_style_emoji", + "message0": "Robot Face: \uD83E\uDD16", + "colour": "#AAAAAA" + } +]); // END JSON EXTRACT (Do not delete this comment.) + +Blockly.Blocks['test_validators_text_null'] = { + init: function() { + this.appendDummyInput() + .appendField("always null") + .appendField(new Blockly.FieldTextInput("default", this.validate), "INPUT"); + this.setColour(230); + this.setCommentText('All input validates to null (invalid). The display' + + ' text will remain the input text, but the value should be the default' + + ' text. The input should be red after the first keystroke.'); + }, + + validate: function(newValue) { + return null; + } +}; +Blockly.Blocks['test_validators_text_A'] = { + init: function() { + this.appendDummyInput() + .appendField("remove \'a\'") + .appendField(new Blockly.FieldTextInput("default", this.validate), "INPUT"); + this.setColour(230); + this.setCommentText('All \'a\' characters are removed from field value.' + + ' The display text will include invalid \'a\' characters while the' + + ' field is being edited, but the value will not.'); + }, + + validate: function(newValue) { + return newValue.replace(/\a/g, ''); + } +}; +Blockly.Blocks['test_validators_text_B'] = { + init: function() { + this.appendDummyInput() + .appendField("\'b\' -> null") + .appendField(new Blockly.FieldTextInput("default", this.validate), "INPUT"); + this.setColour(230); + this.setCommentText('Upon detecting a \'b\' character the input will' + + ' validated to null (invalid). Upon removal it should revert to being' + + ' valid. The display text will remain the input text, but if the input' + + ' text is invalid the value should be the default text.'); + }, + + validate: function(newValue) { + if (newValue.indexOf('b') != -1) { + return null; + } + return newValue; + } +}; + +Blockly.Blocks['test_validators_angle_null'] = { + init: function() { + this.appendDummyInput() + .appendField("always null") + .appendField(new Blockly.FieldAngle(90, this.validate), "INPUT"); + this.setColour(230); + this.setCommentText('All input validates to null (invalid). The field' + + ' will display the input while the field is being edited (this' + + ' includes the text and the graphic), but the value should be the' + + ' default value. The input should be red after the first' + + ' keystroke.'); + }, + + validate: function(newValue) { + return null; + } +}; +Blockly.Blocks['test_validators_angle_mult30_force'] = { + init: function() { + this.appendDummyInput() + .appendField("force mult of 30") + .appendField(new Blockly.FieldAngle(90, this.validate), "INPUT"); + this.setColour(230); + this.setCommentText('The input value will be rounded to the nearest' + + ' multiple of 30. The field will display the input while the field is' + + ' being edited (this includes the text and the graphic), but the value' + + ' will be the validated (rounded) value. Note: If you want to do' + + ' rounding this is not the proper way, use the ROUND property of the' + + ' field angle instead.'); + }, + + validate: function(newValue) { + return Math.round(newValue / 30) * 30; + } +}; +Blockly.Blocks['test_validators_angle_mult30_null'] = { + init: function() { + this.appendDummyInput() + .appendField("not mult of 30 -> null") + .appendField(new Blockly.FieldAngle(90, this.validate), "INPUT"); + this.setColour(230); + this.setCommentText('If the input value is not a multiple of 30, the' + + ' input will validated to null (invalid). The field will display the' + + ' input while the field is being edited (this includes the text and' + + ' the graphic), but if the input value is invalid the value should be' + + ' the default value.'); + }, + + validate: function(newValue) { + if (newValue % 30 != 0) { + return null; + } + return newValue; + } +}; + +Blockly.Blocks['test_validators_checkbox_null'] = { + init: function() { + this.appendDummyInput() + .appendField("always null") + .appendField(new Blockly.FieldCheckbox(true, this.validate), "INPUT"); + this.setColour(230); + this.setCommentText('The new input always validates to null (invalid).' + + ' This means that the field value should not change.'); + }, + + validate: function(newValue) { + return null; + } +}; +Blockly.Blocks['test_validators_checkbox_match'] = { + init: function() { + this.appendDummyInput() + .appendField("force match") + .appendField(new Blockly.FieldCheckbox(true), "MATCH") + .appendField(new Blockly.FieldCheckbox(true, this.validate), "INPUT"); + this.setColour(230); + this.setCommentText('The validator for this block only works on the' + + ' end-most checkbox. The validator will always return the value of the' + + ' start-most checkbox. Therefor they should always match.') + }, + + validate: function(newValue) { + return this.sourceBlock_.getFieldValue('MATCH'); + } +}; +Blockly.Blocks['test_validators_checkbox_not_match_null'] = { + init: function() { + this.appendDummyInput() + .appendField("not match -> null") + .appendField(new Blockly.FieldCheckbox(true), "MATCH") + .appendField(new Blockly.FieldCheckbox(true, this.validate), "INPUT"); + this.setColour(230); + this.setCommentText('The validator for this block only works on the' + + ' end-most checkbox. If the new value does not match the value of the' + + ' start-most checkbox, it will return null (invalid), which means the' + + ' field value should not change. Therfore they should always match.'); + }, + + validate: function(newValue) { + if (this.sourceBlock_.getFieldValue('MATCH') != newValue) { + return null; + } + return newValue; + } +}; + +Blockly.Blocks['test_validators_colour_null'] = { + init: function() { + var colourField = new Blockly.FieldColour('#ff0000', this.validate); + colourField.setColours([ + '#ffffff', '#ffdcdc', '#ffb4b4','#ff8c8c','#ff6464','#ff3c3c','#ff1414', + '#00ffff', '#00dcdc', '#00b4b4','#008c8c','#006464','#003c3c','#001414']); + + this.appendDummyInput() + .appendField("always null") + .appendField(colourField, "INPUT"); + this.setColour(230); + this.setCommentText('All input validates to null (invalid). This means' + + ' the field value should not change.'); + }, + + validate: function(newValue) { + return null; + } +}; +Blockly.Blocks['test_validators_colour_force_red'] = { + init: function() { + var colourField = new Blockly.FieldColour('#ff0000', this.validate); + colourField.setColours([ + '#ffffff', '#ffdcdc', '#ffb4b4','#ff8c8c','#ff6464','#ff3c3c','#ff1414', + '#00ffff', '#00dcdc', '#00b4b4','#008c8c','#006464','#003c3c','#001414']); + + this.appendDummyInput() + .appendField("force full red") + .appendField(colourField, "INPUT"); + this.setColour(230); + this.setCommentText('The input will have its red value replaced with' + + ' full red.'); + }, + + validate: function(newValue) { + return '#ff' + newValue.substr(3, 4); + } +}; +Blockly.Blocks['test_validators_colour_red_null'] = { + init: function() { + var colourField = new Blockly.FieldColour('#ff0000', this.validate); + colourField.setColours([ + '#ffffff', '#ffdcdc', '#ffb4b4','#ff8c8c','#ff6464','#ff3c3c','#ff1414', + '#00ffff', '#00dcdc', '#00b4b4','#008c8c','#006464','#003c3c','#001414']); + + this.appendDummyInput() + .appendField("not red -> null") + .appendField(colourField, "INPUT"); + this.setColour(230); + this.setCommentText('If the input does not have full red, the input will' + + ' validate to null (invalid). Otherwise it will return the input value'); + }, + + validate: function(newValue) { + if (newValue.substr(1, 2) != 'ff') { + return null; + } + return newValue; + } +}; + +Blockly.Blocks['test_validators_dropdown_null'] = { + init: function() { + this.appendDummyInput() + .appendField("always null") + .appendField(new Blockly.FieldDropdown([ + ["1a","1A"], ["1b","1B"], ["1c","1C"], + ["2a","2A"], ["2b","2B"], ["2c","2C"]], this.validate), "INPUT"); + this.setColour(230); + this.setCommentText('All input validates to null (invalid). This means' + + ' the field value should not change.'); + }, + + validate: function(newValue) { + return null; + } +}; +Blockly.Blocks['test_validators_dropdown_force_1s'] = { + init: function() { + this.appendDummyInput() + .appendField("force 1s") + .appendField(new Blockly.FieldDropdown([ + ["1a","1A"], ["1b","1B"], ["1c","1C"], + ["2a","2A"], ["2b","2B"], ["2c","2C"]], this.validate), "INPUT"); + this.setColour(230); + this.setCommentText('The input\'s value will always change to start with' + + ' 1.'); + }, + + validate: function(newValue) { + return '1' + newValue.charAt(1); + } +}; +Blockly.Blocks['test_validators_dropdown_1s_null'] = { + init: function() { + this.appendDummyInput() + .appendField("not 1s -> null") + .appendField(new Blockly.FieldDropdown([ + ["1a","1A"], ["1b","1B"], ["1c","1C"], + ["2a","2A"], ["2b","2B"], ["2c","2C"]], this.validate), "INPUT"); + this.setColour(230); + this.setCommentText('If the input does not start with 1, the input will' + + ' validate to null (invalid). Otherwise it will return the input value.'); + }, + + validate: function(newValue) { + if (newValue.charAt(0) != '1') { + return null; + } + return newValue; + } +}; + +Blockly.Blocks['test_validators_number_null'] = { + init: function() { + this.appendDummyInput() + .appendField("always null") + .appendField(new Blockly.FieldNumber(123, null, null, null, this.validate), "INPUT"); + this.setColour(230); + this.setCommentText('All input validates to null (invalid). The field' + + ' will display the input while the field is being edited, but the value' + + ' should be the default value. The input should be red after the first' + + ' keystroke.'); + }, + + validate: function(newValue) { + return null; + } +}; +Blockly.Blocks['test_validators_number_mult10_force'] = { + init: function() { + this.appendDummyInput() + .appendField("force mult of 10") + .appendField(new Blockly.FieldNumber(123, null, null, null, this.validate), "INPUT"); + this.setColour(230); + this.setCommentText('Theinput value will be rounded to the nearest' + + ' multiple of 10. The field will display the input while the field is' + + ' being edited, but the value should be the validated (rounded) value.' + + ' Note: If you want to do rounding this is not the proper way, use the' + + ' precision option of the number field constructor instead.'); + }, + + validate: function(newValue) { + return Math.round(newValue / 10) * 10; + } +}; +Blockly.Blocks['test_validators_number_mult10_null'] = { + init: function() { + this.appendDummyInput() + .appendField("not mult of 10 -> null") + .appendField(new Blockly.FieldNumber(123, null, null, null, this.validate), "INPUT"); + this.setColour(230); + this.setCommentText('If the input value is not a multiple of 10, the' + + ' input will validate to null (invalid). The field will display the' + + ' input while the field is being edited, but if the input value is' + + ' invalid the value should be the default value.'); + }, + + validate: function(newValue) { + if (newValue % 10 != 0) { + return null; + } + return newValue; + } +}; + +Blockly.Blocks['test_validators_variable_null'] = { + init: function() { + this.appendDummyInput() + .appendField("always null") + .appendField(new Blockly.FieldVariable('1a', this.validate), "INPUT"); + this.setColour(230); + this.setCommentText('All ids validate to null (invalid). This means' + + ' the variable should not change.'); + }, + + validate: function(newValue) { + return null; + } +}; +Blockly.Blocks['test_validators_variable_force_1s'] = { + init: function() { + this.appendDummyInput() + .appendField("force 1s") + .appendField(new Blockly.FieldVariable('1a', this.validate), "INPUT"); + this.setColour(230); + this.setCommentText('The id will always change to start with 1.'); + }, + + validate: function(newValue) { + return '1' + newValue.charAt(1); + } +}; +Blockly.Blocks['test_validators_variable_1s_null'] = { + init: function() { + this.appendDummyInput() + .appendField("not 1s -> null") + .appendField(new Blockly.FieldVariable('1a', this.validate), "INPUT"); + this.setColour(230); + this.setCommentText('If the id does not start with 1, the id will' + + ' validate to null (invalid). Otherwise it will return the id.'); + }, + + validate: function(newValue) { + if (newValue.charAt(0) != '1') { + return null; + } + return newValue; + } +}; + +Blockly.Blocks['test_basic_empty_with_mutator'] = { + init: function() { + this.setMutator(new Blockly.Mutator(['math_number'])); + } +}; + +Blockly.Blocks['test_dropdowns_dynamic'] = { + init: function() { + var dropdown = new Blockly.FieldDropdown(this.dynamicOptions); + this.appendDummyInput() + .appendField('dynamic') + .appendField(dropdown, 'OPTIONS'); + }, + + dynamicOptions: function() { + if (!Blockly.TestBlocks.dynamicDropdownOptions_.length) { + return [['', 'OPTION0']]; + } + return Blockly.TestBlocks.dynamicDropdownOptions_; + } +}; + +/** + * An array of options for the dynamic dropdown. + * @type {!Array} + * @private + */ +Blockly.TestBlocks.dynamicDropdownOptions_ = []; + +/** + * Handles "add option" button in the field test category. This will prompt + * the user for an option to add. + * @package + */ +Blockly.TestBlocks.addDynamicDropdownOption = function() { + Blockly.prompt('Add an option?', + 'option ' + Blockly.TestBlocks.dynamicDropdownOptions_.length, + function(text) { + if (text) { + // Do not remove this log! Helps you know if it was added correctly. + console.log('Adding option: ' + text); + // The option is an array containing human-readable text and a + // language-neutral id. + Blockly.TestBlocks.dynamicDropdownOptions_.push( + [text, 'OPTION' + Blockly.TestBlocks.dynamicDropdownOptions_.length]); + } + }) +}; + +/** + * Handles "remove option" button in the field test category. This will prompt + * the user for an option to remove. May remove multiple options with the + * same name. + * @package + */ +Blockly.TestBlocks.removeDynamicDropdownOption = function() { + var defaultText = Blockly.TestBlocks.dynamicDropdownOptions_[0] ? + Blockly.TestBlocks.dynamicDropdownOptions_[0][0] : ''; + Blockly.prompt('Remove an option?', defaultText, function(text) { + for (var i = 0, option; + option = Blockly.TestBlocks.dynamicDropdownOptions_[i]; + i++) { + // The option is an array containing human-readable text and a + // language-neutral id, we'll compare against the human-readable text. + if (option[0] == text) { + // Do not remove this log! Helps you know if it was removed correctly. + console.log('Removing option: ' + text); + Blockly.TestBlocks.dynamicDropdownOptions_.splice(i, 1); + } + } + }) +}; + +Blockly.Blocks['test_dropdowns_dynamic_random'] = { + init: function() { + var dropdown = new Blockly.FieldDropdown(this.dynamicOptions); + this.appendDummyInput() + .appendField('dynamic random') + .appendField(dropdown, 'OPTIONS'); + }, + + dynamicOptions: function() { + var random = Math.floor(Math.random() * 10) + 1; + var options = []; + for (var i = 0; i < random; i++) { + options.push([String(i), String(i)]); + } + return options; + } +}; + +/** + * Handles "insert" button in the connection row test category. This will insert + * a group of test blocks connected in a row. + * @package + */ +Blockly.TestBlocks.insertConnectionRows = function(button) { + var workspace = button.getTargetWorkspace(); + Blockly.Xml.domToWorkspace(Blockly.Xml.textToDom( + '\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + '' + ), workspace) +}; + +/** + * Handles "insert" button in the connection stack test category. This will + * insert a group of test blocks connected in a stack. + * @package + */ +Blockly.TestBlocks.insertConnectionStacks = function(button) { + var workspace = button.getTargetWorkspace(); + Blockly.Xml.domToWorkspace(Blockly.Xml.textToDom( + '\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + '' + ), workspace); +}; + +/** + * Handles "insert" button in the connection statement test category. This will + * insert a group of test blocks connected as statements. + * @package + */ +Blockly.TestBlocks.insertConnectionStatements = function(button) { + var workspace = button.getTargetWorkspace(); + Blockly.Xml.domToWorkspace(Blockly.Xml.textToDom( + '\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + '' + ), workspace); +}; diff --git a/js/tests/compile/compile.sh b/js/tests/compile/compile.sh new file mode 100644 index 0000000..b3251fc --- /dev/null +++ b/js/tests/compile/compile.sh @@ -0,0 +1,100 @@ +#!/bin/bash +echo "Executing compile.sh from $(pwd)" + +# Find the Blockly project root if pwd is the root +# or if pwd is the directory containing this script. +if [ -f ./main.js ] && [ -f ./compile.sh ]; then + BLOCKLY_ROOT="../.." +elif [ -f tests/compile/compile.sh ]; then + BLOCKLY_ROOT="." +else + echo "ERROR: Cannot determine BLOCKLY_ROOT" 1>&2; + exit 1 +fi + +# Test for npm and node_modules directory. +if command -v npm >/dev/null 2>&1; then + NODE_MODULES=$(npm root) + # npm root will invent a location based on pwd if it can't find + # one, such as when the project has not been `npm install`ed. + # Clear the variable if the directory doesn't already exist. + [[ ! -d $NODE_MODULES ]] && NODE_MODULES="" +fi + +# Find the Closure Compiler. +if [ -n $NODE_MODULES ] && \ + [ -s $NODE_MODULES/google-closure-compiler-java/compiler.jar ]; then + COMPILER=$NODE_MODULES/google-closure-compiler-java/compiler.jar + echo "Found npm google-closure-compiler:" + echo " $COMPILER" + npm list google-closure-compiler | grep google-closure-compiler +else + COMPILER_JARS=$(find $BLOCKLY_ROOT/tests/compile/ -maxdepth 1 -name "*compiler*.jar") + if [ -n "$COMPILER_JARS" ]; then + if [ $(echo "$COMPILER_JARS" | wc -l) -ne 1 ]; then + echo "ERROR: Found too many Closure *compiler*.jar files:" 1>&2; + echo "$COMPILER_JARS" 1>&2; + exit 1 + fi + COMPILER=$COMPILER_JARS + echo "Found local Closure compiler .jar:" + echo " $COMPILER" + else + echo "ERROR: Closure Compiler not found." 1>&2; + echo "Either npm install google-closure-compiler" 1>&2; + echo "Or download from this URL, and place jar file in current directory." 1>&2; + echo "https://dl.google.com/closure-compiler/compiler-latest.zip" 1>&2; + exit 1 + fi +fi + +if [ -f "$BLOCKLY_ROOT/tests/compile/main_compressed.js" ]; then + echo "Removing previous output." + rm "$BLOCKLY_ROOT/tests/compile/main_compressed.js" +fi + +tempPath="$BLOCKLY_ROOT/temp_core" +corePath="$BLOCKLY_ROOT/core/*" +mkdir $tempPath +cp $corePath $tempPath +cp "$BLOCKLY_ROOT/tests/compile/test_blocks.js" "$tempPath/test_blocks.js" +# Copy over all files in core and any subdirectories to the temp_core directory. +for dir in "$corePath/" ; do + # For all files in the directory and any subdirectories rename them to + # include the subirectory name and copy them to temporary directory. + # Ex: subdir/file.js -> temp_core/subdir_file.js + for file in $(find $dir -name \*.js); do + # Replace all / with _ and remove core + newName="${file//\//_}" + newName="${newName//._core_/}" + newFilePath="$tempPath/$newName" + cp $file $newFilePath + done +done + +echo "Compiling Blockly..." +COMPILATION_COMMAND="java -jar $COMPILER --js='$BLOCKLY_ROOT/tests/compile/main.js' \ + --js='$tempPath/**.js' \ + --js='$BLOCKLY_ROOT/blocks/**.js' \ + --js='$BLOCKLY_ROOT/generators/**.js' \ + --generate_exports \ + --externs $BLOCKLY_ROOT/externs/goog-externs.js \ + --externs $BLOCKLY_ROOT/externs/svg-externs.js \ + --compilation_level ADVANCED_OPTIMIZATIONS \ + --language_in ECMASCRIPT5_STRICT \ + --language_out ECMASCRIPT5_STRICT \ + --dependency_mode=PRUNE --entry_point=Main \ + --js_output_file $BLOCKLY_ROOT/tests/compile/main_compressed.js" +echo "$COMPILATION_COMMAND" +$COMPILATION_COMMAND +EXIT_CODE=$? +echo "Compiler exit code: $EXIT_CODE" +if [ "$EXIT_CODE" -eq 0 ] && [ -s "$BLOCKLY_ROOT/tests/compile/main_compressed.js" ]; then + echo "Compilation SUCCESS." +else + echo "Compilation FAIL." + exit 1 +fi + +# Cleanup temp_core directory +rm -r $tempPath diff --git a/js/tests/compile/index.html b/js/tests/compile/index.html new file mode 100644 index 0000000..1ec1ce8 --- /dev/null +++ b/js/tests/compile/index.html @@ -0,0 +1,44 @@ + + + + + Blockly: Advanced Compilation Test + + + + + +

    Blockly: Advanced Compilation Test

    + +

    To run this test manually, download + closure-compiler-vxxxxxxxx.jar, + place it in this directory, then run compile.sh from the command line.

    + +

    Measure the size of main_compressed.js (295kb as of October 2017), then reload + this page and see if Blockly works.

    + +
    + + + diff --git a/js/tests/compile/main.js b/js/tests/compile/main.js new file mode 100644 index 0000000..3f0ec22 --- /dev/null +++ b/js/tests/compile/main.js @@ -0,0 +1,41 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +goog.provide('Main'); +// Core +// Either require 'Blockly.requires', or just the components you use: +goog.require('Blockly'); +goog.require('Blockly.geras.Renderer'); +goog.require('Blockly.VerticalFlyout'); +// Blocks +goog.require('Blockly.Constants.Logic'); +goog.require('Blockly.Constants.Loops'); +goog.require('Blockly.Constants.Math'); +goog.require('Blockly.Constants.Text'); +goog.require('Blockly.Constants.Lists'); +goog.require('Blockly.Constants.Colour'); +goog.require('Blockly.Constants.Variables'); +goog.require('Blockly.Constants.VariablesDynamic'); +goog.require('Blockly.Blocks.procedures'); +goog.require('Blockly.TestBlocks') + +Main.init = function() { + Blockly.inject('blocklyDiv', { + 'toolbox': document.getElementById('toolbox') + }); +}; +window.addEventListener('load', Main.init); diff --git a/js/tests/generators/colour.xml b/js/tests/generators/colour.xml new file mode 100644 index 0000000..05a9dee --- /dev/null +++ b/js/tests/generators/colour.xml @@ -0,0 +1,318 @@ + + + test colour picker + Describe this function... + + + + + static colour + + + + + #ff6600 + + + + + #ff6600 + + + + + + + test rgb + Describe this function... + + + + + from rgb + + + + + + + 100 + + + + + 40 + + + + + 0 + + + + + + + #ff6600 + + + + + + + Colour + + + + + + + + + + + + + + + + + + + + + + + test colour random + Describe this function... + + + + + 100 + + + + + item + + + + + + + + + + + length of random colour string: + + + + + item + + + + + + + + + item + + + + + + + 7 + + + + + + + + + + format of random colour string: + + + + + item + + + + + + + + FIRST + + + item + + + + + + + # + + + + + i + + + 1 + + + + + 6 + + + + + TRUE + + + + + + contents of random colour string: + + + + + item + + + + + at index: + + + + + + + i + + + + + + + + + NEQ + + + + + -1 + + + + + + + FIRST + + + abcdefABDEF0123456789 + + + + + + FROM_START + + + item + + + + + + + i + + + + + + + + + + + + + + + + + + + + + + + + + test blend + Describe this function... + + + + + blend + + + + + + + #ff0000 + + + + + + + 100 + + + + + 40 + + + + + 0 + + + + + + + 0.4 + + + + + + + #ff2900 + + + + + + diff --git a/js/tests/generators/functions.xml b/js/tests/generators/functions.xml new file mode 100644 index 0000000..c2299c7 --- /dev/null +++ b/js/tests/generators/functions.xml @@ -0,0 +1,561 @@ + + + + Functions + + + + + + + + + + + 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/js/tests/generators/golden/generated.dart b/js/tests/generators/golden/generated.dart new file mode 100644 index 0000000..6a1311c --- /dev/null +++ b/js/tests/generators/golden/generated.dart @@ -0,0 +1,1670 @@ +import 'dart:math' as Math; + +var unittestResults, test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy; + +String unittest_report() { + // Create test report. + List report = []; + StringBuffer summary = new StringBuffer(); + int fails = 0; + for (int x = 0; x < unittestResults.length; x++) { + if (unittestResults[x][0]) { + summary.write("."); + } else { + summary.write("F"); + fails++; + report.add(""); + report.add("FAIL: ${unittestResults[x][2]}"); + report.add(unittestResults[x][1]); + } + } + report.insert(0, summary.toString()); + report.add(""); + report.add("Ran ${unittestResults.length} tests."); + report.add(""); + if (fails != 0) { + report.add("FAILED (failures=$fails)"); + } else { + report.add("OK"); + } + return report.join("\n"); +} + +void unittest_assertequals(dynamic actual, dynamic expected, String message) { + // Asserts that a value equals another value. + if (unittestResults == 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)) { + unittestResults.add([true, "OK", message]); + } else { + unittestResults.add([false, "Expected: $expected\nActual: $actual", message]); + } +} + +void unittest_fail(String message) { + // Always assert an error. + if (unittestResults == null) { + throw "Orphaned assert fail: ${message}"; + } + unittestResults.add([false, "Fail.", message]); +} + +/// Describe this function... +void test_if() { + if (false) { + unittest_fail('if false'); + } + ok = false; + if (true) { + ok = true; + } + unittest_assertequals(ok, true, 'if true'); + ok = false; + if (false) { + unittest_fail('if/else false'); + } else { + ok = true; + } + unittest_assertequals(ok, true, 'if/else false'); + ok = false; + if (true) { + ok = true; + } else { + unittest_fail('if/else true'); + } + unittest_assertequals(ok, true, 'if/else true'); + ok = false; + if (false) { + unittest_fail('elseif 1'); + }else if (true) { + ok = true; + }else if (true) { + unittest_fail('elseif 2'); + } else { + unittest_fail('elseif 3'); + } + unittest_assertequals(ok, true, 'elseif 4'); +} + +/// Describe this function... +void test_ifelse() { + ok = false; + if (true) { + ok = true; + } else { + unittest_fail('ifelse true'); + } + unittest_assertequals(ok, true, 'ifelse true'); + ok = false; + if (false) { + unittest_fail('ifelse false'); + } else { + ok = true; + } + unittest_assertequals(ok, true, 'ifelse false'); +} + +/// Describe this function... +void test_equalities() { + unittest_assertequals(2 == 2, true, 'Equal yes'); + unittest_assertequals(3 == 4, false, 'Equal no'); + unittest_assertequals(5 != 6, true, 'Not equal yes'); + unittest_assertequals(3 == 4, false, 'Not equal no'); + unittest_assertequals(5 < 6, true, 'Smaller yes'); + unittest_assertequals(7 < 7, false, 'Smaller no'); + unittest_assertequals(9 > 8, true, 'Greater yes'); + unittest_assertequals(10 > 10, false, 'Greater no'); + unittest_assertequals(11 <= 11, true, 'Smaller-equal yes'); + unittest_assertequals(13 <= 12, false, 'Smaller-equal no'); + unittest_assertequals(14 >= 14, true, 'Greater-equal yes'); + unittest_assertequals(15 >= 16, false, 'Greater-equal no'); +} + +/// Describe this function... +void test_and() { + unittest_assertequals(true && true, true, 'And true/true'); + unittest_assertequals(false && true, false, 'And false/true'); + unittest_assertequals(true && false, false, 'And true/false'); + unittest_assertequals(false && false, false, 'And false/false'); +} + +/// Describe this function... +void test_or() { + unittest_assertequals(true || true, true, 'Or true/true'); + unittest_assertequals(false || true, true, 'Or false/true'); + unittest_assertequals(true || false, true, 'Or true/false'); + unittest_assertequals(false || false, false, 'Or false/false'); +} + +/// Describe this function... +void test_ternary() { + unittest_assertequals(true ? 42 : 99, 42, 'if true'); + unittest_assertequals(false ? 42 : 99, 99, 'if true'); +} + +/// Describe this function... +void test_foreach() { + log = ''; + for (var x in ['a', 'b', 'c']) { + log = [log, x].join(); + } + unittest_assertequals(log, 'abc', 'for loop'); +} + +/// Describe this function... +void test_repeat() { + count = 0; + for (int count2 = 0; count2 < 10; count2++) { + count = (count is num ? count : 0) + 1; + } + unittest_assertequals(count, 10, 'repeat 10'); +} + +/// Describe this function... +void test_while() { + while (false) { + unittest_fail('while 0'); + } + while (!true) { + unittest_fail('until 0'); + } + count = 1; + while (count != 10) { + count = (count is num ? count : 0) + 1; + } + unittest_assertequals(count, 10, 'while 10'); + count = 1; + while (!(count == 10)) { + count = (count is num ? count : 0) + 1; + } + unittest_assertequals(count, 10, 'until 10'); +} + +/// Describe this function... +void test_repeat_ext() { + count = 0; + for (int count3 = 0; count3 < 10; count3++) { + count = (count is num ? count : 0) + 1; + } + unittest_assertequals(count, 10, 'repeat 10'); +} + +/// Describe this function... +void test_count_by() { + log = ''; + for (x = 1; x <= 8; x += 2) { + log = [log, x].join(); + } + unittest_assertequals(log, '1357', 'count up ints'); + log = ''; + for (x = 8; x >= 1; x -= 2) { + log = [log, x].join(); + } + unittest_assertequals(log, '8642', 'count down ints'); + loglist = []; + for (x = 1; x <= 8; x += 1.5) { + loglist.add(x); + } + unittest_assertequals(loglist, [1, 2.5, 4, 5.5, 7], 'count with floats'); + loglist = []; + var x_start = 1 + 0; + var x_end = 8 + 0; + num x_inc = (1 - 2).abs(); + if (x_start > x_end) { + x_inc = -x_inc; + } + for (x = x_start; x_inc >= 0 ? x <= x_end : x >= x_end; x += x_inc) { + loglist.add(x); + } + unittest_assertequals(loglist, [1, 2, 3, 4, 5, 6, 7, 8], 'count up non-trivial ints'); + loglist = []; + var x_start2 = 8 + 0; + var x_end2 = 1 + 0; + num x_inc2 = 2; + if (x_start2 > x_end2) { + x_inc2 = -x_inc2; + } + for (x = x_start2; x_inc2 >= 0 ? x <= x_end2 : x >= x_end2; x += x_inc2) { + loglist.add(x); + } + unittest_assertequals(loglist, [8, 6, 4, 2], 'count down non-trivial ints'); + loglist = []; + var x_start3 = 5 + 0.5; + var x_end3 = 1 + 0; + num x_inc3 = (1 + 0).abs(); + if (x_start3 > x_end3) { + x_inc3 = -x_inc3; + } + for (x = x_start3; x_inc3 >= 0 ? x <= x_end3 : x >= x_end3; x += x_inc3) { + loglist.add(x); + } + unittest_assertequals(loglist, [5.5, 4.5, 3.5, 2.5, 1.5], 'count with floats'); +} + +/// Describe this function... +void test_count_loops() { + log = ''; + for (x = 1; x <= 8; x++) { + log = [log, x].join(); + } + unittest_assertequals(log, '12345678', 'count up'); + log = ''; + for (x = 8; x >= 1; x--) { + log = [log, x].join(); + } + unittest_assertequals(log, '87654321', 'count down'); + loglist = []; + var x_start4 = 1 + 0; + var x_end4 = 4 + 0; + num x_inc4 = 1; + if (x_start4 > x_end4) { + x_inc4 = -x_inc4; + } + for (x = x_start4; x_inc4 >= 0 ? x <= x_end4 : x >= x_end4; x += x_inc4) { + loglist.add(x); + } + unittest_assertequals(loglist, [1, 2, 3, 4], 'count up non-trivial'); + loglist = []; + var x_start5 = 3 + 1; + var x_end5 = 1 + 0; + num x_inc5 = 1; + if (x_start5 > x_end5) { + x_inc5 = -x_inc5; + } + for (x = x_start5; x_inc5 >= 0 ? x <= x_end5 : x >= x_end5; x += x_inc5) { + loglist.add(x); + } + unittest_assertequals(loglist, [4, 3, 2, 1], 'count down non-trivial'); +} + +/// Describe this function... +void test_continue() { + log = ''; + count = 0; + while (count != 8) { + count = (count is num ? count : 0) + 1; + if (count == 5) { + continue; + } + log = [log, count].join(); + } + unittest_assertequals(log, '1234678', 'while continue'); + log = ''; + count = 0; + while (!(count == 8)) { + count = (count is num ? count : 0) + 1; + if (count == 5) { + continue; + } + log = [log, count].join(); + } + unittest_assertequals(log, '1234678', 'until continue'); + log = ''; + for (x = 1; x <= 8; x++) { + if (x == 5) { + continue; + } + log = [log, x].join(); + } + unittest_assertequals(log, '1234678', 'count continue'); + log = ''; + for (var x in ['a', 'b', 'c', 'd']) { + if (x == 'c') { + continue; + } + log = [log, x].join(); + } + unittest_assertequals(log, 'abd', 'for continue'); +} + +/// Describe this function... +void test_break() { + count = 1; + while (count != 10) { + if (count == 5) { + break; + } + count = (count is num ? count : 0) + 1; + } + unittest_assertequals(count, 5, 'while break'); + count = 1; + while (!(count == 10)) { + if (count == 5) { + break; + } + count = (count is num ? count : 0) + 1; + } + unittest_assertequals(count, 5, 'until break'); + log = ''; + for (x = 1; x <= 8; x++) { + if (x == 5) { + break; + } + log = [log, x].join(); + } + unittest_assertequals(log, '1234', 'count break'); + log = ''; + for (var x in ['a', 'b', 'c', 'd']) { + if (x == 'c') { + break; + } + log = [log, x].join(); + } + unittest_assertequals(log, 'ab', 'for break'); +} + +/// Tests the "single" block. +void test_single() { + unittest_assertequals(Math.sqrt(25), 5, 'sqrt'); + unittest_assertequals((-25).abs(), 25, 'abs'); + unittest_assertequals(-(-25), 25, 'negate'); + unittest_assertequals(Math.log(1), 0, 'ln'); + unittest_assertequals(Math.log(100) / Math.log(10), 2, 'log10'); + unittest_assertequals(Math.exp(2), 7.38905609893065, 'exp'); + unittest_assertequals(Math.pow(10,2), 100, 'power10'); +} + +/// Tests the "arithmetic" block for all operations and checks +/// parenthesis are properly generated for different orders. +void test_arithmetic() { + unittest_assertequals(1 + 2, 3, 'add'); + unittest_assertequals(1 - 2, -1, 'subtract'); + unittest_assertequals(1 - (0 + 2), -1, 'subtract order with add'); + unittest_assertequals(1 - (0 - 2), 3, 'subtract order with subtract'); + unittest_assertequals(4 * 2.5, 10, 'multiply'); + unittest_assertequals(4 * (0 + 2.5), 10, 'multiply order'); + unittest_assertequals(8.2 / -5, -1.64, 'divide'); + unittest_assertequals(8.2 / (0 + -5), -1.64, 'divide order'); + unittest_assertequals(Math.pow(10, 4), 10000, 'power'); + unittest_assertequals(Math.pow(10, 0 + 4), 10000, 'power order'); +} + +/// Tests the "trig" block. +void test_trig() { + unittest_assertequals(Math.sin(90 / 180 * Math.pi), 1, 'sin'); + unittest_assertequals(Math.cos(180 / 180 * Math.pi), -1, 'cos'); + unittest_assertequals(Math.tan(0 / 180 * Math.pi), 0, 'tan'); + unittest_assertequals(Math.asin(-1) / Math.pi * 180, -90, 'asin'); + unittest_assertequals(Math.acos(1) / Math.pi * 180, 0, 'acos'); + unittest_assertequals(Math.atan(1) / Math.pi * 180, 45, 'atan'); +} + +/// Tests the "constant" blocks. +void test_constant() { + unittest_assertequals((Math.pi * 1000).floor(), 3141, 'const pi'); + unittest_assertequals((Math.e * 1000).floor(), 2718, 'const e'); + unittest_assertequals((((1 + Math.sqrt(5)) / 2) * 1000).floor(), 1618, 'const golden'); + unittest_assertequals((Math.sqrt2 * 1000).floor(), 1414, 'const sqrt 2'); + unittest_assertequals((Math.sqrt1_2 * 1000).floor(), 707, 'const sqrt 0.5'); + unittest_assertequals(9999 < double.infinity, true, 'const infinity'); +} + +bool math_isPrime(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; +} + +/// Tests the "number property" blocks. +void test_number_properties() { + unittest_assertequals(42 % 2 == 0, true, 'even'); + unittest_assertequals(42.1 % 2 == 1, false, 'odd'); + unittest_assertequals(math_isPrime(5), true, 'prime 5'); + unittest_assertequals(math_isPrime(25), false, 'prime 25'); + unittest_assertequals(math_isPrime(-31.1), false, 'prime negative'); + unittest_assertequals(Math.pi % 1 == 0, false, 'whole'); + unittest_assertequals(double.infinity > 0, true, 'positive'); + unittest_assertequals(-42 < 0, true, 'negative'); + unittest_assertequals(42 % 2 == 0, true, 'divisible'); +} + +/// Tests the "round" block. +void test_round() { + unittest_assertequals(42.42.round(), 42, 'round'); + unittest_assertequals((-42.42).ceil(), -42, 'round up'); + unittest_assertequals(42.42.floor(), 42, 'round down'); +} + +/// Tests the "change" block. +void test_change() { + varToChange = 100; + varToChange = (varToChange is num ? varToChange : 0) + 42; + unittest_assertequals(varToChange, 142, 'change'); +} + +num math_sum(List myList) { + num sumVal = 0; + myList.forEach((num entry) {sumVal += entry;}); + return sumVal; +} + +num math_min(List myList) { + if (myList.isEmpty) return null; + num minVal = myList[0]; + myList.forEach((num entry) {minVal = Math.min(minVal, entry);}); + return minVal; +} + +num math_max(List myList) { + if (myList.isEmpty) return null; + num maxVal = myList[0]; + myList.forEach((num entry) {maxVal = Math.max(maxVal, entry);}); + return maxVal; +} + +num math_mean(List myList) { + // First filter list for numbers only. + List localList = new List.from(myList); + localList.removeWhere((a) => a is! num); + if (localList.isEmpty) return null; + num sumVal = 0; + localList.forEach((var entry) {sumVal += entry;}); + return sumVal / localList.length; +} + +num math_median(List myList) { + // First filter list for numbers only, then sort, then return middle value + // or the average of two middle values if list has an even number of elements. + List localList = new List.from(myList); + localList.removeWhere((a) => a is! num); + if (localList.isEmpty) return null; + localList.sort((a, b) => (a - b)); + int index = localList.length ~/ 2; + if (localList.length % 2 == 1) { + return localList[index]; + } else { + return (localList[index - 1] + localList[index]) / 2; + } +} + +List math_modes(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; +} + +num math_standard_deviation(List myList) { + // First filter list for numbers only. + List numbers = new List.from(myList); + numbers.removeWhere((a) => a is! num); + if (numbers.isEmpty) return null; + num n = numbers.length; + num sum = 0; + numbers.forEach((x) => sum += x); + num mean = sum / n; + num sumSquare = 0; + numbers.forEach((x) => sumSquare += Math.pow(x - mean, 2)); + return Math.sqrt(sumSquare / n); +} + +dynamic math_random_item(List myList) { + int x = new Math.Random().nextInt(myList.length); + return myList[x]; +} + +/// Tests the "list operation" blocks. +void test_operations_on_list() { + unittest_assertequals(math_sum([3, 4, 5]), 12, 'sum'); + unittest_assertequals(math_min([3, 4, 5]), 3, 'min'); + unittest_assertequals(math_max([3, 4, 5]), 5, 'max'); + unittest_assertequals(math_mean([3, 4, 5]), 4, 'average'); + unittest_assertequals(math_median([3, 4, 5, 1]), 3.5, 'median'); + unittest_assertequals(math_modes([3, 4, 3]), [3], 'modes'); + unittest_assertequals(math_modes([3, 4, 3, 1, 4]), [3, 4], 'modes multiple'); + unittest_assertequals(math_standard_deviation([3, 3, 3]), 0, 'standard dev'); + unittest_assertequals([3, 4, 5].indexOf(math_random_item([3, 4, 5])) + 1 > 0, true, 'random'); +} + +/// Tests the "mod" block. +void test_mod() { + unittest_assertequals(42 % 5, 2, 'mod'); +} + +/// Tests the "constrain" block. +void test_constraint() { + unittest_assertequals(Math.min(Math.max(100, 0), 42), 42, 'constraint'); +} + +int math_random_int(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; +} + +/// Tests the "random integer" block. +void test_random_integer() { + rand = math_random_int(5, 10); + unittest_assertequals(rand >= 5 && rand <= 10, true, 'randRange'); + unittest_assertequals(rand % 1 == 0, true, 'randInteger'); +} + +/// Tests the "random fraction" block. +void test_random_fraction() { + rand = new Math.Random().nextDouble(); + unittest_assertequals(rand >= 0 && rand <= 1, true, 'randFloat'); +} + +/// Describe this function... +void test_atan2() { + unittest_assertequals(Math.atan2(5, -5) / Math.pi * 180, 135, 'atan2'); + unittest_assertequals(Math.atan2(-12, 0) / Math.pi * 180, -90, 'atan2'); +} + +/// Checks that the number of calls is one in order +/// to confirm that a function was only called once. +void check_number_of_calls(test_name) { + test_name = [test_name, 'number of calls'].join(); + unittest_assertequals(number_of_calls, 1, test_name); +} + +/// Tests the "create text with" block with varying number of inputs. +void test_create_text() { + unittest_assertequals('', '', 'no text'); + unittest_assertequals('Hello'.toString(), 'Hello', 'create single'); + unittest_assertequals((-1).toString(), '-1', 'create single number'); + unittest_assertequals(['K',9].join(), 'K9', 'create double text'); + unittest_assertequals([4,2].join(), '42', 'create double text numbers'); + unittest_assertequals([1,2,3].join(), '123', 'create triple'); + unittest_assertequals([1,true ? 0 : null,'M'].join(), '10M', 'create order'); +} + +/// Creates an empty string for use with the empty test. +dynamic get_empty() { + return ''; +} + +/// Tests the "is empty" block". +void test_empty_text() { + unittest_assertequals('Google'.isEmpty, false, 'not empty'); + unittest_assertequals(''.isEmpty, true, 'empty'); + unittest_assertequals((get_empty()).isEmpty, true, 'empty complex'); + unittest_assertequals((true ? '' : null).isEmpty, true, 'empty order'); +} + +/// Tests the "length" block. +void test_text_length() { + unittest_assertequals(''.length, 0, 'zero length'); + unittest_assertequals('Google'.length, 6, 'non-zero length'); + unittest_assertequals((true ? 'car' : null).length, 3, 'length order'); +} + +/// Tests the "append text" block with different types of parameters. +void test_append() { + item = 'Miserable'; + item = [item, 'Failure'].join(); + unittest_assertequals(item, 'MiserableFailure', 'append text'); + item = 12; + item = [item, 34].join(); + unittest_assertequals(item, '1234', 'append number'); + item = 'Something '; + item = [item, true ? 'Positive' : null].join(); + unittest_assertequals(item, 'Something Positive', 'append order'); +} + +/// Tests the "find" block with a variable. +void test_find_text_simple() { + text = 'Banana'; + unittest_assertequals(text.indexOf('an') + 1, 2, 'find first simple'); + unittest_assertequals(text.lastIndexOf('an') + 1, 4, 'find last simple'); + unittest_assertequals(text.indexOf('Peel') + 1, 0, 'find none simple'); +} + +/// Creates a string for use with the find test. +dynamic get_fruit() { + number_of_calls = (number_of_calls is num ? number_of_calls : 0) + 1; + return 'Banana'; +} + +/// Tests the "find" block with a function call. +void test_find_text_complex() { + number_of_calls = 0; + unittest_assertequals((get_fruit()).indexOf('an') + 1, 2, 'find first complex'); + check_number_of_calls('find first complex'); + number_of_calls = 0; + unittest_assertequals((true ? get_fruit() : null).indexOf('an') + 1, 2, 'find first order complex'); + check_number_of_calls('find first order complex'); + number_of_calls = 0; + unittest_assertequals((get_fruit()).lastIndexOf('an') + 1, 4, 'find last complex'); + check_number_of_calls('find last complex'); + number_of_calls = 0; + unittest_assertequals((true ? get_fruit() : null).lastIndexOf('an') + 1, 4, 'find last order complex'); + check_number_of_calls('find last order complex'); + number_of_calls = 0; + unittest_assertequals((get_fruit()).indexOf('Peel') + 1, 0, 'find none complex'); + check_number_of_calls('find none complex'); + number_of_calls = 0; + unittest_assertequals((true ? get_fruit() : null).indexOf('Peel') + 1, 0, 'find none order complex'); + check_number_of_calls('find none order complex'); +} + +String text_get_from_end(String text, num x) { + return text[text.length - x]; +} + +String text_random_letter(String text) { + int x = new Math.Random().nextInt(text.length); + return text[x]; +} + +/// Tests the "get letter" block with a variable. +void test_get_text_simple() { + text = 'Blockly'; + unittest_assertequals(text[0], 'B', 'get first simple'); + unittest_assertequals(text_get_from_end(text, 1), 'y', 'get last simple'); + unittest_assertequals(text.indexOf(text_random_letter(text)) + 1 > 0, true, 'get random simple'); + unittest_assertequals(text[2], 'o', 'get # simple'); + unittest_assertequals(text[((true ? 3 : null) - 1)], 'o', 'get # order simple'); + unittest_assertequals(text_get_from_end(text, 3), 'k', 'get #-end simple'); + // The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + unittest_assertequals(text_get_from_end(text, 0 + 3), 'k', 'get #-end order simple'); +} + +/// Creates a string for use with the get test. +dynamic get_Blockly() { + number_of_calls = (number_of_calls is num ? number_of_calls : 0) + 1; + return 'Blockly'; +} + +/// Tests the "get letter" block with a function call. +void test_get_text_complex() { + text = 'Blockly'; + number_of_calls = 0; + unittest_assertequals((get_Blockly())[0], 'B', 'get first complex'); + check_number_of_calls('get first complex'); + number_of_calls = 0; + unittest_assertequals((true ? get_Blockly() : null)[0], 'B', 'get first order complex'); + check_number_of_calls('get first order complex'); + number_of_calls = 0; + unittest_assertequals(text_get_from_end((get_Blockly()), 1), 'y', 'get last complex'); + check_number_of_calls('get last complex'); + number_of_calls = 0; + unittest_assertequals(text_get_from_end((true ? get_Blockly() : null), 1), 'y', 'get last order complex'); + check_number_of_calls('get last order complex'); + number_of_calls = 0; + unittest_assertequals(text.indexOf(text_random_letter((get_Blockly()))) + 1 > 0, true, 'get random complex'); + check_number_of_calls('get random complex'); + number_of_calls = 0; + unittest_assertequals(text.indexOf(text_random_letter((true ? get_Blockly() : null))) + 1 > 0, true, 'get random order complex'); + check_number_of_calls('get random order complex'); + number_of_calls = 0; + unittest_assertequals((get_Blockly())[2], 'o', 'get # complex'); + check_number_of_calls('get # complex'); + number_of_calls = 0; + unittest_assertequals((true ? get_Blockly() : null)[((true ? 3 : null) - 1)], 'o', 'get # order complex'); + check_number_of_calls('get # order complex'); + number_of_calls = 0; + unittest_assertequals(text_get_from_end((get_Blockly()), 3), 'k', 'get #-end complex'); + check_number_of_calls('get #-end complex'); + number_of_calls = 0; + // The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + unittest_assertequals(text_get_from_end((true ? get_Blockly() : null), 0 + 3), 'k', 'get #-end order complex'); + check_number_of_calls('get #-end order complex'); +} + +/// Creates a string for use with the substring test. +dynamic get_numbers() { + number_of_calls = (number_of_calls is num ? number_of_calls : 0) + 1; + return '123456789'; +} + +/// Tests the "get substring" block with a variable. +void test_substring_simple() { + text = '123456789'; + unittest_assertequals(text.substring(1, 3), '23', 'substring # simple'); + unittest_assertequals(text.substring(((true ? 2 : null) - 1), true ? 3 : null), '23', 'substring # simple order'); + unittest_assertequals(text.substring(text.length - 3, text.length - 1), '78', 'substring #-end simple'); + // The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + unittest_assertequals(text.substring(text.length - (0 + 3), text.length - ((0 + 2) - 1)), '78', 'substring #-end simple order'); + unittest_assertequals(text, text, 'substring first-last simple'); + unittest_assertequals(text.substring(1, text.length - 1), '2345678', 'substring # #-end simple'); + unittest_assertequals(text.substring(text.length - 7, 4), '34', 'substring #-end # simple'); + unittest_assertequals(text.substring(0, 4), '1234', 'substring first # simple'); + unittest_assertequals(text.substring(0, text.length - 1), '12345678', 'substring first #-end simple'); + unittest_assertequals(text.substring(6), '789', 'substring # last simple'); + unittest_assertequals(text.substring(text.length - 3), '789', 'substring #-end last simple'); + unittest_assertequals(text.substring(0, text.length - 0), '123456789', 'substring all with # #-end simple'); + unittest_assertequals(text.substring(text.length - 9, 9), '123456789', 'substring all with #-end # simple'); + // Checks that the whole string is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where substring uses [x:length - y] for # #-end. + unittest_assertequals(text.substring(((0 + 1) - 1), text.length - ((0 + 1) - 1)), '123456789', 'substring all with # #-end math simple'); +} + +String text_get_substring(String text, String where1, num at1, String where2, num at2) { + int getAt(String where, num at) { + if (where == 'FROM_END') { + at = text.length - 1 - at; + } else if (where == 'FIRST') { + at = 0; + } else if (where == 'LAST') { + at = text.length - 1; + } else if (where != 'FROM_START') { + throw 'Unhandled option (text_getSubstring).'; + } + return at; + } + at1 = getAt(where1, at1); + at2 = getAt(where2, at2) + 1; + return text.substring(at1, at2); +} + +/// Tests the "get substring" block with a function call. +void test_substring_complex() { + number_of_calls = 0; + unittest_assertequals((get_numbers()).substring(1, 3), '23', 'substring # complex'); + check_number_of_calls('substring # complex'); + number_of_calls = 0; + unittest_assertequals((true ? get_numbers() : null).substring(((true ? 2 : null) - 1), true ? 3 : null), '23', 'substring # complex order'); + check_number_of_calls('substring # complex order'); + number_of_calls = 0; + // The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + unittest_assertequals(text_get_substring((get_numbers()), 'FROM_END', 2, 'FROM_END', 1), '78', 'substring #-end complex'); + check_number_of_calls('substring #-end complex'); + number_of_calls = 0; + unittest_assertequals(text_get_substring((true ? get_numbers() : null), 'FROM_END', ((0 + 3) - 1), 'FROM_END', ((0 + 2) - 1)), '78', 'substring #-end order order'); + check_number_of_calls('substring #-end order order'); + number_of_calls = 0; + unittest_assertequals((get_numbers()), text, 'substring first-last'); + check_number_of_calls('substring first-last'); + number_of_calls = 0; + unittest_assertequals(text_get_substring((get_numbers()), 'FROM_START', 1, 'FROM_END', 1), '2345678', 'substring # #-end complex'); + check_number_of_calls('substring # #-end complex'); + number_of_calls = 0; + unittest_assertequals(text_get_substring((get_numbers()), 'FROM_END', 6, 'FROM_START', 3), '34', 'substring #-end # complex'); + check_number_of_calls('substring #-end # complex'); + number_of_calls = 0; + unittest_assertequals((get_numbers()).substring(0, 4), '1234', 'substring first # complex'); + check_number_of_calls('substring first # complex'); + number_of_calls = 0; + unittest_assertequals(text_get_substring((get_numbers()), 'FIRST', 0, 'FROM_END', 1), '12345678', 'substring first #-end complex'); + check_number_of_calls('substring first #-end complex'); + number_of_calls = 0; + unittest_assertequals(text_get_substring((get_numbers()), 'FROM_START', 6, 'LAST', 0), '789', 'substring # last complex'); + check_number_of_calls('substring # last complex'); + number_of_calls = 0; + unittest_assertequals(text_get_substring((get_numbers()), 'FROM_END', 2, 'LAST', 0), '789', 'substring #-end last complex'); + check_number_of_calls('substring #-end last complex'); + number_of_calls = 0; + unittest_assertequals(text_get_substring((get_numbers()), 'FROM_START', 0, 'FROM_END', 0), '123456789', 'substring all with # #-end complex'); + check_number_of_calls('substring all with # #-end complex'); + number_of_calls = 0; + unittest_assertequals(text_get_substring((get_numbers()), 'FROM_END', 8, 'FROM_START', 8), '123456789', 'substring all with #-end # complex'); + check_number_of_calls('substring all with #-end # complex'); + number_of_calls = 0; + // Checks that the whole string is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where substring uses [x:length - y] for # #-end. + unittest_assertequals(text_get_substring((get_numbers()), 'FROM_START', ((0 + 1) - 1), 'FROM_END', ((0 + 1) - 1)), '123456789', 'substring all with # #-end math complex'); + check_number_of_calls('substring all with # #-end math complex'); +} + +String text_toTitleCase(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(); +} + +/// Tests the "change casing" block. +void test_case() { + text = 'Hello World'; + unittest_assertequals(text.toUpperCase(), 'HELLO WORLD', 'uppercase'); + unittest_assertequals((true ? text : null).toUpperCase(), 'HELLO WORLD', 'uppercase order'); + text = 'Hello World'; + unittest_assertequals(text.toLowerCase(), 'hello world', 'lowercase'); + unittest_assertequals((true ? text : null).toLowerCase(), 'hello world', 'lowercase order'); + text = 'heLLo WorlD'; + unittest_assertequals(text_toTitleCase(text), 'Hello World', 'titlecase'); + unittest_assertequals(text_toTitleCase(true ? text : null), 'Hello World', 'titlecase order'); +} + +/// Tests the "trim" block. +void test_trim() { + text = ' abc def '; + unittest_assertequals(text.trim(), 'abc def', 'trim both'); + unittest_assertequals((true ? text : null).trim(), 'abc def', 'trim both order'); + unittest_assertequals(text.replaceFirst(new RegExp(r'^\s+'), ''), 'abc def ', 'trim left'); + unittest_assertequals((true ? text : null).replaceFirst(new RegExp(r'^\s+'), ''), 'abc def ', 'trim left order'); + unittest_assertequals(text.replaceFirst(new RegExp(r'\s+$'), ''), ' abc def', 'trim right'); + unittest_assertequals((true ? text : null).replaceFirst(new RegExp(r'\s+$'), ''), ' abc def', 'trim right order'); +} + +int text_count(String haystack, String needle) { + if (needle.length == 0) { + return haystack.length + 1; + } + int index = 0; + int count = 0; + while (index != -1) { + index = haystack.indexOf(needle, index); + if (index != -1) { + count++; + index += needle.length; + } + } + return count; +} + +/// Tests the "trim" block. +void test_count_text() { + text = 'woolloomooloo'; + unittest_assertequals(text_count(text, 'o'), 8, 'len 1'); + unittest_assertequals(text_count(text, 'oo'), 4, 'len 2'); + unittest_assertequals(text_count(text, 'loo'), 2, 'len 3'); + unittest_assertequals(text_count(text, 'wool'), 1, 'start'); + unittest_assertequals(text_count(text, 'chicken'), 0, 'missing'); + unittest_assertequals(text_count(text, ''), 14, 'empty needle'); + unittest_assertequals(text_count('', 'chicken'), 0, 'empty source'); +} + +/// Tests the "trim" block. +void test_text_reverse() { + unittest_assertequals(new String.fromCharCodes(''.runes.toList().reversed), '', 'empty string'); + unittest_assertequals(new String.fromCharCodes('a'.runes.toList().reversed), 'a', 'len 1'); + unittest_assertequals(new String.fromCharCodes('ab'.runes.toList().reversed), 'ba', 'len 2'); + unittest_assertequals(new String.fromCharCodes('woolloomooloo'.runes.toList().reversed), 'ooloomoolloow', 'longer'); +} + +/// Tests the "trim" block. +void test_replace() { + unittest_assertequals('woolloomooloo'.replaceAll('oo', '123'), 'w123ll123m123l123', 'replace all instances 1'); + unittest_assertequals('woolloomooloo'.replaceAll('.oo', 'X'), 'woolloomooloo', 'literal string replacement'); + unittest_assertequals('woolloomooloo'.replaceAll('abc', 'X'), 'woolloomooloo', 'not found'); + unittest_assertequals('woolloomooloo'.replaceAll('o', ''), 'wllml', 'empty replacement 1'); + unittest_assertequals('aaaaa'.replaceAll('aaaaa', ''), '', 'empty replacement 2'); + unittest_assertequals('aaaaa'.replaceAll('a', ''), '', 'empty replacement 3'); + unittest_assertequals(''.replaceAll('a', 'chicken'), '', 'empty source'); +} + +/// Checks that the number of calls is one in order +/// to confirm that a function was only called once. +void check_number_of_calls2(test_name) { + test_name = [test_name, 'number of calls'].join(); + unittest_assertequals(number_of_calls, 1, test_name); +} + +/// Tests the "create list with" and "create empty list" blocks. +void test_create_lists() { + unittest_assertequals([], [], 'create empty'); + unittest_assertequals([true, 'love'], [true, 'love'], 'create items'); + unittest_assertequals(new List.filled(3, 'Eject'), ['Eject', 'Eject', 'Eject'], 'create repeated'); + unittest_assertequals(new List.filled(0 + 3, 'Eject'), ['Eject', 'Eject', 'Eject'], 'create repeated order'); +} + +/// Creates an empty list for use with the empty test. +dynamic get_empty_list() { + return []; +} + +/// Tests the "is empty" block. +void test_lists_empty() { + unittest_assertequals([0].isEmpty, false, 'not empty'); + unittest_assertequals([].isEmpty, true, 'empty'); + unittest_assertequals((get_empty_list()).isEmpty, true, 'empty complex'); + unittest_assertequals((true ? [] : null).isEmpty, true, 'empty order'); +} + +/// Tests the "length" block. +void test_lists_length() { + unittest_assertequals([].length, 0, 'zero length'); + unittest_assertequals(['cat'].length, 1, 'one length'); + unittest_assertequals(['cat', true, []].length, 3, 'three length'); + unittest_assertequals((true ? ['cat', true] : null).length, 2, 'two length order'); +} + +/// Tests the "find" block with a variable. +void test_find_lists_simple() { + list = ['Alice', 'Eve', 'Bob', 'Eve']; + unittest_assertequals(list.indexOf('Eve') + 1, 2, 'find first simple'); + unittest_assertequals(list.lastIndexOf('Eve') + 1, 4, 'find last simple'); + unittest_assertequals(list.indexOf('Dave') + 1, 0, 'find none simple'); +} + +/// Creates a list for use with the find test. +dynamic get_names() { + number_of_calls = (number_of_calls is num ? number_of_calls : 0) + 1; + return ['Alice', 'Eve', 'Bob', 'Eve']; +} + +/// Tests the "find" block with a function call. +void test_find_lists_complex() { + number_of_calls = 0; + unittest_assertequals((get_names()).indexOf('Eve') + 1, 2, 'find first complex'); + check_number_of_calls('find first complex'); + number_of_calls = 0; + unittest_assertequals((true ? get_names() : null).indexOf('Eve') + 1, 2, 'find first order complex'); + check_number_of_calls('find first order complex'); + number_of_calls = 0; + unittest_assertequals((get_names()).lastIndexOf('Eve') + 1, 4, 'find last complex'); + check_number_of_calls('find last complex'); + number_of_calls = 0; + unittest_assertequals((true ? get_names() : null).lastIndexOf('Eve') + 1, 4, 'find last order complex'); + check_number_of_calls('find last order complex'); + number_of_calls = 0; + unittest_assertequals((get_names()).indexOf('Dave') + 1, 0, 'find none complex'); + check_number_of_calls('find none complex'); + number_of_calls = 0; + unittest_assertequals((true ? get_names() : null).indexOf('Dave') + 1, 0, 'find none order complex'); + check_number_of_calls('find none order complex'); +} + +dynamic lists_get_random_item(List my_list) { + int x = new Math.Random().nextInt(my_list.length); + return my_list[x]; +} + +/// Tests the "get" block with a variable. +void test_get_lists_simple() { + list = ['Kirk', 'Spock', 'McCoy']; + unittest_assertequals(list.first, 'Kirk', 'get first simple'); + unittest_assertequals(list.last, 'McCoy', 'get last simple'); + unittest_assertequals(list.indexOf(lists_get_random_item(list)) + 1 > 0, true, 'get random simple'); + unittest_assertequals(list[1], 'Spock', 'get # simple'); + unittest_assertequals(list[((true ? 2 : null) - 1)], 'Spock', 'get # order simple'); + unittest_assertequals(list[list.length - 3], 'Kirk', 'get #-end simple'); + // The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + unittest_assertequals(list[list.length - (0 + 3)], 'Kirk', 'get #-end order simple'); +} + +/// Creates a list for use with the get test. +dynamic get_star_wars() { + number_of_calls = (number_of_calls is num ? number_of_calls : 0) + 1; + return ['Kirk', 'Spock', 'McCoy']; +} + +dynamic lists_get_from_end(List my_list, num x) { + x = my_list.length - x; + return my_list[x]; +} + +/// Tests the "get" block with a function call. +void test_get_lists_complex() { + list = ['Kirk', 'Spock', 'McCoy']; + number_of_calls = 0; + unittest_assertequals((get_star_wars()).first, 'Kirk', 'get first complex'); + check_number_of_calls('get first complex'); + number_of_calls = 0; + unittest_assertequals((true ? get_star_wars() : null).first, 'Kirk', 'get first order complex'); + check_number_of_calls('get first order complex'); + number_of_calls = 0; + unittest_assertequals((get_star_wars()).last, 'McCoy', 'get last complex'); + check_number_of_calls('get last complex'); + number_of_calls = 0; + unittest_assertequals((true ? get_star_wars() : null).last, 'McCoy', 'get last order complex'); + check_number_of_calls('get last order complex'); + number_of_calls = 0; + unittest_assertequals(list.indexOf(lists_get_random_item(get_star_wars())) + 1 > 0, true, 'get random complex'); + check_number_of_calls('get random complex'); + number_of_calls = 0; + unittest_assertequals(list.indexOf(lists_get_random_item(true ? get_star_wars() : null)) + 1 > 0, true, 'get random order complex'); + check_number_of_calls('get random order complex'); + number_of_calls = 0; + unittest_assertequals((get_star_wars())[1], 'Spock', 'get # complex'); + check_number_of_calls('get # complex'); + number_of_calls = 0; + unittest_assertequals((true ? get_star_wars() : null)[((true ? 2 : null) - 1)], 'Spock', 'get # order complex'); + check_number_of_calls('get # order complex'); + number_of_calls = 0; + unittest_assertequals(lists_get_from_end(get_star_wars(), 3), 'Kirk', 'get #-end complex'); + check_number_of_calls('get #-end complex'); + number_of_calls = 0; + // The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + unittest_assertequals(lists_get_from_end(true ? get_star_wars() : null, 0 + 3), 'Kirk', 'get #-end order complex'); + check_number_of_calls('get #-end order complex'); +} + +dynamic lists_remove_random_item(List my_list) { + int x = new Math.Random().nextInt(my_list.length); + return my_list.removeAt(x); +} + +dynamic lists_remove_from_end(List my_list, num x) { + x = my_list.length - x; + return my_list.removeAt(x); +} + +/// Tests the "get and remove" block. +void test_getRemove() { + list = ['Kirk', 'Spock', 'McCoy']; + unittest_assertequals(list.removeAt(0), 'Kirk', 'getremove first'); + unittest_assertequals(list, ['Spock', 'McCoy'], 'getremove first list'); + list = ['Kirk', 'Spock', 'McCoy']; + unittest_assertequals((true ? list : null).removeAt(0), 'Kirk', 'getremove first order'); + unittest_assertequals(list, ['Spock', 'McCoy'], 'getremove first order list'); + list = ['Kirk', 'Spock', 'McCoy']; + unittest_assertequals(list.removeLast(), 'McCoy', 'getremove last'); + unittest_assertequals(list, ['Kirk', 'Spock'], 'getremove last list'); + list = ['Kirk', 'Spock', 'McCoy']; + unittest_assertequals((true ? list : null).removeLast(), 'McCoy', 'getremove last order'); + unittest_assertequals(list, ['Kirk', 'Spock'], 'getremove last order list'); + list = ['Kirk', 'Spock', 'McCoy']; + unittest_assertequals(list.indexOf(lists_remove_random_item(list)) + 1 == 0, true, 'getremove random'); + unittest_assertequals(list.length, 2, 'getremove random list'); + list = ['Kirk', 'Spock', 'McCoy']; + unittest_assertequals(list.indexOf(lists_remove_random_item(true ? list : null)) + 1 == 0, true, 'getremove random order'); + unittest_assertequals(list.length, 2, 'getremove random order list'); + list = ['Kirk', 'Spock', 'McCoy']; + unittest_assertequals(list.removeAt(1), 'Spock', 'getremove #'); + unittest_assertequals(list, ['Kirk', 'McCoy'], 'getremove # list'); + list = ['Kirk', 'Spock', 'McCoy']; + unittest_assertequals((true ? list : null).removeAt(((true ? 2 : null) - 1)), 'Spock', 'getremove # order'); + unittest_assertequals(list, ['Kirk', 'McCoy'], 'getremove # order list'); + list = ['Kirk', 'Spock', 'McCoy']; + unittest_assertequals(list.removeAt(list.length - 3), 'Kirk', 'getremove #-end'); + unittest_assertequals(list, ['Spock', 'McCoy'], 'getremove #-end list'); + list = ['Kirk', 'Spock', 'McCoy']; + // The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + unittest_assertequals(lists_remove_from_end(true ? list : null, 0 + 3), 'Kirk', 'getremove #-end order'); + unittest_assertequals(list, ['Spock', 'McCoy'], 'getremove #-end order list'); +} + +/// Tests the "remove" block. +void test_remove() { + list = ['Kirk', 'Spock', 'McCoy']; + list.removeAt(0); + unittest_assertequals(list, ['Spock', 'McCoy'], 'remove first list'); + list = ['Kirk', 'Spock', 'McCoy']; + (true ? list : null).removeAt(0); + unittest_assertequals(list, ['Spock', 'McCoy'], 'remove first order list'); + list = ['Kirk', 'Spock', 'McCoy']; + list.removeLast(); + unittest_assertequals(list, ['Kirk', 'Spock'], 'remove last list'); + list = ['Kirk', 'Spock', 'McCoy']; + (true ? list : null).removeLast(); + unittest_assertequals(list, ['Kirk', 'Spock'], 'remove last order list'); + list = ['Kirk', 'Spock', 'McCoy']; + int tmp_x = new Math.Random().nextInt(list.length); + list.removeAt(tmp_x); + unittest_assertequals(list.length, 2, 'remove random list'); + list = ['Kirk', 'Spock', 'McCoy']; + List tmp_list = true ? list : null; + int tmp_x2 = new Math.Random().nextInt(tmp_list.length); + tmp_list.removeAt(tmp_x2); + unittest_assertequals(list.length, 2, 'remove random order list'); + list = ['Kirk', 'Spock', 'McCoy']; + list.removeAt(1); + unittest_assertequals(list, ['Kirk', 'McCoy'], 'remove # list'); + list = ['Kirk', 'Spock', 'McCoy']; + (true ? list : null).removeAt(((true ? 2 : null) - 1)); + unittest_assertequals(list, ['Kirk', 'McCoy'], 'remove # order list'); + list = ['Kirk', 'Spock', 'McCoy']; + list.removeAt(list.length - 3); + unittest_assertequals(list, ['Spock', 'McCoy'], 'remove #-end list'); + list = ['Kirk', 'Spock', 'McCoy']; + // The order for index for #-end is addition because this will catch + // errors in generators where most perform the operation ... - index. + List tmp_list2 = true ? list : null; + tmp_list2.removeAt(tmp_list2.length - (0 + 3)); + unittest_assertequals(list, ['Spock', 'McCoy'], 'remove #-end order list'); +} + +/// Tests the "set" block. +void test_set() { + list = ['Picard', 'Riker', 'Crusher']; + list[0] = 'Jean-Luc'; + unittest_assertequals(list, ['Jean-Luc', 'Riker', 'Crusher'], 'set first list'); + list = ['Picard', 'Riker', 'Crusher']; + (true ? list : null)[0] = 'Jean-Luc'; + unittest_assertequals(list, ['Jean-Luc', 'Riker', 'Crusher'], 'set first order list'); + list = ['Picard', 'Riker', 'Crusher']; + list[list.length - 1] = 'Beverly'; + unittest_assertequals(list, ['Picard', 'Riker', 'Beverly'], 'set last list'); + list = ['Picard', 'Riker', 'Crusher']; + List tmp_list3 = (true ? list : null); + tmp_list3[tmp_list3.length - 1] = 'Beverly'; + unittest_assertequals(list, ['Picard', 'Riker', 'Beverly'], 'set last order list'); + list = ['Picard', 'Riker', 'Crusher']; + int tmp_x3 = new Math.Random().nextInt(list.length); + list[tmp_x3] = 'Data'; + unittest_assertequals(list.length, 3, 'set random list'); + list = ['Picard', 'Riker', 'Crusher']; + List tmp_list4 = (true ? list : null); + int tmp_x4 = new Math.Random().nextInt(tmp_list4.length); + tmp_list4[tmp_x4] = 'Data'; + unittest_assertequals(list.length, 3, 'set random order list'); + list = ['Picard', 'Riker', 'Crusher']; + list[2] = 'Pulaski'; + unittest_assertequals(list, ['Picard', 'Riker', 'Pulaski'], 'set # list'); + list = ['Picard', 'Riker', 'Crusher']; + (true ? list : null)[((true ? 3 : null) - 1)] = 'Pulaski'; + unittest_assertequals(list, ['Picard', 'Riker', 'Pulaski'], 'set # order list'); + list = ['Picard', 'Riker', 'Crusher']; + list[list.length - 1] = 'Pulaski'; + unittest_assertequals(list, ['Picard', 'Riker', 'Pulaski'], 'set #-end list'); + list = ['Picard', 'Riker', 'Crusher']; + // The order for index for #-end is addition because this will catch + // errors in generators where most perform the operation ... - index. + List tmp_list5 = (true ? list : null); + tmp_list5[tmp_list5.length - (0 + 2)] = 'Pulaski'; + unittest_assertequals(list, ['Picard', 'Pulaski', 'Crusher'], 'set #-end order list'); +} + +/// Tests the "insert" block. +void test_insert() { + list = ['Picard', 'Riker', 'Crusher']; + list.insert(0, 'Data'); + unittest_assertequals(list, ['Data', 'Picard', 'Riker', 'Crusher'], 'insert first list'); + list = ['Picard', 'Riker', 'Crusher']; + (true ? list : null).insert(0, 'Data'); + unittest_assertequals(list, ['Data', 'Picard', 'Riker', 'Crusher'], 'insert first order list'); + list = ['Picard', 'Riker', 'Crusher']; + list.add('Data'); + unittest_assertequals(list, ['Picard', 'Riker', 'Crusher', 'Data'], 'insert last list'); + list = ['Picard', 'Riker', 'Crusher']; + (true ? list : null).add('Data'); + unittest_assertequals(list, ['Picard', 'Riker', 'Crusher', 'Data'], 'insert last order list'); + list = ['Picard', 'Riker', 'Crusher']; + int tmp_x5 = new Math.Random().nextInt(list.length); + list.insert(tmp_x5, 'Data'); + unittest_assertequals(list.length, 4, 'insert random list'); + list = ['Picard', 'Riker', 'Crusher']; + List tmp_list6 = (true ? list : null); + int tmp_x6 = new Math.Random().nextInt(tmp_list6.length); + tmp_list6.insert(tmp_x6, 'Data'); + unittest_assertequals(list.length, 4, 'insert random order list'); + list = ['Picard', 'Riker', 'Crusher']; + list.insert(2, 'Data'); + unittest_assertequals(list, ['Picard', 'Riker', 'Data', 'Crusher'], 'insert # list'); + list = ['Picard', 'Riker', 'Crusher']; + (true ? list : null).insert(((true ? 3 : null) - 1), 'Data'); + unittest_assertequals(list, ['Picard', 'Riker', 'Data', 'Crusher'], 'insert # order list'); + list = ['Picard', 'Riker', 'Crusher']; + list.insert(list.length - 1, 'Data'); + unittest_assertequals(list, ['Picard', 'Riker', 'Data', 'Crusher'], 'insert #-end list'); + list = ['Picard', 'Riker', 'Crusher']; + // The order for index for #-end is addition because this will catch + // errors in generators where most perform the operation ... - index. + List tmp_list7 = (true ? list : null); + tmp_list7.insert(tmp_list7.length - (0 + 2), 'Data'); + unittest_assertequals(list, ['Picard', 'Data', 'Riker', 'Crusher'], 'insert #-end order list'); +} + +/// Tests the "get sub-list" block with a variable. +void test_sublist_simple() { + list = ['Columbia', 'Challenger', 'Discovery', 'Atlantis', 'Endeavour']; + unittest_assertequals(list.sublist(1, 3), ['Challenger', 'Discovery'], 'sublist # simple'); + unittest_assertequals(list.sublist(((true ? 2 : null) - 1), true ? 3 : null), ['Challenger', 'Discovery'], 'sublist # simple order'); + unittest_assertequals(list.sublist(list.length - 3, list.length - 1), ['Discovery', 'Atlantis'], 'sublist #-end simple'); + // The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + unittest_assertequals(list.sublist(list.length - (0 + 3), list.length - ((0 + 2) - 1)), ['Discovery', 'Atlantis'], 'sublist #-end simple order'); + unittest_assertequals(list.sublist(0), list, 'sublist first-last simple'); + changing_list = ['Columbia', 'Challenger', 'Discovery', 'Atlantis', 'Endeavour']; + list_copy = changing_list.sublist(0); + int tmp_x7 = new Math.Random().nextInt(changing_list.length); + changing_list.removeAt(tmp_x7); + unittest_assertequals(list_copy, list, 'sublist first-last simple copy check'); + unittest_assertequals(list.sublist(1, list.length - 1), ['Challenger', 'Discovery', 'Atlantis'], 'sublist # #-end simple'); + unittest_assertequals(list.sublist(list.length - 3, 4), ['Discovery', 'Atlantis'], 'sublist #-end # simple'); + unittest_assertequals(list.sublist(0, 4), ['Columbia', 'Challenger', 'Discovery', 'Atlantis'], 'sublist first # simple'); + unittest_assertequals(list.sublist(0, list.length - 3), ['Columbia', 'Challenger'], 'sublist first #-end simple'); + unittest_assertequals(list.sublist(3), ['Atlantis', 'Endeavour'], 'sublist # last simple'); + unittest_assertequals(list.sublist(list.length - 4), ['Challenger', 'Discovery', 'Atlantis', 'Endeavour'], 'sublist #-end last simple'); + unittest_assertequals(list.sublist(0, list.length - 0), list, 'sublist all with # #-end simple'); + unittest_assertequals(list.sublist(list.length - 5, 5), list, 'sublist all with #-end # simple'); + // Checks that the whole list is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where sublist uses [x:length - y] for # #-end. + unittest_assertequals(list.sublist(((0 + 1) - 1), list.length - ((0 + 1) - 1)), list, 'sublist all with # #-end math simple'); +} + +/// Creates a list for use with the sublist test. +dynamic get_space_shuttles() { + number_of_calls = (number_of_calls is num ? number_of_calls : 0) + 1; + return ['Columbia', 'Challenger', 'Discovery', 'Atlantis', 'Endeavour']; +} + +List lists_get_sublist(List list, String where1, num at1, String where2, num at2) { + int getAt(String where, num at) { + if (where == 'FROM_END') { + at = list.length - 1 - at; + } else if (where == 'FIRST') { + at = 0; + } else if (where == 'LAST') { + at = list.length - 1; + } else if (where != 'FROM_START') { + throw 'Unhandled option (lists_getSublist).'; + } + return at; + } + at1 = getAt(where1, at1); + at2 = getAt(where2, at2) + 1; + return list.sublist(at1, at2); +} + +/// Tests the "get sub-list" block with a function call. +void test_sublist_complex() { + number_of_calls = 0; + unittest_assertequals((get_space_shuttles()).sublist(1, 3), ['Challenger', 'Discovery'], 'sublist # start complex'); + check_number_of_calls('sublist # start complex'); + number_of_calls = 0; + unittest_assertequals((true ? get_space_shuttles() : null).sublist(((true ? 2 : null) - 1), true ? 3 : null), ['Challenger', 'Discovery'], 'sublist # start order complex'); + check_number_of_calls('sublist # start order complex'); + number_of_calls = 0; + // The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + unittest_assertequals(lists_get_sublist((get_space_shuttles()), 'FROM_END', 2, 'FROM_END', 1), ['Discovery', 'Atlantis'], 'sublist # end complex'); + unittest_assertequals(number_of_calls, 1, 'sublist # end complex number of calls'); + number_of_calls = 0; + unittest_assertequals(lists_get_sublist((true ? get_space_shuttles() : null), 'FROM_END', ((0 + 3) - 1), 'FROM_END', ((0 + 2) - 1)), ['Discovery', 'Atlantis'], 'sublist # end order complex'); + check_number_of_calls('sublist # end order complex'); + number_of_calls = 0; + unittest_assertequals(lists_get_sublist((get_space_shuttles()), 'FIRST', 0, 'LAST', 0), list, 'sublist first-last complex'); + check_number_of_calls('sublist first-last complex'); + number_of_calls = 0; + unittest_assertequals(lists_get_sublist((get_space_shuttles()), 'FROM_START', 1, 'FROM_END', 1), ['Challenger', 'Discovery', 'Atlantis'], 'sublist # #-end complex'); + check_number_of_calls('sublist # #-end complex'); + number_of_calls = 0; + unittest_assertequals(lists_get_sublist((get_space_shuttles()), 'FROM_END', 2, 'FROM_START', 3), ['Discovery', 'Atlantis'], 'sublist #-end # complex'); + check_number_of_calls('sublist #-end # complex'); + number_of_calls = 0; + unittest_assertequals((get_space_shuttles()).sublist(0, 4), ['Columbia', 'Challenger', 'Discovery', 'Atlantis'], 'sublist first # complex'); + check_number_of_calls('sublist first # complex'); + number_of_calls = 0; + unittest_assertequals(lists_get_sublist((get_space_shuttles()), 'FIRST', 0, 'FROM_END', 3), ['Columbia', 'Challenger'], 'sublist first #-end complex'); + check_number_of_calls('sublist first #-end complex'); + number_of_calls = 0; + unittest_assertequals(lists_get_sublist((get_space_shuttles()), 'FROM_START', 3, 'LAST', 0), ['Atlantis', 'Endeavour'], 'sublist # last complex'); + check_number_of_calls('sublist # last complex'); + number_of_calls = 0; + unittest_assertequals(lists_get_sublist((get_space_shuttles()), 'FROM_END', 3, 'LAST', 0), ['Challenger', 'Discovery', 'Atlantis', 'Endeavour'], 'sublist #-end last simple'); + check_number_of_calls('sublist #-end last simple'); + number_of_calls = 0; + unittest_assertequals(lists_get_sublist((get_space_shuttles()), 'FROM_START', 0, 'FROM_END', 0), list, 'sublist all with # #-end complex'); + check_number_of_calls('sublist all with # #-end complex'); + number_of_calls = 0; + unittest_assertequals(lists_get_sublist((get_space_shuttles()), 'FROM_END', 4, 'FROM_START', 4), list, 'sublist all with #-end # complex'); + check_number_of_calls('sublist all with #-end # complex'); + number_of_calls = 0; + // Checks that the whole list is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where sublist uses [x:length - y] for # #-end. + unittest_assertequals(lists_get_sublist((get_space_shuttles()), 'FROM_START', ((0 + 1) - 1), 'FROM_END', ((0 + 1) - 1)), list, 'sublist all with # #-end math complex'); + check_number_of_calls('sublist all with # #-end math complex'); +} + +/// Tests the "join" block. +void test_join() { + list = ['Vulcan', 'Klingon', 'Borg']; + unittest_assertequals(list.join(','), 'Vulcan,Klingon,Borg', 'join'); + unittest_assertequals((true ? list : null).join(','), 'Vulcan,Klingon,Borg', 'join order'); +} + +/// Tests the "split" block. +void test_split() { + text = 'Vulcan,Klingon,Borg'; + unittest_assertequals(text.split(','), ['Vulcan', 'Klingon', 'Borg'], 'split'); + unittest_assertequals((true ? text : null).split(','), ['Vulcan', 'Klingon', 'Borg'], 'split order'); +} + +List lists_sort(List list, String type, int direction) { + var compareFuncs = { + "NUMERIC": (a, b) => (direction * a.compareTo(b)).toInt(), + "TEXT": (a, b) => direction * a.toString().compareTo(b.toString()), + "IGNORE_CASE": + (a, b) => direction * + a.toString().toLowerCase().compareTo(b.toString().toLowerCase()) + }; + list = new List.from(list); + var compare = compareFuncs[type]; + list.sort(compare); + return list; +} + +/// Tests the "alphabetic sort" block. +void test_sort_alphabetic() { + list = ['Vulcan', 'klingon', 'Borg']; + unittest_assertequals(lists_sort(list, "TEXT", 1), ['Borg', 'Vulcan', 'klingon'], 'sort alphabetic ascending'); + unittest_assertequals(lists_sort(true ? list : null, "TEXT", 1), ['Borg', 'Vulcan', 'klingon'], 'sort alphabetic ascending order'); +} + +/// Tests the "alphabetic sort ignore case" block. +void test_sort_ignoreCase() { + list = ['Vulcan', 'klingon', 'Borg']; + unittest_assertequals(lists_sort(list, "IGNORE_CASE", 1), ['Borg', 'klingon', 'Vulcan'], 'sort ignore case ascending'); + unittest_assertequals(lists_sort(true ? list : null, "IGNORE_CASE", 1), ['Borg', 'klingon', 'Vulcan'], 'sort ignore case ascending order'); +} + +/// Tests the "numeric sort" block. +void test_sort_numeric() { + list = [8, 18, -1]; + unittest_assertequals(lists_sort(list, "NUMERIC", -1), [18, 8, -1], 'sort numeric descending'); + unittest_assertequals(lists_sort(true ? list : null, "NUMERIC", -1), [18, 8, -1], 'sort numeric descending order'); +} + +/// Tests the "list reverse" block. +void test_lists_reverse() { + list = [8, 18, -1, 64]; + unittest_assertequals(new List.from(list.reversed), [64, -1, 18, 8], 'reverse a copy'); + unittest_assertequals(list, [8, 18, -1, 64], 'reverse a copy original'); + list = []; + unittest_assertequals(new List.from(list.reversed), [], 'empty list'); +} + +/// Describe this function... +void test_colour_picker() { + unittest_assertequals('#ff6600', '#ff6600', 'static colour'); +} + +String colour_rgb(num r, num g, num b) { + num rn = (Math.max(Math.min(r, 100), 0) * 2.55).round(); + String rs = rn.toInt().toRadixString(16); + rs = '0$rs'; + rs = rs.substring(rs.length - 2); + num gn = (Math.max(Math.min(g, 100), 0) * 2.55).round(); + String gs = gn.toInt().toRadixString(16); + gs = '0$gs'; + gs = gs.substring(gs.length - 2); + num bn = (Math.max(Math.min(b, 100), 0) * 2.55).round(); + String bs = bn.toInt().toRadixString(16); + bs = '0$bs'; + bs = bs.substring(bs.length - 2); + return '#$rs$gs$bs'; +} + +/// Describe this function... +void test_rgb() { + unittest_assertequals(colour_rgb(100, 40, 0), '#ff6600', 'from rgb'); +} + +String colour_random() { + 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)]}'; +} + +/// Describe this function... +void test_colour_random() { + for (int count4 = 0; count4 < 100; count4++) { + item = colour_random(); + unittest_assertequals(item.length, 7, ['length of random colour string: ',item].join()); + unittest_assertequals(item[0], '#', ['format of random colour string: ',item].join()); + for (i = 1; i <= 6; i++) { + unittest_assertequals(0 != 'abcdefABDEF0123456789'.indexOf(item[((i + 1) - 1)]) + 1, true, ['contents of random colour string: ',item,' at index: ',i + 1].join()); + } + } +} + +String colour_blend(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'; +} + +/// Describe this function... +void test_blend() { + unittest_assertequals(colour_blend('#ff0000', colour_rgb(100, 40, 0), 0.4), '#ff2900', 'blend'); +} + +/// Describe this function... +void test_procedure() { + procedure_1(8, 2); + unittest_assertequals(proc_z, 4, 'procedure with global'); + proc_w = false; + procedure_2(false); + unittest_assertequals(proc_w, true, 'procedure no return'); + proc_w = false; + procedure_2(true); + unittest_assertequals(proc_w, false, 'procedure return'); +} + +/// Describe this function... +void procedure_1(proc_x, proc_y) { + proc_z = proc_x / proc_y; +} + +/// Describe this function... +void procedure_2(proc_x) { + if (proc_x) { + return; + } + proc_w = true; +} + +/// Describe this function... +void test_function() { + unittest_assertequals(function_1(2, 3), -1, 'function with arguments'); + unittest_assertequals(func_z, 'side effect', 'function with side effect'); + func_a = 'unchanged'; + func_c = 'global'; + unittest_assertequals(function_2(2), '3global', 'function with global'); + unittest_assertequals(func_a, 'unchanged', 'function with scope'); + unittest_assertequals(function_3(true), true, 'function return'); + unittest_assertequals(function_3(false), false, 'function no return'); +} + +/// Describe this function... +dynamic function_1(func_x, func_y) { + func_z = 'side effect'; + return func_x - func_y; +} + +/// Describe this function... +dynamic function_2(func_a) { + func_a = (func_a is num ? func_a : 0) + 1; + return [func_a,func_c].join(); +} + +/// Describe this function... +dynamic function_3(func_a) { + if (func_a) { + return true; + } + return false; +} + +/// Describe this function... +dynamic recurse(n) { + if (n > 0) { + text = [recurse(n - 1),n,recurse(n - 1)].join(); + } else { + text = '-'; + } + return text; +} + + +main() { + unittestResults = []; + print('\n====================\n\nRunning suite: Logic'); + unittest_assertequals(true, true, 'True'); + unittest_assertequals(false, false, 'False'); + unittest_assertequals(!false, true, 'Not true'); + unittest_assertequals(!true, false, 'Not false'); + test_if(); + test_ifelse(); + test_equalities(); + test_and(); + test_or(); + test_ternary(); + print(unittest_report()); + unittestResults = null; + + unittestResults = []; + print('\n====================\n\nRunning suite: Loops 1'); + test_repeat(); + test_repeat_ext(); + test_while(); + test_foreach(); + print(unittest_report()); + unittestResults = null; + + unittestResults = []; + print('\n====================\n\nRunning suite: Loops 2'); + test_count_loops(); + test_count_by(); + print(unittest_report()); + unittestResults = null; + + unittestResults = []; + print('\n====================\n\nRunning suite: Loops 3'); + test_break(); + test_continue(); + print(unittest_report()); + unittestResults = null; + + unittestResults = []; + print('\n====================\n\nRunning suite: Math'); + test_arithmetic(); + test_single(); + test_trig(); + test_constant(); + test_change(); + test_number_properties(); + test_round(); + test_operations_on_list(); + test_constraint(); + test_mod(); + test_random_integer(); + test_random_fraction(); + test_atan2(); + print(unittest_report()); + unittestResults = null; + + unittestResults = []; + print('\n====================\n\nRunning suite: Text'); + test_text_length(); + test_empty_text(); + test_create_text(); + test_append(); + test_find_text_simple(); + test_find_text_complex(); + test_get_text_simple(); + test_get_text_complex(); + test_substring_simple(); + test_substring_complex(); + test_case(); + test_trim(); + test_count_text(); + test_text_reverse(); + test_replace(); + print(unittest_report()); + unittestResults = null; + + unittestResults = []; + print('\n====================\n\nRunning suite: Lists'); + test_create_lists(); + test_lists_empty(); + test_lists_length(); + test_find_lists_simple(); + test_find_lists_complex(); + test_get_lists_simple(); + test_get_lists_complex(); + test_getRemove(); + test_remove(); + test_set(); + test_insert(); + test_sublist_simple(); + test_sublist_complex(); + test_join(); + test_split(); + test_sort_alphabetic(); + test_sort_ignoreCase(); + test_sort_numeric(); + test_lists_reverse(); + print(unittest_report()); + unittestResults = null; + + unittestResults = []; + print('\n====================\n\nRunning suite: Colour'); + test_colour_picker(); + test_blend(); + test_rgb(); + test_colour_random(); + print(unittest_report()); + unittestResults = null; + + unittestResults = []; + print('\n====================\n\nRunning suite: Variables'); + item = 123; + unittest_assertequals(item, 123, 'variable'); + if2 = 123; + unittest_assertequals(if2, 123, 'reserved variable'); + print(unittest_report()); + unittestResults = null; + + // Intentionally non-connected variable. + naked; + + unittestResults = []; + print('\n====================\n\nRunning suite: Functions'); + test_procedure(); + test_function(); + unittest_assertequals(recurse(3), '-1-2-1-3-1-2-1-', 'test recurse'); + print(unittest_report()); + unittestResults = null; +} \ No newline at end of file diff --git a/js/tests/generators/golden/generated.js b/js/tests/generators/golden/generated.js new file mode 100644 index 0000000..c9b80a7 --- /dev/null +++ b/js/tests/generators/golden/generated.js @@ -0,0 +1,1603 @@ +'use strict'; + +var unittestResults, test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy; + +function unittest_report() { + // Create test report. + var report = []; + var summary = []; + var fails = 0; + for (var i = 0; i < unittestResults.length; i++) { + if (unittestResults[i][0]) { + summary.push("."); + } else { + summary.push("F"); + fails++; + report.push(""); + report.push("FAIL: " + unittestResults[i][2]); + report.push(unittestResults[i][1]); + } + } + report.unshift(summary.join("")); + report.push(""); + report.push("Number of tests run: " + unittestResults.length); + report.push(""); + if (fails) { + report.push("FAILED (failures=" + fails + ")"); + } else { + report.push("OK"); + } + return report.join("\n"); +} + +function assertEquals(actual, expected, message) { + // Asserts that a value equals another value. + if (!unittestResults) { + 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)) { + unittestResults.push([true, "OK", message]); + } else { + unittestResults.push([false, "Expected: " + expected + "\nActual: " + actual, message]); + } +} + +function unittest_fail(message) { + // Always assert an error. + if (!unittestResults) { + throw "Orphaned assert fail: " + message; + } + unittestResults.push([false, "Fail.", message]); +} + +// Describe this function... +function test_if() { + if (false) { + unittest_fail('if false'); + } + ok = false; + if (true) { + ok = true; + } + assertEquals(ok, true, 'if true'); + ok = false; + if (false) { + unittest_fail('if/else false'); + } else { + ok = true; + } + assertEquals(ok, true, 'if/else false'); + ok = false; + if (true) { + ok = true; + } else { + unittest_fail('if/else true'); + } + assertEquals(ok, true, 'if/else true'); + ok = false; + if (false) { + unittest_fail('elseif 1'); + } else if (true) { + ok = true; + } else if (true) { + unittest_fail('elseif 2'); + } else { + unittest_fail('elseif 3'); + } + assertEquals(ok, true, 'elseif 4'); +} + +// Describe this function... +function test_ifelse() { + ok = false; + if (true) { + ok = true; + } else { + unittest_fail('ifelse true'); + } + assertEquals(ok, true, 'ifelse true'); + ok = false; + if (false) { + unittest_fail('ifelse false'); + } else { + ok = true; + } + assertEquals(ok, true, 'ifelse false'); +} + +// Describe this function... +function test_equalities() { + assertEquals(2 == 2, true, 'Equal yes'); + assertEquals(3 == 4, false, 'Equal no'); + assertEquals(5 != 6, true, 'Not equal yes'); + assertEquals(3 == 4, false, 'Not equal no'); + assertEquals(5 < 6, true, 'Smaller yes'); + assertEquals(7 < 7, false, 'Smaller no'); + assertEquals(9 > 8, true, 'Greater yes'); + assertEquals(10 > 10, false, 'Greater no'); + assertEquals(11 <= 11, true, 'Smaller-equal yes'); + assertEquals(13 <= 12, false, 'Smaller-equal no'); + assertEquals(14 >= 14, true, 'Greater-equal yes'); + assertEquals(15 >= 16, false, 'Greater-equal no'); +} + +// Describe this function... +function test_and() { + assertEquals(true && true, true, 'And true/true'); + assertEquals(false && true, false, 'And false/true'); + assertEquals(true && false, false, 'And true/false'); + assertEquals(false && false, false, 'And false/false'); +} + +// Describe this function... +function test_or() { + assertEquals(true || true, true, 'Or true/true'); + assertEquals(false || true, true, 'Or false/true'); + assertEquals(true || false, true, 'Or true/false'); + assertEquals(false || false, false, 'Or false/false'); +} + +// Describe this function... +function test_ternary() { + assertEquals(true ? 42 : 99, 42, 'if true'); + assertEquals(false ? 42 : 99, 99, 'if true'); +} + +// Describe this function... +function test_foreach() { + log = ''; + var x_list = ['a', 'b', 'c']; + for (var x_index in x_list) { + x = x_list[x_index]; + log += String(x); + } + assertEquals(log, 'abc', 'for loop'); +} + +// Describe this function... +function test_repeat() { + count = 0; + for (var count2 = 0; count2 < 10; count2++) { + count = (typeof count == 'number' ? count : 0) + 1; + } + assertEquals(count, 10, 'repeat 10'); +} + +// Describe this function... +function test_while() { + while (false) { + unittest_fail('while 0'); + } + while (!true) { + unittest_fail('until 0'); + } + count = 1; + while (count != 10) { + count = (typeof count == 'number' ? count : 0) + 1; + } + assertEquals(count, 10, 'while 10'); + count = 1; + while (!(count == 10)) { + count = (typeof count == 'number' ? count : 0) + 1; + } + assertEquals(count, 10, 'until 10'); +} + +// Describe this function... +function test_repeat_ext() { + count = 0; + for (var count3 = 0; count3 < 10; count3++) { + count = (typeof count == 'number' ? count : 0) + 1; + } + assertEquals(count, 10, 'repeat 10'); +} + +// Describe this function... +function test_count_by() { + log = ''; + for (x = 1; x <= 8; x += 2) { + log += String(x); + } + assertEquals(log, '1357', 'count up ints'); + log = ''; + for (x = 8; x >= 1; x -= 2) { + log += String(x); + } + assertEquals(log, '8642', 'count down ints'); + loglist = []; + for (x = 1; x <= 8; x += 1.5) { + loglist.push(x); + } + assertEquals(loglist, [1, 2.5, 4, 5.5, 7], 'count with floats'); + loglist = []; + var x_start = 1 + 0; + var x_end = 8 + 0; + var x_inc = Math.abs(1 - 2); + if (x_start > x_end) { + x_inc = -x_inc; + } + for (x = x_start; x_inc >= 0 ? x <= x_end : x >= x_end; x += x_inc) { + loglist.push(x); + } + assertEquals(loglist, [1, 2, 3, 4, 5, 6, 7, 8], 'count up non-trivial ints'); + loglist = []; + var x_start2 = 8 + 0; + var x_end2 = 1 + 0; + var x_inc2 = 2; + if (x_start2 > x_end2) { + x_inc2 = -x_inc2; + } + for (x = x_start2; x_inc2 >= 0 ? x <= x_end2 : x >= x_end2; x += x_inc2) { + loglist.push(x); + } + assertEquals(loglist, [8, 6, 4, 2], 'count down non-trivial ints'); + loglist = []; + var x_start3 = 5 + 0.5; + var x_end3 = 1 + 0; + var x_inc3 = Math.abs(1 + 0); + if (x_start3 > x_end3) { + x_inc3 = -x_inc3; + } + for (x = x_start3; x_inc3 >= 0 ? x <= x_end3 : x >= x_end3; x += x_inc3) { + loglist.push(x); + } + assertEquals(loglist, [5.5, 4.5, 3.5, 2.5, 1.5], 'count with floats'); +} + +// Describe this function... +function test_count_loops() { + log = ''; + for (x = 1; x <= 8; x++) { + log += String(x); + } + assertEquals(log, '12345678', 'count up'); + log = ''; + for (x = 8; x >= 1; x--) { + log += String(x); + } + assertEquals(log, '87654321', 'count down'); + loglist = []; + var x_start4 = 1 + 0; + var x_end4 = 4 + 0; + var x_inc4 = 1; + if (x_start4 > x_end4) { + x_inc4 = -x_inc4; + } + for (x = x_start4; x_inc4 >= 0 ? x <= x_end4 : x >= x_end4; x += x_inc4) { + loglist.push(x); + } + assertEquals(loglist, [1, 2, 3, 4], 'count up non-trivial'); + loglist = []; + var x_start5 = 3 + 1; + var x_end5 = 1 + 0; + var x_inc5 = 1; + if (x_start5 > x_end5) { + x_inc5 = -x_inc5; + } + for (x = x_start5; x_inc5 >= 0 ? x <= x_end5 : x >= x_end5; x += x_inc5) { + loglist.push(x); + } + assertEquals(loglist, [4, 3, 2, 1], 'count down non-trivial'); +} + +// Describe this function... +function test_continue() { + log = ''; + count = 0; + while (count != 8) { + count = (typeof count == 'number' ? count : 0) + 1; + if (count == 5) { + continue; + } + log += String(count); + } + assertEquals(log, '1234678', 'while continue'); + log = ''; + count = 0; + while (!(count == 8)) { + count = (typeof count == 'number' ? count : 0) + 1; + if (count == 5) { + continue; + } + log += String(count); + } + assertEquals(log, '1234678', 'until continue'); + log = ''; + for (x = 1; x <= 8; x++) { + if (x == 5) { + continue; + } + log += String(x); + } + assertEquals(log, '1234678', 'count continue'); + log = ''; + var x_list2 = ['a', 'b', 'c', 'd']; + for (var x_index2 in x_list2) { + x = x_list2[x_index2]; + if (x == 'c') { + continue; + } + log += String(x); + } + assertEquals(log, 'abd', 'for continue'); +} + +// Describe this function... +function test_break() { + count = 1; + while (count != 10) { + if (count == 5) { + break; + } + count = (typeof count == 'number' ? count : 0) + 1; + } + assertEquals(count, 5, 'while break'); + count = 1; + while (!(count == 10)) { + if (count == 5) { + break; + } + count = (typeof count == 'number' ? count : 0) + 1; + } + assertEquals(count, 5, 'until break'); + log = ''; + for (x = 1; x <= 8; x++) { + if (x == 5) { + break; + } + log += String(x); + } + assertEquals(log, '1234', 'count break'); + log = ''; + var x_list3 = ['a', 'b', 'c', 'd']; + for (var x_index3 in x_list3) { + x = x_list3[x_index3]; + if (x == 'c') { + break; + } + log += String(x); + } + assertEquals(log, 'ab', 'for break'); +} + +// Tests the "single" block. +function test_single() { + assertEquals(Math.sqrt(25), 5, 'sqrt'); + assertEquals(Math.abs(-25), 25, 'abs'); + assertEquals(-(-25), 25, 'negate'); + assertEquals(Math.log(1), 0, 'ln'); + assertEquals(Math.log(100) / Math.log(10), 2, 'log10'); + assertEquals(Math.exp(2), 7.38905609893065, 'exp'); + assertEquals(Math.pow(10,2), 100, 'power10'); +} + +// Tests the "arithmetic" block for all operations and checks +// parenthesis are properly generated for different orders. +function test_arithmetic() { + assertEquals(1 + 2, 3, 'add'); + assertEquals(1 - 2, -1, 'subtract'); + assertEquals(1 - (0 + 2), -1, 'subtract order with add'); + assertEquals(1 - (0 - 2), 3, 'subtract order with subtract'); + assertEquals(4 * 2.5, 10, 'multiply'); + assertEquals(4 * (0 + 2.5), 10, 'multiply order'); + assertEquals(8.2 / -5, -1.64, 'divide'); + assertEquals(8.2 / (0 + -5), -1.64, 'divide order'); + assertEquals(Math.pow(10, 4), 10000, 'power'); + assertEquals(Math.pow(10, 0 + 4), 10000, 'power order'); +} + +// Tests the "trig" block. +function test_trig() { + assertEquals(Math.sin(90 / 180 * Math.PI), 1, 'sin'); + assertEquals(Math.cos(180 / 180 * Math.PI), -1, 'cos'); + assertEquals(Math.tan(0 / 180 * Math.PI), 0, 'tan'); + assertEquals(Math.asin(-1) / Math.PI * 180, -90, 'asin'); + assertEquals(Math.acos(1) / Math.PI * 180, 0, 'acos'); + assertEquals(Math.atan(1) / Math.PI * 180, 45, 'atan'); +} + +// Tests the "constant" blocks. +function test_constant() { + assertEquals(Math.floor(Math.PI * 1000), 3141, 'const pi'); + assertEquals(Math.floor(Math.E * 1000), 2718, 'const e'); + assertEquals(Math.floor(((1 + Math.sqrt(5)) / 2) * 1000), 1618, 'const golden'); + assertEquals(Math.floor(Math.SQRT2 * 1000), 1414, 'const sqrt 2'); + assertEquals(Math.floor(Math.SQRT1_2 * 1000), 707, 'const sqrt 0.5'); + assertEquals(9999 < Infinity, true, 'const infinity'); +} + +function mathIsPrime(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; +} + +// Tests the "number property" blocks. +function test_number_properties() { + assertEquals(42 % 2 == 0, true, 'even'); + assertEquals(42.1 % 2 == 1, false, 'odd'); + assertEquals(mathIsPrime(5), true, 'prime 5'); + assertEquals(mathIsPrime(25), false, 'prime 25'); + assertEquals(mathIsPrime(-31.1), false, 'prime negative'); + assertEquals(Math.PI % 1 == 0, false, 'whole'); + assertEquals(Infinity > 0, true, 'positive'); + assertEquals(-42 < 0, true, 'negative'); + assertEquals(42 % 2 == 0, true, 'divisible'); +} + +// Tests the "round" block. +function test_round() { + assertEquals(Math.round(42.42), 42, 'round'); + assertEquals(Math.ceil(-42.42), -42, 'round up'); + assertEquals(Math.floor(42.42), 42, 'round down'); +} + +// Tests the "change" block. +function test_change() { + varToChange = 100; + varToChange = (typeof varToChange == 'number' ? varToChange : 0) + 42; + assertEquals(varToChange, 142, 'change'); +} + +function mathMean(myList) { + return myList.reduce(function(x, y) {return x + y;}) / myList.length; +} + +function mathMedian(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]; + } +} + +function mathModes(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; +} + +function mathStandardDeviation(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); +} + +function mathRandomList(list) { + var x = Math.floor(Math.random() * list.length); + return list[x]; +} + +// Tests the "list operation" blocks. +function test_operations_on_list() { + assertEquals([3, 4, 5].reduce(function(x, y) {return x + y;}), 12, 'sum'); + assertEquals(Math.min.apply(null, [3, 4, 5]), 3, 'min'); + assertEquals(Math.max.apply(null, [3, 4, 5]), 5, 'max'); + assertEquals(mathMean([3, 4, 5]), 4, 'average'); + assertEquals(mathMedian([3, 4, 5, 1]), 3.5, 'median'); + assertEquals(mathModes([3, 4, 3]), [3], 'modes'); + assertEquals(mathModes([3, 4, 3, 1, 4]), [3, 4], 'modes multiple'); + assertEquals(mathStandardDeviation([3, 3, 3]), 0, 'standard dev'); + assertEquals([3, 4, 5].indexOf(mathRandomList([3, 4, 5])) + 1 > 0, true, 'random'); +} + +// Tests the "mod" block. +function test_mod() { + assertEquals(42 % 5, 2, 'mod'); +} + +// Tests the "constrain" block. +function test_constraint() { + assertEquals(Math.min(Math.max(100, 0), 42), 42, 'constraint'); +} + +function mathRandomInt(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); +} + +// Tests the "random integer" block. +function test_random_integer() { + rand = mathRandomInt(5, 10); + assertEquals(rand >= 5 && rand <= 10, true, 'randRange'); + assertEquals(rand % 1 == 0, true, 'randInteger'); +} + +// Tests the "random fraction" block. +function test_random_fraction() { + rand = Math.random(); + assertEquals(rand >= 0 && rand <= 1, true, 'randFloat'); +} + +// Describe this function... +function test_atan2() { + assertEquals(Math.atan2(5, -5) / Math.PI * 180, 135, 'atan2'); + assertEquals(Math.atan2(-12, 0) / Math.PI * 180, -90, 'atan2'); +} + +// Checks that the number of calls is one in order +// to confirm that a function was only called once. +function check_number_of_calls(test_name) { + test_name += 'number of calls'; + assertEquals(number_of_calls, 1, test_name); +} + +// Tests the "create text with" block with varying number of inputs. +function test_create_text() { + assertEquals('', '', 'no text'); + assertEquals('Hello', 'Hello', 'create single'); + assertEquals(String(-1), '-1', 'create single number'); + assertEquals('K' + String(9), 'K9', 'create double text'); + assertEquals(String(4) + String(2), '42', 'create double text numbers'); + assertEquals([1,2,3].join(''), '123', 'create triple'); + assertEquals([1,true ? 0 : null,'M'].join(''), '10M', 'create order'); +} + +// Creates an empty string for use with the empty test. +function get_empty() { + return ''; +} + +// Tests the "is empty" block". +function test_empty_text() { + assertEquals(!'Google'.length, false, 'not empty'); + assertEquals(!''.length, true, 'empty'); + assertEquals(!get_empty().length, true, 'empty complex'); + assertEquals(!(true ? '' : null).length, true, 'empty order'); +} + +// Tests the "length" block. +function test_text_length() { + assertEquals(''.length, 0, 'zero length'); + assertEquals('Google'.length, 6, 'non-zero length'); + assertEquals((true ? 'car' : null).length, 3, 'length order'); +} + +// Tests the "append text" block with different types of parameters. +function test_append() { + item = 'Miserable'; + item += 'Failure'; + assertEquals(item, 'MiserableFailure', 'append text'); + item = 12; + item += String(34); + assertEquals(item, '1234', 'append number'); + item = 'Something '; + item += String(true ? 'Positive' : null); + assertEquals(item, 'Something Positive', 'append order'); +} + +// Tests the "find" block with a variable. +function test_find_text_simple() { + text = 'Banana'; + assertEquals(text.indexOf('an') + 1, 2, 'find first simple'); + assertEquals(text.lastIndexOf('an') + 1, 4, 'find last simple'); + assertEquals(text.indexOf('Peel') + 1, 0, 'find none simple'); +} + +// Creates a string for use with the find test. +function get_fruit() { + number_of_calls = (typeof number_of_calls == 'number' ? number_of_calls : 0) + 1; + return 'Banana'; +} + +// Tests the "find" block with a function call. +function test_find_text_complex() { + number_of_calls = 0; + assertEquals(get_fruit().indexOf('an') + 1, 2, 'find first complex'); + check_number_of_calls('find first complex'); + number_of_calls = 0; + assertEquals((true ? get_fruit() : null).indexOf('an') + 1, 2, 'find first order complex'); + check_number_of_calls('find first order complex'); + number_of_calls = 0; + assertEquals(get_fruit().lastIndexOf('an') + 1, 4, 'find last complex'); + check_number_of_calls('find last complex'); + number_of_calls = 0; + assertEquals((true ? get_fruit() : null).lastIndexOf('an') + 1, 4, 'find last order complex'); + check_number_of_calls('find last order complex'); + number_of_calls = 0; + assertEquals(get_fruit().indexOf('Peel') + 1, 0, 'find none complex'); + check_number_of_calls('find none complex'); + number_of_calls = 0; + assertEquals((true ? get_fruit() : null).indexOf('Peel') + 1, 0, 'find none order complex'); + check_number_of_calls('find none order complex'); +} + +function textRandomLetter(text) { + var x = Math.floor(Math.random() * text.length); + return text[x]; +} + +// Tests the "get letter" block with a variable. +function test_get_text_simple() { + text = 'Blockly'; + assertEquals(text.charAt(0), 'B', 'get first simple'); + assertEquals(text.slice(-1), 'y', 'get last simple'); + assertEquals(text.indexOf(textRandomLetter(text)) + 1 > 0, true, 'get random simple'); + assertEquals(text.charAt(2), 'o', 'get # simple'); + assertEquals(text.charAt(((true ? 3 : null) - 1)), 'o', 'get # order simple'); + assertEquals(text.slice(-3).charAt(0), 'k', 'get #-end simple'); + // The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(text.slice((-(0 + 3))).charAt(0), 'k', 'get #-end order simple'); +} + +// Creates a string for use with the get test. +function get_Blockly() { + number_of_calls = (typeof number_of_calls == 'number' ? number_of_calls : 0) + 1; + return 'Blockly'; +} + +// Tests the "get letter" block with a function call. +function test_get_text_complex() { + text = 'Blockly'; + number_of_calls = 0; + assertEquals(get_Blockly().charAt(0), 'B', 'get first complex'); + check_number_of_calls('get first complex'); + number_of_calls = 0; + assertEquals((true ? get_Blockly() : null).charAt(0), 'B', 'get first order complex'); + check_number_of_calls('get first order complex'); + number_of_calls = 0; + assertEquals(get_Blockly().slice(-1), 'y', 'get last complex'); + check_number_of_calls('get last complex'); + number_of_calls = 0; + assertEquals((true ? get_Blockly() : null).slice(-1), 'y', 'get last order complex'); + check_number_of_calls('get last order complex'); + number_of_calls = 0; + assertEquals(text.indexOf(textRandomLetter(get_Blockly())) + 1 > 0, true, 'get random complex'); + check_number_of_calls('get random complex'); + number_of_calls = 0; + assertEquals(text.indexOf(textRandomLetter(true ? get_Blockly() : null)) + 1 > 0, true, 'get random order complex'); + check_number_of_calls('get random order complex'); + number_of_calls = 0; + assertEquals(get_Blockly().charAt(2), 'o', 'get # complex'); + check_number_of_calls('get # complex'); + number_of_calls = 0; + assertEquals((true ? get_Blockly() : null).charAt(((true ? 3 : null) - 1)), 'o', 'get # order complex'); + check_number_of_calls('get # order complex'); + number_of_calls = 0; + assertEquals(get_Blockly().slice(-3).charAt(0), 'k', 'get #-end complex'); + check_number_of_calls('get #-end complex'); + number_of_calls = 0; + // The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals((true ? get_Blockly() : null).slice((-(0 + 3))).charAt(0), 'k', 'get #-end order complex'); + check_number_of_calls('get #-end order complex'); +} + +// Creates a string for use with the substring test. +function get_numbers() { + number_of_calls = (typeof number_of_calls == 'number' ? number_of_calls : 0) + 1; + return '123456789'; +} + +// Tests the "get substring" block with a variable. +function test_substring_simple() { + text = '123456789'; + assertEquals(text.slice(1, 3), '23', 'substring # simple'); + assertEquals(text.slice(((true ? 2 : null) - 1), true ? 3 : null), '23', 'substring # simple order'); + assertEquals(text.slice(text.length - 3, text.length - 1), '78', 'substring #-end simple'); + // The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(text.slice(text.length - (0 + 3), text.length - ((0 + 2) - 1)), '78', 'substring #-end simple order'); + assertEquals(text, text, 'substring first-last simple'); + assertEquals(text.slice(1, text.length - 1), '2345678', 'substring # #-end simple'); + assertEquals(text.slice(text.length - 7, 4), '34', 'substring #-end # simple'); + assertEquals(text.slice(0, 4), '1234', 'substring first # simple'); + assertEquals(text.slice(0, text.length - 1), '12345678', 'substring first #-end simple'); + assertEquals(text.slice(6, text.length), '789', 'substring # last simple'); + assertEquals(text.slice(text.length - 3, text.length), '789', 'substring #-end last simple'); + assertEquals(text.slice(0, text.length - 0), '123456789', 'substring all with # #-end simple'); + assertEquals(text.slice(text.length - 9, 9), '123456789', 'substring all with #-end # simple'); + // Checks that the whole string is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where substring uses [x:length - y] for # #-end. + assertEquals(text.slice(((0 + 1) - 1), text.length - ((0 + 1) - 1)), '123456789', 'substring all with # #-end math simple'); +} + +function subsequenceFromEndFromEnd(sequence, at1, at2) { + var start = sequence.length - 1 - at1; + var end = sequence.length - 1 - at2 + 1; + return sequence.slice(start, end); +} + +function subsequenceFromStartFromEnd(sequence, at1, at2) { + var start = at1; + var end = sequence.length - 1 - at2 + 1; + return sequence.slice(start, end); +} + +function subsequenceFromEndFromStart(sequence, at1, at2) { + var start = sequence.length - 1 - at1; + var end = at2 + 1; + return sequence.slice(start, end); +} + +function subsequenceFirstFromEnd(sequence, at2) { + var start = 0; + var end = sequence.length - 1 - at2 + 1; + return sequence.slice(start, end); +} + +function subsequenceFromStartLast(sequence, at1) { + var start = at1; + var end = sequence.length - 1 + 1; + return sequence.slice(start, end); +} + +function subsequenceFromEndLast(sequence, at1) { + var start = sequence.length - 1 - at1; + var end = sequence.length - 1 + 1; + return sequence.slice(start, end); +} + +// Tests the "get substring" block with a function call. +function test_substring_complex() { + number_of_calls = 0; + assertEquals(get_numbers().slice(1, 3), '23', 'substring # complex'); + check_number_of_calls('substring # complex'); + number_of_calls = 0; + assertEquals((true ? get_numbers() : null).slice(((true ? 2 : null) - 1), true ? 3 : null), '23', 'substring # complex order'); + check_number_of_calls('substring # complex order'); + number_of_calls = 0; + // The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(subsequenceFromEndFromEnd(get_numbers(), 2, 1), '78', 'substring #-end complex'); + check_number_of_calls('substring #-end complex'); + number_of_calls = 0; + assertEquals(subsequenceFromEndFromEnd((true ? get_numbers() : null), ((0 + 3) - 1), ((0 + 2) - 1)), '78', 'substring #-end order order'); + check_number_of_calls('substring #-end order order'); + number_of_calls = 0; + assertEquals(get_numbers(), text, 'substring first-last'); + check_number_of_calls('substring first-last'); + number_of_calls = 0; + assertEquals(subsequenceFromStartFromEnd(get_numbers(), 1, 1), '2345678', 'substring # #-end complex'); + check_number_of_calls('substring # #-end complex'); + number_of_calls = 0; + assertEquals(subsequenceFromEndFromStart(get_numbers(), 6, 3), '34', 'substring #-end # complex'); + check_number_of_calls('substring #-end # complex'); + number_of_calls = 0; + assertEquals(get_numbers().slice(0, 4), '1234', 'substring first # complex'); + check_number_of_calls('substring first # complex'); + number_of_calls = 0; + assertEquals(subsequenceFirstFromEnd(get_numbers(), 1), '12345678', 'substring first #-end complex'); + check_number_of_calls('substring first #-end complex'); + number_of_calls = 0; + assertEquals(subsequenceFromStartLast(get_numbers(), 6), '789', 'substring # last complex'); + check_number_of_calls('substring # last complex'); + number_of_calls = 0; + assertEquals(subsequenceFromEndLast(get_numbers(), 2), '789', 'substring #-end last complex'); + check_number_of_calls('substring #-end last complex'); + number_of_calls = 0; + assertEquals(subsequenceFromStartFromEnd(get_numbers(), 0, 0), '123456789', 'substring all with # #-end complex'); + check_number_of_calls('substring all with # #-end complex'); + number_of_calls = 0; + assertEquals(subsequenceFromEndFromStart(get_numbers(), 8, 8), '123456789', 'substring all with #-end # complex'); + check_number_of_calls('substring all with #-end # complex'); + number_of_calls = 0; + // Checks that the whole string is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where substring uses [x:length - y] for # #-end. + assertEquals(subsequenceFromStartFromEnd(get_numbers(), ((0 + 1) - 1), ((0 + 1) - 1)), '123456789', 'substring all with # #-end math complex'); + check_number_of_calls('substring all with # #-end math complex'); +} + +function textToTitleCase(str) { + return str.replace(/\S+/g, + function(txt) {return txt[0].toUpperCase() + txt.substring(1).toLowerCase();}); +} + +// Tests the "change casing" block. +function test_case() { + text = 'Hello World'; + assertEquals(text.toUpperCase(), 'HELLO WORLD', 'uppercase'); + assertEquals((true ? text : null).toUpperCase(), 'HELLO WORLD', 'uppercase order'); + text = 'Hello World'; + assertEquals(text.toLowerCase(), 'hello world', 'lowercase'); + assertEquals((true ? text : null).toLowerCase(), 'hello world', 'lowercase order'); + text = 'heLLo WorlD'; + assertEquals(textToTitleCase(text), 'Hello World', 'titlecase'); + assertEquals(textToTitleCase(true ? text : null), 'Hello World', 'titlecase order'); +} + +// Tests the "trim" block. +function test_trim() { + text = ' abc def '; + assertEquals(text.trim(), 'abc def', 'trim both'); + assertEquals((true ? text : null).trim(), 'abc def', 'trim both order'); + assertEquals(text.replace(/^[\s\xa0]+/, ''), 'abc def ', 'trim left'); + assertEquals((true ? text : null).replace(/^[\s\xa0]+/, ''), 'abc def ', 'trim left order'); + assertEquals(text.replace(/[\s\xa0]+$/, ''), ' abc def', 'trim right'); + assertEquals((true ? text : null).replace(/[\s\xa0]+$/, ''), ' abc def', 'trim right order'); +} + +function textCount(haystack, needle) { + if (needle.length === 0) { + return haystack.length + 1; + } else { + return haystack.split(needle).length - 1; + } +} + +// Tests the "trim" block. +function test_count_text() { + text = 'woolloomooloo'; + assertEquals(textCount(text, 'o'), 8, 'len 1'); + assertEquals(textCount(text, 'oo'), 4, 'len 2'); + assertEquals(textCount(text, 'loo'), 2, 'len 3'); + assertEquals(textCount(text, 'wool'), 1, 'start'); + assertEquals(textCount(text, 'chicken'), 0, 'missing'); + assertEquals(textCount(text, ''), 14, 'empty needle'); + assertEquals(textCount('', 'chicken'), 0, 'empty source'); +} + +// Tests the "trim" block. +function test_text_reverse() { + assertEquals(''.split('').reverse().join(''), '', 'empty string'); + assertEquals('a'.split('').reverse().join(''), 'a', 'len 1'); + assertEquals('ab'.split('').reverse().join(''), 'ba', 'len 2'); + assertEquals('woolloomooloo'.split('').reverse().join(''), 'ooloomoolloow', 'longer'); +} + +function textReplace(haystack, needle, replacement) { + needle = needle.replace(/([-()\[\]{}+?*.$\^|,:# 0, true, 'get random simple'); + assertEquals(list[1], 'Spock', 'get # simple'); + assertEquals(list[((true ? 2 : null) - 1)], 'Spock', 'get # order simple'); + assertEquals(list.slice(-3)[0], 'Kirk', 'get #-end simple'); + // The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(list.slice((-(0 + 3)))[0], 'Kirk', 'get #-end order simple'); +} + +// Creates a list for use with the get test. +function get_star_wars() { + number_of_calls = (typeof number_of_calls == 'number' ? number_of_calls : 0) + 1; + return ['Kirk', 'Spock', 'McCoy']; +} + +// Tests the "get" block with a function call. +function test_get_lists_complex() { + list = ['Kirk', 'Spock', 'McCoy']; + number_of_calls = 0; + assertEquals(get_star_wars()[0], 'Kirk', 'get first complex'); + check_number_of_calls('get first complex'); + number_of_calls = 0; + assertEquals((true ? get_star_wars() : null)[0], 'Kirk', 'get first order complex'); + check_number_of_calls('get first order complex'); + number_of_calls = 0; + assertEquals(get_star_wars().slice(-1)[0], 'McCoy', 'get last complex'); + check_number_of_calls('get last complex'); + number_of_calls = 0; + assertEquals((true ? get_star_wars() : null).slice(-1)[0], 'McCoy', 'get last order complex'); + check_number_of_calls('get last order complex'); + number_of_calls = 0; + assertEquals(list.indexOf(listsGetRandomItem(get_star_wars(), false)) + 1 > 0, true, 'get random complex'); + check_number_of_calls('get random complex'); + number_of_calls = 0; + assertEquals(list.indexOf(listsGetRandomItem(true ? get_star_wars() : null, false)) + 1 > 0, true, 'get random order complex'); + check_number_of_calls('get random order complex'); + number_of_calls = 0; + assertEquals(get_star_wars()[1], 'Spock', 'get # complex'); + check_number_of_calls('get # complex'); + number_of_calls = 0; + assertEquals((true ? get_star_wars() : null)[((true ? 2 : null) - 1)], 'Spock', 'get # order complex'); + check_number_of_calls('get # order complex'); + number_of_calls = 0; + assertEquals(get_star_wars().slice(-3)[0], 'Kirk', 'get #-end complex'); + check_number_of_calls('get #-end complex'); + number_of_calls = 0; + // The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals((true ? get_star_wars() : null).slice((-(0 + 3)))[0], 'Kirk', 'get #-end order complex'); + check_number_of_calls('get #-end order complex'); +} + +// Tests the "get and remove" block. +function test_getRemove() { + list = ['Kirk', 'Spock', 'McCoy']; + assertEquals(list.shift(), 'Kirk', 'getremove first'); + assertEquals(list, ['Spock', 'McCoy'], 'getremove first list'); + list = ['Kirk', 'Spock', 'McCoy']; + assertEquals((true ? list : null).shift(), 'Kirk', 'getremove first order'); + assertEquals(list, ['Spock', 'McCoy'], 'getremove first order list'); + list = ['Kirk', 'Spock', 'McCoy']; + assertEquals(list.pop(), 'McCoy', 'getremove last'); + assertEquals(list, ['Kirk', 'Spock'], 'getremove last list'); + list = ['Kirk', 'Spock', 'McCoy']; + assertEquals((true ? list : null).pop(), 'McCoy', 'getremove last order'); + assertEquals(list, ['Kirk', 'Spock'], 'getremove last order list'); + list = ['Kirk', 'Spock', 'McCoy']; + assertEquals(list.indexOf(listsGetRandomItem(list, true)) + 1 == 0, true, 'getremove random'); + assertEquals(list.length, 2, 'getremove random list'); + list = ['Kirk', 'Spock', 'McCoy']; + assertEquals(list.indexOf(listsGetRandomItem(true ? list : null, true)) + 1 == 0, true, 'getremove random order'); + assertEquals(list.length, 2, 'getremove random order list'); + list = ['Kirk', 'Spock', 'McCoy']; + assertEquals(list.splice(1, 1)[0], 'Spock', 'getremove #'); + assertEquals(list, ['Kirk', 'McCoy'], 'getremove # list'); + list = ['Kirk', 'Spock', 'McCoy']; + assertEquals((true ? list : null).splice(((true ? 2 : null) - 1), 1)[0], 'Spock', 'getremove # order'); + assertEquals(list, ['Kirk', 'McCoy'], 'getremove # order list'); + list = ['Kirk', 'Spock', 'McCoy']; + assertEquals(list.splice(-3, 1)[0], 'Kirk', 'getremove #-end'); + assertEquals(list, ['Spock', 'McCoy'], 'getremove #-end list'); + list = ['Kirk', 'Spock', 'McCoy']; + // The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals((true ? list : null).splice((-(0 + 3)), 1)[0], 'Kirk', 'getremove #-end order'); + assertEquals(list, ['Spock', 'McCoy'], 'getremove #-end order list'); +} + +// Tests the "remove" block. +function test_remove() { + list = ['Kirk', 'Spock', 'McCoy']; + list.shift(); + assertEquals(list, ['Spock', 'McCoy'], 'remove first list'); + list = ['Kirk', 'Spock', 'McCoy']; + (true ? list : null).shift(); + assertEquals(list, ['Spock', 'McCoy'], 'remove first order list'); + list = ['Kirk', 'Spock', 'McCoy']; + list.pop(); + assertEquals(list, ['Kirk', 'Spock'], 'remove last list'); + list = ['Kirk', 'Spock', 'McCoy']; + (true ? list : null).pop(); + assertEquals(list, ['Kirk', 'Spock'], 'remove last order list'); + list = ['Kirk', 'Spock', 'McCoy']; + listsGetRandomItem(list, true); + assertEquals(list.length, 2, 'remove random list'); + list = ['Kirk', 'Spock', 'McCoy']; + listsGetRandomItem(true ? list : null, true); + assertEquals(list.length, 2, 'remove random order list'); + list = ['Kirk', 'Spock', 'McCoy']; + list.splice(1, 1); + assertEquals(list, ['Kirk', 'McCoy'], 'remove # list'); + list = ['Kirk', 'Spock', 'McCoy']; + (true ? list : null).splice(((true ? 2 : null) - 1), 1); + assertEquals(list, ['Kirk', 'McCoy'], 'remove # order list'); + list = ['Kirk', 'Spock', 'McCoy']; + list.splice(-3, 1);assertEquals(list, ['Spock', 'McCoy'], 'remove #-end list'); + list = ['Kirk', 'Spock', 'McCoy']; + // The order for index for #-end is addition because this will catch + // errors in generators where most perform the operation ... - index. + (true ? list : null).splice((-(0 + 3)), 1);assertEquals(list, ['Spock', 'McCoy'], 'remove #-end order list'); +} + +// Tests the "set" block. +function test_set() { + list = ['Picard', 'Riker', 'Crusher']; + list[0] = 'Jean-Luc'; + assertEquals(list, ['Jean-Luc', 'Riker', 'Crusher'], 'set first list'); + list = ['Picard', 'Riker', 'Crusher']; + (true ? list : null)[0] = 'Jean-Luc'; + assertEquals(list, ['Jean-Luc', 'Riker', 'Crusher'], 'set first order list'); + list = ['Picard', 'Riker', 'Crusher']; + list[list.length - 1] = 'Beverly'; + assertEquals(list, ['Picard', 'Riker', 'Beverly'], 'set last list'); + list = ['Picard', 'Riker', 'Crusher']; + var tmpList = (true ? list : null); + tmpList[tmpList.length - 1] = 'Beverly'; + assertEquals(list, ['Picard', 'Riker', 'Beverly'], 'set last order list'); + list = ['Picard', 'Riker', 'Crusher']; + var tmpX = Math.floor(Math.random() * list.length); + list[tmpX] = 'Data'; + assertEquals(list.length, 3, 'set random list'); + list = ['Picard', 'Riker', 'Crusher']; + var tmpList2 = (true ? list : null); + var tmpX2 = Math.floor(Math.random() * tmpList2.length); + tmpList2[tmpX2] = 'Data'; + assertEquals(list.length, 3, 'set random order list'); + list = ['Picard', 'Riker', 'Crusher']; + list[2] = 'Pulaski'; + assertEquals(list, ['Picard', 'Riker', 'Pulaski'], 'set # list'); + list = ['Picard', 'Riker', 'Crusher']; + (true ? list : null)[((true ? 3 : null) - 1)] = 'Pulaski'; + assertEquals(list, ['Picard', 'Riker', 'Pulaski'], 'set # order list'); + list = ['Picard', 'Riker', 'Crusher']; + list[list.length - 1] = 'Pulaski'; + assertEquals(list, ['Picard', 'Riker', 'Pulaski'], 'set #-end list'); + list = ['Picard', 'Riker', 'Crusher']; + // The order for index for #-end is addition because this will catch + // errors in generators where most perform the operation ... - index. + var tmpList3 = (true ? list : null); + tmpList3[tmpList3.length - (0 + 2)] = 'Pulaski'; + assertEquals(list, ['Picard', 'Pulaski', 'Crusher'], 'set #-end order list'); +} + +// Tests the "insert" block. +function test_insert() { + list = ['Picard', 'Riker', 'Crusher']; + list.unshift('Data'); + assertEquals(list, ['Data', 'Picard', 'Riker', 'Crusher'], 'insert first list'); + list = ['Picard', 'Riker', 'Crusher']; + (true ? list : null).unshift('Data'); + assertEquals(list, ['Data', 'Picard', 'Riker', 'Crusher'], 'insert first order list'); + list = ['Picard', 'Riker', 'Crusher']; + list.push('Data'); + assertEquals(list, ['Picard', 'Riker', 'Crusher', 'Data'], 'insert last list'); + list = ['Picard', 'Riker', 'Crusher']; + (true ? list : null).push('Data'); + assertEquals(list, ['Picard', 'Riker', 'Crusher', 'Data'], 'insert last order list'); + list = ['Picard', 'Riker', 'Crusher']; + var tmpX3 = Math.floor(Math.random() * list.length); + list.splice(tmpX3, 0, 'Data'); + assertEquals(list.length, 4, 'insert random list'); + list = ['Picard', 'Riker', 'Crusher']; + var tmpList4 = (true ? list : null); + var tmpX4 = Math.floor(Math.random() * tmpList4.length); + tmpList4.splice(tmpX4, 0, 'Data'); + assertEquals(list.length, 4, 'insert random order list'); + list = ['Picard', 'Riker', 'Crusher']; + list.splice(2, 0, 'Data'); + assertEquals(list, ['Picard', 'Riker', 'Data', 'Crusher'], 'insert # list'); + list = ['Picard', 'Riker', 'Crusher']; + (true ? list : null).splice(((true ? 3 : null) - 1), 0, 'Data'); + assertEquals(list, ['Picard', 'Riker', 'Data', 'Crusher'], 'insert # order list'); + list = ['Picard', 'Riker', 'Crusher']; + list.splice(list.length - 1, 0, 'Data'); + assertEquals(list, ['Picard', 'Riker', 'Data', 'Crusher'], 'insert #-end list'); + list = ['Picard', 'Riker', 'Crusher']; + // The order for index for #-end is addition because this will catch + // errors in generators where most perform the operation ... - index. + var tmpList5 = (true ? list : null); + tmpList5.splice(tmpList5.length - (0 + 2), 0, 'Data'); + assertEquals(list, ['Picard', 'Data', 'Riker', 'Crusher'], 'insert #-end order list'); +} + +// Tests the "get sub-list" block with a variable. +function test_sublist_simple() { + list = ['Columbia', 'Challenger', 'Discovery', 'Atlantis', 'Endeavour']; + assertEquals(list.slice(1, 3), ['Challenger', 'Discovery'], 'sublist # simple'); + assertEquals(list.slice(((true ? 2 : null) - 1), true ? 3 : null), ['Challenger', 'Discovery'], 'sublist # simple order'); + assertEquals(list.slice(list.length - 3, list.length - 1), ['Discovery', 'Atlantis'], 'sublist #-end simple'); + // The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(list.slice(list.length - (0 + 3), list.length - ((0 + 2) - 1)), ['Discovery', 'Atlantis'], 'sublist #-end simple order'); + assertEquals(list.slice(0), list, 'sublist first-last simple'); + changing_list = ['Columbia', 'Challenger', 'Discovery', 'Atlantis', 'Endeavour']; + list_copy = changing_list.slice(0); + listsGetRandomItem(changing_list, true); + assertEquals(list_copy, list, 'sublist first-last simple copy check'); + assertEquals(list.slice(1, list.length - 1), ['Challenger', 'Discovery', 'Atlantis'], 'sublist # #-end simple'); + assertEquals(list.slice(list.length - 3, 4), ['Discovery', 'Atlantis'], 'sublist #-end # simple'); + assertEquals(list.slice(0, 4), ['Columbia', 'Challenger', 'Discovery', 'Atlantis'], 'sublist first # simple'); + assertEquals(list.slice(0, list.length - 3), ['Columbia', 'Challenger'], 'sublist first #-end simple'); + assertEquals(list.slice(3, list.length), ['Atlantis', 'Endeavour'], 'sublist # last simple'); + assertEquals(list.slice(list.length - 4, list.length), ['Challenger', 'Discovery', 'Atlantis', 'Endeavour'], 'sublist #-end last simple'); + assertEquals(list.slice(0, list.length - 0), list, 'sublist all with # #-end simple'); + assertEquals(list.slice(list.length - 5, 5), list, 'sublist all with #-end # simple'); + // Checks that the whole list is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where sublist uses [x:length - y] for # #-end. + assertEquals(list.slice(((0 + 1) - 1), list.length - ((0 + 1) - 1)), list, 'sublist all with # #-end math simple'); +} + +// Creates a list for use with the sublist test. +function get_space_shuttles() { + number_of_calls = (typeof number_of_calls == 'number' ? number_of_calls : 0) + 1; + return ['Columbia', 'Challenger', 'Discovery', 'Atlantis', 'Endeavour']; +} + +// Tests the "get sub-list" block with a function call. +function test_sublist_complex() { + number_of_calls = 0; + assertEquals(get_space_shuttles().slice(1, 3), ['Challenger', 'Discovery'], 'sublist # start complex'); + check_number_of_calls('sublist # start complex'); + number_of_calls = 0; + assertEquals((true ? get_space_shuttles() : null).slice(((true ? 2 : null) - 1), true ? 3 : null), ['Challenger', 'Discovery'], 'sublist # start order complex'); + check_number_of_calls('sublist # start order complex'); + number_of_calls = 0; + // The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(subsequenceFromEndFromEnd(get_space_shuttles(), 2, 1), ['Discovery', 'Atlantis'], 'sublist # end complex'); + assertEquals(number_of_calls, 1, 'sublist # end complex number of calls'); + number_of_calls = 0; + assertEquals(subsequenceFromEndFromEnd((true ? get_space_shuttles() : null), ((0 + 3) - 1), ((0 + 2) - 1)), ['Discovery', 'Atlantis'], 'sublist # end order complex'); + check_number_of_calls('sublist # end order complex'); + number_of_calls = 0; + assertEquals(get_space_shuttles().slice(0), list, 'sublist first-last complex'); + check_number_of_calls('sublist first-last complex'); + number_of_calls = 0; + assertEquals(subsequenceFromStartFromEnd(get_space_shuttles(), 1, 1), ['Challenger', 'Discovery', 'Atlantis'], 'sublist # #-end complex'); + check_number_of_calls('sublist # #-end complex'); + number_of_calls = 0; + assertEquals(subsequenceFromEndFromStart(get_space_shuttles(), 2, 3), ['Discovery', 'Atlantis'], 'sublist #-end # complex'); + check_number_of_calls('sublist #-end # complex'); + number_of_calls = 0; + assertEquals(get_space_shuttles().slice(0, 4), ['Columbia', 'Challenger', 'Discovery', 'Atlantis'], 'sublist first # complex'); + check_number_of_calls('sublist first # complex'); + number_of_calls = 0; + assertEquals(subsequenceFirstFromEnd(get_space_shuttles(), 3), ['Columbia', 'Challenger'], 'sublist first #-end complex'); + check_number_of_calls('sublist first #-end complex'); + number_of_calls = 0; + assertEquals(subsequenceFromStartLast(get_space_shuttles(), 3), ['Atlantis', 'Endeavour'], 'sublist # last complex'); + check_number_of_calls('sublist # last complex'); + number_of_calls = 0; + assertEquals(subsequenceFromEndLast(get_space_shuttles(), 3), ['Challenger', 'Discovery', 'Atlantis', 'Endeavour'], 'sublist #-end last simple'); + check_number_of_calls('sublist #-end last simple'); + number_of_calls = 0; + assertEquals(subsequenceFromStartFromEnd(get_space_shuttles(), 0, 0), list, 'sublist all with # #-end complex'); + check_number_of_calls('sublist all with # #-end complex'); + number_of_calls = 0; + assertEquals(subsequenceFromEndFromStart(get_space_shuttles(), 4, 4), list, 'sublist all with #-end # complex'); + check_number_of_calls('sublist all with #-end # complex'); + number_of_calls = 0; + // Checks that the whole list is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where sublist uses [x:length - y] for # #-end. + assertEquals(subsequenceFromStartFromEnd(get_space_shuttles(), ((0 + 1) - 1), ((0 + 1) - 1)), list, 'sublist all with # #-end math complex'); + check_number_of_calls('sublist all with # #-end math complex'); +} + +// Tests the "join" block. +function test_join() { + list = ['Vulcan', 'Klingon', 'Borg']; + assertEquals(list.join(','), 'Vulcan,Klingon,Borg', 'join'); + assertEquals((true ? list : null).join(','), 'Vulcan,Klingon,Borg', 'join order'); +} + +// Tests the "split" block. +function test_split() { + text = 'Vulcan,Klingon,Borg'; + assertEquals(text.split(','), ['Vulcan', 'Klingon', 'Borg'], 'split'); + assertEquals((true ? text : null).split(','), ['Vulcan', 'Klingon', 'Borg'], 'split order'); +} + +function listsGetSortCompare(type, direction) { + var compareFuncs = { + "NUMERIC": function(a, b) { + return Number(a) - Number(b); }, + "TEXT": function(a, b) { + return a.toString() > b.toString() ? 1 : -1; }, + "IGNORE_CASE": function(a, b) { + return a.toString().toLowerCase() > b.toString().toLowerCase() ? 1 : -1; }, + }; + var compare = compareFuncs[type]; + return function(a, b) { return compare(a, b) * direction; } +} + +// Tests the "alphabetic sort" block. +function test_sort_alphabetic() { + list = ['Vulcan', 'klingon', 'Borg']; + assertEquals(list.slice().sort(listsGetSortCompare("TEXT", 1)), ['Borg', 'Vulcan', 'klingon'], 'sort alphabetic ascending'); + assertEquals((true ? list : null).slice().sort(listsGetSortCompare("TEXT", 1)), ['Borg', 'Vulcan', 'klingon'], 'sort alphabetic ascending order'); +} + +// Tests the "alphabetic sort ignore case" block. +function test_sort_ignoreCase() { + list = ['Vulcan', 'klingon', 'Borg']; + assertEquals(list.slice().sort(listsGetSortCompare("IGNORE_CASE", 1)), ['Borg', 'klingon', 'Vulcan'], 'sort ignore case ascending'); + assertEquals((true ? list : null).slice().sort(listsGetSortCompare("IGNORE_CASE", 1)), ['Borg', 'klingon', 'Vulcan'], 'sort ignore case ascending order'); +} + +// Tests the "numeric sort" block. +function test_sort_numeric() { + list = [8, 18, -1]; + assertEquals(list.slice().sort(listsGetSortCompare("NUMERIC", -1)), [18, 8, -1], 'sort numeric descending'); + assertEquals((true ? list : null).slice().sort(listsGetSortCompare("NUMERIC", -1)), [18, 8, -1], 'sort numeric descending order'); +} + +// Tests the "list reverse" block. +function test_lists_reverse() { + list = [8, 18, -1, 64]; + assertEquals(list.slice().reverse(), [64, -1, 18, 8], 'reverse a copy'); + assertEquals(list, [8, 18, -1, 64], 'reverse a copy original'); + list = []; + assertEquals(list.slice().reverse(), [], 'empty list'); +} + +// Describe this function... +function test_colour_picker() { + assertEquals('#ff6600', '#ff6600', 'static colour'); +} + +function colourRgb(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; +} + +// Describe this function... +function test_rgb() { + assertEquals(colourRgb(100, 40, 0), '#ff6600', 'from rgb'); +} + +function colourRandom() { + var num = Math.floor(Math.random() * Math.pow(2, 24)); + return '#' + ('00000' + num.toString(16)).substr(-6); +} + +// Describe this function... +function test_colour_random() { + for (var count4 = 0; count4 < 100; count4++) { + item = colourRandom(); + assertEquals(item.length, 7, 'length of random colour string: ' + String(item)); + assertEquals(item.charAt(0), '#', 'format of random colour string: ' + String(item)); + for (i = 1; i <= 6; i++) { + assertEquals(0 != 'abcdefABDEF0123456789'.indexOf(item.charAt(((i + 1) - 1))) + 1, true, ['contents of random colour string: ',item,' at index: ',i + 1].join('')); + } + } +} + +function colourBlend(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; +} + +// Describe this function... +function test_blend() { + assertEquals(colourBlend('#ff0000', colourRgb(100, 40, 0), 0.4), '#ff2900', 'blend'); +} + +// Describe this function... +function test_procedure() { + procedure_1(8, 2); + assertEquals(proc_z, 4, 'procedure with global'); + proc_w = false; + procedure_2(false); + assertEquals(proc_w, true, 'procedure no return'); + proc_w = false; + procedure_2(true); + assertEquals(proc_w, false, 'procedure return'); +} + +// Describe this function... +function procedure_1(proc_x, proc_y) { + proc_z = proc_x / proc_y; +} + +// Describe this function... +function procedure_2(proc_x) { + if (proc_x) { + return; + } + proc_w = true; +} + +// Describe this function... +function test_function() { + assertEquals(function_1(2, 3), -1, 'function with arguments'); + assertEquals(func_z, 'side effect', 'function with side effect'); + func_a = 'unchanged'; + func_c = 'global'; + assertEquals(function_2(2), '3global', 'function with global'); + assertEquals(func_a, 'unchanged', 'function with scope'); + assertEquals(function_3(true), true, 'function return'); + assertEquals(function_3(false), false, 'function no return'); +} + +// Describe this function... +function function_1(func_x, func_y) { + func_z = 'side effect'; + return func_x - func_y; +} + +// Describe this function... +function function_2(func_a) { + func_a = (typeof func_a == 'number' ? func_a : 0) + 1; + return String(func_a) + String(func_c); +} + +// Describe this function... +function function_3(func_a) { + if (func_a) { + return true; + } + return false; +} + +// Describe this function... +function recurse(n) { + if (n > 0) { + text = [recurse(n - 1),n,recurse(n - 1)].join(''); + } else { + text = '-'; + } + return text; +} + + +unittestResults = []; +console.log('\n====================\n\nRunning suite: Logic') +assertEquals(true, true, 'True'); +assertEquals(false, false, 'False'); +assertEquals(!false, true, 'Not true'); +assertEquals(!true, false, 'Not false'); +test_if(); +test_ifelse(); +test_equalities(); +test_and(); +test_or(); +test_ternary(); +console.log(unittest_report()); +unittestResults = null; + +unittestResults = []; +console.log('\n====================\n\nRunning suite: Loops 1') +test_repeat(); +test_repeat_ext(); +test_while(); +test_foreach(); +console.log(unittest_report()); +unittestResults = null; + +unittestResults = []; +console.log('\n====================\n\nRunning suite: Loops 2') +test_count_loops(); +test_count_by(); +console.log(unittest_report()); +unittestResults = null; + +unittestResults = []; +console.log('\n====================\n\nRunning suite: Loops 3') +test_break(); +test_continue(); +console.log(unittest_report()); +unittestResults = null; + +unittestResults = []; +console.log('\n====================\n\nRunning suite: Math') +test_arithmetic(); +test_single(); +test_trig(); +test_constant(); +test_change(); +test_number_properties(); +test_round(); +test_operations_on_list(); +test_constraint(); +test_mod(); +test_random_integer(); +test_random_fraction(); +test_atan2(); +console.log(unittest_report()); +unittestResults = null; + +unittestResults = []; +console.log('\n====================\n\nRunning suite: Text') +test_text_length(); +test_empty_text(); +test_create_text(); +test_append(); +test_find_text_simple(); +test_find_text_complex(); +test_get_text_simple(); +test_get_text_complex(); +test_substring_simple(); +test_substring_complex(); +test_case(); +test_trim(); +test_count_text(); +test_text_reverse(); +test_replace(); +console.log(unittest_report()); +unittestResults = null; + +unittestResults = []; +console.log('\n====================\n\nRunning suite: Lists') +test_create_lists(); +test_lists_empty(); +test_lists_length(); +test_find_lists_simple(); +test_find_lists_complex(); +test_get_lists_simple(); +test_get_lists_complex(); +test_getRemove(); +test_remove(); +test_set(); +test_insert(); +test_sublist_simple(); +test_sublist_complex(); +test_join(); +test_split(); +test_sort_alphabetic(); +test_sort_ignoreCase(); +test_sort_numeric(); +test_lists_reverse(); +console.log(unittest_report()); +unittestResults = null; + +unittestResults = []; +console.log('\n====================\n\nRunning suite: Colour') +test_colour_picker(); +test_blend(); +test_rgb(); +test_colour_random(); +console.log(unittest_report()); +unittestResults = null; + +unittestResults = []; +console.log('\n====================\n\nRunning suite: Variables') +item = 123; +assertEquals(item, 123, 'variable'); +if2 = 123; +assertEquals(if2, 123, 'reserved variable'); +console.log(unittest_report()); +unittestResults = null; + +// Intentionally non-connected variable. +naked; + +unittestResults = []; +console.log('\n====================\n\nRunning suite: Functions') +test_procedure(); +test_function(); +assertEquals(recurse(3), '-1-2-1-3-1-2-1-', 'test recurse'); +console.log(unittest_report()); +unittestResults = null; diff --git a/js/tests/generators/golden/generated.lua b/js/tests/generators/golden/generated.lua new file mode 100644 index 0000000..9b6acfa --- /dev/null +++ b/js/tests/generators/golden/generated.lua @@ -0,0 +1,1872 @@ +function unittest_report() + -- Create test report. + local report = {} + local summary = {} + local fails = 0 + for _, v in pairs(unittestResults) do + if v["success"] then + table.insert(summary, ".") + else + table.insert(summary, "F") + fails = fails + 1 + table.insert(report, "FAIL: " .. v["title"]) + table.insert(report, v["log"]) + end + end + table.insert(report, 1, table.concat(summary)) + table.insert(report, "") + table.insert(report, "Number of tests run: " .. #unittestResults) + table.insert(report, "") + if fails > 0 then + table.insert(report, "FAILED (failures=" .. fails .. ")") + else + table.insert(report, "OK") + end + return table.concat(report, "\n") +end + +function assertEquals(actual, expected, message) + -- Asserts that a value equals another value. + assert(unittestResults ~= nil, "Orphaned assert equals: " .. message) + if type(actual) == "table" and type(expected) == "table" then + local lists_match = #actual == #expected + if lists_match then + for i, v1 in ipairs(actual) do + local v2 = expected[i] + if type(v1) == "number" and type(v2) == "number" then + if math.abs(v1 - v2) > 1e-9 then + lists_match = false + end + elseif v1 ~= v2 then + lists_match = false + end + end + end + if lists_match then + table.insert(unittestResults, {success=true, log="OK", title=message}) + return + else + -- produce the non-matching strings for a human-readable error + expected = "{" .. table.concat(expected, ", ") .. "}" + actual = "{" .. table.concat(actual, ", ") .. "}" + end + end + if actual == expected or (type(actual) == "number" and type(expected) == "number" and math.abs(actual - expected) < 1e-9) then + table.insert(unittestResults, {success=true, log="OK", title=message}) + else + table.insert(unittestResults, {success=false, log=string.format("Expected: %s\nActual: %s", tostring(expected), tostring(actual)), title=message}) + end +end + +function unittest_fail(message) + -- Always assert an error. + assert(unittestResults ~= nil, "Orphaned assert fail: " .. message) + table.insert(unittestResults, {success=false, log="Fail.", title=message}) +end + +-- Describe this function... +function test_if() + if false then + unittest_fail('if false') + end + ok = false + if true then + ok = true + end + assertEquals(ok, true, 'if true') + ok = false + if false then + unittest_fail('if/else false') + else + ok = true + end + assertEquals(ok, true, 'if/else false') + ok = false + if true then + ok = true + else + unittest_fail('if/else true') + end + assertEquals(ok, true, 'if/else true') + ok = false + if false then + unittest_fail('elseif 1') + elseif true then + ok = true + elseif true then + unittest_fail('elseif 2') + else + unittest_fail('elseif 3') + end + assertEquals(ok, true, 'elseif 4') +end + + +-- Describe this function... +function test_ifelse() + ok = false + if true then + ok = true + else + unittest_fail('ifelse true') + end + assertEquals(ok, true, 'ifelse true') + ok = false + if false then + unittest_fail('ifelse false') + else + ok = true + end + assertEquals(ok, true, 'ifelse false') +end + + +-- Describe this function... +function test_equalities() + assertEquals(2 == 2, true, 'Equal yes') + assertEquals(3 == 4, false, 'Equal no') + assertEquals(5 ~= 6, true, 'Not equal yes') + assertEquals(3 == 4, false, 'Not equal no') + assertEquals(5 < 6, true, 'Smaller yes') + assertEquals(7 < 7, false, 'Smaller no') + assertEquals(9 > 8, true, 'Greater yes') + assertEquals(10 > 10, false, 'Greater no') + assertEquals(11 <= 11, true, 'Smaller-equal yes') + assertEquals(13 <= 12, false, 'Smaller-equal no') + assertEquals(14 >= 14, true, 'Greater-equal yes') + assertEquals(15 >= 16, false, 'Greater-equal no') +end + + +-- Describe this function... +function test_and() + assertEquals(true and true, true, 'And true/true') + assertEquals(false and true, false, 'And false/true') + assertEquals(true and false, false, 'And true/false') + assertEquals(false and false, false, 'And false/false') +end + + +-- Describe this function... +function test_or() + assertEquals(true or true, true, 'Or true/true') + assertEquals(false or true, true, 'Or false/true') + assertEquals(true or false, true, 'Or true/false') + assertEquals(false or false, false, 'Or false/false') +end + + +-- Describe this function... +function test_ternary() + assertEquals(true and 42 or 99, 42, 'if true') + assertEquals(false and 42 or 99, 99, 'if true') +end + + +-- Describe this function... +function test_foreach() + log = '' + for _, x in ipairs({'a', 'b', 'c'}) do + log = log .. x + end + assertEquals(log, 'abc', 'for loop') +end + + +-- Describe this function... +function test_repeat() + count = 0 + for count2 = 1, 10 do + count = count + 1 + end + assertEquals(count, 10, 'repeat 10') +end + + +-- Describe this function... +function test_while() + while false do + unittest_fail('while 0') + end + while not true do + unittest_fail('until 0') + end + count = 1 + while count ~= 10 do + count = count + 1 + end + assertEquals(count, 10, 'while 10') + count = 1 + while not (count == 10) do + count = count + 1 + end + assertEquals(count, 10, 'until 10') +end + + +-- Describe this function... +function test_repeat_ext() + count = 0 + for count3 = 1, 10 do + count = count + 1 + end + assertEquals(count, 10, 'repeat 10') +end + + +-- Describe this function... +function test_count_by() + log = '' + for x = 1, 8, 2 do + log = log .. x + end + assertEquals(log, '1357', 'count up ints') + log = '' + for x = 8, 1, -2 do + log = log .. x + end + assertEquals(log, '8642', 'count down ints') + loglist = {} + for x = 1, 8, 1.5 do + table.insert(loglist, #loglist + 1, x) + end + assertEquals(loglist, {1, 2.5, 4, 5.5, 7}, 'count with floats') + loglist = {} + x_inc = math.abs(1 - 2) + if (1 + 0) > (8 + 0) then + x_inc = -x_inc + end + for x = 1 + 0, 8 + 0, x_inc do + table.insert(loglist, #loglist + 1, x) + end + assertEquals(loglist, {1, 2, 3, 4, 5, 6, 7, 8}, 'count up non-trivial ints') + loglist = {} + x_inc2 = 2 + if (8 + 0) > (1 + 0) then + x_inc2 = -x_inc2 + end + for x = 8 + 0, 1 + 0, x_inc2 do + table.insert(loglist, #loglist + 1, x) + end + assertEquals(loglist, {8, 6, 4, 2}, 'count down non-trivial ints') + loglist = {} + x_inc3 = math.abs(1 + 0) + if (5 + 0.5) > (1 + 0) then + x_inc3 = -x_inc3 + end + for x = 5 + 0.5, 1 + 0, x_inc3 do + table.insert(loglist, #loglist + 1, x) + end + assertEquals(loglist, {5.5, 4.5, 3.5, 2.5, 1.5}, 'count with floats') +end + + +-- Describe this function... +function test_count_loops() + log = '' + for x = 1, 8, 1 do + log = log .. x + end + assertEquals(log, '12345678', 'count up') + log = '' + for x = 8, 1, -1 do + log = log .. x + end + assertEquals(log, '87654321', 'count down') + loglist = {} + x_inc4 = 1 + if (1 + 0) > (4 + 0) then + x_inc4 = -x_inc4 + end + for x = 1 + 0, 4 + 0, x_inc4 do + table.insert(loglist, #loglist + 1, x) + end + assertEquals(loglist, {1, 2, 3, 4}, 'count up non-trivial') + loglist = {} + x_inc5 = 1 + if (3 + 1) > (1 + 0) then + x_inc5 = -x_inc5 + end + for x = 3 + 1, 1 + 0, x_inc5 do + table.insert(loglist, #loglist + 1, x) + end + assertEquals(loglist, {4, 3, 2, 1}, 'count down non-trivial') +end + + +-- Describe this function... +function test_continue() + log = '' + count = 0 + while count ~= 8 do + count = count + 1 + if count == 5 then + goto continue + end + log = log .. count + ::continue:: + end + assertEquals(log, '1234678', 'while continue') + log = '' + count = 0 + while not (count == 8) do + count = count + 1 + if count == 5 then + goto continue + end + log = log .. count + ::continue:: + end + assertEquals(log, '1234678', 'until continue') + log = '' + for x = 1, 8, 1 do + if x == 5 then + goto continue + end + log = log .. x + ::continue:: + end + assertEquals(log, '1234678', 'count continue') + log = '' + for _, x in ipairs({'a', 'b', 'c', 'd'}) do + if x == 'c' then + goto continue + end + log = log .. x + ::continue:: + end + assertEquals(log, 'abd', 'for continue') +end + + +-- Describe this function... +function test_break() + count = 1 + while count ~= 10 do + if count == 5 then + break + end + count = count + 1 + end + assertEquals(count, 5, 'while break') + count = 1 + while not (count == 10) do + if count == 5 then + break + end + count = count + 1 + end + assertEquals(count, 5, 'until break') + log = '' + for x = 1, 8, 1 do + if x == 5 then + break + end + log = log .. x + end + assertEquals(log, '1234', 'count break') + log = '' + for _, x in ipairs({'a', 'b', 'c', 'd'}) do + if x == 'c' then + break + end + log = log .. x + end + assertEquals(log, 'ab', 'for break') +end + + +-- Tests the "single" block. +function test_single() + assertEquals(math.sqrt(25), 5, 'sqrt') + assertEquals(math.abs(-25), 25, 'abs') + assertEquals(-(-25), 25, 'negate') + assertEquals(math.log(1), 0, 'ln') + assertEquals(math.log(100, 10), 2, 'log10') + assertEquals(math.exp(2), 7.38905609893065, 'exp') + assertEquals(10 ^ 2, 100, 'power10') +end + + +-- Tests the "arithmetic" block for all operations and checks +-- parenthesis are properly generated for different orders. +function test_arithmetic() + assertEquals(1 + 2, 3, 'add') + assertEquals(1 - 2, -1, 'subtract') + assertEquals(1 - (0 + 2), -1, 'subtract order with add') + assertEquals(1 - (0 - 2), 3, 'subtract order with subtract') + assertEquals(4 * 2.5, 10, 'multiply') + assertEquals(4 * (0 + 2.5), 10, 'multiply order') + assertEquals(8.2 / -5, -1.64, 'divide') + assertEquals(8.2 / (0 + -5), -1.64, 'divide order') + assertEquals(10 ^ 4, 10000, 'power') + assertEquals(10 ^ (0 + 4), 10000, 'power order') +end + + +-- Tests the "trig" block. +function test_trig() + assertEquals(math.sin(math.rad(90)), 1, 'sin') + assertEquals(math.cos(math.rad(180)), -1, 'cos') + assertEquals(math.tan(math.rad(0)), 0, 'tan') + assertEquals(math.deg(math.asin(-1)), -90, 'asin') + assertEquals(math.deg(math.acos(1)), 0, 'acos') + assertEquals(math.deg(math.atan(1)), 45, 'atan') +end + + +-- Tests the "constant" blocks. +function test_constant() + assertEquals(math.floor(math.pi * 1000), 3141, 'const pi') + assertEquals(math.floor(math.exp(1) * 1000), 2718, 'const e') + assertEquals(math.floor(((1 + math.sqrt(5)) / 2) * 1000), 1618, 'const golden') + assertEquals(math.floor(math.sqrt(2) * 1000), 1414, 'const sqrt 2') + assertEquals(math.floor(math.sqrt(1 / 2) * 1000), 707, 'const sqrt 0.5') + assertEquals(9999 < math.huge, true, 'const infinity') +end + + +function math_isPrime(n) + -- https://en.wikipedia.org/wiki/Primality_test#Naive_methods + if n == 2 or n == 3 then + return true + end + -- False if n is NaN, negative, is 1, or not whole. + -- And false if n is divisible by 2 or 3. + if not(n > 1) or n % 1 ~= 0 or n % 2 == 0 or n % 3 == 0 then + return false + end + -- Check all the numbers of form 6k +/- 1, up to sqrt(n). + for x = 6, math.sqrt(n) + 1.5, 6 do + if n % (x - 1) == 0 or n % (x + 1) == 0 then + return false + end + end + return true +end + +-- Tests the "number property" blocks. +function test_number_properties() + assertEquals(42 % 2 == 0, true, 'even') + assertEquals(42.1 % 2 == 1, false, 'odd') + assertEquals(math_isPrime(5), true, 'prime 5') + assertEquals(math_isPrime(25), false, 'prime 25') + assertEquals(math_isPrime(-31.1), false, 'prime negative') + assertEquals(math.pi % 1 == 0, false, 'whole') + assertEquals(math.huge > 0, true, 'positive') + assertEquals(-42 < 0, true, 'negative') + assertEquals(42 % 2 == 0, true, 'divisible') +end + + +-- Tests the "round" block. +function test_round() + assertEquals(math.floor(42.42 + .5), 42, 'round') + assertEquals(math.ceil(-42.42), -42, 'round up') + assertEquals(math.floor(42.42), 42, 'round down') +end + + +-- Tests the "change" block. +function test_change() + varToChange = 100 + varToChange = varToChange + 42 + assertEquals(varToChange, 142, 'change') +end + + +function math_sum(t) + local result = 0 + for _, v in ipairs(t) do + result = result + v + end + return result +end + +function math_min(t) + if #t == 0 then + return 0 + end + local result = math.huge + for _, v in ipairs(t) do + if v < result then + result = v + end + end + return result +end + +function math_max(t) + if #t == 0 then + return 0 + end + local result = -math.huge + for _, v in ipairs(t) do + if v > result then + result = v + end + end + return result +end + +function math_average(t) + if #t == 0 then + return 0 + end + return math_sum(t) / #t +end + +function math_median(t) + -- Source: http://lua-users.org/wiki/SimpleStats + if #t == 0 then + return 0 + end + local temp={} + for _, v in ipairs(t) do + if type(v) == "number" then + table.insert(temp, v) + end + end + table.sort(temp) + if #temp % 2 == 0 then + return (temp[#temp/2] + temp[(#temp/2)+1]) / 2 + else + return temp[math.ceil(#temp/2)] + end +end + +function math_modes(t) + -- Source: http://lua-users.org/wiki/SimpleStats + local counts={} + for _, v in ipairs(t) do + if counts[v] == nil then + counts[v] = 1 + else + counts[v] = counts[v] + 1 + end + end + local biggestCount = 0 + for _, v in pairs(counts) do + if v > biggestCount then + biggestCount = v + end + end + local temp={} + for k, v in pairs(counts) do + if v == biggestCount then + table.insert(temp, k) + end + end + return temp +end + +function math_standard_deviation(t) + local m + local vm + local total = 0 + local count = 0 + local result + m = #t == 0 and 0 or math_sum(t) / #t + for _, v in ipairs(t) do + if type(v) == 'number' then + vm = v - m + total = total + (vm * vm) + count = count + 1 + end + end + result = math.sqrt(total / (count-1)) + return result +end + +function math_random_list(t) + if #t == 0 then + return nil + end + return t[math.random(#t)] +end + +function first_index(t, elem) + for k, v in ipairs(t) do + if v == elem then + return k + end + end + return 0 +end + +-- Tests the "list operation" blocks. +function test_operations_on_list() + assertEquals(math_sum({3, 4, 5}), 12, 'sum') + assertEquals(math_min({3, 4, 5}), 3, 'min') + assertEquals(math_max({3, 4, 5}), 5, 'max') + assertEquals(math_average({3, 4, 5}), 4, 'average') + assertEquals(math_median({3, 4, 5, 1}), 3.5, 'median') + assertEquals(math_modes({3, 4, 3}), {3}, 'modes') + assertEquals(math_modes({3, 4, 3, 1, 4}), {3, 4}, 'modes multiple') + assertEquals(math_standard_deviation({3, 3, 3}), 0, 'standard dev') + assertEquals(first_index({3, 4, 5}, math_random_list({3, 4, 5})) > 0, true, 'random') +end + + +-- Tests the "mod" block. +function test_mod() + assertEquals(42 % 5, 2, 'mod') +end + + +-- Tests the "constrain" block. +function test_constraint() + assertEquals(math.min(math.max(100, 0), 42), 42, 'constraint') +end + + +-- Tests the "random integer" block. +function test_random_integer() + rand = math.random(5, 10) + assertEquals(rand >= 5 and rand <= 10, true, 'randRange') + assertEquals(rand % 1 == 0, true, 'randInteger') +end + + +-- Tests the "random fraction" block. +function test_random_fraction() + rand = math.random() + assertEquals(rand >= 0 and rand <= 1, true, 'randFloat') +end + + +-- Describe this function... +function test_atan2() + assertEquals(math.deg(math.atan2(5, -5)), 135, 'atan2') + assertEquals(math.deg(math.atan2(-12, 0)), -90, 'atan2') +end + + +-- Checks that the number of calls is one in order +-- to confirm that a function was only called once. +function check_number_of_calls(test_name) + test_name = test_name .. 'number of calls' + assertEquals(number_of_calls, 1, test_name) +end + + +-- Tests the "create text with" block with varying number of inputs. +function test_create_text() + assertEquals('', '', 'no text') + assertEquals(tostring('Hello'), 'Hello', 'create single') + assertEquals(tostring(-1), '-1', 'create single number') + assertEquals('K' .. 9, 'K9', 'create double text') + assertEquals(4 .. 2, '42', 'create double text numbers') + assertEquals(table.concat({1, 2, 3}), '123', 'create triple') + assertEquals(table.concat({1, true and 0 or nil, 'M'}), '10M', 'create order') +end + + +-- Creates an empty string for use with the empty test. +function get_empty() + return '' +end + + +-- Tests the "is empty" block". +function test_empty_text() + assertEquals(#'Google' == 0, false, 'not empty') + assertEquals(#'' == 0, true, 'empty') + assertEquals(#get_empty() == 0, true, 'empty complex') + assertEquals(#(true and '' or nil) == 0, true, 'empty order') +end + + +-- Tests the "length" block. +function test_text_length() + assertEquals(#'', 0, 'zero length') + assertEquals(#'Google', 6, 'non-zero length') + assertEquals(#(true and 'car' or nil), 3, 'length order') +end + + +-- Tests the "append text" block with different types of parameters. +function test_append() + item = 'Miserable' + item = item .. 'Failure' + assertEquals(item, 'MiserableFailure', 'append text') + item = 12 + item = item .. 34 + assertEquals(item, '1234', 'append number') + item = 'Something ' + item = item .. (true and 'Positive' or nil) + assertEquals(item, 'Something Positive', 'append order') +end + + +function firstIndexOf(str, substr) + local i = string.find(str, substr, 1, true) + if i == nil then + return 0 + else + return i + end +end + +function lastIndexOf(str, substr) + local i = string.find(string.reverse(str), string.reverse(substr), 1, true) + if i then + return #str + 2 - i - #substr + end + return 0 +end + +-- Tests the "find" block with a variable. +function test_find_text_simple() + text = 'Banana' + assertEquals(firstIndexOf(text, 'an'), 2, 'find first simple') + assertEquals(lastIndexOf(text, 'an'), 4, 'find last simple') + assertEquals(firstIndexOf(text, 'Peel'), 0, 'find none simple') +end + + +-- Creates a string for use with the find test. +function get_fruit() + number_of_calls = number_of_calls + 1 + return 'Banana' +end + + +-- Tests the "find" block with a function call. +function test_find_text_complex() + number_of_calls = 0 + assertEquals(firstIndexOf(get_fruit(), 'an'), 2, 'find first complex') + check_number_of_calls('find first complex') + number_of_calls = 0 + assertEquals(firstIndexOf(true and get_fruit() or nil, 'an'), 2, 'find first order complex') + check_number_of_calls('find first order complex') + number_of_calls = 0 + assertEquals(lastIndexOf(get_fruit(), 'an'), 4, 'find last complex') + check_number_of_calls('find last complex') + number_of_calls = 0 + assertEquals(lastIndexOf(true and get_fruit() or nil, 'an'), 4, 'find last order complex') + check_number_of_calls('find last order complex') + number_of_calls = 0 + assertEquals(firstIndexOf(get_fruit(), 'Peel'), 0, 'find none complex') + check_number_of_calls('find none complex') + number_of_calls = 0 + assertEquals(firstIndexOf(true and get_fruit() or nil, 'Peel'), 0, 'find none order complex') + check_number_of_calls('find none order complex') +end + + +function text_random_letter(str) + local index = math.random(string.len(str)) + return string.sub(str, index, index) +end + +function text_char_at(str, index) + return string.sub(str, index, index) +end + +-- Tests the "get letter" block with a variable. +function test_get_text_simple() + text = 'Blockly' + assertEquals(string.sub(text, 1, 1), 'B', 'get first simple') + assertEquals(string.sub(text, -1, -1), 'y', 'get last simple') + assertEquals(firstIndexOf(text, text_random_letter(text)) > 0, true, 'get random simple') + assertEquals(string.sub(text, 3, 3), 'o', 'get # simple') + assertEquals(text_char_at(text, true and 3 or nil), 'o', 'get # order simple') + assertEquals(string.sub(text, -3, -3), 'k', 'get #-end simple') + -- The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(text_char_at(text, -(0 + 3)), 'k', 'get #-end order simple') +end + + +-- Creates a string for use with the get test. +function get_Blockly() + number_of_calls = number_of_calls + 1 + return 'Blockly' +end + + +-- Tests the "get letter" block with a function call. +function test_get_text_complex() + text = 'Blockly' + number_of_calls = 0 + assertEquals(string.sub(get_Blockly(), 1, 1), 'B', 'get first complex') + check_number_of_calls('get first complex') + number_of_calls = 0 + assertEquals(string.sub(true and get_Blockly() or nil, 1, 1), 'B', 'get first order complex') + check_number_of_calls('get first order complex') + number_of_calls = 0 + assertEquals(string.sub(get_Blockly(), -1, -1), 'y', 'get last complex') + check_number_of_calls('get last complex') + number_of_calls = 0 + assertEquals(string.sub(true and get_Blockly() or nil, -1, -1), 'y', 'get last order complex') + check_number_of_calls('get last order complex') + number_of_calls = 0 + assertEquals(firstIndexOf(text, text_random_letter(get_Blockly())) > 0, true, 'get random complex') + check_number_of_calls('get random complex') + number_of_calls = 0 + assertEquals(firstIndexOf(text, text_random_letter(true and get_Blockly() or nil)) > 0, true, 'get random order complex') + check_number_of_calls('get random order complex') + number_of_calls = 0 + assertEquals(string.sub(get_Blockly(), 3, 3), 'o', 'get # complex') + check_number_of_calls('get # complex') + number_of_calls = 0 + assertEquals(text_char_at(true and get_Blockly() or nil, true and 3 or nil), 'o', 'get # order complex') + check_number_of_calls('get # order complex') + number_of_calls = 0 + assertEquals(string.sub(get_Blockly(), -3, -3), 'k', 'get #-end complex') + check_number_of_calls('get #-end complex') + number_of_calls = 0 + -- The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(text_char_at(true and get_Blockly() or nil, -(0 + 3)), 'k', 'get #-end order complex') + check_number_of_calls('get #-end order complex') +end + + +-- Creates a string for use with the substring test. +function get_numbers() + number_of_calls = number_of_calls + 1 + return '123456789' +end + + +-- Tests the "get substring" block with a variable. +function test_substring_simple() + text = '123456789' + assertEquals(string.sub(text, 2, 3), '23', 'substring # simple') + assertEquals(string.sub(text, true and 2 or nil, true and 3 or nil), '23', 'substring # simple order') + assertEquals(string.sub(text, -3, -2), '78', 'substring #-end simple') + -- The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(string.sub(text, -(0 + 3), -(0 + 2)), '78', 'substring #-end simple order') + assertEquals(string.sub(text, 1, -1), text, 'substring first-last simple') + assertEquals(string.sub(text, 2, -2), '2345678', 'substring # #-end simple') + assertEquals(string.sub(text, -7, 4), '34', 'substring #-end # simple') + assertEquals(string.sub(text, 1, 4), '1234', 'substring first # simple') + assertEquals(string.sub(text, 1, -2), '12345678', 'substring first #-end simple') + assertEquals(string.sub(text, 7, -1), '789', 'substring # last simple') + assertEquals(string.sub(text, -3, -1), '789', 'substring #-end last simple') + assertEquals(string.sub(text, 1, -1), '123456789', 'substring all with # #-end simple') + assertEquals(string.sub(text, -9, 9), '123456789', 'substring all with #-end # simple') + -- Checks that the whole string is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where substring uses [x:length - y] for # #-end. + assertEquals(string.sub(text, 0 + 1, -(0 + 1)), '123456789', 'substring all with # #-end math simple') +end + + +-- Tests the "get substring" block with a function call. +function test_substring_complex() + number_of_calls = 0 + assertEquals(string.sub(get_numbers(), 2, 3), '23', 'substring # complex') + check_number_of_calls('substring # complex') + number_of_calls = 0 + assertEquals(string.sub(true and get_numbers() or nil, true and 2 or nil, true and 3 or nil), '23', 'substring # complex order') + check_number_of_calls('substring # complex order') + number_of_calls = 0 + -- The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(string.sub(get_numbers(), -3, -2), '78', 'substring #-end complex') + check_number_of_calls('substring #-end complex') + number_of_calls = 0 + assertEquals(string.sub(true and get_numbers() or nil, -(0 + 3), -(0 + 2)), '78', 'substring #-end order order') + check_number_of_calls('substring #-end order order') + number_of_calls = 0 + assertEquals(string.sub(get_numbers(), 1, -1), text, 'substring first-last') + check_number_of_calls('substring first-last') + number_of_calls = 0 + assertEquals(string.sub(get_numbers(), 2, -2), '2345678', 'substring # #-end complex') + check_number_of_calls('substring # #-end complex') + number_of_calls = 0 + assertEquals(string.sub(get_numbers(), -7, 4), '34', 'substring #-end # complex') + check_number_of_calls('substring #-end # complex') + number_of_calls = 0 + assertEquals(string.sub(get_numbers(), 1, 4), '1234', 'substring first # complex') + check_number_of_calls('substring first # complex') + number_of_calls = 0 + assertEquals(string.sub(get_numbers(), 1, -2), '12345678', 'substring first #-end complex') + check_number_of_calls('substring first #-end complex') + number_of_calls = 0 + assertEquals(string.sub(get_numbers(), 7, -1), '789', 'substring # last complex') + check_number_of_calls('substring # last complex') + number_of_calls = 0 + assertEquals(string.sub(get_numbers(), -3, -1), '789', 'substring #-end last complex') + check_number_of_calls('substring #-end last complex') + number_of_calls = 0 + assertEquals(string.sub(get_numbers(), 1, -1), '123456789', 'substring all with # #-end complex') + check_number_of_calls('substring all with # #-end complex') + number_of_calls = 0 + assertEquals(string.sub(get_numbers(), -9, 9), '123456789', 'substring all with #-end # complex') + check_number_of_calls('substring all with #-end # complex') + number_of_calls = 0 + -- Checks that the whole string is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where substring uses [x:length - y] for # #-end. + assertEquals(string.sub(get_numbers(), 0 + 1, -(0 + 1)), '123456789', 'substring all with # #-end math complex') + check_number_of_calls('substring all with # #-end math complex') +end + + +function text_titlecase(str) + local buf = {} + local inWord = false + for i = 1, #str do + local c = string.sub(str, i, i) + if inWord then + table.insert(buf, string.lower(c)) + if string.find(c, "%s") then + inWord = false + end + else + table.insert(buf, string.upper(c)) + inWord = true + end + end + return table.concat(buf) +end + +-- Tests the "change casing" block. +function test_case() + text = 'Hello World' + assertEquals(string.upper(text), 'HELLO WORLD', 'uppercase') + assertEquals(string.upper(true and text or nil), 'HELLO WORLD', 'uppercase order') + text = 'Hello World' + assertEquals(string.lower(text), 'hello world', 'lowercase') + assertEquals(string.lower(true and text or nil), 'hello world', 'lowercase order') + text = 'heLLo WorlD' + assertEquals(text_titlecase(text), 'Hello World', 'titlecase') + assertEquals(text_titlecase(true and text or nil), 'Hello World', 'titlecase order') +end + + +-- Tests the "trim" block. +function test_trim() + text = ' abc def ' + assertEquals(string.gsub(text, "^%s*(.-)%s*$", "%1"), 'abc def', 'trim both') + assertEquals(string.gsub(true and text or nil, "^%s*(.-)%s*$", "%1"), 'abc def', 'trim both order') + assertEquals(string.gsub(text, "^%s*(,-)", "%1"), 'abc def ', 'trim left') + assertEquals(string.gsub(true and text or nil, "^%s*(,-)", "%1"), 'abc def ', 'trim left order') + assertEquals(string.gsub(text, "(.-)%s*$", "%1"), ' abc def', 'trim right') + assertEquals(string.gsub(true and text or nil, "(.-)%s*$", "%1"), ' abc def', 'trim right order') +end + + +function text_count(haystack, needle) + if #needle == 0 then + return #haystack + 1 + end + local i = 1 + local count = 0 + while true do + i = string.find(haystack, needle, i, true) + if i == nil then + break + end + count = count + 1 + i = i + #needle + end + return count +end + +-- Tests the "trim" block. +function test_count_text() + text = 'woolloomooloo' + assertEquals(text_count(text, 'o'), 8, 'len 1') + assertEquals(text_count(text, 'oo'), 4, 'len 2') + assertEquals(text_count(text, 'loo'), 2, 'len 3') + assertEquals(text_count(text, 'wool'), 1, 'start') + assertEquals(text_count(text, 'chicken'), 0, 'missing') + assertEquals(text_count(text, ''), 14, 'empty needle') + assertEquals(text_count('', 'chicken'), 0, 'empty source') +end + + +-- Tests the "trim" block. +function test_text_reverse() + assertEquals(string.reverse(''), '', 'empty string') + assertEquals(string.reverse('a'), 'a', 'len 1') + assertEquals(string.reverse('ab'), 'ba', 'len 2') + assertEquals(string.reverse('woolloomooloo'), 'ooloomoolloow', 'longer') +end + + +function text_replace(haystack, needle, replacement) + local buf = {} + local i = 1 + while i <= #haystack do + if string.sub(haystack, i, i + #needle - 1) == needle then + for j = 1, #replacement do + table.insert(buf, string.sub(replacement, j, j)) + end + i = i + #needle + else + table.insert(buf, string.sub(haystack, i, i)) + i = i + 1 + end + end + return table.concat(buf) +end + +-- Tests the "trim" block. +function test_replace() + assertEquals(text_replace('woolloomooloo', 'oo', '123'), 'w123ll123m123l123', 'replace all instances 1') + assertEquals(text_replace('woolloomooloo', '.oo', 'X'), 'woolloomooloo', 'literal string replacement') + assertEquals(text_replace('woolloomooloo', 'abc', 'X'), 'woolloomooloo', 'not found') + assertEquals(text_replace('woolloomooloo', 'o', ''), 'wllml', 'empty replacement 1') + assertEquals(text_replace('aaaaa', 'aaaaa', ''), '', 'empty replacement 2') + assertEquals(text_replace('aaaaa', 'a', ''), '', 'empty replacement 3') + assertEquals(text_replace('', 'a', 'chicken'), '', 'empty source') +end + + +-- Checks that the number of calls is one in order +-- to confirm that a function was only called once. +function check_number_of_calls2(test_name) + test_name = test_name .. 'number of calls' + assertEquals(number_of_calls, 1, test_name) +end + + +function create_list_repeated(item, count) + local t = {} + for i = 1, count do + table.insert(t, item) + end + return t +end + +-- Tests the "create list with" and "create empty list" blocks. +function test_create_lists() + assertEquals({}, {}, 'create empty') + assertEquals({true, 'love'}, {true, 'love'}, 'create items') + assertEquals(create_list_repeated('Eject', 3), {'Eject', 'Eject', 'Eject'}, 'create repeated') + assertEquals(create_list_repeated('Eject', 0 + 3), {'Eject', 'Eject', 'Eject'}, 'create repeated order') +end + + +-- Creates an empty list for use with the empty test. +function get_empty_list() + return {} +end + + +-- Tests the "is empty" block. +function test_lists_empty() + assertEquals(#{0} == 0, false, 'not empty') + assertEquals(#{} == 0, true, 'empty') + assertEquals(#get_empty_list() == 0, true, 'empty complex') + assertEquals(#(true and {} or nil) == 0, true, 'empty order') +end + + +-- Tests the "length" block. +function test_lists_length() + assertEquals(#{}, 0, 'zero length') + assertEquals(#{'cat'}, 1, 'one length') + assertEquals(#{'cat', true, {}}, 3, 'three length') + assertEquals(#(true and {'cat', true} or nil), 2, 'two length order') +end + + +function last_index(t, elem) + for i = #t, 1, -1 do + if t[i] == elem then + return i + end + end + return 0 +end + +-- Tests the "find" block with a variable. +function test_find_lists_simple() + list = {'Alice', 'Eve', 'Bob', 'Eve'} + assertEquals(first_index(list, 'Eve'), 2, 'find first simple') + assertEquals(last_index(list, 'Eve'), 4, 'find last simple') + assertEquals(first_index(list, 'Dave'), 0, 'find none simple') +end + + +-- Creates a list for use with the find test. +function get_names() + number_of_calls = number_of_calls + 1 + return {'Alice', 'Eve', 'Bob', 'Eve'} +end + + +-- Tests the "find" block with a function call. +function test_find_lists_complex() + number_of_calls = 0 + assertEquals(first_index(get_names(), 'Eve'), 2, 'find first complex') + check_number_of_calls('find first complex') + number_of_calls = 0 + assertEquals(first_index(true and get_names() or nil, 'Eve'), 2, 'find first order complex') + check_number_of_calls('find first order complex') + number_of_calls = 0 + assertEquals(last_index(get_names(), 'Eve'), 4, 'find last complex') + check_number_of_calls('find last complex') + number_of_calls = 0 + assertEquals(last_index(true and get_names() or nil, 'Eve'), 4, 'find last order complex') + check_number_of_calls('find last order complex') + number_of_calls = 0 + assertEquals(first_index(get_names(), 'Dave'), 0, 'find none complex') + check_number_of_calls('find none complex') + number_of_calls = 0 + assertEquals(first_index(true and get_names() or nil, 'Dave'), 0, 'find none order complex') + check_number_of_calls('find none order complex') +end + + +-- Tests the "get" block with a variable. +function test_get_lists_simple() + list = {'Kirk', 'Spock', 'McCoy'} + assertEquals(list[1], 'Kirk', 'get first simple') + assertEquals(list[#list], 'McCoy', 'get last simple') + assertEquals(first_index(list, list[math.random(#list)]) > 0, true, 'get random simple') + assertEquals(list[2], 'Spock', 'get # simple') + assertEquals(list[true and 2 or nil], 'Spock', 'get # order simple') + assertEquals(list[#list + 1 - 3], 'Kirk', 'get #-end simple') + -- The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(list[#list + 1 - (0 + 3)], 'Kirk', 'get #-end order simple') +end + + +-- Creates a list for use with the get test. +function get_star_wars() + number_of_calls = number_of_calls + 1 + return {'Kirk', 'Spock', 'McCoy'} +end + + +function list_get_last(t) + return t[#t] +end + +function list_get_random(t) + return t[math.random(#t)] +end + +function list_get_from_end(t, at) + return t[#t + 1 - at] +end + +-- Tests the "get" block with a function call. +function test_get_lists_complex() + list = {'Kirk', 'Spock', 'McCoy'} + number_of_calls = 0 + assertEquals((get_star_wars())[1], 'Kirk', 'get first complex') + check_number_of_calls('get first complex') + number_of_calls = 0 + assertEquals((true and get_star_wars() or nil)[1], 'Kirk', 'get first order complex') + check_number_of_calls('get first order complex') + number_of_calls = 0 + assertEquals(list_get_last((get_star_wars())), 'McCoy', 'get last complex') + check_number_of_calls('get last complex') + number_of_calls = 0 + assertEquals(list_get_last((true and get_star_wars() or nil)), 'McCoy', 'get last order complex') + check_number_of_calls('get last order complex') + number_of_calls = 0 + assertEquals(first_index(list, list_get_random((get_star_wars()))) > 0, true, 'get random complex') + check_number_of_calls('get random complex') + number_of_calls = 0 + assertEquals(first_index(list, list_get_random((true and get_star_wars() or nil))) > 0, true, 'get random order complex') + check_number_of_calls('get random order complex') + number_of_calls = 0 + assertEquals((get_star_wars())[2], 'Spock', 'get # complex') + check_number_of_calls('get # complex') + number_of_calls = 0 + assertEquals((true and get_star_wars() or nil)[true and 2 or nil], 'Spock', 'get # order complex') + check_number_of_calls('get # order complex') + number_of_calls = 0 + assertEquals(list_get_from_end((get_star_wars()), 3), 'Kirk', 'get #-end complex') + check_number_of_calls('get #-end complex') + number_of_calls = 0 + -- The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(list_get_from_end((true and get_star_wars() or nil), 0 + 3), 'Kirk', 'get #-end order complex') + check_number_of_calls('get #-end order complex') +end + + +function list_remove_last(t) + return table.remove(t, #t) +end + +function list_remove_random(t) + return table.remove(t, math.random(#t)) +end + +function list_remove_from_end(t, at) + return table.remove(t, #t + 1 - at) +end + +-- Tests the "get and remove" block. +function test_getRemove() + list = {'Kirk', 'Spock', 'McCoy'} + assertEquals(table.remove(list, 1), 'Kirk', 'getremove first') + assertEquals(list, {'Spock', 'McCoy'}, 'getremove first list') + list = {'Kirk', 'Spock', 'McCoy'} + assertEquals(table.remove((true and list or nil), 1), 'Kirk', 'getremove first order') + assertEquals(list, {'Spock', 'McCoy'}, 'getremove first order list') + list = {'Kirk', 'Spock', 'McCoy'} + assertEquals(table.remove(list, #list), 'McCoy', 'getremove last') + assertEquals(list, {'Kirk', 'Spock'}, 'getremove last list') + list = {'Kirk', 'Spock', 'McCoy'} + assertEquals(list_remove_last((true and list or nil)), 'McCoy', 'getremove last order') + assertEquals(list, {'Kirk', 'Spock'}, 'getremove last order list') + list = {'Kirk', 'Spock', 'McCoy'} + assertEquals(first_index(list, table.remove(list, math.random(#list))) == 0, true, 'getremove random') + assertEquals(#list, 2, 'getremove random list') + list = {'Kirk', 'Spock', 'McCoy'} + assertEquals(first_index(list, list_remove_random((true and list or nil))) == 0, true, 'getremove random order') + assertEquals(#list, 2, 'getremove random order list') + list = {'Kirk', 'Spock', 'McCoy'} + assertEquals(table.remove(list, 2), 'Spock', 'getremove #') + assertEquals(list, {'Kirk', 'McCoy'}, 'getremove # list') + list = {'Kirk', 'Spock', 'McCoy'} + assertEquals(table.remove((true and list or nil), true and 2 or nil), 'Spock', 'getremove # order') + assertEquals(list, {'Kirk', 'McCoy'}, 'getremove # order list') + list = {'Kirk', 'Spock', 'McCoy'} + assertEquals(table.remove(list, #list + 1 - 3), 'Kirk', 'getremove #-end') + assertEquals(list, {'Spock', 'McCoy'}, 'getremove #-end list') + list = {'Kirk', 'Spock', 'McCoy'} + -- The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(list_remove_from_end((true and list or nil), 0 + 3), 'Kirk', 'getremove #-end order') + assertEquals(list, {'Spock', 'McCoy'}, 'getremove #-end order list') +end + + +-- Tests the "remove" block. +function test_remove() + list = {'Kirk', 'Spock', 'McCoy'} + table.remove(list, 1) + assertEquals(list, {'Spock', 'McCoy'}, 'remove first list') + list = {'Kirk', 'Spock', 'McCoy'} + table.remove((true and list or nil), 1) + assertEquals(list, {'Spock', 'McCoy'}, 'remove first order list') + list = {'Kirk', 'Spock', 'McCoy'} + table.remove(list, #list) + assertEquals(list, {'Kirk', 'Spock'}, 'remove last list') + list = {'Kirk', 'Spock', 'McCoy'} + tmp_list = (true and list or nil) + table.remove(tmp_list, #tmp_list) + assertEquals(list, {'Kirk', 'Spock'}, 'remove last order list') + list = {'Kirk', 'Spock', 'McCoy'} + table.remove(list, math.random(#list)) + assertEquals(#list, 2, 'remove random list') + list = {'Kirk', 'Spock', 'McCoy'} + tmp_list2 = (true and list or nil) + table.remove(tmp_list2, math.random(#tmp_list2)) + assertEquals(#list, 2, 'remove random order list') + list = {'Kirk', 'Spock', 'McCoy'} + table.remove(list, 2) + assertEquals(list, {'Kirk', 'McCoy'}, 'remove # list') + list = {'Kirk', 'Spock', 'McCoy'} + table.remove((true and list or nil), true and 2 or nil) + assertEquals(list, {'Kirk', 'McCoy'}, 'remove # order list') + list = {'Kirk', 'Spock', 'McCoy'} + table.remove(list, #list + 1 - 3) + assertEquals(list, {'Spock', 'McCoy'}, 'remove #-end list') + list = {'Kirk', 'Spock', 'McCoy'} + -- The order for index for #-end is addition because this will catch + -- errors in generators where most perform the operation ... - index. + tmp_list3 = (true and list or nil) + table.remove(tmp_list3, #tmp_list3 + 1 - (0 + 3)) + assertEquals(list, {'Spock', 'McCoy'}, 'remove #-end order list') +end + + +-- Tests the "set" block. +function test_set() + list = {'Picard', 'Riker', 'Crusher'} + list[1] = 'Jean-Luc' + assertEquals(list, {'Jean-Luc', 'Riker', 'Crusher'}, 'set first list') + list = {'Picard', 'Riker', 'Crusher'} + (true and list or nil)[1] = 'Jean-Luc' + assertEquals(list, {'Jean-Luc', 'Riker', 'Crusher'}, 'set first order list') + list = {'Picard', 'Riker', 'Crusher'} + list[#list] = 'Beverly' + assertEquals(list, {'Picard', 'Riker', 'Beverly'}, 'set last list') + list = {'Picard', 'Riker', 'Crusher'} + tmp_list4 = (true and list or nil) + tmp_list4[#tmp_list4] = 'Beverly' + assertEquals(list, {'Picard', 'Riker', 'Beverly'}, 'set last order list') + list = {'Picard', 'Riker', 'Crusher'} + list[math.random(#list)] = 'Data' + assertEquals(#list, 3, 'set random list') + list = {'Picard', 'Riker', 'Crusher'} + tmp_list5 = (true and list or nil) + tmp_list5[math.random(#tmp_list5)] = 'Data' + assertEquals(#list, 3, 'set random order list') + list = {'Picard', 'Riker', 'Crusher'} + list[3] = 'Pulaski' + assertEquals(list, {'Picard', 'Riker', 'Pulaski'}, 'set # list') + list = {'Picard', 'Riker', 'Crusher'} + (true and list or nil)[(true and 3 or nil)] = 'Pulaski' + assertEquals(list, {'Picard', 'Riker', 'Pulaski'}, 'set # order list') + list = {'Picard', 'Riker', 'Crusher'} + list[#list + 1 - 1] = 'Pulaski' + assertEquals(list, {'Picard', 'Riker', 'Pulaski'}, 'set #-end list') + list = {'Picard', 'Riker', 'Crusher'} + -- The order for index for #-end is addition because this will catch + -- errors in generators where most perform the operation ... - index. + tmp_list6 = (true and list or nil) + tmp_list6[#tmp_list6 + 1 - (0 + 2)] = 'Pulaski' + assertEquals(list, {'Picard', 'Pulaski', 'Crusher'}, 'set #-end order list') +end + + +-- Tests the "insert" block. +function test_insert() + list = {'Picard', 'Riker', 'Crusher'} + table.insert(list, 1, 'Data') + assertEquals(list, {'Data', 'Picard', 'Riker', 'Crusher'}, 'insert first list') + list = {'Picard', 'Riker', 'Crusher'} + table.insert((true and list or nil), 1, 'Data') + assertEquals(list, {'Data', 'Picard', 'Riker', 'Crusher'}, 'insert first order list') + list = {'Picard', 'Riker', 'Crusher'} + table.insert(list, #list + 1, 'Data') + assertEquals(list, {'Picard', 'Riker', 'Crusher', 'Data'}, 'insert last list') + list = {'Picard', 'Riker', 'Crusher'} + tmp_list7 = (true and list or nil) + table.insert(tmp_list7, #tmp_list7 + 1, 'Data') + assertEquals(list, {'Picard', 'Riker', 'Crusher', 'Data'}, 'insert last order list') + list = {'Picard', 'Riker', 'Crusher'} + table.insert(list, math.random(#list), 'Data') + assertEquals(#list, 4, 'insert random list') + list = {'Picard', 'Riker', 'Crusher'} + tmp_list8 = (true and list or nil) + table.insert(tmp_list8, math.random(#tmp_list8), 'Data') + assertEquals(#list, 4, 'insert random order list') + list = {'Picard', 'Riker', 'Crusher'} + table.insert(list, 3, 'Data') + assertEquals(list, {'Picard', 'Riker', 'Data', 'Crusher'}, 'insert # list') + list = {'Picard', 'Riker', 'Crusher'} + table.insert((true and list or nil), (true and 3 or nil), 'Data') + assertEquals(list, {'Picard', 'Riker', 'Data', 'Crusher'}, 'insert # order list') + list = {'Picard', 'Riker', 'Crusher'} + table.insert(list, #list + 1 - 1, 'Data') + assertEquals(list, {'Picard', 'Riker', 'Data', 'Crusher'}, 'insert #-end list') + list = {'Picard', 'Riker', 'Crusher'} + -- The order for index for #-end is addition because this will catch + -- errors in generators where most perform the operation ... - index. + tmp_list9 = (true and list or nil) + table.insert(tmp_list9, #tmp_list9 + 1 - (0 + 2), 'Data') + assertEquals(list, {'Picard', 'Data', 'Riker', 'Crusher'}, 'insert #-end order list') +end + + +function list_sublist_from_start_from_start(source, at1, at2) + local t = {} + local start = at1 + local finish = at2 + for i = start, finish do + table.insert(t, source[i]) + end + return t +end + +function list_sublist_from_end_from_end(source, at1, at2) + local t = {} + local start = #source + 1 - at1 + local finish = #source + 1 - at2 + for i = start, finish do + table.insert(t, source[i]) + end + return t +end + +function list_sublist_first_last(source) + local t = {} + local start = 1 + local finish = #source + for i = start, finish do + table.insert(t, source[i]) + end + return t +end + +function list_sublist_from_start_from_end(source, at1, at2) + local t = {} + local start = at1 + local finish = #source + 1 - at2 + for i = start, finish do + table.insert(t, source[i]) + end + return t +end + +function list_sublist_from_end_from_start(source, at1, at2) + local t = {} + local start = #source + 1 - at1 + local finish = at2 + for i = start, finish do + table.insert(t, source[i]) + end + return t +end + +function list_sublist_first_from_start(source, at2) + local t = {} + local start = 1 + local finish = at2 + for i = start, finish do + table.insert(t, source[i]) + end + return t +end + +function list_sublist_first_from_end(source, at2) + local t = {} + local start = 1 + local finish = #source + 1 - at2 + for i = start, finish do + table.insert(t, source[i]) + end + return t +end + +function list_sublist_from_start_last(source, at1) + local t = {} + local start = at1 + local finish = #source + for i = start, finish do + table.insert(t, source[i]) + end + return t +end + +function list_sublist_from_end_last(source, at1) + local t = {} + local start = #source + 1 - at1 + local finish = #source + for i = start, finish do + table.insert(t, source[i]) + end + return t +end + +-- Tests the "get sub-list" block with a variable. +function test_sublist_simple() + list = {'Columbia', 'Challenger', 'Discovery', 'Atlantis', 'Endeavour'} + assertEquals(list_sublist_from_start_from_start(list, 2, 3), {'Challenger', 'Discovery'}, 'sublist # simple') + assertEquals(list_sublist_from_start_from_start(list, true and 2 or nil, true and 3 or nil), {'Challenger', 'Discovery'}, 'sublist # simple order') + assertEquals(list_sublist_from_end_from_end(list, 3, 2), {'Discovery', 'Atlantis'}, 'sublist #-end simple') + -- The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(list_sublist_from_end_from_end(list, 0 + 3, 0 + 2), {'Discovery', 'Atlantis'}, 'sublist #-end simple order') + assertEquals(list_sublist_first_last(list), list, 'sublist first-last simple') + changing_list = {'Columbia', 'Challenger', 'Discovery', 'Atlantis', 'Endeavour'} + list_copy = list_sublist_first_last(changing_list) + table.remove(changing_list, math.random(#changing_list)) + assertEquals(list_copy, list, 'sublist first-last simple copy check') + assertEquals(list_sublist_from_start_from_end(list, 2, 2), {'Challenger', 'Discovery', 'Atlantis'}, 'sublist # #-end simple') + assertEquals(list_sublist_from_end_from_start(list, 3, 4), {'Discovery', 'Atlantis'}, 'sublist #-end # simple') + assertEquals(list_sublist_first_from_start(list, 4), {'Columbia', 'Challenger', 'Discovery', 'Atlantis'}, 'sublist first # simple') + assertEquals(list_sublist_first_from_end(list, 4), {'Columbia', 'Challenger'}, 'sublist first #-end simple') + assertEquals(list_sublist_from_start_last(list, 4), {'Atlantis', 'Endeavour'}, 'sublist # last simple') + assertEquals(list_sublist_from_end_last(list, 4), {'Challenger', 'Discovery', 'Atlantis', 'Endeavour'}, 'sublist #-end last simple') + assertEquals(list_sublist_from_start_from_end(list, 1, 1), list, 'sublist all with # #-end simple') + assertEquals(list_sublist_from_end_from_start(list, 5, 5), list, 'sublist all with #-end # simple') + -- Checks that the whole list is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where sublist uses [x:length - y] for # #-end. + assertEquals(list_sublist_from_start_from_end(list, 0 + 1, 0 + 1), list, 'sublist all with # #-end math simple') +end + + +-- Creates a list for use with the sublist test. +function get_space_shuttles() + number_of_calls = number_of_calls + 1 + return {'Columbia', 'Challenger', 'Discovery', 'Atlantis', 'Endeavour'} +end + + +-- Tests the "get sub-list" block with a function call. +function test_sublist_complex() + number_of_calls = 0 + assertEquals(list_sublist_from_start_from_start(get_space_shuttles(), 2, 3), {'Challenger', 'Discovery'}, 'sublist # start complex') + check_number_of_calls('sublist # start complex') + number_of_calls = 0 + assertEquals(list_sublist_from_start_from_start(true and get_space_shuttles() or nil, true and 2 or nil, true and 3 or nil), {'Challenger', 'Discovery'}, 'sublist # start order complex') + check_number_of_calls('sublist # start order complex') + number_of_calls = 0 + -- The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(list_sublist_from_end_from_end(get_space_shuttles(), 3, 2), {'Discovery', 'Atlantis'}, 'sublist # end complex') + assertEquals(number_of_calls, 1, 'sublist # end complex number of calls') + number_of_calls = 0 + assertEquals(list_sublist_from_end_from_end(true and get_space_shuttles() or nil, 0 + 3, 0 + 2), {'Discovery', 'Atlantis'}, 'sublist # end order complex') + check_number_of_calls('sublist # end order complex') + number_of_calls = 0 + assertEquals(list_sublist_first_last(get_space_shuttles()), list, 'sublist first-last complex') + check_number_of_calls('sublist first-last complex') + number_of_calls = 0 + assertEquals(list_sublist_from_start_from_end(get_space_shuttles(), 2, 2), {'Challenger', 'Discovery', 'Atlantis'}, 'sublist # #-end complex') + check_number_of_calls('sublist # #-end complex') + number_of_calls = 0 + assertEquals(list_sublist_from_end_from_start(get_space_shuttles(), 3, 4), {'Discovery', 'Atlantis'}, 'sublist #-end # complex') + check_number_of_calls('sublist #-end # complex') + number_of_calls = 0 + assertEquals(list_sublist_first_from_start(get_space_shuttles(), 4), {'Columbia', 'Challenger', 'Discovery', 'Atlantis'}, 'sublist first # complex') + check_number_of_calls('sublist first # complex') + number_of_calls = 0 + assertEquals(list_sublist_first_from_end(get_space_shuttles(), 4), {'Columbia', 'Challenger'}, 'sublist first #-end complex') + check_number_of_calls('sublist first #-end complex') + number_of_calls = 0 + assertEquals(list_sublist_from_start_last(get_space_shuttles(), 4), {'Atlantis', 'Endeavour'}, 'sublist # last complex') + check_number_of_calls('sublist # last complex') + number_of_calls = 0 + assertEquals(list_sublist_from_end_last(get_space_shuttles(), 4), {'Challenger', 'Discovery', 'Atlantis', 'Endeavour'}, 'sublist #-end last simple') + check_number_of_calls('sublist #-end last simple') + number_of_calls = 0 + assertEquals(list_sublist_from_start_from_end(get_space_shuttles(), 1, 1), list, 'sublist all with # #-end complex') + check_number_of_calls('sublist all with # #-end complex') + number_of_calls = 0 + assertEquals(list_sublist_from_end_from_start(get_space_shuttles(), 5, 5), list, 'sublist all with #-end # complex') + check_number_of_calls('sublist all with #-end # complex') + number_of_calls = 0 + -- Checks that the whole list is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where sublist uses [x:length - y] for # #-end. + assertEquals(list_sublist_from_start_from_end(get_space_shuttles(), 0 + 1, 0 + 1), list, 'sublist all with # #-end math complex') + check_number_of_calls('sublist all with # #-end math complex') +end + + +-- Tests the "join" block. +function test_join() + list = {'Vulcan', 'Klingon', 'Borg'} + assertEquals(table.concat(list, ','), 'Vulcan,Klingon,Borg', 'join') + assertEquals(table.concat(true and list or nil, ','), 'Vulcan,Klingon,Borg', 'join order') +end + + +function list_string_split(input, delim) + local t = {} + local pos = 1 + while true do + next_delim = string.find(input, delim, pos) + if next_delim == nil then + table.insert(t, string.sub(input, pos)) + break + else + table.insert(t, string.sub(input, pos, next_delim-1)) + pos = next_delim + #delim + end + end + return t +end + +-- Tests the "split" block. +function test_split() + text = 'Vulcan,Klingon,Borg' + assertEquals(list_string_split(text, ','), {'Vulcan', 'Klingon', 'Borg'}, 'split') + assertEquals(list_string_split(true and text or nil, ','), {'Vulcan', 'Klingon', 'Borg'}, 'split order') +end + + +function list_sort(list, typev, direction) + local t = {} + for n,v in pairs(list) do table.insert(t, v) end + local compareFuncs = { + NUMERIC = function(a, b) + return (tonumber(tostring(a)) or 0) + < (tonumber(tostring(b)) or 0) end, + TEXT = function(a, b) + return tostring(a) < tostring(b) end, + IGNORE_CASE = function(a, b) + return string.lower(tostring(a)) < string.lower(tostring(b)) end + } + local compareTemp = compareFuncs[typev] + local compare = compareTemp + if direction == -1 + then compare = function(a, b) return compareTemp(b, a) end + end + table.sort(t, compare) + return t +end + +-- Tests the "alphabetic sort" block. +function test_sort_alphabetic() + list = {'Vulcan', 'klingon', 'Borg'} + assertEquals(list_sort(list,"TEXT", 1), {'Borg', 'Vulcan', 'klingon'}, 'sort alphabetic ascending') + assertEquals(list_sort(true and list or nil,"TEXT", 1), {'Borg', 'Vulcan', 'klingon'}, 'sort alphabetic ascending order') +end + + +-- Tests the "alphabetic sort ignore case" block. +function test_sort_ignoreCase() + list = {'Vulcan', 'klingon', 'Borg'} + assertEquals(list_sort(list,"IGNORE_CASE", 1), {'Borg', 'klingon', 'Vulcan'}, 'sort ignore case ascending') + assertEquals(list_sort(true and list or nil,"IGNORE_CASE", 1), {'Borg', 'klingon', 'Vulcan'}, 'sort ignore case ascending order') +end + + +-- Tests the "numeric sort" block. +function test_sort_numeric() + list = {8, 18, -1} + assertEquals(list_sort(list,"NUMERIC", -1), {18, 8, -1}, 'sort numeric descending') + assertEquals(list_sort(true and list or nil,"NUMERIC", -1), {18, 8, -1}, 'sort numeric descending order') +end + + +function list_reverse(input) + local reversed = {} + for i = #input, 1, -1 do + table.insert(reversed, input[i]) + end + return reversed +end + +-- Tests the "list reverse" block. +function test_lists_reverse() + list = {8, 18, -1, 64} + assertEquals(list_reverse(list), {64, -1, 18, 8}, 'reverse a copy') + assertEquals(list, {8, 18, -1, 64}, 'reverse a copy original') + list = {} + assertEquals(list_reverse(list), {}, 'empty list') +end + + +-- Describe this function... +function test_colour_picker() + assertEquals('#ff6600', '#ff6600', 'static colour') +end + + +function colour_rgb(r, g, b) + r = math.floor(math.min(100, math.max(0, r)) * 2.55 + .5) + g = math.floor(math.min(100, math.max(0, g)) * 2.55 + .5) + b = math.floor(math.min(100, math.max(0, b)) * 2.55 + .5) + return string.format("#%02x%02x%02x", r, g, b) +end + +-- Describe this function... +function test_rgb() + assertEquals(colour_rgb(100, 40, 0), '#ff6600', 'from rgb') +end + + +-- Describe this function... +function test_colour_random() + for count4 = 1, 100 do + item = string.format("#%06x", math.random(0, 2^24 - 1)) + assertEquals(#item, 7, 'length of random colour string: ' .. item) + assertEquals(string.sub(item, 1, 1), '#', 'format of random colour string: ' .. item) + for i = 1, 6, 1 do + assertEquals(0 ~= firstIndexOf('abcdefABDEF0123456789', text_char_at(item, i + 1)), true, table.concat({'contents of random colour string: ', item, ' at index: ', i + 1})) + end + end +end + + +function colour_blend(colour1, colour2, ratio) + local r1 = tonumber(string.sub(colour1, 2, 3), 16) + local r2 = tonumber(string.sub(colour2, 2, 3), 16) + local g1 = tonumber(string.sub(colour1, 4, 5), 16) + local g2 = tonumber(string.sub(colour2, 4, 5), 16) + local b1 = tonumber(string.sub(colour1, 6, 7), 16) + local b2 = tonumber(string.sub(colour2, 6, 7), 16) + local ratio = math.min(1, math.max(0, ratio)) + local r = math.floor(r1 * (1 - ratio) + r2 * ratio + .5) + local g = math.floor(g1 * (1 - ratio) + g2 * ratio + .5) + local b = math.floor(b1 * (1 - ratio) + b2 * ratio + .5) + return string.format("#%02x%02x%02x", r, g, b) +end + +-- Describe this function... +function test_blend() + assertEquals(colour_blend('#ff0000', colour_rgb(100, 40, 0), 0.4), '#ff2900', 'blend') +end + + +-- Describe this function... +function test_procedure() + procedure_1(8, 2) + assertEquals(proc_z, 4, 'procedure with global') + proc_w = false + procedure_2(false) + assertEquals(proc_w, true, 'procedure no return') + proc_w = false + procedure_2(true) + assertEquals(proc_w, false, 'procedure return') +end + + +-- Describe this function... +function procedure_1(proc_x, proc_y) + proc_z = proc_x / proc_y +end + + +-- Describe this function... +function procedure_2(proc_x) + if proc_x then + return + end + proc_w = true +end + + +-- Describe this function... +function test_function() + assertEquals(function_1(2, 3), -1, 'function with arguments') + assertEquals(func_z, 'side effect', 'function with side effect') + func_a = 'unchanged' + func_c = 'global' + assertEquals(function_2(2), '3global', 'function with global') + assertEquals(func_a, 'unchanged', 'function with scope') + assertEquals(function_3(true), true, 'function return') + assertEquals(function_3(false), false, 'function no return') +end + + +-- Describe this function... +function function_1(func_x, func_y) + func_z = 'side effect' + return func_x - func_y +end + + +-- Describe this function... +function function_2(func_a) + func_a = func_a + 1 + return func_a .. func_c +end + + +-- Describe this function... +function function_3(func_a) + if func_a then + return true + end + return false +end + + +-- Describe this function... +function recurse(n) + if n > 0 then + text = table.concat({recurse(n - 1), n, recurse(n - 1)}) + else + text = '-' + end + return text +end + + + +unittestResults = {} +print('\n====================\n\nRunning suite: Logic') +assertEquals(true, true, 'True') +assertEquals(false, false, 'False') +assertEquals(not false, true, 'Not true') +assertEquals(not true, false, 'Not false') +test_if() +test_ifelse() +test_equalities() +test_and() +test_or() +test_ternary() +print(unittest_report()) +unittestResults = nil + +unittestResults = {} +print('\n====================\n\nRunning suite: Loops 1') +test_repeat() +test_repeat_ext() +test_while() +test_foreach() +print(unittest_report()) +unittestResults = nil + +unittestResults = {} +print('\n====================\n\nRunning suite: Loops 2') +test_count_loops() +test_count_by() +print(unittest_report()) +unittestResults = nil + +unittestResults = {} +print('\n====================\n\nRunning suite: Loops 3') +test_break() +test_continue() +print(unittest_report()) +unittestResults = nil + +unittestResults = {} +print('\n====================\n\nRunning suite: Math') +test_arithmetic() +test_single() +test_trig() +test_constant() +test_change() +test_number_properties() +test_round() +test_operations_on_list() +test_constraint() +test_mod() +test_random_integer() +test_random_fraction() +test_atan2() +print(unittest_report()) +unittestResults = nil + +unittestResults = {} +print('\n====================\n\nRunning suite: Text') +test_text_length() +test_empty_text() +test_create_text() +test_append() +test_find_text_simple() +test_find_text_complex() +test_get_text_simple() +test_get_text_complex() +test_substring_simple() +test_substring_complex() +test_case() +test_trim() +test_count_text() +test_text_reverse() +test_replace() +print(unittest_report()) +unittestResults = nil + +unittestResults = {} +print('\n====================\n\nRunning suite: Lists') +test_create_lists() +test_lists_empty() +test_lists_length() +test_find_lists_simple() +test_find_lists_complex() +test_get_lists_simple() +test_get_lists_complex() +test_getRemove() +test_remove() +test_set() +test_insert() +test_sublist_simple() +test_sublist_complex() +test_join() +test_split() +test_sort_alphabetic() +test_sort_ignoreCase() +test_sort_numeric() +test_lists_reverse() +print(unittest_report()) +unittestResults = nil + +unittestResults = {} +print('\n====================\n\nRunning suite: Colour') +test_colour_picker() +test_blend() +test_rgb() +test_colour_random() +print(unittest_report()) +unittestResults = nil + +unittestResults = {} +print('\n====================\n\nRunning suite: Variables') +item = 123 +assertEquals(item, 123, 'variable') +if2 = 123 +assertEquals(if2, 123, 'reserved variable') +print(unittest_report()) +unittestResults = nil + +local _ = -- Intentionally non-connected variable. +naked + +unittestResults = {} +print('\n====================\n\nRunning suite: Functions') +test_procedure() +test_function() +assertEquals(recurse(3), '-1-2-1-3-1-2-1-', 'test recurse') +print(unittest_report()) +unittestResults = nil diff --git a/js/tests/generators/golden/generated.php b/js/tests/generators/golden/generated.php new file mode 100644 index 0000000..a2d470d --- /dev/null +++ b/js/tests/generators/golden/generated.php @@ -0,0 +1,1696 @@ +$unittestResults; +$test_name; +$naked; +$proc_x; +$proc_y; +$func_x; +$func_y; +$func_a; +$n; +$ok; +$log; +$count; +$varToChange; +$rand; +$item; +$text; +$number_of_calls; +$list2; +$proc_z; +$func_z; +$x; +$proc_w; +$func_c; +$if2; +$i; +$loglist; +$changing_list; +$list_copy; + +function unittest_report() { + global $unittestResults; + // Create test report. + $report = array(); + $summary = array(); + $fails = 0; + for ($x = 0; $x < count($unittestResults); $x++) { + if ($unittestResults[$x][0]) { + array_push($summary, "."); + } else { + array_push($summary, "F"); + $fails++; + array_push($report, ""); + array_push($report, "FAIL: " . $unittestResults[$x][2]); + array_push($report, $unittestResults[$x][1]); + } + } + array_unshift($report, implode("", $summary)); + array_push($report, ""); + array_push($report, "Number of tests run: " . count($unittestResults)); + array_push($report, ""); + if ($fails) { + array_push($report, "FAILED (failures=" . $fails . ")"); + } else { + array_push($report, "OK"); + } + return implode("\n", $report); +} + +function assertEquals($actual, $expected, $message) { + global $unittestResults; + // Asserts that a value equals another value. + if (!is_array($unittestResults)) { + throw new Exception("Orphaned assert: " . $message); + } + if ($actual == $expected) { + array_push($unittestResults, [true, "OK", $message]); + } else { + $expected = is_array($expected) ? implode(" ", $expected) : $expected; + $actual = is_array($actual) ? implode(" ", $actual) : $actual; + array_push($unittestResults, [false, "Expected: " . $expected . "\nActual: " . $actual, $message]); + } +} + +function unittest_fail($message) { + global $unittestResults; + // Always assert an error. + if (!$unittestResults) { + throw new Exception("Orphaned assert fail: " . $message); + } + array_push($unittestResults, [false, "Fail.", $message]); +} + +// Describe this function... +function test_if() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + if (false) { + unittest_fail('if false'); + } + $ok = false; + if (true) { + $ok = true; + } + assertEquals($ok, true, 'if true'); + $ok = false; + if (false) { + unittest_fail('if/else false'); + } else { + $ok = true; + } + assertEquals($ok, true, 'if/else false'); + $ok = false; + if (true) { + $ok = true; + } else { + unittest_fail('if/else true'); + } + assertEquals($ok, true, 'if/else true'); + $ok = false; + if (false) { + unittest_fail('elseif 1'); + } else if (true) { + $ok = true; + } else if (true) { + unittest_fail('elseif 2'); + } else { + unittest_fail('elseif 3'); + } + assertEquals($ok, true, 'elseif 4'); +} + +// Describe this function... +function test_ifelse() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $ok = false; + if (true) { + $ok = true; + } else { + unittest_fail('ifelse true'); + } + assertEquals($ok, true, 'ifelse true'); + $ok = false; + if (false) { + unittest_fail('ifelse false'); + } else { + $ok = true; + } + assertEquals($ok, true, 'ifelse false'); +} + +// Describe this function... +function test_equalities() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + assertEquals(2 == 2, true, 'Equal yes'); + assertEquals(3 == 4, false, 'Equal no'); + assertEquals(5 != 6, true, 'Not equal yes'); + assertEquals(3 == 4, false, 'Not equal no'); + assertEquals(5 < 6, true, 'Smaller yes'); + assertEquals(7 < 7, false, 'Smaller no'); + assertEquals(9 > 8, true, 'Greater yes'); + assertEquals(10 > 10, false, 'Greater no'); + assertEquals(11 <= 11, true, 'Smaller-equal yes'); + assertEquals(13 <= 12, false, 'Smaller-equal no'); + assertEquals(14 >= 14, true, 'Greater-equal yes'); + assertEquals(15 >= 16, false, 'Greater-equal no'); +} + +// Describe this function... +function test_and() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + assertEquals(true && true, true, 'And true/true'); + assertEquals(false && true, false, 'And false/true'); + assertEquals(true && false, false, 'And true/false'); + assertEquals(false && false, false, 'And false/false'); +} + +// Describe this function... +function test_or() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + assertEquals(true || true, true, 'Or true/true'); + assertEquals(false || true, true, 'Or false/true'); + assertEquals(true || false, true, 'Or true/false'); + assertEquals(false || false, false, 'Or false/false'); +} + +// Describe this function... +function test_ternary() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + assertEquals(true ? 42 : 99, 42, 'if true'); + assertEquals(false ? 42 : 99, 99, 'if true'); +} + +// Describe this function... +function test_foreach() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $log = ''; + foreach (array('a', 'b', 'c') as $x) { + $log .= $x; + } + assertEquals($log, 'abc', 'for loop'); +} + +// Describe this function... +function test_repeat() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $count = 0; + for ($count2 = 0; $count2 < 10; $count2++) { + $count += 1; + } + assertEquals($count, 10, 'repeat 10'); +} + +// Describe this function... +function test_while() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + while (false) { + unittest_fail('while 0'); + } + while (!true) { + unittest_fail('until 0'); + } + $count = 1; + while ($count != 10) { + $count += 1; + } + assertEquals($count, 10, 'while 10'); + $count = 1; + while (!($count == 10)) { + $count += 1; + } + assertEquals($count, 10, 'until 10'); +} + +// Describe this function... +function test_repeat_ext() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $count = 0; + for ($count3 = 0; $count3 < 10; $count3++) { + $count += 1; + } + assertEquals($count, 10, 'repeat 10'); +} + +// Describe this function... +function test_count_by() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $log = ''; + for ($x = 1; $x <= 8; $x += 2) { + $log .= $x; + } + assertEquals($log, '1357', 'count up ints'); + $log = ''; + for ($x = 8; $x >= 1; $x -= 2) { + $log .= $x; + } + assertEquals($log, '8642', 'count down ints'); + $loglist = array(); + for ($x = 1; $x <= 8; $x += 1.5) { + array_push($loglist, $x); + } + assertEquals($loglist, array(1, 2.5, 4, 5.5, 7), 'count with floats'); + $loglist = array(); + $_x_start = 1 + 0; + $_x_end = 8 + 0; + $_x_inc = abs(1 - 2); + if ($_x_start > $_x_end) { + $_x_inc = -$_x_inc; + } + for ($x = $_x_start; $_x_inc >= 0 ? $x <= $_x_end : $x >= $_x_end; $x += $_x_inc) { + array_push($loglist, $x); + } + assertEquals($loglist, array(1, 2, 3, 4, 5, 6, 7, 8), 'count up non-trivial ints'); + $loglist = array(); + $_x_start2 = 8 + 0; + $_x_end2 = 1 + 0; + $_x_inc2 = 2; + if ($_x_start2 > $_x_end2) { + $_x_inc2 = -$_x_inc2; + } + for ($x = $_x_start2; $_x_inc2 >= 0 ? $x <= $_x_end2 : $x >= $_x_end2; $x += $_x_inc2) { + array_push($loglist, $x); + } + assertEquals($loglist, array(8, 6, 4, 2), 'count down non-trivial ints'); + $loglist = array(); + $_x_start3 = 5 + 0.5; + $_x_end3 = 1 + 0; + $_x_inc3 = abs(1 + 0); + if ($_x_start3 > $_x_end3) { + $_x_inc3 = -$_x_inc3; + } + for ($x = $_x_start3; $_x_inc3 >= 0 ? $x <= $_x_end3 : $x >= $_x_end3; $x += $_x_inc3) { + array_push($loglist, $x); + } + assertEquals($loglist, array(5.5, 4.5, 3.5, 2.5, 1.5), 'count with floats'); +} + +// Describe this function... +function test_count_loops() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $log = ''; + for ($x = 1; $x <= 8; $x++) { + $log .= $x; + } + assertEquals($log, '12345678', 'count up'); + $log = ''; + for ($x = 8; $x >= 1; $x--) { + $log .= $x; + } + assertEquals($log, '87654321', 'count down'); + $loglist = array(); + $_x_start4 = 1 + 0; + $_x_end4 = 4 + 0; + $_x_inc4 = 1; + if ($_x_start4 > $_x_end4) { + $_x_inc4 = -$_x_inc4; + } + for ($x = $_x_start4; $_x_inc4 >= 0 ? $x <= $_x_end4 : $x >= $_x_end4; $x += $_x_inc4) { + array_push($loglist, $x); + } + assertEquals($loglist, array(1, 2, 3, 4), 'count up non-trivial'); + $loglist = array(); + $_x_start5 = 3 + 1; + $_x_end5 = 1 + 0; + $_x_inc5 = 1; + if ($_x_start5 > $_x_end5) { + $_x_inc5 = -$_x_inc5; + } + for ($x = $_x_start5; $_x_inc5 >= 0 ? $x <= $_x_end5 : $x >= $_x_end5; $x += $_x_inc5) { + array_push($loglist, $x); + } + assertEquals($loglist, array(4, 3, 2, 1), 'count down non-trivial'); +} + +// Describe this function... +function test_continue() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $log = ''; + $count = 0; + while ($count != 8) { + $count += 1; + if ($count == 5) { + continue; + } + $log .= $count; + } + assertEquals($log, '1234678', 'while continue'); + $log = ''; + $count = 0; + while (!($count == 8)) { + $count += 1; + if ($count == 5) { + continue; + } + $log .= $count; + } + assertEquals($log, '1234678', 'until continue'); + $log = ''; + for ($x = 1; $x <= 8; $x++) { + if ($x == 5) { + continue; + } + $log .= $x; + } + assertEquals($log, '1234678', 'count continue'); + $log = ''; + foreach (array('a', 'b', 'c', 'd') as $x) { + if ($x == 'c') { + continue; + } + $log .= $x; + } + assertEquals($log, 'abd', 'for continue'); +} + +// Describe this function... +function test_break() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $count = 1; + while ($count != 10) { + if ($count == 5) { + break; + } + $count += 1; + } + assertEquals($count, 5, 'while break'); + $count = 1; + while (!($count == 10)) { + if ($count == 5) { + break; + } + $count += 1; + } + assertEquals($count, 5, 'until break'); + $log = ''; + for ($x = 1; $x <= 8; $x++) { + if ($x == 5) { + break; + } + $log .= $x; + } + assertEquals($log, '1234', 'count break'); + $log = ''; + foreach (array('a', 'b', 'c', 'd') as $x) { + if ($x == 'c') { + break; + } + $log .= $x; + } + assertEquals($log, 'ab', 'for break'); +} + +// Tests the "single" block. +function test_single() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + assertEquals(sqrt(25), 5, 'sqrt'); + assertEquals(abs(-25), 25, 'abs'); + assertEquals(-(-25), 25, 'negate'); + assertEquals(log(1), 0, 'ln'); + assertEquals(log(100) / log(10), 2, 'log10'); + assertEquals(exp(2), 7.38905609893065, 'exp'); + assertEquals(pow(10,2), 100, 'power10'); +} + +// Tests the "arithmetic" block for all operations and checks +// parenthesis are properly generated for different orders. +function test_arithmetic() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + assertEquals(1 + 2, 3, 'add'); + assertEquals(1 - 2, -1, 'subtract'); + assertEquals(1 - (0 + 2), -1, 'subtract order with add'); + assertEquals(1 - (0 - 2), 3, 'subtract order with subtract'); + assertEquals(4 * 2.5, 10, 'multiply'); + assertEquals(4 * (0 + 2.5), 10, 'multiply order'); + assertEquals(8.2 / -5, -1.64, 'divide'); + assertEquals(8.2 / (0 + -5), -1.64, 'divide order'); + assertEquals(10 ** 4, 10000, 'power'); + assertEquals(10 ** (0 + 4), 10000, 'power order'); +} + +// Tests the "trig" block. +function test_trig() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + assertEquals(sin(90 / 180 * pi()), 1, 'sin'); + assertEquals(cos(180 / 180 * pi()), -1, 'cos'); + assertEquals(tan(0 / 180 * pi()), 0, 'tan'); + assertEquals(asin(-1) / pi() * 180, -90, 'asin'); + assertEquals(acos(1) / pi() * 180, 0, 'acos'); + assertEquals(atan(1) / pi() * 180, 45, 'atan'); +} + +// Tests the "constant" blocks. +function test_constant() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + assertEquals(floor(M_PI * 1000), 3141, 'const pi'); + assertEquals(floor(M_E * 1000), 2718, 'const e'); + assertEquals(floor(((1 + sqrt(5)) / 2) * 1000), 1618, 'const golden'); + assertEquals(floor(M_SQRT2 * 1000), 1414, 'const sqrt 2'); + assertEquals(floor(M_SQRT1_2 * 1000), 707, 'const sqrt 0.5'); + assertEquals(9999 < INF, true, 'const infinity'); +} + +function math_isPrime($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; +} + +// Tests the "number property" blocks. +function test_number_properties() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + assertEquals(42 % 2 == 0, true, 'even'); + assertEquals(42.1 % 2 == 1, false, 'odd'); + assertEquals(math_isPrime(5), true, 'prime 5'); + assertEquals(math_isPrime(25), false, 'prime 25'); + assertEquals(math_isPrime(-31.1), false, 'prime negative'); + assertEquals(is_int(M_PI), false, 'whole'); + assertEquals(INF > 0, true, 'positive'); + assertEquals(-42 < 0, true, 'negative'); + assertEquals(42 % 2 == 0, true, 'divisible'); +} + +// Tests the "round" block. +function test_round() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + assertEquals(round(42.42), 42, 'round'); + assertEquals(ceil(-42.42), -42, 'round up'); + assertEquals(floor(42.42), 42, 'round down'); +} + +// Tests the "change" block. +function test_change() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $varToChange = 100; + $varToChange += 42; + assertEquals($varToChange, 142, 'change'); +} + +function math_mean($myList) { + return array_sum($myList) / count($myList); +} + +function math_median($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; +} + +function math_modes($values) { + if (empty($values)) return array(); + $counts = array_count_values($values); + arsort($counts); // Sort counts in descending order + $modes = array_keys($counts, current($counts), true); + return $modes; +} + +function math_standard_deviation($numbers) { + $n = count($numbers); + if (!$n) return null; + $mean = array_sum($numbers) / count($numbers); + foreach($numbers as $key => $num) $devs[$key] = pow($num - $mean, 2); + return sqrt(array_sum($devs) / (count($devs) - 1)); +} + +function math_random_list($list) { + $x = rand(0, count($list)-1); + return $list[$x]; +} + +function indexOf($haystack, $needle) { + for ($index = 0; $index < count($haystack); $index++) { + if ($haystack[$index] == $needle) return $index + 1; + } + return 0; +} + +// Tests the "list operation" blocks. +function test_operations_on_list() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + assertEquals(array_sum((array(3, 4, 5))), 12, 'sum'); + assertEquals(min((array(3, 4, 5))), 3, 'min'); + assertEquals(max((array(3, 4, 5))), 5, 'max'); + assertEquals(math_mean(array(3, 4, 5)), 4, 'average'); + assertEquals(math_median(array(3, 4, 5, 1)), 3.5, 'median'); + assertEquals(math_modes(array(3, 4, 3)), array(3), 'modes'); + assertEquals(math_modes(array(3, 4, 3, 1, 4)), array(3, 4), 'modes multiple'); + assertEquals(math_standard_deviation(array(3, 3, 3)), 0, 'standard dev'); + assertEquals(indexOf(array(3, 4, 5), math_random_list(array(3, 4, 5))) > 0, true, 'random'); +} + +// Tests the "mod" block. +function test_mod() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + assertEquals(42 % 5, 2, 'mod'); +} + +// Tests the "constrain" block. +function test_constraint() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + assertEquals(min(max(100, 0), 42), 42, 'constraint'); +} + +function math_random_int($a, $b) { + if ($a > $b) { + return rand($b, $a); + } + return rand($a, $b); +} + +// Tests the "random integer" block. +function test_random_integer() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $rand = math_random_int(5, 10); + assertEquals($rand >= 5 && $rand <= 10, true, 'randRange'); + assertEquals(is_int($rand), true, 'randInteger'); +} + +// Tests the "random fraction" block. +function test_random_fraction() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $rand = (float)rand()/(float)getrandmax(); + assertEquals($rand >= 0 && $rand <= 1, true, 'randFloat'); +} + +// Describe this function... +function test_atan2() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + assertEquals(atan2(5, -5) / pi() * 180, 135, 'atan2'); + assertEquals(atan2(-12, 0) / pi() * 180, -90, 'atan2'); +} + +// Checks that the number of calls is one in order +// to confirm that a function was only called once. +function check_number_of_calls($test_name) { + global $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $test_name .= 'number of calls'; + assertEquals($number_of_calls, 1, $test_name); +} + +// Tests the "create text with" block with varying number of inputs. +function test_create_text() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + assertEquals('', '', 'no text'); + assertEquals('Hello', 'Hello', 'create single'); + assertEquals(-1, '-1', 'create single number'); + assertEquals('K' . 9, 'K9', 'create double text'); + assertEquals(4 . 2, '42', 'create double text numbers'); + assertEquals(implode('', array(1,2,3)), '123', 'create triple'); + assertEquals(implode('', array(1,true ? 0 : null,'M')), '10M', 'create order'); +} + +// Creates an empty string for use with the empty test. +function get_empty() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + return ''; +} + +// Tests the "is empty" block". +function test_empty_text() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + assertEquals(empty('Google'), false, 'not empty'); + assertEquals(empty(''), true, 'empty'); + assertEquals(empty(get_empty()), true, 'empty complex'); + assertEquals(empty(true ? '' : null), true, 'empty order'); +} + +function length($value) { + if (is_string($value)) { + return strlen($value); + } else { + return count($value); + } +} + +// Tests the "length" block. +function test_text_length() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + assertEquals(length(''), 0, 'zero length'); + assertEquals(length('Google'), 6, 'non-zero length'); + assertEquals(length(true ? 'car' : null), 3, 'length order'); +} + +// Tests the "append text" block with different types of parameters. +function test_append() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $item = 'Miserable'; + $item .= 'Failure'; + assertEquals($item, 'MiserableFailure', 'append text'); + $item = 12; + $item .= 34; + assertEquals($item, '1234', 'append number'); + $item = 'Something '; + $item .= true ? 'Positive' : null; + assertEquals($item, 'Something Positive', 'append order'); +} + +function text_indexOf($text, $search) { + $pos = strpos($text, $search); + return $pos === false ? 0 : $pos + 1; +} + +function text_lastIndexOf($text, $search) { + $pos = strrpos($text, $search); + return $pos === false ? 0 : $pos + 1; +} + +// Tests the "find" block with a variable. +function test_find_text_simple() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $text = 'Banana'; + assertEquals(text_indexOf($text, 'an'), 2, 'find first simple'); + assertEquals(text_lastIndexOf($text, 'an'), 4, 'find last simple'); + assertEquals(text_indexOf($text, 'Peel'), 0, 'find none simple'); +} + +// Creates a string for use with the find test. +function get_fruit() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $number_of_calls += 1; + return 'Banana'; +} + +// Tests the "find" block with a function call. +function test_find_text_complex() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $number_of_calls = 0; + assertEquals(text_indexOf(get_fruit(), 'an'), 2, 'find first complex'); + check_number_of_calls('find first complex'); + $number_of_calls = 0; + assertEquals(text_indexOf(true ? get_fruit() : null, 'an'), 2, 'find first order complex'); + check_number_of_calls('find first order complex'); + $number_of_calls = 0; + assertEquals(text_lastIndexOf(get_fruit(), 'an'), 4, 'find last complex'); + check_number_of_calls('find last complex'); + $number_of_calls = 0; + assertEquals(text_lastIndexOf(true ? get_fruit() : null, 'an'), 4, 'find last order complex'); + check_number_of_calls('find last order complex'); + $number_of_calls = 0; + assertEquals(text_indexOf(get_fruit(), 'Peel'), 0, 'find none complex'); + check_number_of_calls('find none complex'); + $number_of_calls = 0; + assertEquals(text_indexOf(true ? get_fruit() : null, 'Peel'), 0, 'find none order complex'); + check_number_of_calls('find none order complex'); +} + +function text_random_letter($text) { + return $text[rand(0, strlen($text) - 1)]; +} + +// Tests the "get letter" block with a variable. +function test_get_text_simple() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $text = 'Blockly'; + assertEquals(substr($text, 0, 1), 'B', 'get first simple'); + assertEquals(substr($text, -1), 'y', 'get last simple'); + assertEquals(text_indexOf($text, text_random_letter($text)) > 0, true, 'get random simple'); + assertEquals(substr($text, 2, 1), 'o', 'get # simple'); + assertEquals(substr($text, ((true ? 3 : null) - 1), 1), 'o', 'get # order simple'); + assertEquals(substr($text, -3, 1), 'k', 'get #-end simple'); + // The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(substr($text, (-(0 + 3)), 1), 'k', 'get #-end order simple'); +} + +// Creates a string for use with the get test. +function get_Blockly() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $number_of_calls += 1; + return 'Blockly'; +} + +// Tests the "get letter" block with a function call. +function test_get_text_complex() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $text = 'Blockly'; + $number_of_calls = 0; + assertEquals(substr(get_Blockly(), 0, 1), 'B', 'get first complex'); + check_number_of_calls('get first complex'); + $number_of_calls = 0; + assertEquals(substr(true ? get_Blockly() : null, 0, 1), 'B', 'get first order complex'); + check_number_of_calls('get first order complex'); + $number_of_calls = 0; + assertEquals(substr(get_Blockly(), -1), 'y', 'get last complex'); + check_number_of_calls('get last complex'); + $number_of_calls = 0; + assertEquals(substr(true ? get_Blockly() : null, -1), 'y', 'get last order complex'); + check_number_of_calls('get last order complex'); + $number_of_calls = 0; + assertEquals(text_indexOf($text, text_random_letter(get_Blockly())) > 0, true, 'get random complex'); + check_number_of_calls('get random complex'); + $number_of_calls = 0; + assertEquals(text_indexOf($text, text_random_letter(true ? get_Blockly() : null)) > 0, true, 'get random order complex'); + check_number_of_calls('get random order complex'); + $number_of_calls = 0; + assertEquals(substr(get_Blockly(), 2, 1), 'o', 'get # complex'); + check_number_of_calls('get # complex'); + $number_of_calls = 0; + assertEquals(substr(true ? get_Blockly() : null, ((true ? 3 : null) - 1), 1), 'o', 'get # order complex'); + check_number_of_calls('get # order complex'); + $number_of_calls = 0; + assertEquals(substr(get_Blockly(), -3, 1), 'k', 'get #-end complex'); + check_number_of_calls('get #-end complex'); + $number_of_calls = 0; + // The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(substr(true ? get_Blockly() : null, (-(0 + 3)), 1), 'k', 'get #-end order complex'); + check_number_of_calls('get #-end order complex'); +} + +// Creates a string for use with the substring test. +function get_numbers() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $number_of_calls += 1; + return '123456789'; +} + +function text_get_substring($text, $where1, $at1, $where2, $at2) { + if ($where1 == 'FROM_END') { + $at1 = strlen($text) - 1 - $at1; + } else if ($where1 == 'FIRST') { + $at1 = 0; + } else if ($where1 != 'FROM_START') { + throw new Exception('Unhandled option (text_get_substring).'); + } + $length = 0; + if ($where2 == 'FROM_START') { + $length = $at2 - $at1 + 1; + } else if ($where2 == 'FROM_END') { + $length = strlen($text) - $at1 - $at2; + } else if ($where2 == 'LAST') { + $length = strlen($text) - $at1; + } else { + throw new Exception('Unhandled option (text_get_substring).'); + } + return substr($text, $at1, $length); +} + +// Tests the "get substring" block with a variable. +function test_substring_simple() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $text = '123456789'; + assertEquals(text_get_substring($text, 'FROM_START', 1, 'FROM_START', 2), '23', 'substring # simple'); + assertEquals(text_get_substring($text, 'FROM_START', ((true ? 2 : null) - 1), 'FROM_START', ((true ? 3 : null) - 1)), '23', 'substring # simple order'); + assertEquals(text_get_substring($text, 'FROM_END', 2, 'FROM_END', 1), '78', 'substring #-end simple'); + // The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(text_get_substring($text, 'FROM_END', ((0 + 3) - 1), 'FROM_END', ((0 + 2) - 1)), '78', 'substring #-end simple order'); + assertEquals($text, $text, 'substring first-last simple'); + assertEquals(text_get_substring($text, 'FROM_START', 1, 'FROM_END', 1), '2345678', 'substring # #-end simple'); + assertEquals(text_get_substring($text, 'FROM_END', 6, 'FROM_START', 3), '34', 'substring #-end # simple'); + assertEquals(text_get_substring($text, 'FIRST', 0, 'FROM_START', 3), '1234', 'substring first # simple'); + assertEquals(text_get_substring($text, 'FIRST', 0, 'FROM_END', 1), '12345678', 'substring first #-end simple'); + assertEquals(text_get_substring($text, 'FROM_START', 6, 'LAST', 0), '789', 'substring # last simple'); + assertEquals(text_get_substring($text, 'FROM_END', 2, 'LAST', 0), '789', 'substring #-end last simple'); + assertEquals(text_get_substring($text, 'FROM_START', 0, 'FROM_END', 0), '123456789', 'substring all with # #-end simple'); + assertEquals(text_get_substring($text, 'FROM_END', 8, 'FROM_START', 8), '123456789', 'substring all with #-end # simple'); + // Checks that the whole string is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where substring uses [x:length - y] for # #-end. + assertEquals(text_get_substring($text, 'FROM_START', ((0 + 1) - 1), 'FROM_END', ((0 + 1) - 1)), '123456789', 'substring all with # #-end math simple'); +} + +// Tests the "get substring" block with a function call. +function test_substring_complex() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $number_of_calls = 0; + assertEquals(text_get_substring((get_numbers()), 'FROM_START', 1, 'FROM_START', 2), '23', 'substring # complex'); + check_number_of_calls('substring # complex'); + $number_of_calls = 0; + assertEquals(text_get_substring((true ? get_numbers() : null), 'FROM_START', ((true ? 2 : null) - 1), 'FROM_START', ((true ? 3 : null) - 1)), '23', 'substring # complex order'); + check_number_of_calls('substring # complex order'); + $number_of_calls = 0; + // The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(text_get_substring((get_numbers()), 'FROM_END', 2, 'FROM_END', 1), '78', 'substring #-end complex'); + check_number_of_calls('substring #-end complex'); + $number_of_calls = 0; + assertEquals(text_get_substring((true ? get_numbers() : null), 'FROM_END', ((0 + 3) - 1), 'FROM_END', ((0 + 2) - 1)), '78', 'substring #-end order order'); + check_number_of_calls('substring #-end order order'); + $number_of_calls = 0; + assertEquals((get_numbers()), $text, 'substring first-last'); + check_number_of_calls('substring first-last'); + $number_of_calls = 0; + assertEquals(text_get_substring((get_numbers()), 'FROM_START', 1, 'FROM_END', 1), '2345678', 'substring # #-end complex'); + check_number_of_calls('substring # #-end complex'); + $number_of_calls = 0; + assertEquals(text_get_substring((get_numbers()), 'FROM_END', 6, 'FROM_START', 3), '34', 'substring #-end # complex'); + check_number_of_calls('substring #-end # complex'); + $number_of_calls = 0; + assertEquals(text_get_substring((get_numbers()), 'FIRST', 0, 'FROM_START', 3), '1234', 'substring first # complex'); + check_number_of_calls('substring first # complex'); + $number_of_calls = 0; + assertEquals(text_get_substring((get_numbers()), 'FIRST', 0, 'FROM_END', 1), '12345678', 'substring first #-end complex'); + check_number_of_calls('substring first #-end complex'); + $number_of_calls = 0; + assertEquals(text_get_substring((get_numbers()), 'FROM_START', 6, 'LAST', 0), '789', 'substring # last complex'); + check_number_of_calls('substring # last complex'); + $number_of_calls = 0; + assertEquals(text_get_substring((get_numbers()), 'FROM_END', 2, 'LAST', 0), '789', 'substring #-end last complex'); + check_number_of_calls('substring #-end last complex'); + $number_of_calls = 0; + assertEquals(text_get_substring((get_numbers()), 'FROM_START', 0, 'FROM_END', 0), '123456789', 'substring all with # #-end complex'); + check_number_of_calls('substring all with # #-end complex'); + $number_of_calls = 0; + assertEquals(text_get_substring((get_numbers()), 'FROM_END', 8, 'FROM_START', 8), '123456789', 'substring all with #-end # complex'); + check_number_of_calls('substring all with #-end # complex'); + $number_of_calls = 0; + // Checks that the whole string is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where substring uses [x:length - y] for # #-end. + assertEquals(text_get_substring((get_numbers()), 'FROM_START', ((0 + 1) - 1), 'FROM_END', ((0 + 1) - 1)), '123456789', 'substring all with # #-end math complex'); + check_number_of_calls('substring all with # #-end math complex'); +} + +// Tests the "change casing" block. +function test_case() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $text = 'Hello World'; + assertEquals(strtoupper($text), 'HELLO WORLD', 'uppercase'); + assertEquals(strtoupper(true ? $text : null), 'HELLO WORLD', 'uppercase order'); + $text = 'Hello World'; + assertEquals(strtolower($text), 'hello world', 'lowercase'); + assertEquals(strtolower(true ? $text : null), 'hello world', 'lowercase order'); + $text = 'heLLo WorlD'; + assertEquals(ucwords(strtolower($text)), 'Hello World', 'titlecase'); + assertEquals(ucwords(strtolower(true ? $text : null)), 'Hello World', 'titlecase order'); +} + +// Tests the "trim" block. +function test_trim() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $text = ' abc def '; + assertEquals(trim($text), 'abc def', 'trim both'); + assertEquals(trim(true ? $text : null), 'abc def', 'trim both order'); + assertEquals(ltrim($text), 'abc def ', 'trim left'); + assertEquals(ltrim(true ? $text : null), 'abc def ', 'trim left order'); + assertEquals(rtrim($text), ' abc def', 'trim right'); + assertEquals(rtrim(true ? $text : null), ' abc def', 'trim right order'); +} + +// Tests the "trim" block. +function test_count_text() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $text = 'woolloomooloo'; + assertEquals(strlen('o') === 0 ? strlen($text) + 1 : substr_count($text, 'o'), 8, 'len 1'); + assertEquals(strlen('oo') === 0 ? strlen($text) + 1 : substr_count($text, 'oo'), 4, 'len 2'); + assertEquals(strlen('loo') === 0 ? strlen($text) + 1 : substr_count($text, 'loo'), 2, 'len 3'); + assertEquals(strlen('wool') === 0 ? strlen($text) + 1 : substr_count($text, 'wool'), 1, 'start'); + assertEquals(strlen('chicken') === 0 ? strlen($text) + 1 : substr_count($text, 'chicken'), 0, 'missing'); + assertEquals(strlen('') === 0 ? strlen($text) + 1 : substr_count($text, ''), 14, 'empty needle'); + assertEquals(strlen('chicken') === 0 ? strlen('') + 1 : substr_count('', 'chicken'), 0, 'empty source'); +} + +// Tests the "trim" block. +function test_text_reverse() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + assertEquals(strrev(''), '', 'empty string'); + assertEquals(strrev('a'), 'a', 'len 1'); + assertEquals(strrev('ab'), 'ba', 'len 2'); + assertEquals(strrev('woolloomooloo'), 'ooloomoolloow', 'longer'); +} + +// Tests the "trim" block. +function test_replace() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + assertEquals(str_replace('oo', '123', 'woolloomooloo'), 'w123ll123m123l123', 'replace all instances 1'); + assertEquals(str_replace('.oo', 'X', 'woolloomooloo'), 'woolloomooloo', 'literal string replacement'); + assertEquals(str_replace('abc', 'X', 'woolloomooloo'), 'woolloomooloo', 'not found'); + assertEquals(str_replace('o', '', 'woolloomooloo'), 'wllml', 'empty replacement 1'); + assertEquals(str_replace('aaaaa', '', 'aaaaa'), '', 'empty replacement 2'); + assertEquals(str_replace('a', '', 'aaaaa'), '', 'empty replacement 3'); + assertEquals(str_replace('a', 'chicken', ''), '', 'empty source'); +} + +// Checks that the number of calls is one in order +// to confirm that a function was only called once. +function check_number_of_calls2($test_name) { + global $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $test_name .= 'number of calls'; + assertEquals($number_of_calls, 1, $test_name); +} + +function lists_repeat($value, $count) { + $array = array(); + for ($index = 0; $index < $count; $index++) { + $array[] = $value; + } + return $array; +} + +// Tests the "create list with" and "create empty list" blocks. +function test_create_lists() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + assertEquals(array(), array(), 'create empty'); + assertEquals(array(true, 'love'), array(true, 'love'), 'create items'); + assertEquals(lists_repeat('Eject', 3), array('Eject', 'Eject', 'Eject'), 'create repeated'); + assertEquals(lists_repeat('Eject', 0 + 3), array('Eject', 'Eject', 'Eject'), 'create repeated order'); +} + +// Creates an empty list for use with the empty test. +function get_empty_list() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + return array(); +} + +// Tests the "is empty" block. +function test_lists_empty() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + assertEquals(empty((array(0))), false, 'not empty'); + assertEquals(empty((array())), true, 'empty'); + assertEquals(empty((get_empty_list())), true, 'empty complex'); + assertEquals(empty((true ? array() : null)), true, 'empty order'); +} + +// Tests the "length" block. +function test_lists_length() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + assertEquals(length(array()), 0, 'zero length'); + assertEquals(length(array('cat')), 1, 'one length'); + assertEquals(length(array('cat', true, array())), 3, 'three length'); + assertEquals(length(true ? array('cat', true) : null), 2, 'two length order'); +} + +function lastIndexOf($haystack, $needle) { + $last = 0; + for ($index = 0; $index < count($haystack); $index++) { + if ($haystack[$index] == $needle) $last = $index + 1; + } + return $last; +} + +// Tests the "find" block with a variable. +function test_find_lists_simple() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $list2 = array('Alice', 'Eve', 'Bob', 'Eve'); + assertEquals(indexOf($list2, 'Eve'), 2, 'find first simple'); + assertEquals(lastIndexOf($list2, 'Eve'), 4, 'find last simple'); + assertEquals(indexOf($list2, 'Dave'), 0, 'find none simple'); +} + +// Creates a list for use with the find test. +function get_names() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $number_of_calls += 1; + return array('Alice', 'Eve', 'Bob', 'Eve'); +} + +// Tests the "find" block with a function call. +function test_find_lists_complex() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $number_of_calls = 0; + assertEquals(indexOf(get_names(), 'Eve'), 2, 'find first complex'); + check_number_of_calls('find first complex'); + $number_of_calls = 0; + assertEquals(indexOf((true ? get_names() : null), 'Eve'), 2, 'find first order complex'); + check_number_of_calls('find first order complex'); + $number_of_calls = 0; + assertEquals(lastIndexOf(get_names(), 'Eve'), 4, 'find last complex'); + check_number_of_calls('find last complex'); + $number_of_calls = 0; + assertEquals(lastIndexOf((true ? get_names() : null), 'Eve'), 4, 'find last order complex'); + check_number_of_calls('find last order complex'); + $number_of_calls = 0; + assertEquals(indexOf(get_names(), 'Dave'), 0, 'find none complex'); + check_number_of_calls('find none complex'); + $number_of_calls = 0; + assertEquals(indexOf((true ? get_names() : null), 'Dave'), 0, 'find none order complex'); + check_number_of_calls('find none order complex'); +} + +function lists_get_random_item($list) { + return $list[rand(0,count($list)-1)]; +} + +// Tests the "get" block with a variable. +function test_get_lists_simple() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $list2 = array('Kirk', 'Spock', 'McCoy'); + assertEquals($list2[0], 'Kirk', 'get first simple'); + assertEquals(end($list2), 'McCoy', 'get last simple'); + assertEquals(indexOf($list2, lists_get_random_item($list2)) > 0, true, 'get random simple'); + assertEquals($list2[1], 'Spock', 'get # simple'); + assertEquals($list2[((true ? 2 : null) - 1)], 'Spock', 'get # order simple'); + assertEquals(array_slice($list2, -3, 1)[0], 'Kirk', 'get #-end simple'); + // The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(array_slice($list2, (-(0 + 3)), 1)[0], 'Kirk', 'get #-end order simple'); +} + +// Creates a list for use with the get test. +function get_star_wars() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $number_of_calls += 1; + return array('Kirk', 'Spock', 'McCoy'); +} + +// Tests the "get" block with a function call. +function test_get_lists_complex() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $list2 = array('Kirk', 'Spock', 'McCoy'); + $number_of_calls = 0; + assertEquals(get_star_wars()[0], 'Kirk', 'get first complex'); + check_number_of_calls('get first complex'); + $number_of_calls = 0; + assertEquals((true ? get_star_wars() : null)[0], 'Kirk', 'get first order complex'); + check_number_of_calls('get first order complex'); + $number_of_calls = 0; + assertEquals(end(get_star_wars()), 'McCoy', 'get last complex'); + check_number_of_calls('get last complex'); + $number_of_calls = 0; + assertEquals(end(true ? get_star_wars() : null), 'McCoy', 'get last order complex'); + check_number_of_calls('get last order complex'); + $number_of_calls = 0; + assertEquals(indexOf($list2, lists_get_random_item(get_star_wars())) > 0, true, 'get random complex'); + check_number_of_calls('get random complex'); + $number_of_calls = 0; + assertEquals(indexOf($list2, lists_get_random_item(true ? get_star_wars() : null)) > 0, true, 'get random order complex'); + check_number_of_calls('get random order complex'); + $number_of_calls = 0; + assertEquals(get_star_wars()[1], 'Spock', 'get # complex'); + check_number_of_calls('get # complex'); + $number_of_calls = 0; + assertEquals((true ? get_star_wars() : null)[((true ? 2 : null) - 1)], 'Spock', 'get # order complex'); + check_number_of_calls('get # order complex'); + $number_of_calls = 0; + assertEquals(array_slice(get_star_wars(), -3, 1)[0], 'Kirk', 'get #-end complex'); + check_number_of_calls('get #-end complex'); + $number_of_calls = 0; + // The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(array_slice(true ? get_star_wars() : null, (-(0 + 3)), 1)[0], 'Kirk', 'get #-end order complex'); + check_number_of_calls('get #-end order complex'); +} + +function lists_get_remove_random_item(&$list) { + $x = rand(0,count($list)-1); + unset($list[$x]); + return array_values($list); +} + +// Tests the "get and remove" block. +function test_getRemove() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $list2 = array('Kirk', 'Spock', 'McCoy'); + assertEquals(array_shift($list2), 'Kirk', 'getremove first'); + assertEquals($list2, array('Spock', 'McCoy'), 'getremove first list'); + $list2 = array('Kirk', 'Spock', 'McCoy'); + assertEquals(array_shift(true ? $list2 : null), 'Kirk', 'getremove first order'); + assertEquals($list2, array('Spock', 'McCoy'), 'getremove first order list'); + $list2 = array('Kirk', 'Spock', 'McCoy'); + assertEquals(array_pop($list2), 'McCoy', 'getremove last'); + assertEquals($list2, array('Kirk', 'Spock'), 'getremove last list'); + $list2 = array('Kirk', 'Spock', 'McCoy'); + assertEquals(array_pop(true ? $list2 : null), 'McCoy', 'getremove last order'); + assertEquals($list2, array('Kirk', 'Spock'), 'getremove last order list'); + $list2 = array('Kirk', 'Spock', 'McCoy'); + assertEquals(indexOf($list2, lists_get_remove_random_item($list2)) == 0, true, 'getremove random'); + assertEquals(length($list2), 2, 'getremove random list'); + $list2 = array('Kirk', 'Spock', 'McCoy'); + assertEquals(indexOf($list2, lists_get_remove_random_item(true ? $list2 : null)) == 0, true, 'getremove random order'); + assertEquals(length($list2), 2, 'getremove random order list'); + $list2 = array('Kirk', 'Spock', 'McCoy'); + assertEquals(array_splice($list2, 1, 1)[0], 'Spock', 'getremove #'); + assertEquals($list2, array('Kirk', 'McCoy'), 'getremove # list'); + $list2 = array('Kirk', 'Spock', 'McCoy'); + assertEquals(array_splice(true ? $list2 : null, ((true ? 2 : null) - 1), 1)[0], 'Spock', 'getremove # order'); + assertEquals($list2, array('Kirk', 'McCoy'), 'getremove # order list'); + $list2 = array('Kirk', 'Spock', 'McCoy'); + assertEquals(array_splice($list2, count($list2) - 3, 1)[0], 'Kirk', 'getremove #-end'); + assertEquals($list2, array('Spock', 'McCoy'), 'getremove #-end list'); + $list2 = array('Kirk', 'Spock', 'McCoy'); + // The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(array_splice(true ? $list2 : null, count(true ? $list2 : null) - (0 + 3), 1)[0], 'Kirk', 'getremove #-end order'); + assertEquals($list2, array('Spock', 'McCoy'), 'getremove #-end order list'); +} + +function lists_remove_random_item(&$list) { + unset($list[rand(0,count($list)-1)]); +} + +// Tests the "remove" block. +function test_remove() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $list2 = array('Kirk', 'Spock', 'McCoy'); + array_shift($list2); + assertEquals($list2, array('Spock', 'McCoy'), 'remove first list'); + $list2 = array('Kirk', 'Spock', 'McCoy'); + array_shift(true ? $list2 : null); + assertEquals($list2, array('Spock', 'McCoy'), 'remove first order list'); + $list2 = array('Kirk', 'Spock', 'McCoy'); + array_pop($list2); + assertEquals($list2, array('Kirk', 'Spock'), 'remove last list'); + $list2 = array('Kirk', 'Spock', 'McCoy'); + array_pop(true ? $list2 : null); + assertEquals($list2, array('Kirk', 'Spock'), 'remove last order list'); + $list2 = array('Kirk', 'Spock', 'McCoy'); + lists_remove_random_item($list2); + assertEquals(length($list2), 2, 'remove random list'); + $list2 = array('Kirk', 'Spock', 'McCoy'); + lists_remove_random_item(true ? $list2 : null); + assertEquals(length($list2), 2, 'remove random order list'); + $list2 = array('Kirk', 'Spock', 'McCoy'); + array_splice($list2, 1, 1); + assertEquals($list2, array('Kirk', 'McCoy'), 'remove # list'); + $list2 = array('Kirk', 'Spock', 'McCoy'); + array_splice(true ? $list2 : null, ((true ? 2 : null) - 1), 1); + assertEquals($list2, array('Kirk', 'McCoy'), 'remove # order list'); + $list2 = array('Kirk', 'Spock', 'McCoy'); + array_splice($list2, count($list2) - 3, 1)[0]; + assertEquals($list2, array('Spock', 'McCoy'), 'remove #-end list'); + $list2 = array('Kirk', 'Spock', 'McCoy'); + // The order for index for #-end is addition because this will catch + // errors in generators where most perform the operation ... - index. + array_splice(true ? $list2 : null, count(true ? $list2 : null) - (0 + 3), 1)[0]; + assertEquals($list2, array('Spock', 'McCoy'), 'remove #-end order list'); +} + +function lists_set_last_item(&$list, $value) { + $list[count($list) - 1] = $value; +} + +function lists_set_from_end(&$list, $at, $value) { + $list[count($list) - $at] = $value; +} + +// Tests the "set" block. +function test_set() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $list2 = array('Picard', 'Riker', 'Crusher'); + $list2[0] = 'Jean-Luc'; + assertEquals($list2, array('Jean-Luc', 'Riker', 'Crusher'), 'set first list'); + $list2 = array('Picard', 'Riker', 'Crusher'); + (true ? $list2 : null)[0] = 'Jean-Luc'; + assertEquals($list2, array('Jean-Luc', 'Riker', 'Crusher'), 'set first order list'); + $list2 = array('Picard', 'Riker', 'Crusher'); + lists_set_last_item($list2, 'Beverly'); + assertEquals($list2, array('Picard', 'Riker', 'Beverly'), 'set last list'); + $list2 = array('Picard', 'Riker', 'Crusher'); + lists_set_last_item(true ? $list2 : null, 'Beverly'); + assertEquals($list2, array('Picard', 'Riker', 'Beverly'), 'set last order list'); + $list2 = array('Picard', 'Riker', 'Crusher'); + $tmp_x = rand(0, count($list2)-1); + $list2[$tmp_x] = 'Data'; + assertEquals(length($list2), 3, 'set random list'); + $list2 = array('Picard', 'Riker', 'Crusher'); + $tmp_list = &(true ? $list2 : null); + $tmp_x2 = rand(0, count($tmp_list)-1); + $tmp_list[$tmp_x2] = 'Data'; + assertEquals(length($list2), 3, 'set random order list'); + $list2 = array('Picard', 'Riker', 'Crusher'); + $list2[2] = 'Pulaski'; + assertEquals($list2, array('Picard', 'Riker', 'Pulaski'), 'set # list'); + $list2 = array('Picard', 'Riker', 'Crusher'); + (true ? $list2 : null)[((true ? 3 : null) - 1)] = 'Pulaski'; + assertEquals($list2, array('Picard', 'Riker', 'Pulaski'), 'set # order list'); + $list2 = array('Picard', 'Riker', 'Crusher'); + lists_set_from_end($list2, 1, 'Pulaski'); + assertEquals($list2, array('Picard', 'Riker', 'Pulaski'), 'set #-end list'); + $list2 = array('Picard', 'Riker', 'Crusher'); + // The order for index for #-end is addition because this will catch + // errors in generators where most perform the operation ... - index. + lists_set_from_end(true ? $list2 : null, 0 + 2, 'Pulaski'); + assertEquals($list2, array('Picard', 'Pulaski', 'Crusher'), 'set #-end order list'); +} + +function lists_insert_from_end(&$list, $at, $value) { + return array_splice($list, count($list) - $at, 0, $value); +} + +// Tests the "insert" block. +function test_insert() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $list2 = array('Picard', 'Riker', 'Crusher'); + array_unshift($list2, 'Data'); + assertEquals($list2, array('Data', 'Picard', 'Riker', 'Crusher'), 'insert first list'); + $list2 = array('Picard', 'Riker', 'Crusher'); + array_unshift(true ? $list2 : null, 'Data'); + assertEquals($list2, array('Data', 'Picard', 'Riker', 'Crusher'), 'insert first order list'); + $list2 = array('Picard', 'Riker', 'Crusher'); + array_push($list2, 'Data'); + assertEquals($list2, array('Picard', 'Riker', 'Crusher', 'Data'), 'insert last list'); + $list2 = array('Picard', 'Riker', 'Crusher'); + array_push(true ? $list2 : null, 'Data'); + assertEquals($list2, array('Picard', 'Riker', 'Crusher', 'Data'), 'insert last order list'); + $list2 = array('Picard', 'Riker', 'Crusher'); + $tmp_x3 = rand(0, count($list2)-1); + array_splice($list2, $tmp_x3, 0, 'Data'); + assertEquals(length($list2), 4, 'insert random list'); + $list2 = array('Picard', 'Riker', 'Crusher'); + $tmp_list2 = &(true ? $list2 : null); + $tmp_x4 = rand(0, count($tmp_list2)-1); + array_splice($tmp_list2, $tmp_x4, 0, 'Data'); + assertEquals(length($list2), 4, 'insert random order list'); + $list2 = array('Picard', 'Riker', 'Crusher'); + array_splice($list2, 2, 0, 'Data'); + assertEquals($list2, array('Picard', 'Riker', 'Data', 'Crusher'), 'insert # list'); + $list2 = array('Picard', 'Riker', 'Crusher'); + array_splice(true ? $list2 : null, ((true ? 3 : null) - 1), 0, 'Data'); + assertEquals($list2, array('Picard', 'Riker', 'Data', 'Crusher'), 'insert # order list'); + $list2 = array('Picard', 'Riker', 'Crusher'); + lists_insert_from_end($list2, 1, 'Data'); + assertEquals($list2, array('Picard', 'Riker', 'Data', 'Crusher'), 'insert #-end list'); + $list2 = array('Picard', 'Riker', 'Crusher'); + // The order for index for #-end is addition because this will catch + // errors in generators where most perform the operation ... - index. + lists_insert_from_end(true ? $list2 : null, 0 + 2, 'Data'); + assertEquals($list2, array('Picard', 'Data', 'Riker', 'Crusher'), 'insert #-end order list'); +} + +// Tests the "get sub-list" block with a variable. +function test_sublist_simple() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $list2 = array('Columbia', 'Challenger', 'Discovery', 'Atlantis', 'Endeavour'); + assertEquals(array_slice($list2, 1, 2 - 1 + 1), array('Challenger', 'Discovery'), 'sublist # simple'); + assertEquals(array_slice($list2, ((true ? 2 : null) - 1), ((true ? 3 : null) - 1) - ((true ? 2 : null) - 1) + 1), array('Challenger', 'Discovery'), 'sublist # simple order'); + assertEquals(array_slice($list2, count($list2) - 3, count($list2) - 1 - (count($list2) - 3)), array('Discovery', 'Atlantis'), 'sublist #-end simple'); + // The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(array_slice($list2, count($list2) - (0 + 3), count($list2) - ((0 + 2) - 1) - (count($list2) - (0 + 3))), array('Discovery', 'Atlantis'), 'sublist #-end simple order'); + assertEquals($list2, $list2, 'sublist first-last simple'); + $changing_list = array('Columbia', 'Challenger', 'Discovery', 'Atlantis', 'Endeavour'); + $list_copy = $changing_list; + lists_remove_random_item($changing_list); + assertEquals($list_copy, $list2, 'sublist first-last simple copy check'); + assertEquals(array_slice($list2, 1, count($list2) - 1 - 1), array('Challenger', 'Discovery', 'Atlantis'), 'sublist # #-end simple'); + assertEquals(array_slice($list2, count($list2) - 3, 3 - (count($list2) - 3) + 1), array('Discovery', 'Atlantis'), 'sublist #-end # simple'); + assertEquals(array_slice($list2, 0, 3 - 0 + 1), array('Columbia', 'Challenger', 'Discovery', 'Atlantis'), 'sublist first # simple'); + assertEquals(array_slice($list2, 0, count($list2) - 3 - 0), array('Columbia', 'Challenger'), 'sublist first #-end simple'); + assertEquals(array_slice($list2, 3, count($list2) - 3), array('Atlantis', 'Endeavour'), 'sublist # last simple'); + assertEquals(array_slice($list2, count($list2) - 4, count($list2) - (count($list2) - 4)), array('Challenger', 'Discovery', 'Atlantis', 'Endeavour'), 'sublist #-end last simple'); + assertEquals(array_slice($list2, 0, count($list2) - 0 - 0), $list2, 'sublist all with # #-end simple'); + assertEquals(array_slice($list2, count($list2) - 5, 4 - (count($list2) - 5) + 1), $list2, 'sublist all with #-end # simple'); + // Checks that the whole list is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where sublist uses [x:length - y] for # #-end. + assertEquals(array_slice($list2, ((0 + 1) - 1), count($list2) - ((0 + 1) - 1) - ((0 + 1) - 1)), $list2, 'sublist all with # #-end math simple'); +} + +// Creates a list for use with the sublist test. +function get_space_shuttles() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $number_of_calls += 1; + return array('Columbia', 'Challenger', 'Discovery', 'Atlantis', 'Endeavour'); +} + +function lists_get_sublist($list, $where1, $at1, $where2, $at2) { + if ($where1 == 'FROM_END') { + $at1 = count($list) - 1 - $at1; + } else if ($where1 == 'FIRST') { + $at1 = 0; + } else if ($where1 != 'FROM_START') { + throw new Exception('Unhandled option (lists_get_sublist).'); + } + $length = 0; + if ($where2 == 'FROM_START') { + $length = $at2 - $at1 + 1; + } else if ($where2 == 'FROM_END') { + $length = count($list) - $at1 - $at2; + } else if ($where2 == 'LAST') { + $length = count($list) - $at1; + } else { + throw new Exception('Unhandled option (lists_get_sublist).'); + } + return array_slice($list, $at1, $length); +} + +// Tests the "get sub-list" block with a function call. +function test_sublist_complex() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $number_of_calls = 0; + assertEquals(array_slice(get_space_shuttles(), 1, 2 - 1 + 1), array('Challenger', 'Discovery'), 'sublist # start complex'); + check_number_of_calls('sublist # start complex'); + $number_of_calls = 0; + assertEquals(array_slice(true ? get_space_shuttles() : null, ((true ? 2 : null) - 1), ((true ? 3 : null) - 1) - ((true ? 2 : null) - 1) + 1), array('Challenger', 'Discovery'), 'sublist # start order complex'); + check_number_of_calls('sublist # start order complex'); + $number_of_calls = 0; + // The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(lists_get_sublist(get_space_shuttles(), 'FROM_END', 2, 'FROM_END', 1), array('Discovery', 'Atlantis'), 'sublist # end complex'); + assertEquals($number_of_calls, 1, 'sublist # end complex number of calls'); + $number_of_calls = 0; + assertEquals(lists_get_sublist(true ? get_space_shuttles() : null, 'FROM_END', ((0 + 3) - 1), 'FROM_END', ((0 + 2) - 1)), array('Discovery', 'Atlantis'), 'sublist # end order complex'); + check_number_of_calls('sublist # end order complex'); + $number_of_calls = 0; + assertEquals(get_space_shuttles(), $list2, 'sublist first-last complex'); + check_number_of_calls('sublist first-last complex'); + $number_of_calls = 0; + assertEquals(lists_get_sublist(get_space_shuttles(), 'FROM_START', 1, 'FROM_END', 1), array('Challenger', 'Discovery', 'Atlantis'), 'sublist # #-end complex'); + check_number_of_calls('sublist # #-end complex'); + $number_of_calls = 0; + assertEquals(lists_get_sublist(get_space_shuttles(), 'FROM_END', 2, 'FROM_START', 3), array('Discovery', 'Atlantis'), 'sublist #-end # complex'); + check_number_of_calls('sublist #-end # complex'); + $number_of_calls = 0; + assertEquals(array_slice(get_space_shuttles(), 0, 3 - 0 + 1), array('Columbia', 'Challenger', 'Discovery', 'Atlantis'), 'sublist first # complex'); + check_number_of_calls('sublist first # complex'); + $number_of_calls = 0; + assertEquals(lists_get_sublist(get_space_shuttles(), 'FIRST', 0, 'FROM_END', 3), array('Columbia', 'Challenger'), 'sublist first #-end complex'); + check_number_of_calls('sublist first #-end complex'); + $number_of_calls = 0; + assertEquals(lists_get_sublist(get_space_shuttles(), 'FROM_START', 3, 'LAST', 0), array('Atlantis', 'Endeavour'), 'sublist # last complex'); + check_number_of_calls('sublist # last complex'); + $number_of_calls = 0; + assertEquals(lists_get_sublist(get_space_shuttles(), 'FROM_END', 3, 'LAST', 0), array('Challenger', 'Discovery', 'Atlantis', 'Endeavour'), 'sublist #-end last simple'); + check_number_of_calls('sublist #-end last simple'); + $number_of_calls = 0; + assertEquals(lists_get_sublist(get_space_shuttles(), 'FROM_START', 0, 'FROM_END', 0), $list2, 'sublist all with # #-end complex'); + check_number_of_calls('sublist all with # #-end complex'); + $number_of_calls = 0; + assertEquals(lists_get_sublist(get_space_shuttles(), 'FROM_END', 4, 'FROM_START', 4), $list2, 'sublist all with #-end # complex'); + check_number_of_calls('sublist all with #-end # complex'); + $number_of_calls = 0; + // Checks that the whole list is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where sublist uses [x:length - y] for # #-end. + assertEquals(lists_get_sublist(get_space_shuttles(), 'FROM_START', ((0 + 1) - 1), 'FROM_END', ((0 + 1) - 1)), $list2, 'sublist all with # #-end math complex'); + check_number_of_calls('sublist all with # #-end math complex'); +} + +// Tests the "join" block. +function test_join() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $list2 = array('Vulcan', 'Klingon', 'Borg'); + assertEquals(implode(',', $list2), 'Vulcan,Klingon,Borg', 'join'); + assertEquals(implode(',', true ? $list2 : null), 'Vulcan,Klingon,Borg', 'join order'); +} + +// Tests the "split" block. +function test_split() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $text = 'Vulcan,Klingon,Borg'; + assertEquals(explode(',', $text), array('Vulcan', 'Klingon', 'Borg'), 'split'); + assertEquals(explode(',', true ? $text : null), array('Vulcan', 'Klingon', 'Borg'), 'split order'); +} + +function lists_sort($list, $type, $direction) { + $sortCmpFuncs = array( + "NUMERIC" => "strnatcasecmp", + "TEXT" => "strcmp", + "IGNORE_CASE" => "strcasecmp" + ); + $sortCmp = $sortCmpFuncs[$type]; + $list2 = $list; + usort($list2, $sortCmp); + if ($direction == -1) { + $list2 = array_reverse($list2); + } + return $list2; +} + +// Tests the "alphabetic sort" block. +function test_sort_alphabetic() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $list2 = array('Vulcan', 'klingon', 'Borg'); + assertEquals(lists_sort($list2, "TEXT", 1), array('Borg', 'Vulcan', 'klingon'), 'sort alphabetic ascending'); + assertEquals(lists_sort(true ? $list2 : null, "TEXT", 1), array('Borg', 'Vulcan', 'klingon'), 'sort alphabetic ascending order'); +} + +// Tests the "alphabetic sort ignore case" block. +function test_sort_ignoreCase() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $list2 = array('Vulcan', 'klingon', 'Borg'); + assertEquals(lists_sort($list2, "IGNORE_CASE", 1), array('Borg', 'klingon', 'Vulcan'), 'sort ignore case ascending'); + assertEquals(lists_sort(true ? $list2 : null, "IGNORE_CASE", 1), array('Borg', 'klingon', 'Vulcan'), 'sort ignore case ascending order'); +} + +// Tests the "numeric sort" block. +function test_sort_numeric() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $list2 = array(8, 18, -1); + assertEquals(lists_sort($list2, "NUMERIC", -1), array(18, 8, -1), 'sort numeric descending'); + assertEquals(lists_sort(true ? $list2 : null, "NUMERIC", -1), array(18, 8, -1), 'sort numeric descending order'); +} + +// Tests the "list reverse" block. +function test_lists_reverse() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $list2 = array(8, 18, -1, 64); + assertEquals(array_reverse($list2), array(64, -1, 18, 8), 'reverse a copy'); + assertEquals($list2, array(8, 18, -1, 64), 'reverse a copy original'); + $list2 = array(); + assertEquals(array_reverse($list2), array(), 'empty list'); +} + +// Describe this function... +function test_colour_picker() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + assertEquals('#ff6600', '#ff6600', 'static colour'); +} + +function colour_rgb($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; +} + +// Describe this function... +function test_rgb() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + assertEquals(colour_rgb(100, 40, 0), '#ff6600', 'from rgb'); +} + +function colour_random() { + return '#' . str_pad(dechex(mt_rand(0, 0xFFFFFF)), 6, '0', STR_PAD_LEFT); +} + +// Describe this function... +function test_colour_random() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + for ($count4 = 0; $count4 < 100; $count4++) { + $item = colour_random(); + assertEquals(length($item), 7, 'length of random colour string: ' . $item); + assertEquals(substr($item, 0, 1), '#', 'format of random colour string: ' . $item); + for ($i = 1; $i <= 6; $i++) { + assertEquals(0 != text_indexOf('abcdefABDEF0123456789', substr($item, (($i + 1) - 1), 1)), true, implode('', array('contents of random colour string: ',$item,' at index: ',$i + 1))); + } + } +} + +function colour_blend($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; +} + +// Describe this function... +function test_blend() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + assertEquals(colour_blend('#ff0000', colour_rgb(100, 40, 0), 0.4), '#ff2900', 'blend'); +} + +// Describe this function... +function test_procedure() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + procedure_1(8, 2); + assertEquals($proc_z, 4, 'procedure with global'); + $proc_w = false; + procedure_2(false); + assertEquals($proc_w, true, 'procedure no return'); + $proc_w = false; + procedure_2(true); + assertEquals($proc_w, false, 'procedure return'); +} + +// Describe this function... +function procedure_1($proc_x, $proc_y) { + global $test_name, $naked, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $proc_z = $proc_x / $proc_y; +} + +// Describe this function... +function procedure_2($proc_x) { + global $test_name, $naked, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + if ($proc_x) { + return; + } + $proc_w = true; +} + +// Describe this function... +function test_function() { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + assertEquals(function_1(2, 3), -1, 'function with arguments'); + assertEquals($func_z, 'side effect', 'function with side effect'); + $func_a = 'unchanged'; + $func_c = 'global'; + assertEquals(function_2(2), '3global', 'function with global'); + assertEquals($func_a, 'unchanged', 'function with scope'); + assertEquals(function_3(true), true, 'function return'); + assertEquals(function_3(false), false, 'function no return'); +} + +// Describe this function... +function function_1($func_x, $func_y) { + global $test_name, $naked, $proc_x, $proc_y, $func_a, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $func_z = 'side effect'; + return $func_x - $func_y; +} + +// Describe this function... +function function_2($func_a) { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + $func_a += 1; + return $func_a . $func_c; +} + +// Describe this function... +function function_3($func_a) { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $n, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + if ($func_a) { + return true; + } + return false; +} + +// Describe this function... +function recurse($n) { + global $test_name, $naked, $proc_x, $proc_y, $func_x, $func_y, $func_a, $ok, $log, $count, $varToChange, $rand, $item, $text, $number_of_calls, $list2, $proc_z, $func_z, $x, $proc_w, $func_c, $if2, $i, $loglist, $changing_list, $list_copy, $unittestResults; + if ($n > 0) { + $text = implode('', array(recurse($n - 1),$n,recurse($n - 1))); + } else { + $text = '-'; + } + return $text; +} + + +$unittestResults = array(); +print("\n====================\n\nRunning suite: Logic\n"); +assertEquals(true, true, 'True'); +assertEquals(false, false, 'False'); +assertEquals(!false, true, 'Not true'); +assertEquals(!true, false, 'Not false'); +test_if(); +test_ifelse(); +test_equalities(); +test_and(); +test_or(); +test_ternary(); +print(unittest_report()); +$unittestResults = null; + +$unittestResults = array(); +print("\n====================\n\nRunning suite: Loops 1\n"); +test_repeat(); +test_repeat_ext(); +test_while(); +test_foreach(); +print(unittest_report()); +$unittestResults = null; + +$unittestResults = array(); +print("\n====================\n\nRunning suite: Loops 2\n"); +test_count_loops(); +test_count_by(); +print(unittest_report()); +$unittestResults = null; + +$unittestResults = array(); +print("\n====================\n\nRunning suite: Loops 3\n"); +test_break(); +test_continue(); +print(unittest_report()); +$unittestResults = null; + +$unittestResults = array(); +print("\n====================\n\nRunning suite: Math\n"); +test_arithmetic(); +test_single(); +test_trig(); +test_constant(); +test_change(); +test_number_properties(); +test_round(); +test_operations_on_list(); +test_constraint(); +test_mod(); +test_random_integer(); +test_random_fraction(); +test_atan2(); +print(unittest_report()); +$unittestResults = null; + +$unittestResults = array(); +print("\n====================\n\nRunning suite: Text\n"); +test_text_length(); +test_empty_text(); +test_create_text(); +test_append(); +test_find_text_simple(); +test_find_text_complex(); +test_get_text_simple(); +test_get_text_complex(); +test_substring_simple(); +test_substring_complex(); +test_case(); +test_trim(); +test_count_text(); +test_text_reverse(); +test_replace(); +print(unittest_report()); +$unittestResults = null; + +$unittestResults = array(); +print("\n====================\n\nRunning suite: Lists\n"); +test_create_lists(); +test_lists_empty(); +test_lists_length(); +test_find_lists_simple(); +test_find_lists_complex(); +test_get_lists_simple(); +test_get_lists_complex(); +test_getRemove(); +test_remove(); +test_set(); +test_insert(); +test_sublist_simple(); +test_sublist_complex(); +test_join(); +test_split(); +test_sort_alphabetic(); +test_sort_ignoreCase(); +test_sort_numeric(); +test_lists_reverse(); +print(unittest_report()); +$unittestResults = null; + +$unittestResults = array(); +print("\n====================\n\nRunning suite: Colour\n"); +test_colour_picker(); +test_blend(); +test_rgb(); +test_colour_random(); +print(unittest_report()); +$unittestResults = null; + +$unittestResults = array(); +print("\n====================\n\nRunning suite: Variables\n"); +$item = 123; +assertEquals($item, 123, 'variable'); +$if2 = 123; +assertEquals($if2, 123, 'reserved variable'); +print(unittest_report()); +$unittestResults = null; + +// Intentionally non-connected variable. +$naked; + +$unittestResults = array(); +print("\n====================\n\nRunning suite: Functions\n"); +test_procedure(); +test_function(); +assertEquals(recurse(3), '-1-2-1-3-1-2-1-', 'test recurse'); +print(unittest_report()); +$unittestResults = null; diff --git a/js/tests/generators/golden/generated.py b/js/tests/generators/golden/generated.py new file mode 100644 index 0000000..b20142b --- /dev/null +++ b/js/tests/generators/golden/generated.py @@ -0,0 +1,1441 @@ +from numbers import Number +import math +import random +import sys + +unittestResults = None +test_name = None +naked = None +proc_x = None +proc_y = None +func_x = None +func_y = None +func_a = None +n = None +ok = None +log = None +count = None +varToChange = None +rand = None +item = None +text = None +number_of_calls = None +list2 = None +proc_z = None +func_z = None +x = None +proc_w = None +func_c = None +if2 = None +i = None +loglist = None +changing_list = None +list_copy = None + +def unittest_report(): + # Create test report. + report = [] + summary = [] + fails = 0 + for (success, log, message) in unittestResults: + 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(unittestResults)) + report.append("") + if fails: + report.append("FAILED (failures=%d)" % fails) + else: + report.append("OK") + return "\n".join(report) + +def assertEquals(actual, expected, message): + # Asserts that a value equals another value. + if unittestResults == None: + raise Exception("Orphaned assert equals: " + message) + if actual == expected: + unittestResults.append((True, "OK", message)) + else: + unittestResults.append((False, "Expected: %s\nActual: %s" % (expected, actual), message)) + +def fail(message): + # Always assert an error. + if unittestResults == None: + raise Exception("Orphaned assert equals: " + message) + unittestResults.append((False, "Fail.", message)) + +# Describe this function... +def test_if(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + if False: + fail('if false') + ok = False + if True: + ok = True + assertEquals(ok, True, 'if true') + ok = False + if False: + fail('if/else false') + else: + ok = True + assertEquals(ok, True, 'if/else false') + ok = False + if True: + ok = True + else: + fail('if/else true') + assertEquals(ok, True, 'if/else true') + ok = False + if False: + fail('elseif 1') + elif True: + ok = True + elif True: + fail('elseif 2') + else: + fail('elseif 3') + assertEquals(ok, True, 'elseif 4') + +# Describe this function... +def test_ifelse(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + ok = False + if True: + ok = True + else: + fail('ifelse true') + assertEquals(ok, True, 'ifelse true') + ok = False + if False: + fail('ifelse false') + else: + ok = True + assertEquals(ok, True, 'ifelse false') + +# Describe this function... +def test_equalities(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + assertEquals(2 == 2, True, 'Equal yes') + assertEquals(3 == 4, False, 'Equal no') + assertEquals(5 != 6, True, 'Not equal yes') + assertEquals(3 == 4, False, 'Not equal no') + assertEquals(5 < 6, True, 'Smaller yes') + assertEquals(7 < 7, False, 'Smaller no') + assertEquals(9 > 8, True, 'Greater yes') + assertEquals(10 > 10, False, 'Greater no') + assertEquals(11 <= 11, True, 'Smaller-equal yes') + assertEquals(13 <= 12, False, 'Smaller-equal no') + assertEquals(14 >= 14, True, 'Greater-equal yes') + assertEquals(15 >= 16, False, 'Greater-equal no') + +# Describe this function... +def test_and(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + assertEquals(True and True, True, 'And true/true') + assertEquals(False and True, False, 'And false/true') + assertEquals(True and False, False, 'And true/false') + assertEquals(False and False, False, 'And false/false') + +# Describe this function... +def test_or(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + assertEquals(True or True, True, 'Or true/true') + assertEquals(False or True, True, 'Or false/true') + assertEquals(True or False, True, 'Or true/false') + assertEquals(False or False, False, 'Or false/false') + +# Describe this function... +def test_ternary(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + assertEquals(42 if True else 99, 42, 'if true') + assertEquals(42 if False else 99, 99, 'if true') + +# Describe this function... +def test_foreach(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + log = '' + for x in ['a', 'b', 'c']: + log = str(log) + str(x) + assertEquals(log, 'abc', 'for loop') + +# Describe this function... +def test_repeat(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + count = 0 + for count2 in range(10): + count = (count if isinstance(count, Number) else 0) + 1 + assertEquals(count, 10, 'repeat 10') + +# Describe this function... +def test_while(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + while False: + fail('while 0') + while not True: + fail('until 0') + count = 1 + while count != 10: + count = (count if isinstance(count, Number) else 0) + 1 + assertEquals(count, 10, 'while 10') + count = 1 + while not count == 10: + count = (count if isinstance(count, Number) else 0) + 1 + assertEquals(count, 10, 'until 10') + +# Describe this function... +def test_repeat_ext(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + count = 0 + for count3 in range(10): + count = (count if isinstance(count, Number) else 0) + 1 + assertEquals(count, 10, 'repeat 10') + +def upRange(start, stop, step): + while start <= stop: + yield start + start += abs(step) + +def downRange(start, stop, step): + while start >= stop: + yield start + start -= abs(step) + +# Describe this function... +def test_count_by(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + log = '' + for x in range(1, 9, 2): + log = str(log) + str(x) + assertEquals(log, '1357', 'count up ints') + log = '' + for x in range(8, 0, -2): + log = str(log) + str(x) + assertEquals(log, '8642', 'count down ints') + loglist = [] + for x in upRange(1, 8, 1.5): + loglist.append(x) + assertEquals(loglist, [1, 2.5, 4, 5.5, 7], 'count with floats') + loglist = [] + x_start = float(1 + 0) + x_end = float(8 + 0) + x_inc = float(1 - 2) + for x in (x_start <= x_end) and upRange(x_start, x_end, 1 - 2) or downRange(x_start, x_end, 1 - 2): + loglist.append(x) + assertEquals(loglist, [1, 2, 3, 4, 5, 6, 7, 8], 'count up non-trivial ints') + loglist = [] + x_start2 = float(8 + 0) + x_end2 = float(1 + 0) + for x in (x_start2 <= x_end2) and upRange(x_start2, x_end2, 2) or downRange(x_start2, x_end2, 2): + loglist.append(x) + assertEquals(loglist, [8, 6, 4, 2], 'count down non-trivial ints') + loglist = [] + x_start3 = float(5 + 0.5) + x_end3 = float(1 + 0) + x_inc2 = float(1 + 0) + for x in (x_start3 <= x_end3) and upRange(x_start3, x_end3, 1 + 0) or downRange(x_start3, x_end3, 1 + 0): + loglist.append(x) + assertEquals(loglist, [5.5, 4.5, 3.5, 2.5, 1.5], 'count with floats') + +# Describe this function... +def test_count_loops(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + log = '' + for x in range(1, 9): + log = str(log) + str(x) + assertEquals(log, '12345678', 'count up') + log = '' + for x in range(8, 0, -1): + log = str(log) + str(x) + assertEquals(log, '87654321', 'count down') + loglist = [] + x_start4 = float(1 + 0) + x_end4 = float(4 + 0) + for x in (x_start4 <= x_end4) and upRange(x_start4, x_end4, 1) or downRange(x_start4, x_end4, 1): + loglist.append(x) + assertEquals(loglist, [1, 2, 3, 4], 'count up non-trivial') + loglist = [] + x_start5 = float(3 + 1) + x_end5 = float(1 + 0) + for x in (x_start5 <= x_end5) and upRange(x_start5, x_end5, 1) or downRange(x_start5, x_end5, 1): + loglist.append(x) + assertEquals(loglist, [4, 3, 2, 1], 'count down non-trivial') + +# Describe this function... +def test_continue(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + log = '' + count = 0 + while count != 8: + count = (count if isinstance(count, Number) else 0) + 1 + if count == 5: + continue + log = str(log) + str(count) + assertEquals(log, '1234678', 'while continue') + log = '' + count = 0 + while not count == 8: + count = (count if isinstance(count, Number) else 0) + 1 + if count == 5: + continue + log = str(log) + str(count) + assertEquals(log, '1234678', 'until continue') + log = '' + for x in range(1, 9): + if x == 5: + continue + log = str(log) + str(x) + assertEquals(log, '1234678', 'count continue') + log = '' + for x in ['a', 'b', 'c', 'd']: + if x == 'c': + continue + log = str(log) + str(x) + assertEquals(log, 'abd', 'for continue') + +# Describe this function... +def test_break(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + count = 1 + while count != 10: + if count == 5: + break + count = (count if isinstance(count, Number) else 0) + 1 + assertEquals(count, 5, 'while break') + count = 1 + while not count == 10: + if count == 5: + break + count = (count if isinstance(count, Number) else 0) + 1 + assertEquals(count, 5, 'until break') + log = '' + for x in range(1, 9): + if x == 5: + break + log = str(log) + str(x) + assertEquals(log, '1234', 'count break') + log = '' + for x in ['a', 'b', 'c', 'd']: + if x == 'c': + break + log = str(log) + str(x) + assertEquals(log, 'ab', 'for break') + +# Tests the "single" block. +def test_single(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + assertEquals(math.sqrt(25), 5, 'sqrt') + assertEquals(math.fabs(-25), 25, 'abs') + assertEquals(-(-25), 25, 'negate') + assertEquals(math.log(1), 0, 'ln') + assertEquals(math.log10(100), 2, 'log10') + assertEquals(math.exp(2), 7.38905609893065, 'exp') + assertEquals(math.pow(10,2), 100, 'power10') + +# Tests the "arithmetic" block for all operations and checks +# parenthesis are properly generated for different orders. +def test_arithmetic(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + assertEquals(1 + 2, 3, 'add') + assertEquals(1 - 2, -1, 'subtract') + assertEquals(1 - (0 + 2), -1, 'subtract order with add') + assertEquals(1 - (0 - 2), 3, 'subtract order with subtract') + assertEquals(4 * 2.5, 10, 'multiply') + assertEquals(4 * (0 + 2.5), 10, 'multiply order') + assertEquals(8.2 / -5, -1.64, 'divide') + assertEquals(8.2 / (0 + -5), -1.64, 'divide order') + assertEquals(10 ** 4, 10000, 'power') + assertEquals(10 ** (0 + 4), 10000, 'power order') + +# Tests the "trig" block. +def test_trig(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + assertEquals(math.sin(90 / 180.0 * math.pi), 1, 'sin') + assertEquals(math.cos(180 / 180.0 * math.pi), -1, 'cos') + assertEquals(math.tan(0 / 180.0 * math.pi), 0, 'tan') + assertEquals(math.asin(-1) / math.pi * 180, -90, 'asin') + assertEquals(math.acos(1) / math.pi * 180, 0, 'acos') + assertEquals(math.atan(1) / math.pi * 180, 45, 'atan') + +# Tests the "constant" blocks. +def test_constant(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + assertEquals(math.floor(math.pi * 1000), 3141, 'const pi') + assertEquals(math.floor(math.e * 1000), 2718, 'const e') + assertEquals(math.floor(((1 + math.sqrt(5)) / 2) * 1000), 1618, 'const golden') + assertEquals(math.floor(math.sqrt(2) * 1000), 1414, 'const sqrt 2') + assertEquals(math.floor(math.sqrt(1.0 / 2) * 1000), 707, 'const sqrt 0.5') + assertEquals(9999 < float('inf'), True, 'const infinity') + +def math_isPrime(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 + +# Tests the "number property" blocks. +def test_number_properties(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + assertEquals(42 % 2 == 0, True, 'even') + assertEquals(42.1 % 2 == 1, False, 'odd') + assertEquals(math_isPrime(5), True, 'prime 5') + assertEquals(math_isPrime(25), False, 'prime 25') + assertEquals(math_isPrime(-31.1), False, 'prime negative') + assertEquals(math.pi % 1 == 0, False, 'whole') + assertEquals(float('inf') > 0, True, 'positive') + assertEquals(-42 < 0, True, 'negative') + assertEquals(42 % 2 == 0, True, 'divisible') + +# Tests the "round" block. +def test_round(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + assertEquals(round(42.42), 42, 'round') + assertEquals(math.ceil(-42.42), -42, 'round up') + assertEquals(math.floor(42.42), 42, 'round down') + +# Tests the "change" block. +def test_change(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + varToChange = 100 + varToChange = (varToChange if isinstance(varToChange, Number) else 0) + 42 + assertEquals(varToChange, 142, 'change') + +def math_mean(myList): + localList = [e for e in myList if isinstance(e, Number)] + if not localList: return + return float(sum(localList)) / len(localList) + +def math_median(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] + +def math_modes(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 + +def math_standard_deviation(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) + +def first_index(my_list, elem): + try: index = my_list.index(elem) + 1 + except: index = 0 + return index + +# Tests the "list operation" blocks. +def test_operations_on_list(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + assertEquals(sum([3, 4, 5]), 12, 'sum') + assertEquals(min([3, 4, 5]), 3, 'min') + assertEquals(max([3, 4, 5]), 5, 'max') + assertEquals(math_mean([3, 4, 5]), 4, 'average') + assertEquals(math_median([3, 4, 5, 1]), 3.5, 'median') + assertEquals(math_modes([3, 4, 3]), [3], 'modes') + assertEquals(math_modes([3, 4, 3, 1, 4]), [3, 4], 'modes multiple') + assertEquals(math_standard_deviation([3, 3, 3]), 0, 'standard dev') + assertEquals(first_index([3, 4, 5], random.choice([3, 4, 5])) > 0, True, 'random') + +# Tests the "mod" block. +def test_mod(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + assertEquals(42 % 5, 2, 'mod') + +# Tests the "constrain" block. +def test_constraint(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + assertEquals(min(max(100, 0), 42), 42, 'constraint') + +# Tests the "random integer" block. +def test_random_integer(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + rand = random.randint(5, 10) + assertEquals(rand >= 5 and rand <= 10, True, 'randRange') + assertEquals(rand % 1 == 0, True, 'randInteger') + +# Tests the "random fraction" block. +def test_random_fraction(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + rand = random.random() + assertEquals(rand >= 0 and rand <= 1, True, 'randFloat') + +# Describe this function... +def test_atan2(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + assertEquals(math.atan2(5, -5) / math.pi * 180, 135, 'atan2') + assertEquals(math.atan2(-12, 0) / math.pi * 180, -90, 'atan2') + +# Checks that the number of calls is one in order +# to confirm that a function was only called once. +def check_number_of_calls(test_name): + global naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + test_name = str(test_name) + 'number of calls' + assertEquals(number_of_calls, 1, test_name) + +# Tests the "create text with" block with varying number of inputs. +def test_create_text(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + assertEquals('', '', 'no text') + assertEquals('Hello', 'Hello', 'create single') + assertEquals(str(-1), '-1', 'create single number') + assertEquals('K' + str(9), 'K9', 'create double text') + assertEquals(str(4) + str(2), '42', 'create double text numbers') + assertEquals(''.join([str(x2) for x2 in [1, 2, 3]]), '123', 'create triple') + assertEquals(''.join([str(x3) for x3 in [1, 0 if True else None, 'M']]), '10M', 'create order') + +# Creates an empty string for use with the empty test. +def get_empty(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + return '' + +# Tests the "is empty" block". +def test_empty_text(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + assertEquals(not len('Google'), False, 'not empty') + assertEquals(not len(''), True, 'empty') + assertEquals(not len(get_empty()), True, 'empty complex') + assertEquals(not len('' if True else None), True, 'empty order') + +# Tests the "length" block. +def test_text_length(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + assertEquals(len(''), 0, 'zero length') + assertEquals(len('Google'), 6, 'non-zero length') + assertEquals(len('car' if True else None), 3, 'length order') + +# Tests the "append text" block with different types of parameters. +def test_append(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + item = 'Miserable' + item = str(item) + 'Failure' + assertEquals(item, 'MiserableFailure', 'append text') + item = 12 + item = str(item) + str(34) + assertEquals(item, '1234', 'append number') + item = 'Something ' + item = str(item) + str('Positive' if True else None) + assertEquals(item, 'Something Positive', 'append order') + +# Tests the "find" block with a variable. +def test_find_text_simple(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + text = 'Banana' + assertEquals(text.find('an') + 1, 2, 'find first simple') + assertEquals(text.rfind('an') + 1, 4, 'find last simple') + assertEquals(text.find('Peel') + 1, 0, 'find none simple') + +# Creates a string for use with the find test. +def get_fruit(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + number_of_calls = (number_of_calls if isinstance(number_of_calls, Number) else 0) + 1 + return 'Banana' + +# Tests the "find" block with a function call. +def test_find_text_complex(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + number_of_calls = 0 + assertEquals(get_fruit().find('an') + 1, 2, 'find first complex') + check_number_of_calls('find first complex') + number_of_calls = 0 + assertEquals((get_fruit() if True else None).find('an') + 1, 2, 'find first order complex') + check_number_of_calls('find first order complex') + number_of_calls = 0 + assertEquals(get_fruit().rfind('an') + 1, 4, 'find last complex') + check_number_of_calls('find last complex') + number_of_calls = 0 + assertEquals((get_fruit() if True else None).rfind('an') + 1, 4, 'find last order complex') + check_number_of_calls('find last order complex') + number_of_calls = 0 + assertEquals(get_fruit().find('Peel') + 1, 0, 'find none complex') + check_number_of_calls('find none complex') + number_of_calls = 0 + assertEquals((get_fruit() if True else None).find('Peel') + 1, 0, 'find none order complex') + check_number_of_calls('find none order complex') + +def text_random_letter(text): + x = int(random.random() * len(text)) + return text[x]; + +# Tests the "get letter" block with a variable. +def test_get_text_simple(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + text = 'Blockly' + assertEquals(text[0], 'B', 'get first simple') + assertEquals(text[-1], 'y', 'get last simple') + assertEquals(text.find(text_random_letter(text)) + 1 > 0, True, 'get random simple') + assertEquals(text[2], 'o', 'get # simple') + assertEquals(text[int((3 if True else None) - 1)], 'o', 'get # order simple') + assertEquals(text[-3], 'k', 'get #-end simple') + # The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(text[-int(0 + 3)], 'k', 'get #-end order simple') + +# Creates a string for use with the get test. +def get_Blockly(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + number_of_calls = (number_of_calls if isinstance(number_of_calls, Number) else 0) + 1 + return 'Blockly' + +# Tests the "get letter" block with a function call. +def test_get_text_complex(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + text = 'Blockly' + number_of_calls = 0 + assertEquals(get_Blockly()[0], 'B', 'get first complex') + check_number_of_calls('get first complex') + number_of_calls = 0 + assertEquals((get_Blockly() if True else None)[0], 'B', 'get first order complex') + check_number_of_calls('get first order complex') + number_of_calls = 0 + assertEquals(get_Blockly()[-1], 'y', 'get last complex') + check_number_of_calls('get last complex') + number_of_calls = 0 + assertEquals((get_Blockly() if True else None)[-1], 'y', 'get last order complex') + check_number_of_calls('get last order complex') + number_of_calls = 0 + assertEquals(text.find(text_random_letter(get_Blockly())) + 1 > 0, True, 'get random complex') + check_number_of_calls('get random complex') + number_of_calls = 0 + assertEquals(text.find(text_random_letter((get_Blockly() if True else None))) + 1 > 0, True, 'get random order complex') + check_number_of_calls('get random order complex') + number_of_calls = 0 + assertEquals(get_Blockly()[2], 'o', 'get # complex') + check_number_of_calls('get # complex') + number_of_calls = 0 + assertEquals((get_Blockly() if True else None)[int((3 if True else None) - 1)], 'o', 'get # order complex') + check_number_of_calls('get # order complex') + number_of_calls = 0 + assertEquals(get_Blockly()[-3], 'k', 'get #-end complex') + check_number_of_calls('get #-end complex') + number_of_calls = 0 + # The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals((get_Blockly() if True else None)[-int(0 + 3)], 'k', 'get #-end order complex') + check_number_of_calls('get #-end order complex') + +# Creates a string for use with the substring test. +def get_numbers(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + number_of_calls = (number_of_calls if isinstance(number_of_calls, Number) else 0) + 1 + return '123456789' + +# Tests the "get substring" block with a variable. +def test_substring_simple(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + text = '123456789' + assertEquals(text[1 : 3], '23', 'substring # simple') + assertEquals(text[int((2 if True else None) - 1) : int(3 if True else None)], '23', 'substring # simple order') + assertEquals(text[-3 : -1], '78', 'substring #-end simple') + # The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(text[-int(0 + 3) : -int((0 + 2) - 1) or sys.maxsize], '78', 'substring #-end simple order') + assertEquals(text[ : ], text, 'substring first-last simple') + assertEquals(text[1 : -1], '2345678', 'substring # #-end simple') + assertEquals(text[-7 : 4], '34', 'substring #-end # simple') + assertEquals(text[ : 4], '1234', 'substring first # simple') + assertEquals(text[ : -1], '12345678', 'substring first #-end simple') + assertEquals(text[6 : ], '789', 'substring # last simple') + assertEquals(text[-3 : ], '789', 'substring #-end last simple') + assertEquals(text[ : ], '123456789', 'substring all with # #-end simple') + assertEquals(text[-9 : 9], '123456789', 'substring all with #-end # simple') + # Checks that the whole string is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where substring uses [x:length - y] for # #-end. + assertEquals(text[int((0 + 1) - 1) : -int((0 + 1) - 1) or sys.maxsize], '123456789', 'substring all with # #-end math simple') + +# Tests the "get substring" block with a function call. +def test_substring_complex(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + number_of_calls = 0 + assertEquals(get_numbers()[1 : 3], '23', 'substring # complex') + check_number_of_calls('substring # complex') + number_of_calls = 0 + assertEquals((get_numbers() if True else None)[int((2 if True else None) - 1) : int(3 if True else None)], '23', 'substring # complex order') + check_number_of_calls('substring # complex order') + number_of_calls = 0 + # The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(get_numbers()[-3 : -1], '78', 'substring #-end complex') + check_number_of_calls('substring #-end complex') + number_of_calls = 0 + assertEquals((get_numbers() if True else None)[-int(0 + 3) : -int((0 + 2) - 1) or sys.maxsize], '78', 'substring #-end order order') + check_number_of_calls('substring #-end order order') + number_of_calls = 0 + assertEquals(get_numbers()[ : ], text, 'substring first-last') + check_number_of_calls('substring first-last') + number_of_calls = 0 + assertEquals(get_numbers()[1 : -1], '2345678', 'substring # #-end complex') + check_number_of_calls('substring # #-end complex') + number_of_calls = 0 + assertEquals(get_numbers()[-7 : 4], '34', 'substring #-end # complex') + check_number_of_calls('substring #-end # complex') + number_of_calls = 0 + assertEquals(get_numbers()[ : 4], '1234', 'substring first # complex') + check_number_of_calls('substring first # complex') + number_of_calls = 0 + assertEquals(get_numbers()[ : -1], '12345678', 'substring first #-end complex') + check_number_of_calls('substring first #-end complex') + number_of_calls = 0 + assertEquals(get_numbers()[6 : ], '789', 'substring # last complex') + check_number_of_calls('substring # last complex') + number_of_calls = 0 + assertEquals(get_numbers()[-3 : ], '789', 'substring #-end last complex') + check_number_of_calls('substring #-end last complex') + number_of_calls = 0 + assertEquals(get_numbers()[ : ], '123456789', 'substring all with # #-end complex') + check_number_of_calls('substring all with # #-end complex') + number_of_calls = 0 + assertEquals(get_numbers()[-9 : 9], '123456789', 'substring all with #-end # complex') + check_number_of_calls('substring all with #-end # complex') + number_of_calls = 0 + # Checks that the whole string is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where substring uses [x:length - y] for # #-end. + assertEquals(get_numbers()[int((0 + 1) - 1) : -int((0 + 1) - 1) or sys.maxsize], '123456789', 'substring all with # #-end math complex') + check_number_of_calls('substring all with # #-end math complex') + +# Tests the "change casing" block. +def test_case(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + text = 'Hello World' + assertEquals(text.upper(), 'HELLO WORLD', 'uppercase') + assertEquals((text if True else None).upper(), 'HELLO WORLD', 'uppercase order') + text = 'Hello World' + assertEquals(text.lower(), 'hello world', 'lowercase') + assertEquals((text if True else None).lower(), 'hello world', 'lowercase order') + text = 'heLLo WorlD' + assertEquals(text.title(), 'Hello World', 'titlecase') + assertEquals((text if True else None).title(), 'Hello World', 'titlecase order') + +# Tests the "trim" block. +def test_trim(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + text = ' abc def ' + assertEquals(text.strip(), 'abc def', 'trim both') + assertEquals((text if True else None).strip(), 'abc def', 'trim both order') + assertEquals(text.lstrip(), 'abc def ', 'trim left') + assertEquals((text if True else None).lstrip(), 'abc def ', 'trim left order') + assertEquals(text.rstrip(), ' abc def', 'trim right') + assertEquals((text if True else None).rstrip(), ' abc def', 'trim right order') + +# Tests the "trim" block. +def test_count_text(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + text = 'woolloomooloo' + assertEquals(text.count('o'), 8, 'len 1') + assertEquals(text.count('oo'), 4, 'len 2') + assertEquals(text.count('loo'), 2, 'len 3') + assertEquals(text.count('wool'), 1, 'start') + assertEquals(text.count('chicken'), 0, 'missing') + assertEquals(text.count(''), 14, 'empty needle') + assertEquals(''.count('chicken'), 0, 'empty source') + +# Tests the "trim" block. +def test_text_reverse(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + assertEquals(''[::-1], '', 'empty string') + assertEquals('a'[::-1], 'a', 'len 1') + assertEquals('ab'[::-1], 'ba', 'len 2') + assertEquals('woolloomooloo'[::-1], 'ooloomoolloow', 'longer') + +# Tests the "trim" block. +def test_replace(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + assertEquals('woolloomooloo'.replace('oo', '123'), 'w123ll123m123l123', 'replace all instances 1') + assertEquals('woolloomooloo'.replace('.oo', 'X'), 'woolloomooloo', 'literal string replacement') + assertEquals('woolloomooloo'.replace('abc', 'X'), 'woolloomooloo', 'not found') + assertEquals('woolloomooloo'.replace('o', ''), 'wllml', 'empty replacement 1') + assertEquals('aaaaa'.replace('aaaaa', ''), '', 'empty replacement 2') + assertEquals('aaaaa'.replace('a', ''), '', 'empty replacement 3') + assertEquals(''.replace('a', 'chicken'), '', 'empty source') + +# Checks that the number of calls is one in order +# to confirm that a function was only called once. +def check_number_of_calls2(test_name): + global naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + test_name = str(test_name) + 'number of calls' + assertEquals(number_of_calls, 1, test_name) + +# Tests the "create list with" and "create empty list" blocks. +def test_create_lists(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + assertEquals([], [], 'create empty') + assertEquals([True, 'love'], [True, 'love'], 'create items') + assertEquals(['Eject'] * 3, ['Eject', 'Eject', 'Eject'], 'create repeated') + assertEquals(['Eject'] * (0 + 3), ['Eject', 'Eject', 'Eject'], 'create repeated order') + +# Creates an empty list for use with the empty test. +def get_empty_list(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + return [] + +# Tests the "is empty" block. +def test_lists_empty(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + assertEquals(not len([0]), False, 'not empty') + assertEquals(not len([]), True, 'empty') + assertEquals(not len(get_empty_list()), True, 'empty complex') + assertEquals(not len([] if True else None), True, 'empty order') + +# Tests the "length" block. +def test_lists_length(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + assertEquals(len([]), 0, 'zero length') + assertEquals(len(['cat']), 1, 'one length') + assertEquals(len(['cat', True, []]), 3, 'three length') + assertEquals(len(['cat', True] if True else None), 2, 'two length order') + +def last_index(my_list, elem): + try: index = len(my_list) - my_list[::-1].index(elem) + except: index = 0 + return index + +# Tests the "find" block with a variable. +def test_find_lists_simple(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + list2 = ['Alice', 'Eve', 'Bob', 'Eve'] + assertEquals(first_index(list2, 'Eve'), 2, 'find first simple') + assertEquals(last_index(list2, 'Eve'), 4, 'find last simple') + assertEquals(first_index(list2, 'Dave'), 0, 'find none simple') + +# Creates a list for use with the find test. +def get_names(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + number_of_calls = (number_of_calls if isinstance(number_of_calls, Number) else 0) + 1 + return ['Alice', 'Eve', 'Bob', 'Eve'] + +# Tests the "find" block with a function call. +def test_find_lists_complex(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + number_of_calls = 0 + assertEquals(first_index(get_names(), 'Eve'), 2, 'find first complex') + check_number_of_calls('find first complex') + number_of_calls = 0 + assertEquals(first_index(get_names() if True else None, 'Eve'), 2, 'find first order complex') + check_number_of_calls('find first order complex') + number_of_calls = 0 + assertEquals(last_index(get_names(), 'Eve'), 4, 'find last complex') + check_number_of_calls('find last complex') + number_of_calls = 0 + assertEquals(last_index(get_names() if True else None, 'Eve'), 4, 'find last order complex') + check_number_of_calls('find last order complex') + number_of_calls = 0 + assertEquals(first_index(get_names(), 'Dave'), 0, 'find none complex') + check_number_of_calls('find none complex') + number_of_calls = 0 + assertEquals(first_index(get_names() if True else None, 'Dave'), 0, 'find none order complex') + check_number_of_calls('find none order complex') + +# Tests the "get" block with a variable. +def test_get_lists_simple(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + list2 = ['Kirk', 'Spock', 'McCoy'] + assertEquals(list2[0], 'Kirk', 'get first simple') + assertEquals(list2[-1], 'McCoy', 'get last simple') + assertEquals(first_index(list2, random.choice(list2)) > 0, True, 'get random simple') + assertEquals(list2[1], 'Spock', 'get # simple') + assertEquals(list2[int((2 if True else None) - 1)], 'Spock', 'get # order simple') + assertEquals(list2[-3], 'Kirk', 'get #-end simple') + # The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(list2[-int(0 + 3)], 'Kirk', 'get #-end order simple') + +# Creates a list for use with the get test. +def get_star_wars(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + number_of_calls = (number_of_calls if isinstance(number_of_calls, Number) else 0) + 1 + return ['Kirk', 'Spock', 'McCoy'] + +# Tests the "get" block with a function call. +def test_get_lists_complex(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + list2 = ['Kirk', 'Spock', 'McCoy'] + number_of_calls = 0 + assertEquals(get_star_wars()[0], 'Kirk', 'get first complex') + check_number_of_calls('get first complex') + number_of_calls = 0 + assertEquals((get_star_wars() if True else None)[0], 'Kirk', 'get first order complex') + check_number_of_calls('get first order complex') + number_of_calls = 0 + assertEquals(get_star_wars()[-1], 'McCoy', 'get last complex') + check_number_of_calls('get last complex') + number_of_calls = 0 + assertEquals((get_star_wars() if True else None)[-1], 'McCoy', 'get last order complex') + check_number_of_calls('get last order complex') + number_of_calls = 0 + assertEquals(first_index(list2, random.choice(get_star_wars())) > 0, True, 'get random complex') + check_number_of_calls('get random complex') + number_of_calls = 0 + assertEquals(first_index(list2, random.choice(get_star_wars() if True else None)) > 0, True, 'get random order complex') + check_number_of_calls('get random order complex') + number_of_calls = 0 + assertEquals(get_star_wars()[1], 'Spock', 'get # complex') + check_number_of_calls('get # complex') + number_of_calls = 0 + assertEquals((get_star_wars() if True else None)[int((2 if True else None) - 1)], 'Spock', 'get # order complex') + check_number_of_calls('get # order complex') + number_of_calls = 0 + assertEquals(get_star_wars()[-3], 'Kirk', 'get #-end complex') + check_number_of_calls('get #-end complex') + number_of_calls = 0 + # The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals((get_star_wars() if True else None)[-int(0 + 3)], 'Kirk', 'get #-end order complex') + check_number_of_calls('get #-end order complex') + +def lists_remove_random_item(myList): + x = int(random.random() * len(myList)) + return myList.pop(x) + +# Tests the "get and remove" block. +def test_getRemove(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + list2 = ['Kirk', 'Spock', 'McCoy'] + assertEquals(list2.pop(0), 'Kirk', 'getremove first') + assertEquals(list2, ['Spock', 'McCoy'], 'getremove first list') + list2 = ['Kirk', 'Spock', 'McCoy'] + assertEquals((list2 if True else None).pop(0), 'Kirk', 'getremove first order') + assertEquals(list2, ['Spock', 'McCoy'], 'getremove first order list') + list2 = ['Kirk', 'Spock', 'McCoy'] + assertEquals(list2.pop(), 'McCoy', 'getremove last') + assertEquals(list2, ['Kirk', 'Spock'], 'getremove last list') + list2 = ['Kirk', 'Spock', 'McCoy'] + assertEquals((list2 if True else None).pop(), 'McCoy', 'getremove last order') + assertEquals(list2, ['Kirk', 'Spock'], 'getremove last order list') + list2 = ['Kirk', 'Spock', 'McCoy'] + assertEquals(first_index(list2, lists_remove_random_item(list2)) == 0, True, 'getremove random') + assertEquals(len(list2), 2, 'getremove random list') + list2 = ['Kirk', 'Spock', 'McCoy'] + assertEquals(first_index(list2, lists_remove_random_item(list2 if True else None)) == 0, True, 'getremove random order') + assertEquals(len(list2), 2, 'getremove random order list') + list2 = ['Kirk', 'Spock', 'McCoy'] + assertEquals(list2.pop(1), 'Spock', 'getremove #') + assertEquals(list2, ['Kirk', 'McCoy'], 'getremove # list') + list2 = ['Kirk', 'Spock', 'McCoy'] + assertEquals((list2 if True else None).pop(int((2 if True else None) - 1)), 'Spock', 'getremove # order') + assertEquals(list2, ['Kirk', 'McCoy'], 'getremove # order list') + list2 = ['Kirk', 'Spock', 'McCoy'] + assertEquals(list2.pop(-3), 'Kirk', 'getremove #-end') + assertEquals(list2, ['Spock', 'McCoy'], 'getremove #-end list') + list2 = ['Kirk', 'Spock', 'McCoy'] + # The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals((list2 if True else None).pop(-int(0 + 3)), 'Kirk', 'getremove #-end order') + assertEquals(list2, ['Spock', 'McCoy'], 'getremove #-end order list') + +# Tests the "remove" block. +def test_remove(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + list2 = ['Kirk', 'Spock', 'McCoy'] + list2.pop(0) + assertEquals(list2, ['Spock', 'McCoy'], 'remove first list') + list2 = ['Kirk', 'Spock', 'McCoy'] + (list2 if True else None).pop(0) + assertEquals(list2, ['Spock', 'McCoy'], 'remove first order list') + list2 = ['Kirk', 'Spock', 'McCoy'] + list2.pop() + assertEquals(list2, ['Kirk', 'Spock'], 'remove last list') + list2 = ['Kirk', 'Spock', 'McCoy'] + (list2 if True else None).pop() + assertEquals(list2, ['Kirk', 'Spock'], 'remove last order list') + list2 = ['Kirk', 'Spock', 'McCoy'] + lists_remove_random_item(list2) + assertEquals(len(list2), 2, 'remove random list') + list2 = ['Kirk', 'Spock', 'McCoy'] + lists_remove_random_item(list2 if True else None) + assertEquals(len(list2), 2, 'remove random order list') + list2 = ['Kirk', 'Spock', 'McCoy'] + list2.pop(1) + assertEquals(list2, ['Kirk', 'McCoy'], 'remove # list') + list2 = ['Kirk', 'Spock', 'McCoy'] + (list2 if True else None).pop(int((2 if True else None) - 1)) + assertEquals(list2, ['Kirk', 'McCoy'], 'remove # order list') + list2 = ['Kirk', 'Spock', 'McCoy'] + list2.pop(-3) + assertEquals(list2, ['Spock', 'McCoy'], 'remove #-end list') + list2 = ['Kirk', 'Spock', 'McCoy'] + # The order for index for #-end is addition because this will catch + # errors in generators where most perform the operation ... - index. + (list2 if True else None).pop(-int(0 + 3)) + assertEquals(list2, ['Spock', 'McCoy'], 'remove #-end order list') + +# Tests the "set" block. +def test_set(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + list2 = ['Picard', 'Riker', 'Crusher'] + list2[0] = 'Jean-Luc' + assertEquals(list2, ['Jean-Luc', 'Riker', 'Crusher'], 'set first list') + list2 = ['Picard', 'Riker', 'Crusher'] + (list2 if True else None)[0] = 'Jean-Luc' + assertEquals(list2, ['Jean-Luc', 'Riker', 'Crusher'], 'set first order list') + list2 = ['Picard', 'Riker', 'Crusher'] + list2[-1] = 'Beverly' + assertEquals(list2, ['Picard', 'Riker', 'Beverly'], 'set last list') + list2 = ['Picard', 'Riker', 'Crusher'] + (list2 if True else None)[-1] = 'Beverly' + assertEquals(list2, ['Picard', 'Riker', 'Beverly'], 'set last order list') + list2 = ['Picard', 'Riker', 'Crusher'] + tmp_x = int(random.random() * len(list2)) + list2[tmp_x] = 'Data' + assertEquals(len(list2), 3, 'set random list') + list2 = ['Picard', 'Riker', 'Crusher'] + tmp_list = (list2 if True else None) + tmp_x2 = int(random.random() * len(tmp_list)) + tmp_list[tmp_x2] = 'Data' + assertEquals(len(list2), 3, 'set random order list') + list2 = ['Picard', 'Riker', 'Crusher'] + list2[2] = 'Pulaski' + assertEquals(list2, ['Picard', 'Riker', 'Pulaski'], 'set # list') + list2 = ['Picard', 'Riker', 'Crusher'] + (list2 if True else None)[int((3 if True else None) - 1)] = 'Pulaski' + assertEquals(list2, ['Picard', 'Riker', 'Pulaski'], 'set # order list') + list2 = ['Picard', 'Riker', 'Crusher'] + list2[-1] = 'Pulaski' + assertEquals(list2, ['Picard', 'Riker', 'Pulaski'], 'set #-end list') + list2 = ['Picard', 'Riker', 'Crusher'] + # The order for index for #-end is addition because this will catch + # errors in generators where most perform the operation ... - index. + (list2 if True else None)[-int(0 + 2)] = 'Pulaski' + assertEquals(list2, ['Picard', 'Pulaski', 'Crusher'], 'set #-end order list') + +# Tests the "insert" block. +def test_insert(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + list2 = ['Picard', 'Riker', 'Crusher'] + list2.insert(0, 'Data') + assertEquals(list2, ['Data', 'Picard', 'Riker', 'Crusher'], 'insert first list') + list2 = ['Picard', 'Riker', 'Crusher'] + (list2 if True else None).insert(0, 'Data') + assertEquals(list2, ['Data', 'Picard', 'Riker', 'Crusher'], 'insert first order list') + list2 = ['Picard', 'Riker', 'Crusher'] + list2.append('Data') + assertEquals(list2, ['Picard', 'Riker', 'Crusher', 'Data'], 'insert last list') + list2 = ['Picard', 'Riker', 'Crusher'] + (list2 if True else None).append('Data') + assertEquals(list2, ['Picard', 'Riker', 'Crusher', 'Data'], 'insert last order list') + list2 = ['Picard', 'Riker', 'Crusher'] + tmp_x3 = int(random.random() * len(list2)) + list2.insert(tmp_x3, 'Data') + assertEquals(len(list2), 4, 'insert random list') + list2 = ['Picard', 'Riker', 'Crusher'] + tmp_list2 = (list2 if True else None) + tmp_x4 = int(random.random() * len(tmp_list2)) + tmp_list2.insert(tmp_x4, 'Data') + assertEquals(len(list2), 4, 'insert random order list') + list2 = ['Picard', 'Riker', 'Crusher'] + list2.insert(2, 'Data') + assertEquals(list2, ['Picard', 'Riker', 'Data', 'Crusher'], 'insert # list') + list2 = ['Picard', 'Riker', 'Crusher'] + (list2 if True else None).insert(int((3 if True else None) - 1), 'Data') + assertEquals(list2, ['Picard', 'Riker', 'Data', 'Crusher'], 'insert # order list') + list2 = ['Picard', 'Riker', 'Crusher'] + list2.insert(-1, 'Data') + assertEquals(list2, ['Picard', 'Riker', 'Data', 'Crusher'], 'insert #-end list') + list2 = ['Picard', 'Riker', 'Crusher'] + # The order for index for #-end is addition because this will catch + # errors in generators where most perform the operation ... - index. + (list2 if True else None).insert(-int(0 + 2), 'Data') + assertEquals(list2, ['Picard', 'Data', 'Riker', 'Crusher'], 'insert #-end order list') + +# Tests the "get sub-list" block with a variable. +def test_sublist_simple(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + list2 = ['Columbia', 'Challenger', 'Discovery', 'Atlantis', 'Endeavour'] + assertEquals(list2[1 : 3], ['Challenger', 'Discovery'], 'sublist # simple') + assertEquals(list2[int((2 if True else None) - 1) : int(3 if True else None)], ['Challenger', 'Discovery'], 'sublist # simple order') + assertEquals(list2[-3 : -1], ['Discovery', 'Atlantis'], 'sublist #-end simple') + # The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(list2[-int(0 + 3) : -int((0 + 2) - 1) or sys.maxsize], ['Discovery', 'Atlantis'], 'sublist #-end simple order') + assertEquals(list2[ : ], list2, 'sublist first-last simple') + changing_list = ['Columbia', 'Challenger', 'Discovery', 'Atlantis', 'Endeavour'] + list_copy = changing_list[ : ] + lists_remove_random_item(changing_list) + assertEquals(list_copy, list2, 'sublist first-last simple copy check') + assertEquals(list2[1 : -1], ['Challenger', 'Discovery', 'Atlantis'], 'sublist # #-end simple') + assertEquals(list2[-3 : 4], ['Discovery', 'Atlantis'], 'sublist #-end # simple') + assertEquals(list2[ : 4], ['Columbia', 'Challenger', 'Discovery', 'Atlantis'], 'sublist first # simple') + assertEquals(list2[ : -3], ['Columbia', 'Challenger'], 'sublist first #-end simple') + assertEquals(list2[3 : ], ['Atlantis', 'Endeavour'], 'sublist # last simple') + assertEquals(list2[-4 : ], ['Challenger', 'Discovery', 'Atlantis', 'Endeavour'], 'sublist #-end last simple') + assertEquals(list2[ : ], list2, 'sublist all with # #-end simple') + assertEquals(list2[-5 : 5], list2, 'sublist all with #-end # simple') + # Checks that the whole list is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where sublist uses [x:length - y] for # #-end. + assertEquals(list2[int((0 + 1) - 1) : -int((0 + 1) - 1) or sys.maxsize], list2, 'sublist all with # #-end math simple') + +# Creates a list for use with the sublist test. +def get_space_shuttles(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + number_of_calls = (number_of_calls if isinstance(number_of_calls, Number) else 0) + 1 + return ['Columbia', 'Challenger', 'Discovery', 'Atlantis', 'Endeavour'] + +# Tests the "get sub-list" block with a function call. +def test_sublist_complex(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + number_of_calls = 0 + assertEquals(get_space_shuttles()[1 : 3], ['Challenger', 'Discovery'], 'sublist # start complex') + check_number_of_calls('sublist # start complex') + number_of_calls = 0 + assertEquals((get_space_shuttles() if True else None)[int((2 if True else None) - 1) : int(3 if True else None)], ['Challenger', 'Discovery'], 'sublist # start order complex') + check_number_of_calls('sublist # start order complex') + number_of_calls = 0 + # The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + assertEquals(get_space_shuttles()[-3 : -1], ['Discovery', 'Atlantis'], 'sublist # end complex') + assertEquals(number_of_calls, 1, 'sublist # end complex number of calls') + number_of_calls = 0 + assertEquals((get_space_shuttles() if True else None)[-int(0 + 3) : -int((0 + 2) - 1) or sys.maxsize], ['Discovery', 'Atlantis'], 'sublist # end order complex') + check_number_of_calls('sublist # end order complex') + number_of_calls = 0 + assertEquals(get_space_shuttles()[ : ], list2, 'sublist first-last complex') + check_number_of_calls('sublist first-last complex') + number_of_calls = 0 + assertEquals(get_space_shuttles()[1 : -1], ['Challenger', 'Discovery', 'Atlantis'], 'sublist # #-end complex') + check_number_of_calls('sublist # #-end complex') + number_of_calls = 0 + assertEquals(get_space_shuttles()[-3 : 4], ['Discovery', 'Atlantis'], 'sublist #-end # complex') + check_number_of_calls('sublist #-end # complex') + number_of_calls = 0 + assertEquals(get_space_shuttles()[ : 4], ['Columbia', 'Challenger', 'Discovery', 'Atlantis'], 'sublist first # complex') + check_number_of_calls('sublist first # complex') + number_of_calls = 0 + assertEquals(get_space_shuttles()[ : -3], ['Columbia', 'Challenger'], 'sublist first #-end complex') + check_number_of_calls('sublist first #-end complex') + number_of_calls = 0 + assertEquals(get_space_shuttles()[3 : ], ['Atlantis', 'Endeavour'], 'sublist # last complex') + check_number_of_calls('sublist # last complex') + number_of_calls = 0 + assertEquals(get_space_shuttles()[-4 : ], ['Challenger', 'Discovery', 'Atlantis', 'Endeavour'], 'sublist #-end last simple') + check_number_of_calls('sublist #-end last simple') + number_of_calls = 0 + assertEquals(get_space_shuttles()[ : ], list2, 'sublist all with # #-end complex') + check_number_of_calls('sublist all with # #-end complex') + number_of_calls = 0 + assertEquals(get_space_shuttles()[-5 : 5], list2, 'sublist all with #-end # complex') + check_number_of_calls('sublist all with #-end # complex') + number_of_calls = 0 + # Checks that the whole list is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where sublist uses [x:length - y] for # #-end. + assertEquals(get_space_shuttles()[int((0 + 1) - 1) : -int((0 + 1) - 1) or sys.maxsize], list2, 'sublist all with # #-end math complex') + check_number_of_calls('sublist all with # #-end math complex') + +# Tests the "join" block. +def test_join(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + list2 = ['Vulcan', 'Klingon', 'Borg'] + assertEquals(','.join(list2), 'Vulcan,Klingon,Borg', 'join') + assertEquals(','.join(list2 if True else None), 'Vulcan,Klingon,Borg', 'join order') + +# Tests the "split" block. +def test_split(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + text = 'Vulcan,Klingon,Borg' + assertEquals(text.split(','), ['Vulcan', 'Klingon', 'Borg'], 'split') + assertEquals((text if True else None).split(','), ['Vulcan', 'Klingon', 'Borg'], 'split order') + +def lists_sort(my_list, type, reverse): + def try_float(s): + try: + return float(s) + except: + return 0 + key_funcs = { + "NUMERIC": try_float, + "TEXT": str, + "IGNORE_CASE": lambda s: str(s).lower() + } + key_func = key_funcs[type] + list_cpy = list(my_list) + return sorted(list_cpy, key=key_func, reverse=reverse) + +# Tests the "alphabetic sort" block. +def test_sort_alphabetic(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + list2 = ['Vulcan', 'klingon', 'Borg'] + assertEquals(lists_sort(list2, "TEXT", False), ['Borg', 'Vulcan', 'klingon'], 'sort alphabetic ascending') + assertEquals(lists_sort(list2 if True else None, "TEXT", False), ['Borg', 'Vulcan', 'klingon'], 'sort alphabetic ascending order') + +# Tests the "alphabetic sort ignore case" block. +def test_sort_ignoreCase(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + list2 = ['Vulcan', 'klingon', 'Borg'] + assertEquals(lists_sort(list2, "IGNORE_CASE", False), ['Borg', 'klingon', 'Vulcan'], 'sort ignore case ascending') + assertEquals(lists_sort(list2 if True else None, "IGNORE_CASE", False), ['Borg', 'klingon', 'Vulcan'], 'sort ignore case ascending order') + +# Tests the "numeric sort" block. +def test_sort_numeric(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + list2 = [8, 18, -1] + assertEquals(lists_sort(list2, "NUMERIC", True), [18, 8, -1], 'sort numeric descending') + assertEquals(lists_sort(list2 if True else None, "NUMERIC", True), [18, 8, -1], 'sort numeric descending order') + +# Tests the "list reverse" block. +def test_lists_reverse(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + list2 = [8, 18, -1, 64] + assertEquals(list(reversed(list2)), [64, -1, 18, 8], 'reverse a copy') + assertEquals(list2, [8, 18, -1, 64], 'reverse a copy original') + list2 = [] + assertEquals(list(reversed(list2)), [], 'empty list') + +# Describe this function... +def test_colour_picker(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + assertEquals('#ff6600', '#ff6600', 'static colour') + +def colour_rgb(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) + +# Describe this function... +def test_rgb(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + assertEquals(colour_rgb(100, 40, 0), '#ff6600', 'from rgb') + +# Describe this function... +def test_colour_random(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + for count4 in range(100): + item = '#%06x' % random.randint(0, 2**24 - 1) + assertEquals(len(item), 7, 'length of random colour string: ' + str(item)) + assertEquals(item[0], '#', 'format of random colour string: ' + str(item)) + for i in range(1, 7): + assertEquals(0 != 'abcdefABDEF0123456789'.find(item[int((i + 1) - 1)]) + 1, True, ''.join([str(x4) for x4 in ['contents of random colour string: ', item, ' at index: ', i + 1]])) + +def colour_blend(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) + +# Describe this function... +def test_blend(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + assertEquals(colour_blend('#ff0000', colour_rgb(100, 40, 0), 0.4), '#ff2900', 'blend') + +# Describe this function... +def test_procedure(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + procedure_1(8, 2) + assertEquals(proc_z, 4, 'procedure with global') + proc_w = False + procedure_2(False) + assertEquals(proc_w, True, 'procedure no return') + proc_w = False + procedure_2(True) + assertEquals(proc_w, False, 'procedure return') + +# Describe this function... +def procedure_1(proc_x, proc_y): + global test_name, naked, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + proc_z = proc_x / proc_y + +# Describe this function... +def procedure_2(proc_x): + global test_name, naked, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + if proc_x: + return + proc_w = True + +# Describe this function... +def test_function(): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + assertEquals(function_1(2, 3), -1, 'function with arguments') + assertEquals(func_z, 'side effect', 'function with side effect') + func_a = 'unchanged' + func_c = 'global' + assertEquals(function_2(2), '3global', 'function with global') + assertEquals(func_a, 'unchanged', 'function with scope') + assertEquals(function_3(True), True, 'function return') + assertEquals(function_3(False), False, 'function no return') + +# Describe this function... +def function_1(func_x, func_y): + global test_name, naked, proc_x, proc_y, func_a, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + func_z = 'side effect' + return func_x - func_y + +# Describe this function... +def function_2(func_a): + global test_name, naked, proc_x, proc_y, func_x, func_y, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + func_a = (func_a if isinstance(func_a, Number) else 0) + 1 + return str(func_a) + str(func_c) + +# Describe this function... +def function_3(func_a): + global test_name, naked, proc_x, proc_y, func_x, func_y, n, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + if func_a: + return True + return False + +# Describe this function... +def recurse(n): + global test_name, naked, proc_x, proc_y, func_x, func_y, func_a, ok, log, count, varToChange, rand, item, text, number_of_calls, list2, proc_z, func_z, x, proc_w, func_c, if2, i, loglist, changing_list, list_copy, unittestResults + if n > 0: + text = ''.join([str(x5) for x5 in [recurse(n - 1), n, recurse(n - 1)]]) + else: + text = '-' + return text + + +unittestResults = [] +print('\n====================\n\nRunning suite: Logic') +assertEquals(True, True, 'True') +assertEquals(False, False, 'False') +assertEquals(not False, True, 'Not true') +assertEquals(not True, False, 'Not false') +test_if() +test_ifelse() +test_equalities() +test_and() +test_or() +test_ternary() +print(unittest_report()) +unittestResults = None + +unittestResults = [] +print('\n====================\n\nRunning suite: Loops 1') +test_repeat() +test_repeat_ext() +test_while() +test_foreach() +print(unittest_report()) +unittestResults = None + +unittestResults = [] +print('\n====================\n\nRunning suite: Loops 2') +test_count_loops() +test_count_by() +print(unittest_report()) +unittestResults = None + +unittestResults = [] +print('\n====================\n\nRunning suite: Loops 3') +test_break() +test_continue() +print(unittest_report()) +unittestResults = None + +unittestResults = [] +print('\n====================\n\nRunning suite: Math') +test_arithmetic() +test_single() +test_trig() +test_constant() +test_change() +test_number_properties() +test_round() +test_operations_on_list() +test_constraint() +test_mod() +test_random_integer() +test_random_fraction() +test_atan2() +print(unittest_report()) +unittestResults = None + +unittestResults = [] +print('\n====================\n\nRunning suite: Text') +test_text_length() +test_empty_text() +test_create_text() +test_append() +test_find_text_simple() +test_find_text_complex() +test_get_text_simple() +test_get_text_complex() +test_substring_simple() +test_substring_complex() +test_case() +test_trim() +test_count_text() +test_text_reverse() +test_replace() +print(unittest_report()) +unittestResults = None + +unittestResults = [] +print('\n====================\n\nRunning suite: Lists') +test_create_lists() +test_lists_empty() +test_lists_length() +test_find_lists_simple() +test_find_lists_complex() +test_get_lists_simple() +test_get_lists_complex() +test_getRemove() +test_remove() +test_set() +test_insert() +test_sublist_simple() +test_sublist_complex() +test_join() +test_split() +test_sort_alphabetic() +test_sort_ignoreCase() +test_sort_numeric() +test_lists_reverse() +print(unittest_report()) +unittestResults = None + +unittestResults = [] +print('\n====================\n\nRunning suite: Colour') +test_colour_picker() +test_blend() +test_rgb() +test_colour_random() +print(unittest_report()) +unittestResults = None + +unittestResults = [] +print('\n====================\n\nRunning suite: Variables') +item = 123 +assertEquals(item, 123, 'variable') +if2 = 123 +assertEquals(if2, 123, 'reserved variable') +print(unittest_report()) +unittestResults = None + +# Intentionally non-connected variable. +naked + +unittestResults = [] +print('\n====================\n\nRunning suite: Functions') +test_procedure() +test_function() +assertEquals(recurse(3), '-1-2-1-3-1-2-1-', 'test recurse') +print(unittest_report()) +unittestResults = None diff --git a/js/tests/generators/index.html b/js/tests/generators/index.html new file mode 100644 index 0000000..a7082e2 --- /dev/null +++ b/js/tests/generators/index.html @@ -0,0 +1,453 @@ + + + + +Blockly Generator Tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +

    Blockly Generator Tests

    + +

    See the docs for details on running the tests. + + +

    + +
    + Logic
    + Loops 1 (repeat, while, foreach)
    + Loops 2 (count)
    + Loops 3 (continue, break)
    + Math
    + Text
    + Lists
    + Colour
    + Variables
    + Functions
    +
    + +

    + + +

    +

    + +

    + +

    + + +

    + +

    + Generate: + +

    + +
    interpreter +
    +
    + +
    interpreter +
    +
    + +
    interpreter +
    +
    + +
    interpreter +
    +
    + +
    interpreter +
    +

    +
    + +
    + + diff --git a/js/tests/generators/lists.xml b/js/tests/generators/lists.xml new file mode 100644 index 0000000..ccb76a9 --- /dev/null +++ b/js/tests/generators/lists.xml @@ -0,0 +1,8285 @@ + + + Lists + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + check number of calls + Checks that the number of calls is one in order to confirm that a function was only called once. + + + test name + + + number of calls + + + + + + + test name + + + + + number of calls + + + + + 1 + + + + + + + + + test create lists + Tests the "create list with" and "create empty list" blocks. + + + + + create empty + + + + + + + + + + + + + + + create items + + + + + + + + TRUE + + + + + love + + + + + + + + + + TRUE + + + + + love + + + + + + + + + create repeated + + + + + + + Eject + + + + + 3 + + + + + + + + + + Eject + + + + + Eject + + + + + Eject + + + + + + + + + create repeated order + + + + + + + Eject + + + + + ADD + + + 0 + + + + + 3 + + + + + + + + + + + + Eject + + + + + Eject + + + + + Eject + + + + + + + + + + + + + + + + get empty list + Creates an empty list for use with the empty test. + + + + + + test lists empty + Tests the "is empty" block. + + + FALSE + + + not empty + + + + + + + + + + 0 + + + + + + + + + TRUE + + + empty + + + + + + + + + + + + TRUE + + + empty complex + + + + + + + + + + + + + + TRUE + + + empty order + + + + + + + + + TRUE + + + + + + + + + + + + + + + + + + + + + + + test lists length + Tests the "length" block. + + + + + zero length + + + + + + + + + + + + 0 + + + + + + + one length + + + + + + + + + + cat + + + + + + + + + 1 + + + + + + + three length + + + + + + + + + + cat + + + + + TRUE + + + + + + + + + + + + 3 + + + + + + + two length order + + + + + + + + + TRUE + + + + + + + + cat + + + + + TRUE + + + + + + + + + + + + + + 2 + + + + + + + + + + + + + test find lists simple + Tests the "find" block with a variable. + + + list + + + + + + Alice + + + + + Eve + + + + + Bob + + + + + Eve + + + + + + + + + find first simple + + + + + FIRST + + + list + + + + + Eve + + + + + + + + + 1 + + + + + + + + + find last simple + + + + + LAST + + + list + + + + + Eve + + + + + + + + + 3 + + + + + + + + + find none simple + + + + + FIRST + + + list + + + + + Dave + + + + + + + + + -1 + + + + + + + + + + + + + + + get names + Creates a list for use with the find test. + + + number of calls + + + 1 + + + + + + + + + + Alice + + + + + Eve + + + + + Bob + + + + + Eve + + + + + + + test find lists complex + Tests the "find" block with a function call. + + + number of calls + + + 0 + + + + + + + find first complex + + + + + FIRST + + + + + + + + Eve + + + + + + + + + 1 + + + + + + + + + + + + find first complex + + + + + number of calls + + + 0 + + + + + + + find first order complex + + + + + FIRST + + + + + TRUE + + + + + + + + + + + + + + + Eve + + + + + + + + + 1 + + + + + + + + + + + + find first order complex + + + + + number of calls + + + 0 + + + + + + + find last complex + + + + + LAST + + + + + + + + Eve + + + + + + + + + 3 + + + + + + + + + + + + find last complex + + + + + number of calls + + + 0 + + + + + + + find last order complex + + + + + LAST + + + + + TRUE + + + + + + + + + + + + + + + Eve + + + + + + + + + 3 + + + + + + + + + + + + find last order complex + + + + + number of calls + + + 0 + + + + + + + find none complex + + + + + FIRST + + + + + + + + Dave + + + + + + + + + -1 + + + + + + + + + + + + find none complex + + + + + number of calls + + + 0 + + + + + + + find none order complex + + + + + FIRST + + + + + TRUE + + + + + + + + + + + + + + + Dave + + + + + + + + + -1 + + + + + + + + + + + + find none order complex + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + test get lists simple + Tests the "get" block with a variable. + + + list + + + + + + Kirk + + + + + Spock + + + + + McCoy + + + + + + + + + get first simple + + + + + + GET + FIRST + + + list + + + + + + + Kirk + + + + + + + get last simple + + + + + + GET + LAST + + + list + + + + + + + McCoy + + + + + TRUE + + + get random simple + + + + + GT + + + FIRST + + + list + + + + + + GET + RANDOM + + + list + + + + + + + + + + + -1 + + + + + + + + + + + get # simple + + + + + + GET + FROM_START + + + list + + + + + + + 1 + + + + + + + + + Spock + + + + + + + get # order simple + + + + + + GET + FROM_START + + + list + + + + + + + TRUE + + + + + + + 1 + + + + + + + + + + + + + + Spock + + + + + + + get #-end simple + + + + + + GET + FROM_END + + + list + + + + + + + 2 + + + + + + + + + Kirk + + + + + + + get #-end order simple + + + + + + GET + FROM_END + The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + + + list + + + + + ADD + + + 0 + + + + + + + 2 + + + + + + + + + + + Kirk + + + + + + + + + + + + + + + + + + + + + get star wars + Creates a list for use with the get test. + + + number of calls + + + 1 + + + + + + + + + + Kirk + + + + + Spock + + + + + McCoy + + + + + + + test get lists complex + Tests the "get" block with a function call. + + + list + + + + + + Kirk + + + + + Spock + + + + + McCoy + + + + + + + number of calls + + + 0 + + + + + + + get first complex + + + + + + GET + FIRST + + + + + + + + + + Kirk + + + + + + + + + + get first complex + + + + + number of calls + + + 0 + + + + + + + get first order complex + + + + + + GET + FIRST + + + + + TRUE + + + + + + + + + + + + + + + + + Kirk + + + + + + + + + + get first order complex + + + + + number of calls + + + 0 + + + + + + + get last complex + + + + + + GET + LAST + + + + + + + + + + McCoy + + + + + + + + + + get last complex + + + + + number of calls + + + 0 + + + + + + + get last order complex + + + + + + GET + LAST + + + + + TRUE + + + + + + + + + + + + + + + + + McCoy + + + + + + + + + + get last order complex + + + + + number of calls + + + 0 + + + + + TRUE + + + get random complex + + + + + GT + + + FIRST + + + list + + + + + + GET + RANDOM + + + + + + + + + + + + + + -1 + + + + + + + + + + + + + + get random complex + + + + + number of calls + + + 0 + + + + + TRUE + + + get random order complex + + + + + GT + + + FIRST + + + list + + + + + + GET + RANDOM + + + + + TRUE + + + + + + + + + + + + + + + + + + + + + -1 + + + + + + + + + + + + + + get random order complex + + + + + number of calls + + + 0 + + + + + + + get # complex + + + + + + GET + FROM_START + + + + + + + + + + 1 + + + + + + + + + Spock + + + + + + + + + + get # complex + + + + + number of calls + + + 0 + + + + + + + get # order complex + + + + + + GET + FROM_START + + + + + TRUE + + + + + + + + + + + + + + + + + TRUE + + + + + + + 1 + + + + + + + + + + + + + + Spock + + + + + + + + + + get # order complex + + + + + number of calls + + + 0 + + + + + + + get #-end complex + + + + + + GET + FROM_END + + + + + + + + + + 2 + + + + + + + + + Kirk + + + + + + + + + + get #-end complex + + + + + number of calls + + + 0 + + + + + + + get #-end order complex + + + + + + GET + FROM_END + The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + + + + + TRUE + + + + + + + + + + + + + + + ADD + + + 0 + + + + + + + 2 + + + + + + + + + + + Kirk + + + + + + + + + + get #-end order complex + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + test getRemove + Tests the "get and remove" block. + + + list + + + + + + Kirk + + + + + Spock + + + + + McCoy + + + + + + + + + getremove first + + + + + + GET_REMOVE + FIRST + + + list + + + + + + + Kirk + + + + + + + getremove first list + + + + + list + + + + + + + + Spock + + + + + McCoy + + + + + + + list + + + + + + Kirk + + + + + Spock + + + + + McCoy + + + + + + + + + getremove first order + + + + + + GET_REMOVE + FIRST + + + + + TRUE + + + + + list + + + + + + + + + + + + Kirk + + + + + + + getremove first order list + + + + + list + + + + + + + + Spock + + + + + McCoy + + + + + + + list + + + + + + Kirk + + + + + Spock + + + + + McCoy + + + + + + + + + getremove last + + + + + + GET_REMOVE + LAST + + + list + + + + + + + McCoy + + + + + + + getremove last list + + + + + list + + + + + + + + Kirk + + + + + Spock + + + + + + + list + + + + + + Kirk + + + + + Spock + + + + + McCoy + + + + + + + + + getremove last order + + + + + + GET_REMOVE + LAST + + + + + TRUE + + + + + list + + + + + + + + + + + + McCoy + + + + + + + getremove last order list + + + + + list + + + + + + + + Kirk + + + + + Spock + + + + + + + list + + + + + + Kirk + + + + + Spock + + + + + McCoy + + + + + + + TRUE + + + getremove random + + + + + EQ + + + FIRST + + + list + + + + + + GET_REMOVE + RANDOM + + + list + + + + + + + + + + + -1 + + + + + + + + + + + getremove random list + + + + + + + list + + + + + + + 2 + + + + + list + + + + + + Kirk + + + + + Spock + + + + + McCoy + + + + + + + TRUE + + + getremove random order + + + + + EQ + + + FIRST + + + list + + + + + + GET_REMOVE + RANDOM + + + + + TRUE + + + + + list + + + + + + + + + + + + + + + + -1 + + + + + + + + + + + getremove random order list + + + + + + + list + + + + + + + 2 + + + + + list + + + + + + Kirk + + + + + Spock + + + + + McCoy + + + + + + + + + getremove # + + + + + + GET_REMOVE + FROM_START + + + list + + + + + + + 1 + + + + + + + + + Spock + + + + + + + getremove # list + + + + + list + + + + + + + + Kirk + + + + + McCoy + + + + + + + list + + + + + + Kirk + + + + + Spock + + + + + McCoy + + + + + + + + + getremove # order + + + + + + GET_REMOVE + FROM_START + + + + + TRUE + + + + + list + + + + + + + + + + + + TRUE + + + + + + + 1 + + + + + + + + + + + + + + Spock + + + + + + + getremove # order list + + + + + list + + + + + + + + Kirk + + + + + McCoy + + + + + + + list + + + + + + Kirk + + + + + Spock + + + + + McCoy + + + + + + + + + getremove #-end + + + + + + GET_REMOVE + FROM_END + + + list + + + + + + + 2 + + + + + + + + + Kirk + + + + + + + getremove #-end list + + + + + list + + + + + + + + Spock + + + + + McCoy + + + + + + + list + + + + + + Kirk + + + + + Spock + + + + + McCoy + + + + + + + + + getremove #-end order + + + + + + GET_REMOVE + FROM_END + The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + + + + + TRUE + + + + + list + + + + + + + + + + ADD + + + 0 + + + + + + + 2 + + + + + + + + + + + Kirk + + + + + + + getremove #-end order list + + + + + list + + + + + + + + Spock + + + + + McCoy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + test remove + Tests the "remove" block. + + + list + + + + + + Kirk + + + + + Spock + + + + + McCoy + + + + + + + + REMOVE + FIRST + + + list + + + + + + + remove first list + + + + + list + + + + + + + + Spock + + + + + McCoy + + + + + + + list + + + + + + Kirk + + + + + Spock + + + + + McCoy + + + + + + + + REMOVE + FIRST + + + + + TRUE + + + + + list + + + + + + + + + + + + remove first order list + + + + + list + + + + + + + + Spock + + + + + McCoy + + + + + + + list + + + + + + Kirk + + + + + Spock + + + + + McCoy + + + + + + + + REMOVE + LAST + + + list + + + + + + + remove last list + + + + + list + + + + + + + + Kirk + + + + + Spock + + + + + + + list + + + + + + Kirk + + + + + Spock + + + + + McCoy + + + + + + + + REMOVE + LAST + + + + + TRUE + + + + + list + + + + + + + + + + + + remove last order list + + + + + list + + + + + + + + Kirk + + + + + Spock + + + + + + + list + + + + + + Kirk + + + + + Spock + + + + + McCoy + + + + + + + + REMOVE + RANDOM + + + list + + + + + + + remove random list + + + + + + + list + + + + + + + 2 + + + + + list + + + + + + Kirk + + + + + Spock + + + + + McCoy + + + + + + + + REMOVE + RANDOM + + + + + TRUE + + + + + list + + + + + + + + + + + + remove random order list + + + + + + + list + + + + + + + 2 + + + + + list + + + + + + Kirk + + + + + Spock + + + + + McCoy + + + + + + + + REMOVE + FROM_START + + + list + + + + + + + 1 + + + + + + + + + remove # list + + + + + list + + + + + + + + Kirk + + + + + McCoy + + + + + + + list + + + + + + Kirk + + + + + Spock + + + + + McCoy + + + + + + + + REMOVE + FROM_START + + + + + TRUE + + + + + list + + + + + + + + + + + + TRUE + + + + + + + 1 + + + + + + + + + + + + + + remove # order list + + + + + list + + + + + + + + Kirk + + + + + McCoy + + + + + + + list + + + + + + Kirk + + + + + Spock + + + + + McCoy + + + + + + + + REMOVE + FROM_END + + + list + + + + + + + 2 + + + + + + + + + remove #-end list + + + + + list + + + + + + + + Spock + + + + + McCoy + + + + + + + list + + + + + + Kirk + + + + + Spock + + + + + McCoy + + + + + + + + REMOVE + FROM_END + The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + + + + + TRUE + + + + + list + + + + + + + + + + ADD + + + 0 + + + + + + + 2 + + + + + + + + + + + remove #-end order list + + + + + list + + + + + + + + Spock + + + + + McCoy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + test set + Tests the "set" block. + + + list + + + + + + Picard + + + + + Riker + + + + + Crusher + + + + + + + + SET + FIRST + + + list + + + + + Jean-Luc + + + + + + + set first list + + + + + list + + + + + + + + Jean-Luc + + + + + Riker + + + + + Crusher + + + + + + + list + + + + + + Picard + + + + + Riker + + + + + Crusher + + + + + + + + SET + FIRST + + + + + TRUE + + + + + list + + + + + + + + + + Jean-Luc + + + + + + + set first order list + + + + + list + + + + + + + + Jean-Luc + + + + + Riker + + + + + Crusher + + + + + + + list + + + + + + Picard + + + + + Riker + + + + + Crusher + + + + + + + + SET + LAST + + + list + + + + + Beverly + + + + + + + set last list + + + + + list + + + + + + + + Picard + + + + + Riker + + + + + Beverly + + + + + + + list + + + + + + Picard + + + + + Riker + + + + + Crusher + + + + + + + + SET + LAST + + + + + TRUE + + + + + list + + + + + + + + + + Beverly + + + + + + + set last order list + + + + + list + + + + + + + + Picard + + + + + Riker + + + + + Beverly + + + + + + + list + + + + + + Picard + + + + + Riker + + + + + Crusher + + + + + + + + SET + RANDOM + + + list + + + + + Data + + + + + + + set random list + + + + + + + list + + + + + + + 3 + + + + + list + + + + + + Picard + + + + + Riker + + + + + Crusher + + + + + + + + SET + RANDOM + + + + + TRUE + + + + + list + + + + + + + + + + Data + + + + + + + set random order list + + + + + + + list + + + + + + + 3 + + + + + list + + + + + + Picard + + + + + Riker + + + + + Crusher + + + + + + + + SET + FROM_START + + + list + + + + + + + 2 + + + + + + + Pulaski + + + + + + + set # list + + + + + list + + + + + + + + Picard + + + + + Riker + + + + + Pulaski + + + + + + + list + + + + + + Picard + + + + + Riker + + + + + Crusher + + + + + + + + SET + FROM_START + + + + + TRUE + + + + + list + + + + + + + + + + + + TRUE + + + + + + + 2 + + + + + + + + + + + + Pulaski + + + + + + + set # order list + + + + + list + + + + + + + + Picard + + + + + Riker + + + + + Pulaski + + + + + + + list + + + + + + Picard + + + + + Riker + + + + + Crusher + + + + + + + + SET + FROM_END + + + list + + + + + + + 0 + + + + + + + Pulaski + + + + + + + set #-end list + + + + + list + + + + + + + + Picard + + + + + Riker + + + + + Pulaski + + + + + + + list + + + + + + Picard + + + + + Riker + + + + + Crusher + + + + + + + + SET + FROM_END + The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + + + + + TRUE + + + + + list + + + + + + + + + + ADD + + + 0 + + + + + + + 1 + + + + + + + + + Pulaski + + + + + + + set #-end order list + + + + + list + + + + + + + + Picard + + + + + Pulaski + + + + + Crusher + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + test insert + Tests the "insert" block. + + + list + + + + + + Picard + + + + + Riker + + + + + Crusher + + + + + + + + INSERT + FIRST + + + list + + + + + Data + + + + + + + insert first list + + + + + list + + + + + + + + Data + + + + + Picard + + + + + Riker + + + + + Crusher + + + + + + + list + + + + + + Picard + + + + + Riker + + + + + Crusher + + + + + + + + INSERT + FIRST + + + + + TRUE + + + + + list + + + + + + + + + + Data + + + + + + + insert first order list + + + + + list + + + + + + + + Data + + + + + Picard + + + + + Riker + + + + + Crusher + + + + + + + list + + + + + + Picard + + + + + Riker + + + + + Crusher + + + + + + + + INSERT + LAST + + + list + + + + + Data + + + + + + + insert last list + + + + + list + + + + + + + + Picard + + + + + Riker + + + + + Crusher + + + + + Data + + + + + + + list + + + + + + Picard + + + + + Riker + + + + + Crusher + + + + + + + + INSERT + LAST + + + + + TRUE + + + + + list + + + + + + + + + + Data + + + + + + + insert last order list + + + + + list + + + + + + + + Picard + + + + + Riker + + + + + Crusher + + + + + Data + + + + + + + list + + + + + + Picard + + + + + Riker + + + + + Crusher + + + + + + + + INSERT + RANDOM + + + list + + + + + Data + + + + + + + insert random list + + + + + + + list + + + + + + + 4 + + + + + list + + + + + + Picard + + + + + Riker + + + + + Crusher + + + + + + + + INSERT + RANDOM + + + + + TRUE + + + + + list + + + + + + + + + + Data + + + + + + + insert random order list + + + + + + + list + + + + + + + 4 + + + + + list + + + + + + Picard + + + + + Riker + + + + + Crusher + + + + + + + + INSERT + FROM_START + + + list + + + + + + + 2 + + + + + + + Data + + + + + + + insert # list + + + + + list + + + + + + + + Picard + + + + + Riker + + + + + Data + + + + + Crusher + + + + + + + list + + + + + + Picard + + + + + Riker + + + + + Crusher + + + + + + + + INSERT + FROM_START + + + + + TRUE + + + + + list + + + + + + + + + + + + TRUE + + + + + + + 2 + + + + + + + + + + + + Data + + + + + + + insert # order list + + + + + list + + + + + + + + Picard + + + + + Riker + + + + + Data + + + + + Crusher + + + + + + + list + + + + + + Picard + + + + + Riker + + + + + Crusher + + + + + + + + INSERT + FROM_END + + + list + + + + + + + 0 + + + + + + + Data + + + + + + + insert #-end list + + + + + list + + + + + + + + Picard + + + + + Riker + + + + + Data + + + + + Crusher + + + + + + + list + + + + + + Picard + + + + + Riker + + + + + Crusher + + + + + + + + INSERT + FROM_END + The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + + + + + TRUE + + + + + list + + + + + + + + + + ADD + + + 0 + + + + + + + 1 + + + + + + + + + Data + + + + + + + insert #-end order list + + + + + list + + + + + + + + Picard + + + + + Data + + + + + Riker + + + + + Crusher + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + test sublist simple + Tests the "get sub-list" block with a variable. + + + list + + + + + + Columbia + + + + + Challenger + + + + + Discovery + + + + + Atlantis + + + + + Endeavour + + + + + + + + + sublist # simple + + + + + + FROM_START + FROM_START + + + list + + + + + + + 1 + + + + + + + + + 2 + + + + + + + + + + + + Challenger + + + + + Discovery + + + + + + + + + sublist # simple order + + + + + + FROM_START + FROM_START + + + list + + + + + + + TRUE + + + + + + + 1 + + + + + + + + + + + + + + TRUE + + + + + + + 2 + + + + + + + + + + + + + + + + + Challenger + + + + + Discovery + + + + + + + + + sublist #-end simple + + + + + + FROM_END + FROM_END + + + list + + + + + + + 2 + + + + + + + + + 1 + + + + + + + + + + + + Discovery + + + + + Atlantis + + + + + + + + + sublist #-end simple order + + + + + + FROM_END + FROM_END + The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + + + list + + + + + ADD + + + 0 + + + + + + + 2 + + + + + + + + + ADD + + + 0 + + + + + + + 1 + + + + + + + + + + + + + + Discovery + + + + + Atlantis + + + + + + + + + sublist first-last simple + + + + + + FIRST + LAST + + + list + + + + + + + list + + + + + changing list + + + + + + Columbia + + + + + Challenger + + + + + Discovery + + + + + Atlantis + + + + + Endeavour + + + + + + + list copy + + + + FIRST + LAST + + + changing list + + + + + + + + REMOVE + RANDOM + + + changing list + + + + + + + sublist first-last simple copy check + + + + + list copy + + + + + list + + + + + + + sublist # #-end simple + + + + + + FROM_START + FROM_END + + + list + + + + + + + 1 + + + + + + + + + 1 + + + + + + + + + + + + Challenger + + + + + Discovery + + + + + Atlantis + + + + + + + + + sublist #-end # simple + + + + + + FROM_END + FROM_START + + + list + + + + + + + 2 + + + + + + + + + 3 + + + + + + + + + + + + Discovery + + + + + Atlantis + + + + + + + + + sublist first # simple + + + + + + FIRST + FROM_START + + + list + + + + + + + 3 + + + + + + + + + + + + Columbia + + + + + Challenger + + + + + Discovery + + + + + Atlantis + + + + + + + + + sublist first #-end simple + + + + + + FIRST + FROM_END + + + list + + + + + + + 3 + + + + + + + + + + + + Columbia + + + + + Challenger + + + + + + + + + sublist # last simple + + + + + + FROM_START + LAST + + + list + + + + + + + 3 + + + + + + + + + + + + Atlantis + + + + + Endeavour + + + + + + + + + sublist #-end last simple + + + + + + FROM_END + LAST + + + list + + + + + + + 3 + + + + + + + + + + + + Challenger + + + + + Discovery + + + + + Atlantis + + + + + Endeavour + + + + + + + + + sublist all with # #-end simple + + + + + + FROM_START + FROM_END + + + list + + + + + + + 0 + + + + + + + + + 0 + + + + + + + + + list + + + + + + + sublist all with #-end # simple + + + + + + FROM_END + FROM_START + + + list + + + + + + + 4 + + + + + + + + + 4 + + + + + + + + + list + + + + + + + sublist all with # #-end math simple + + + + + + FROM_START + FROM_END + Checks that the whole list is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where sublist uses [x:length - y] for # #-end. + + + list + + + + + ADD + + + 0 + + + + + + + 0 + + + + + + + + + ADD + + + 0 + + + + + + + 0 + + + + + + + + + + + list + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + get space shuttles + Creates a list for use with the sublist test. + + + number of calls + + + 1 + + + + + + + + + + Columbia + + + + + Challenger + + + + + Discovery + + + + + Atlantis + + + + + Endeavour + + + + + + + test sublist complex + Tests the "get sub-list" block with a function call. + + + number of calls + + + 0 + + + + + + + sublist # start complex + + + + + + FROM_START + FROM_START + + + + + + + + + + 1 + + + + + + + + + 2 + + + + + + + + + + + + Challenger + + + + + Discovery + + + + + + + + + + + + sublist # start complex + + + + + number of calls + + + 0 + + + + + + + sublist # start order complex + + + + + + FROM_START + FROM_START + + + + + TRUE + + + + + + + + + + + + + + + + + TRUE + + + + + + + 1 + + + + + + + + + + + + + + TRUE + + + + + + + 2 + + + + + + + + + + + + + + + + + Challenger + + + + + Discovery + + + + + + + + + + + + sublist # start order complex + + + + + number of calls + + + 0 + + + + + + + sublist # end complex + + + + + + FROM_END + FROM_END + The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + + + + + + + + + + 2 + + + + + + + + + 1 + + + + + + + + + + + + Discovery + + + + + Atlantis + + + + + + + + + sublist # end complex number of calls + + + + + number of calls + + + + + 1 + + + + + number of calls + + + 0 + + + + + + + sublist # end order complex + + + + + + FROM_END + FROM_END + + + + + TRUE + + + + + + + + + + + + + + + ADD + + + 0 + + + + + + + 2 + + + + + + + + + ADD + + + 0 + + + + + + + 1 + + + + + + + + + + + + + + Discovery + + + + + Atlantis + + + + + + + + + + + + sublist # end order complex + + + + + number of calls + + + 0 + + + + + + + sublist first-last complex + + + + + + FIRST + LAST + + + + + + + + + + list + + + + + + + + + + sublist first-last complex + + + + + number of calls + + + 0 + + + + + + + sublist # #-end complex + + + + + + FROM_START + FROM_END + + + + + + + + + + 1 + + + + + + + + + 1 + + + + + + + + + + + + Challenger + + + + + Discovery + + + + + Atlantis + + + + + + + + + + + + sublist # #-end complex + + + + + number of calls + + + 0 + + + + + + + sublist #-end # complex + + + + + + FROM_END + FROM_START + + + + + + + + + + 2 + + + + + + + + + 3 + + + + + + + + + + + + Discovery + + + + + Atlantis + + + + + + + + + + + + sublist #-end # complex + + + + + number of calls + + + 0 + + + + + + + sublist first # complex + + + + + + FIRST + FROM_START + + + + + + + + + + 3 + + + + + + + + + + + + Columbia + + + + + Challenger + + + + + Discovery + + + + + Atlantis + + + + + + + + + + + + sublist first # complex + + + + + number of calls + + + 0 + + + + + + + sublist first #-end complex + + + + + + FIRST + FROM_END + + + + + + + + + + 3 + + + + + + + + + + + + Columbia + + + + + Challenger + + + + + + + + + + + + sublist first #-end complex + + + + + number of calls + + + 0 + + + + + + + sublist # last complex + + + + + + FROM_START + LAST + + + + + + + + + + 3 + + + + + + + + + + + + Atlantis + + + + + Endeavour + + + + + + + + + + + + sublist # last complex + + + + + number of calls + + + 0 + + + + + + + sublist #-end last simple + + + + + + FROM_END + LAST + + + + + + + + + + 3 + + + + + + + + + + + + Challenger + + + + + Discovery + + + + + Atlantis + + + + + Endeavour + + + + + + + + + + + + sublist #-end last simple + + + + + number of calls + + + 0 + + + + + + + sublist all with # #-end complex + + + + + + FROM_START + FROM_END + + + + + + + + + + 0 + + + + + + + + + 0 + + + + + + + + + list + + + + + + + + + + sublist all with # #-end complex + + + + + number of calls + + + 0 + + + + + + + sublist all with #-end # complex + + + + + + FROM_END + FROM_START + + + + + + + + + + 4 + + + + + + + + + 4 + + + + + + + + + list + + + + + + + + + + sublist all with #-end # complex + + + + + number of calls + + + 0 + + + + + + + sublist all with # #-end math complex + + + + + + FROM_START + FROM_END + Checks that the whole list is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where sublist uses [x:length - y] for # #-end. + + + + + + + + ADD + + + 0 + + + + + + + 0 + + + + + + + + + ADD + + + 0 + + + + + + + 0 + + + + + + + + + + + list + + + + + + + + + + sublist all with # #-end math complex + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + test join + Tests the "join" block. + + + list + + + + + + Vulcan + + + + + Klingon + + + + + Borg + + + + + + + + + join + + + + + + JOIN + + + list + + + + + , + + + + + + + Vulcan,Klingon,Borg + + + + + + + join order + + + + + + JOIN + + + + + TRUE + + + + + list + + + + + + + + + + , + + + + + + + Vulcan,Klingon,Borg + + + + + + + + + + + test split + Tests the "split" block. + + + text + + + Vulcan,Klingon,Borg + + + + + + + split + + + + + + SPLIT + + + text + + + + + , + + + + + + + + + + Vulcan + + + + + Klingon + + + + + Borg + + + + + + + + + split order + + + + + + SPLIT + + + + + TRUE + + + + + text + + + + + + + + + + , + + + + + + + + + + Vulcan + + + + + Klingon + + + + + Borg + + + + + + + + + + + + + test sort alphabetic + Tests the "alphabetic sort" block. + + + list + + + + + + Vulcan + + + + + klingon + + + + + Borg + + + + + + + + + sort alphabetic ascending + + + + + TEXT + 1 + + + list + + + + + + + + + + Borg + + + + + Vulcan + + + + + klingon + + + + + + + + + sort alphabetic ascending order + + + + + TEXT + 1 + + + + + TRUE + + + + + list + + + + + + + + + + + + + + + Borg + + + + + Vulcan + + + + + klingon + + + + + + + + + + + + + test sort ignoreCase + Tests the "alphabetic sort ignore case" block. + + + list + + + + + + Vulcan + + + + + klingon + + + + + Borg + + + + + + + + + sort ignore case ascending + + + + + IGNORE_CASE + 1 + + + list + + + + + + + + + + Borg + + + + + klingon + + + + + Vulcan + + + + + + + + + sort ignore case ascending order + + + + + IGNORE_CASE + 1 + + + + + TRUE + + + + + list + + + + + + + + + + + + + + + Borg + + + + + klingon + + + + + Vulcan + + + + + + + + + + + + + test sort numeric + Tests the "numeric sort" block. + + + list + + + + + + 8 + + + + + 18 + + + + + -1 + + + + + + + + + sort numeric descending + + + + + NUMERIC + -1 + + + list + + + + + + + + + + 18 + + + + + 8 + + + + + -1 + + + + + + + + + sort numeric descending order + + + + + NUMERIC + -1 + + + + + TRUE + + + + + list + + + + + + + + + + + + + + + 18 + + + + + 8 + + + + + -1 + + + + + + + + + + + + + test lists reverse + Tests the "list reverse" block. + + + list + + + + + + 8 + + + + + 18 + + + + + -1 + + + + + 64 + + + + + + + + + reverse a copy + + + + + + + list + + + + + + + + + + 64 + + + + + -1 + + + + + 18 + + + + + 8 + + + + + + + + + reverse a copy original + + + + + list + + + + + + + + 8 + + + + + 18 + + + + + -1 + + + + + 64 + + + + + + + list + + + + + + + + empty list + + + + + + + list + + + + + + + + + + + + + + + + + + + diff --git a/js/tests/generators/logic.xml b/js/tests/generators/logic.xml new file mode 100644 index 0000000..d5312d4 --- /dev/null +++ b/js/tests/generators/logic.xml @@ -0,0 +1,1019 @@ + + + Logic + + + TRUE + + + True + + + + + TRUE + + + + + FALSE + + + False + + + + + FALSE + + + + + TRUE + + + Not true + + + + + + + FALSE + + + + + + + FALSE + + + Not false + + + + + + + TRUE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + test if + Describe this function... + + + + + FALSE + + + + + if false + + + + + ok + + + FALSE + + + + + + + TRUE + + + + + ok + + + TRUE + + + + + + + TRUE + + + if true + + + + + ok + + + + + ok + + + FALSE + + + + + + + + FALSE + + + + + if/else false + + + + + ok + + + TRUE + + + + + + + TRUE + + + if/else false + + + + + ok + + + + + ok + + + FALSE + + + + + + + + TRUE + + + + + ok + + + TRUE + + + + + + + if/else true + + + + + TRUE + + + if/else true + + + + + ok + + + + + ok + + + FALSE + + + + + + + + FALSE + + + + + elseif 1 + + + + + TRUE + + + + + ok + + + TRUE + + + + + + + TRUE + + + + + elseif 2 + + + + + elseif 3 + + + + + TRUE + + + elseif 4 + + + + + ok + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + test ifelse + Describe this function... + + + ok + + + FALSE + + + + + + + TRUE + + + + + ok + + + TRUE + + + + + + + ifelse true + + + + + TRUE + + + ifelse true + + + + + ok + + + + + ok + + + FALSE + + + + + + + FALSE + + + + + ifelse false + + + + + ok + + + TRUE + + + + + + + TRUE + + + ifelse false + + + + + ok + + + + + + + + + + + + + + + + + test equalities + Describe this function... + + + TRUE + + + Equal yes + + + + + EQ + + + 2 + + + + + 2 + + + + + + + FALSE + + + Equal no + + + + + EQ + + + 3 + + + + + 4 + + + + + + + TRUE + + + Not equal yes + + + + + NEQ + + + 5 + + + + + 6 + + + + + + + FALSE + + + Not equal no + + + + + EQ + + + 3 + + + + + 4 + + + + + + + TRUE + + + Smaller yes + + + + + LT + + + 5 + + + + + 6 + + + + + + + FALSE + + + Smaller no + + + + + LT + + + 7 + + + + + 7 + + + + + + + TRUE + + + Greater yes + + + + + GT + + + 9 + + + + + 8 + + + + + + + FALSE + + + Greater no + + + + + GT + + + 10 + + + + + 10 + + + + + + + TRUE + + + Smaller-equal yes + + + + + LTE + + + 11 + + + + + 11 + + + + + + + FALSE + + + Smaller-equal no + + + + + LTE + + + 13 + + + + + 12 + + + + + + + TRUE + + + Greater-equal yes + + + + + GTE + + + 14 + + + + + 14 + + + + + + + FALSE + + + Greater-equal no + + + + + GTE + + + 15 + + + + + 16 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + test and + Describe this function... + + + TRUE + + + And true/true + + + + + AND + + + TRUE + + + + + TRUE + + + + + + + FALSE + + + And false/true + + + + + AND + + + FALSE + + + + + TRUE + + + + + + + FALSE + + + And true/false + + + + + AND + + + TRUE + + + + + FALSE + + + + + + + FALSE + + + And false/false + + + + + AND + + + FALSE + + + + + FALSE + + + + + + + + + + + + + + + test or + Describe this function... + + + TRUE + + + Or true/true + + + + + OR + + + TRUE + + + + + TRUE + + + + + + + TRUE + + + Or false/true + + + + + OR + + + FALSE + + + + + TRUE + + + + + + + TRUE + + + Or true/false + + + + + OR + + + TRUE + + + + + FALSE + + + + + + + FALSE + + + Or false/false + + + + + OR + + + FALSE + + + + + FALSE + + + + + + + + + + + + + + + test ternary + Describe this function... + + + + + if true + + + + + + + TRUE + + + + + 42 + + + + + 99 + + + + + + + 42 + + + + + + + if true + + + + + + + FALSE + + + + + 42 + + + + + 99 + + + + + + + 99 + + + + + + + + diff --git a/js/tests/generators/loops1.xml b/js/tests/generators/loops1.xml new file mode 100644 index 0000000..9ee2239 --- /dev/null +++ b/js/tests/generators/loops1.xml @@ -0,0 +1,345 @@ + + + Loops 1 + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + + + + + + + + test repeat_ext + + + count + + + 0 + + + + + + + 10 + + + + + count + + + 1 + + + + + + + + + repeat 10 + + + + + count + + + + + 10 + + + + + + + + + + diff --git a/js/tests/generators/loops2.xml b/js/tests/generators/loops2.xml new file mode 100644 index 0000000..ae6adfb --- /dev/null +++ b/js/tests/generators/loops2.xml @@ -0,0 +1,891 @@ + + + Loops 2 + + + + + + + + + + + + + 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 loops + + + 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/js/tests/generators/loops3.xml b/js/tests/generators/loops3.xml new file mode 100644 index 0000000..08006bd --- /dev/null +++ b/js/tests/generators/loops3.xml @@ -0,0 +1,735 @@ + + + Loops 3 + + + + + + + + + + + + + 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/js/tests/generators/math.xml b/js/tests/generators/math.xml new file mode 100644 index 0000000..ff079d2 --- /dev/null +++ b/js/tests/generators/math.xml @@ -0,0 +1,1950 @@ + + + Math + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + test single + Tests the "single" block. + + + + + 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 + Tests the "arithmetic" block for all operations and checks parenthesis are properly generated for different orders. + + + + + add + + + + + ADD + + + 1 + + + + + 2 + + + + + + + 3 + + + + + + + subtract + + + + + MINUS + + + 1 + + + + + 2 + + + + + + + -1 + + + + + + + subtract order with add + + + + + MINUS + + + 1 + + + + + ADD + + + 0 + + + + + 2 + + + + + + + + + -1 + + + + + + + subtract order with subtract + + + + + MINUS + + + 1 + + + + + MINUS + + + 0 + + + + + 2 + + + + + + + + + 3 + + + + + + + multiply + + + + + MULTIPLY + + + 4 + + + + + 2.5 + + + + + + + 10 + + + + + + + multiply order + + + + + MULTIPLY + + + 4 + + + + + ADD + + + 0 + + + + + 2.5 + + + + + + + + + 10 + + + + + + + divide + + + + + DIVIDE + + + 8.2 + + + + + -5 + + + + + + + -1.64 + + + + + + + divide order + + + + + DIVIDE + + + 8.2 + + + + + ADD + + + 0 + + + + + -5 + + + + + + + + + -1.64 + + + + + + + power + + + + + POWER + + + 10 + + + + + 4 + + + + + + + 10000 + + + + + + + power order + + + + + POWER + + + 10 + + + + + ADD + + + 0 + + + + + 4 + + + + + + + + + 10000 + + + + + + + + + + + + + + + + + + + + + + + + + test trig + Tests the "trig" block. + + + + + 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 + Tests the "constant" blocks. + + + + + 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 + + + + + TRUE + + + const infinity + + + + + LT + + + 9999 + + + + + INFINITY + + + + + + + + + + + + + + + + + + + test number properties + Tests the "number property" blocks. + + + TRUE + + + even + + + + + + EVEN + + + 42 + + + + + + + FALSE + + + odd + + + + + + ODD + + + 42.1 + + + + + + + TRUE + + + prime 5 + + + + + + PRIME + + + 5 + + + + + + + FALSE + + + prime 25 + + + + + + PRIME + + + 25 + + + + + + + FALSE + + + prime negative + + + + + + PRIME + + + -31.1 + + + + + + + FALSE + + + whole + + + + + + WHOLE + + + PI + + + + + + + TRUE + + + positive + + + + + + POSITIVE + + + INFINITY + + + + + + + TRUE + + + negative + + + + + + NEGATIVE + + + -42 + + + + + + + TRUE + + + divisible + + + + + + DIVISIBLE_BY + + + 42 + + + + + 2 + + + + + + + + + + + + + + + + + + + + + + + + + test round + Tests the "round" block. + + + + + round + + + + + ROUND + + + 42.42 + + + + + + + 42 + + + + + + + round up + + + + + ROUNDUP + + + -42.42 + + + + + + + -42 + + + + + + + round down + + + + + ROUNDDOWN + + + 42.42 + + + + + + + 42 + + + + + + + + + + + test change + Tests the "change" block. + + + varToChange + + + 100 + + + + + varToChange + + + 42 + + + + + + + change + + + + + varToChange + + + + + 142 + + + + + + + + + + + test operations on list + Tests the "list operation" blocks. + + + + + 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 + + + + + + MODE + + + + + + 3 + + + + + 4 + + + + + 3 + + + + + + + + + + + + 3 + + + + + + + + + modes multiple + + + + + + MODE + + + + + + 3 + + + + + 4 + + + + + 3 + + + + + 1 + + + + + 4 + + + + + + + + + + + + 3 + + + + + 4 + + + + + + + + + standard dev + + + + + + STD_DEV + + + + + + 3 + + + + + 3 + + + + + 3 + + + + + + + + + 0 + + + + + TRUE + + + random + + + + + GT + + + FIRST + + + + + + 3 + + + + + 4 + + + + + 5 + + + + + + + + RANDOM + + + + + + 3 + + + + + 4 + + + + + 5 + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + test mod + Tests the "mod" block. + + + + + mod + + + + + + + 42 + + + + + 5 + + + + + + + 2 + + + + + + + test constraint + Tests the "constrain" block. + + + + + constraint + + + + + + + 100 + + + + + 0 + + + + + 42 + + + + + + + 42 + + + + + + + test random integer + Tests the "random integer" block. + + + rand + + + + + 5 + + + + + 10 + + + + + + + TRUE + + + randRange + + + + + AND + + + GTE + + + rand + + + + + 5 + + + + + + + LTE + + + rand + + + + + 10 + + + + + + + + + TRUE + + + randInteger + + + + + + WHOLE + + + rand + + + + + + + + + + + + + test random fraction + Tests the "random fraction" block. + + + rand + + + + + + TRUE + + + randFloat + + + + + AND + + + GTE + + + rand + + + + + 0 + + + + + + + LTE + + + rand + + + + + 1 + + + + + + + + + + + + + test atan2 + Describe this function... + + + + + atan2 + + + + + + + -5 + + + + + 5 + + + + + + + 135 + + + + + + + atan2 + + + + + + + 0 + + + + + -12 + + + + + + + -90 + + + + + + + + diff --git a/js/tests/generators/run_generators_in_browser.js b/js/tests/generators/run_generators_in_browser.js new file mode 100644 index 0000000..02c6e78 --- /dev/null +++ b/js/tests/generators/run_generators_in_browser.js @@ -0,0 +1,114 @@ +/** + * @license + * Copyright 2018 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Node.js script to run generator tests in Firefox, via webdriver. + */ +var webdriverio = require('webdriverio'); +var fs = require('fs'); + +module.exports = runGeneratorsInBrowser; + +/** + * Run the generator for a given language and save the results to a file. + * @param {Thenable} browser A Thenable managing the processing of the browser + * tests. + * @param {string} filename Where to write the output file. + * @param {Function} codegenFn The function to run for code generation for this + * language. + */ +async function runLangGeneratorInBrowser(browser, filename, codegenFn) { + await browser.execute(codegenFn); + var elem = await browser.$("#importExport"); + var result = await elem.getValue(); + fs.writeFile(filename, result, function(err) { + if (err) { + return console.log(err); + } + }); +} + +/** + * Runs the generator tests in Firefox. It uses webdriverio to + * launch Firefox and load index.html. Outputs a summary of the test results + * to the console and outputs files for later validation. + * @return the Thenable managing the processing of the browser tests. + */ +async function runGeneratorsInBrowser() { + var options = { + capabilities: { + browserName: 'firefox' + } + }; + // Run in headless mode on Travis. + if (process.env.TRAVIS_CI) { + options.capabilities['moz:firefoxOptions'] = { + args: ['-headless'] + }; + } + + var url = 'file://' + __dirname + '/index.html'; + var prefix = 'tests/generators/tmp/generated'; + + console.log('Starting webdriverio...'); + const browser = await webdriverio.remote(options); + console.log('Initialized.\nLoading url: ' + url); + await browser.url(url); + + await browser.execute(function() { + checkAll(); + loadSelected(); + }); + + await runLangGeneratorInBrowser(browser, prefix + '.js', + function() { + toJavaScript(); + }); + await runLangGeneratorInBrowser(browser, prefix + '.py', + function() { + toPython(); + }); + await runLangGeneratorInBrowser(browser, prefix + '.dart', + function() { + toDart(); + }); + await runLangGeneratorInBrowser(browser, prefix + '.lua', + function() { + toLua(); + }); + await runLangGeneratorInBrowser(browser, prefix + '.php', + function() { + toPhp(); + }); + + await browser.deleteSession(); +} + +if (require.main === module) { + runGeneratorsInBrowser().catch(e => { + console.error(e); + process.exit(1); + }).then(function(result) { + if (result) { + console.log('Generator tests failed'); + process.exit(1); + } else { + console.log('Generator tests passed'); + process.exit(0); + } + }); +} diff --git a/js/tests/generators/text.xml b/js/tests/generators/text.xml new file mode 100644 index 0000000..9f96175 --- /dev/null +++ b/js/tests/generators/text.xml @@ -0,0 +1,4651 @@ + + + Text + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + check number of calls + Checks that the number of calls is one in order to confirm that a function was only called once. + + + test name + + + number of calls + + + + + + + test name + + + + + number of calls + + + + + 1 + + + + + + + + + test create text + Tests the "create text with" block with varying number of inputs. + + + + + no text + + + + + + + + + + + + + + + + + create single + + + + + + + + Hello + + + + + + + Hello + + + + + + + create single number + + + + + + + + -1 + + + + + + + -1 + + + + + + + create double text + + + + + + + + K + + + + + 9 + + + + + + + K9 + + + + + + + create double text numbers + + + + + + + + 4 + + + + + 2 + + + + + + + 42 + + + + + + + create triple + + + + + + + + 1 + + + + + 2 + + + + + 3 + + + + + + + 123 + + + + + + + create order + + + + + + + + 1 + + + + + + + TRUE + + + + + 0 + + + + + + + + + + M + + + + + + + 10M + + + + + + + + + + + + + + + + + + + + get empty + Creates an empty string for use with the empty test. + + + + + + + + test empty text + Tests the "is empty" block". + + + FALSE + + + not empty + + + + + + + Google + + + + + + + TRUE + + + empty + + + + + + + + + + + + + + TRUE + + + empty complex + + + + + + + + + + + + + + TRUE + + + empty order + + + + + + + + + TRUE + + + + + + + + + + + + + + + + + + + + + + + + + test text length + Tests the "length" block. + + + + + zero length + + + + + + + + + + + + + + 0 + + + + + + + non-zero length + + + + + + + Google + + + + + + + 6 + + + + + + + length order + + + + + + + + + TRUE + + + + + car + + + + + + + + + + + + 3 + + + + + + + + + + + test append + Tests the "append text" block with different types of parameters. + + + item + + + Miserable + + + + + item + + + Failure + + + + + + + append text + + + + + item + + + + + MiserableFailure + + + + + item + + + 12 + + + + + item + + + 34 + + + + + + + append number + + + + + item + + + + + 1234 + + + + + item + + + Something + + + + + item + + + + + TRUE + + + + + Positive + + + + + + + + + + + + append order + + + + + item + + + + + Something Positive + + + + + + + + + + + + + + + + + + + + + + + test find text simple + Tests the "find" block with a variable. + + + text + + + Banana + + + + + + + find first simple + + + + + FIRST + + + text + + + + + an + + + + + + + + + 1 + + + + + + + + + find last simple + + + + + LAST + + + text + + + + + an + + + + + + + + + 3 + + + + + + + + + find none simple + + + + + FIRST + + + text + + + + + Peel + + + + + + + + + -1 + + + + + + + + + + + + + + + get fruit + Creates a string for use with the find test. + + + number of calls + + + 1 + + + + + + + Banana + + + + + test find text complex + Tests the "find" block with a function call. + + + number of calls + + + 0 + + + + + + + find first complex + + + + + FIRST + + + + + + + + an + + + + + + + + + 1 + + + + + + + + + + + + find first complex + + + + + number of calls + + + 0 + + + + + + + find first order complex + + + + + FIRST + + + + + TRUE + + + + + + + + + + + + + + + an + + + + + + + + + 1 + + + + + + + + + + + + find first order complex + + + + + number of calls + + + 0 + + + + + + + find last complex + + + + + LAST + + + + + + + + an + + + + + + + + + 3 + + + + + + + + + + + + find last complex + + + + + number of calls + + + 0 + + + + + + + find last order complex + + + + + LAST + + + + + TRUE + + + + + + + + + + + + + + + an + + + + + + + + + 3 + + + + + + + + + + + + find last order complex + + + + + number of calls + + + 0 + + + + + + + find none complex + + + + + FIRST + + + + + + + + Peel + + + + + + + + + -1 + + + + + + + + + + + + find none complex + + + + + number of calls + + + 0 + + + + + + + find none order complex + + + + + FIRST + + + + + TRUE + + + + + + + + + + + + + + + Peel + + + + + + + + + -1 + + + + + + + + + + + + find none order complex + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + test get text simple + Tests the "get letter" block with a variable. + + + text + + + Blockly + + + + + + + get first simple + + + + + + FIRST + + + text + + + + + + + B + + + + + + + get last simple + + + + + + LAST + + + text + + + + + + + y + + + + + TRUE + + + get random simple + + + + + GT + + + FIRST + + + text + + + + + + RANDOM + + + text + + + + + + + + + + + -1 + + + + + + + + + + + get # simple + + + + + + FROM_START + + + text + + + + + + + 2 + + + + + + + + + o + + + + + + + get # order simple + + + + + + FROM_START + + + text + + + + + + + TRUE + + + + + + + 2 + + + + + + + + + + + + + + o + + + + + + + get #-end simple + + + + + + FROM_END + + + text + + + + + + + 2 + + + + + + + + + k + + + + + + + get #-end order simple + + + + + + FROM_END + The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + + + text + + + + + ADD + + + 0 + + + + + + + 2 + + + + + + + + + + + k + + + + + + + + + + + + + + + + + + + + + get Blockly + Creates a string for use with the get test. + + + number of calls + + + 1 + + + + + + + Blockly + + + + + test get text complex + Tests the "get letter" block with a function call. + + + text + + + Blockly + + + + + number of calls + + + 0 + + + + + + + get first complex + + + + + + FIRST + + + + + + + + + + B + + + + + + + + + + get first complex + + + + + number of calls + + + 0 + + + + + + + get first order complex + + + + + + FIRST + + + + + TRUE + + + + + + + + + + + + + + + + + B + + + + + + + + + + get first order complex + + + + + number of calls + + + 0 + + + + + + + get last complex + + + + + + LAST + + + + + + + + + + y + + + + + + + + + + get last complex + + + + + number of calls + + + 0 + + + + + + + get last order complex + + + + + + LAST + + + + + TRUE + + + + + + + + + + + + + + + + + y + + + + + + + + + + get last order complex + + + + + number of calls + + + 0 + + + + + TRUE + + + get random complex + + + + + GT + + + FIRST + + + text + + + + + + RANDOM + + + + + + + + + + + + + + -1 + + + + + + + + + + + + + + get random complex + + + + + number of calls + + + 0 + + + + + TRUE + + + get random order complex + + + + + GT + + + FIRST + + + text + + + + + + RANDOM + + + + + TRUE + + + + + + + + + + + + + + + + + + + + + -1 + + + + + + + + + + + + + + get random order complex + + + + + number of calls + + + 0 + + + + + + + get # complex + + + + + + FROM_START + + + + + + + + + + 2 + + + + + + + + + o + + + + + + + + + + get # complex + + + + + number of calls + + + 0 + + + + + + + get # order complex + + + + + + FROM_START + + + + + TRUE + + + + + + + + + + + + + + + + + TRUE + + + + + + + 2 + + + + + + + + + + + + + + o + + + + + + + + + + get # order complex + + + + + number of calls + + + 0 + + + + + + + get #-end complex + + + + + + FROM_END + + + + + + + + + + 2 + + + + + + + + + k + + + + + + + + + + get #-end complex + + + + + number of calls + + + 0 + + + + + + + get #-end order complex + + + + + + FROM_END + The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + + + + + TRUE + + + + + + + + + + + + + + + ADD + + + 0 + + + + + + + 2 + + + + + + + + + + + k + + + + + + + + + + get #-end order complex + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + get numbers + Creates a string for use with the substring test. + + + number of calls + + + 1 + + + + + + + 123456789 + + + + + test substring simple + Tests the "get substring" block with a variable. + + + text + + + 123456789 + + + + + + + substring # simple + + + + + + FROM_START + FROM_START + + + text + + + + + + + 1 + + + + + + + + + 2 + + + + + + + + + 23 + + + + + + + substring # simple order + + + + + + FROM_START + FROM_START + + + text + + + + + + + TRUE + + + + + + + 1 + + + + + + + + + + + + + + TRUE + + + + + + + 2 + + + + + + + + + + + + + + 23 + + + + + + + substring #-end simple + + + + + + FROM_END + FROM_END + + + text + + + + + + + 2 + + + + + + + + + 1 + + + + + + + + + 78 + + + + + + + substring #-end simple order + + + + + + FROM_END + FROM_END + The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + + + text + + + + + ADD + + + 0 + + + + + + + 2 + + + + + + + + + ADD + + + 0 + + + + + + + 1 + + + + + + + + + + + 78 + + + + + + + substring first-last simple + + + + + + FIRST + LAST + + + text + + + + + + + text + + + + + + + substring # #-end simple + + + + + + FROM_START + FROM_END + + + text + + + + + + + 1 + + + + + + + + + 1 + + + + + + + + + 2345678 + + + + + + + substring #-end # simple + + + + + + FROM_END + FROM_START + + + text + + + + + + + 6 + + + + + + + + + 3 + + + + + + + + + 34 + + + + + + + substring first # simple + + + + + + FIRST + FROM_START + + + text + + + + + + + 3 + + + + + + + + + 1234 + + + + + + + substring first #-end simple + + + + + + FIRST + FROM_END + + + text + + + + + + + 1 + + + + + + + + + 12345678 + + + + + + + substring # last simple + + + + + + FROM_START + LAST + + + text + + + + + + + 6 + + + + + + + + + 789 + + + + + + + substring #-end last simple + + + + + + FROM_END + LAST + + + text + + + + + + + 2 + + + + + + + + + 789 + + + + + + + substring all with # #-end simple + + + + + + FROM_START + FROM_END + + + text + + + + + + + 0 + + + + + + + + + 0 + + + + + + + + + 123456789 + + + + + + + substring all with #-end # simple + + + + + + FROM_END + FROM_START + + + text + + + + + + + 8 + + + + + + + + + 8 + + + + + + + + + 123456789 + + + + + + + substring all with # #-end math simple + + + + + + FROM_START + FROM_END + Checks that the whole string is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where substring uses [x:length - y] for # #-end. + + + text + + + + + ADD + + + 0 + + + + + + + 0 + + + + + + + + + ADD + + + 0 + + + + + + + 0 + + + + + + + + + + + 123456789 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + test substring complex + Tests the "get substring" block with a function call. + + + number of calls + + + 0 + + + + + + + substring # complex + + + + + + FROM_START + FROM_START + + + + + + + + + + 1 + + + + + + + + + 2 + + + + + + + + + 23 + + + + + + + + + + substring # complex + + + + + number of calls + + + 0 + + + + + + + substring # complex order + + + + + + FROM_START + FROM_START + + + + + TRUE + + + + + + + + + + + + + + + + + TRUE + + + + + + + 1 + + + + + + + + + + + + + + TRUE + + + + + + + 2 + + + + + + + + + + + + + + 23 + + + + + + + + + + substring # complex order + + + + + number of calls + + + 0 + + + + + + + substring #-end complex + + + + + + FROM_END + FROM_END + The order for index for #-end is addition because this will catch errors in generators where most perform the operation ... - index. + + + + + + + + + + 2 + + + + + + + + + 1 + + + + + + + + + 78 + + + + + + + + + + substring #-end complex + + + + + number of calls + + + 0 + + + + + + + substring #-end order order + + + + + + FROM_END + FROM_END + + + + + TRUE + + + + + + + + + + + + + + + ADD + + + 0 + + + + + + + 2 + + + + + + + + + ADD + + + 0 + + + + + + + 1 + + + + + + + + + + + 78 + + + + + + + + + + substring #-end order order + + + + + number of calls + + + 0 + + + + + + + substring first-last + + + + + + FIRST + LAST + + + + + + + + + + text + + + + + + + + + + substring first-last + + + + + number of calls + + + 0 + + + + + + + substring # #-end complex + + + + + + FROM_START + FROM_END + + + + + + + + + + 1 + + + + + + + + + 1 + + + + + + + + + 2345678 + + + + + + + + + + substring # #-end complex + + + + + number of calls + + + 0 + + + + + + + substring #-end # complex + + + + + + FROM_END + FROM_START + + + + + + + + + + 6 + + + + + + + + + 3 + + + + + + + + + 34 + + + + + + + + + + substring #-end # complex + + + + + number of calls + + + 0 + + + + + + + substring first # complex + + + + + + FIRST + FROM_START + + + + + + + + + + 3 + + + + + + + + + 1234 + + + + + + + + + + substring first # complex + + + + + number of calls + + + 0 + + + + + + + substring first #-end complex + + + + + + FIRST + FROM_END + + + + + + + + + + 1 + + + + + + + + + 12345678 + + + + + + + + + + substring first #-end complex + + + + + number of calls + + + 0 + + + + + + + substring # last complex + + + + + + FROM_START + LAST + + + + + + + + + + 6 + + + + + + + + + 789 + + + + + + + + + + substring # last complex + + + + + number of calls + + + 0 + + + + + + + substring #-end last complex + + + + + + FROM_END + LAST + + + + + + + + + + 2 + + + + + + + + + 789 + + + + + + + + + + substring #-end last complex + + + + + number of calls + + + 0 + + + + + + + substring all with # #-end complex + + + + + + FROM_START + FROM_END + + + + + + + + + + 0 + + + + + + + + + 0 + + + + + + + + + 123456789 + + + + + + + + + + substring all with # #-end complex + + + + + number of calls + + + 0 + + + + + + + substring all with #-end # complex + + + + + + FROM_END + FROM_START + + + + + + + + + + 8 + + + + + + + + + 8 + + + + + + + + + 123456789 + + + + + + + + + + substring all with #-end # complex + + + + + number of calls + + + 0 + + + + + + + substring all with # #-end math complex + + + + + + FROM_START + FROM_END + Checks that the whole string is properly retrieved even if the value for start and end is not a simple number. This is especially important in generators where substring uses [x:length - y] for # #-end. + + + + + + + + ADD + + + 0 + + + + + + + 0 + + + + + + + + + ADD + + + 0 + + + + + + + 0 + + + + + + + + + + + 123456789 + + + + + + + + + + substring all with # #-end math complex + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + test case + Tests the "change casing" block. + + + text + + + Hello World + + + + + + + uppercase + + + + + UPPERCASE + + + text + + + + + + + HELLO WORLD + + + + + + + uppercase order + + + + + UPPERCASE + + + + + TRUE + + + + + text + + + + + + + + + + + + HELLO WORLD + + + + + text + + + Hello World + + + + + + + lowercase + + + + + LOWERCASE + + + text + + + + + + + hello world + + + + + + + lowercase order + + + + + LOWERCASE + + + + + TRUE + + + + + text + + + + + + + + + + + + hello world + + + + + text + + + heLLo WorlD + + + + + + + titlecase + + + + + TITLECASE + + + text + + + + + + + Hello World + + + + + + + titlecase order + + + + + TITLECASE + + + + + TRUE + + + + + text + + + + + + + + + + + + Hello World + + + + + + + + + + + + + + + + + + + + + + + test trim + Tests the "trim" block. + + + text + + + abc def + + + + + + + trim both + + + + + BOTH + + + text + + + + + + + abc def + + + + + + + trim both order + + + + + BOTH + + + + + TRUE + + + + + text + + + + + + + + + + + + abc def + + + + + + + trim left + + + + + LEFT + + + text + + + + + + + abc def + + + + + + + trim left order + + + + + LEFT + + + + + TRUE + + + + + text + + + + + + + + + + + + abc def + + + + + + + trim right + + + + + RIGHT + + + text + + + + + + + abc def + + + + + + + trim right order + + + + + RIGHT + + + + + TRUE + + + + + text + + + + + + + + + + + + abc def + + + + + + + + + + + + + + + + + + + test count text + Tests the "trim" block. + + + text + + + woolloomooloo + + + + + + + len 1 + + + + + + + o + + + + + text + + + + + + + 8 + + + + + + + len 2 + + + + + + + oo + + + + + text + + + + + + + 4 + + + + + + + len 3 + + + + + + + loo + + + + + text + + + + + + + 2 + + + + + + + start + + + + + + + wool + + + + + text + + + + + + + 1 + + + + + + + missing + + + + + + + chicken + + + + + text + + + + + + + 0 + + + + + + + empty needle + + + + + + + + + + + + text + + + + + + + 14 + + + + + + + empty source + + + + + + + chicken + + + + + + + + + + + + 0 + + + + + + + + + + + + + + + + + + + + + test text reverse + Tests the "trim" block. + + + + + empty string + + + + + + + + + + + + + + + + + + + + + len 1 + + + + + + + a + + + + + + + a + + + + + + + len 2 + + + + + + + ab + + + + + + + ba + + + + + + + longer + + + + + + + woolloomooloo + + + + + + + ooloomoolloow + + + + + + + + + + + + + test replace + Tests the "trim" block. + + + + + replace all instances 1 + + + + + + + oo + + + + + 123 + + + + + woolloomooloo + + + + + + + w123ll123m123l123 + + + + + + + literal string replacement + + + + + + + .oo + + + + + X + + + + + woolloomooloo + + + + + + + woolloomooloo + + + + + + + not found + + + + + + + abc + + + + + X + + + + + woolloomooloo + + + + + + + woolloomooloo + + + + + + + empty replacement 1 + + + + + + + o + + + + + + + + + + woolloomooloo + + + + + + + wllml + + + + + + + empty replacement 2 + + + + + + + aaaaa + + + + + + + + + + aaaaa + + + + + + + + + + + + + + empty replacement 3 + + + + + + + a + + + + + + + + + + aaaaa + + + + + + + + + + + + + + empty source + + + + + + + a + + + + + chicken + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/js/tests/generators/unittest.js b/js/tests/generators/unittest.js new file mode 100644 index 0000000..8e318a8 --- /dev/null +++ b/js/tests/generators/unittest.js @@ -0,0 +1,115 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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 test suite') + .appendField(new Blockly.FieldTextInput(''), 'SUITE_NAME'); + this.appendStatementInput('DO'); + this.setTooltip('Executes the enclosed unit tests,\n' + + 'then prints a summary.'); + }, + getDeveloperVars: 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.appendValueInput('MESSAGE') + .appendField('name') + .setCheck('String'); + this.appendValueInput('ACTUAL') + .appendField('actual'); + this.appendValueInput('EXPECTED') + .appendField('expected'); + this.setTooltip('Tests that "actual == expected".'); + }, + getDeveloperVars: 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.appendValueInput('MESSAGE', 'test name') + .appendField('name') + .setCheck('String'); + this.appendValueInput('ACTUAL') + .appendField('assert') + .appendField(new Blockly.FieldDropdown( + [['true', 'TRUE'], ['false', 'FALSE'], ['null', 'NULL']]), 'EXPECTED'); + this.setTooltip('Tests that the value is true, false, or null.'); + }, + getDeveloperVars: 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.'); + }, + getDeveloperVars: function() { + return ['unittestResults']; + } +}; + +Blockly.Blocks['unittest_adjustindex'] = { + // Adjusts the indexing based on current setting. + init: function() { + this.jsonInit({ + "message0": "adjusted %1", + "args0": [ + { + "type": "input_value", + "name": "INDEX", + "check": "Number" + } + ], + "inputsInline": true, + "output": "Number", + "colour": 65, + "tooltip": "Adjusts the value based on whether generated code is using " + + "zero or one based indexing." + }); + } +}; diff --git a/js/tests/generators/unittest_dart.js b/js/tests/generators/unittest_dart.js new file mode 100644 index 0000000..12c5892 --- /dev/null +++ b/js/tests/generators/unittest_dart.js @@ -0,0 +1,175 @@ +/** + * @license + * Copyright 2014 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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.Names.DEVELOPER_VARIABLE_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'; + // Say which test suite this is. + code += 'print(\'\\n====================\\n\\n' + + 'Running suite: ' + + block.getFieldValue('SUITE_NAME') + + '\');\n'; + // Run tests (unindented). + code += Blockly.Dart.statementToCode(block, 'DO') + .replace(/^ /, '').replace(/\n /g, '\n'); + // Print the report to the console (that's where errors will go anyway). + code += 'print(' + functionName + '());\n'; + // Destroy results. + code += resultsVar + ' = null;\n'; + return code; +}; + +Blockly.Dart['unittest_main'].defineAssert_ = function() { + var resultsVar = Blockly.Dart.variableDB_.getName('unittestResults', + Blockly.Names.DEVELOPER_VARIABLE_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.valueToCode(block, 'MESSAGE', + Blockly.Dart.ORDER_NONE) || ''; + var actual = Blockly.Dart.valueToCode(block, 'ACTUAL', + Blockly.Dart.ORDER_NONE) || 'null'; + var expected = Blockly.Dart.valueToCode(block, 'EXPECTED', + 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.valueToCode(block, 'MESSAGE', + Blockly.Dart.ORDER_NONE) || ''; + 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.Names.DEVELOPER_VARIABLE_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'; +}; + +Blockly.Dart['unittest_adjustindex'] = function(block) { + var index = Blockly.Dart.valueToCode(block, 'INDEX', + Blockly.Dart.ORDER_ADDITIVE) || '0'; + // Adjust index if using one-based indexing. + if (block.workspace.options.oneBasedIndex) { + if (Blockly.isNumber(index)) { + // If the index is a naked number, adjust it right now. + return [Number(index) + 1, Blockly.Dart.ORDER_ATOMIC]; + } else { + // If the index is dynamic, adjust it in code. + index = index + ' + 1'; + } + } else if (Blockly.isNumber(index)) { + return [index, Blockly.Dart.ORDER_ATOMIC]; + } + return [index, Blockly.Dart.ORDER_ADDITIVE]; +}; diff --git a/js/tests/generators/unittest_javascript.js b/js/tests/generators/unittest_javascript.js new file mode 100644 index 0000000..4791fa2 --- /dev/null +++ b/js/tests/generators/unittest_javascript.js @@ -0,0 +1,179 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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.Names.DEVELOPER_VARIABLE_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 i = 0; i < ' + resultsVar + '.length; i++) {', + ' if (' + resultsVar + '[i][0]) {', + ' summary.push(".");', + ' } else {', + ' summary.push("F");', + ' fails++;', + ' report.push("");', + ' report.push("FAIL: " + ' + resultsVar + '[i][2]);', + ' report.push(' + resultsVar + '[i][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'; + // Say which test suite this is. + code += 'console.log(\'\\n====================\\n\\n' + + 'Running suite: ' + + block.getFieldValue('SUITE_NAME') + + '\')\n'; + // Run tests (unindented). + code += Blockly.JavaScript.statementToCode(block, 'DO') + .replace(/^ /, '').replace(/\n /g, '\n'); + // Send the report to the console (that's where errors will go anyway). + code += 'console.log(' + functionName + '());\n'; + // Destroy results. + code += resultsVar + ' = null;\n'; + return code; +}; + +Blockly.JavaScript['unittest_main'].defineAssert_ = function(block) { + var resultsVar = Blockly.JavaScript.variableDB_.getName('unittestResults', + Blockly.Names.DEVELOPER_VARIABLE_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.valueToCode(block, 'MESSAGE', + Blockly.JavaScript.ORDER_NONE) || ''; + var actual = Blockly.JavaScript.valueToCode(block, 'ACTUAL', + Blockly.JavaScript.ORDER_COMMA) || 'null'; + var expected = Blockly.JavaScript.valueToCode(block, 'EXPECTED', + 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.valueToCode(block, 'MESSAGE', + Blockly.JavaScript.ORDER_NONE) || ''; + 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.Names.DEVELOPER_VARIABLE_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'; +}; + +Blockly.JavaScript['unittest_adjustindex'] = function(block) { + var index = Blockly.JavaScript.valueToCode(block, 'INDEX', + Blockly.JavaScript.ORDER_ADDITION) || '0'; + // Adjust index if using one-based indexing. + if (block.workspace.options.oneBasedIndex) { + if (Blockly.isNumber(index)) { + // If the index is a naked number, adjust it right now. + return [Number(index) + 1, Blockly.JavaScript.ORDER_ATOMIC]; + } else { + // If the index is dynamic, adjust it in code. + index = index + ' + 1'; + } + } else if (Blockly.isNumber(index)) { + return [index, Blockly.JavaScript.ORDER_ATOMIC]; + } + return [index, Blockly.JavaScript.ORDER_ADDITION]; +}; diff --git a/js/tests/generators/unittest_lua.js b/js/tests/generators/unittest_lua.js new file mode 100644 index 0000000..4f25326 --- /dev/null +++ b/js/tests/generators/unittest_lua.js @@ -0,0 +1,177 @@ +/** + * @license + * Copyright 2016 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Generating Lua for unit test blocks. + * @author rodrigoq@google.com (Rodrigo Queiro) + */ +'use strict'; + +Blockly.Lua['unittest_main'] = function(block) { + // Container for unit tests. + var resultsVar = Blockly.Lua.variableDB_.getName('unittestResults', + Blockly.Names.DEVELOPER_VARIABLE_TYPE); + var functionName = Blockly.Lua.provideFunction_( + 'unittest_report', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '()', + ' -- Create test report.', + ' local report = {}', + ' local summary = {}', + ' local fails = 0', + ' for _, v in pairs(' + resultsVar + ') do', + ' if v["success"] then', + ' table.insert(summary, ".")', + ' else', + ' table.insert(summary, "F")', + ' fails = fails + 1', + ' table.insert(report, "FAIL: " .. v["title"])', + ' table.insert(report, v["log"])', + ' end', + ' end', + ' table.insert(report, 1, table.concat(summary))', + ' table.insert(report, "")', + ' table.insert(report, "Number of tests run: " .. #' + resultsVar + ')', + ' table.insert(report, "")', + ' if fails > 0 then', + ' table.insert(report, "FAILED (failures=" .. fails .. ")")', + ' else', + ' table.insert(report, "OK")', + ' end', + ' return table.concat(report, "\\n")', + 'end']); + // Setup global to hold test results. + var code = resultsVar + ' = {}\n'; + // Say which test suite this is. + code += 'print(\'\\n====================\\n\\n' + + 'Running suite: ' + + block.getFieldValue('SUITE_NAME') + + '\')\n'; + // Run tests (unindented). + code += Blockly.Lua.statementToCode(block, 'DO') + .replace(/^ /, '').replace(/\n /g, '\n'); + // Print the report. + code += 'print(' + functionName + '())\n'; + // Destroy results. + code += resultsVar + ' = nil\n'; + return code; +}; + +Blockly.Lua['unittest_main'].defineAssert_ = function(block) { + var resultsVar = Blockly.Lua.variableDB_.getName('unittestResults', + Blockly.Names.DEVELOPER_VARIABLE_TYPE); + var functionName = Blockly.Lua.provideFunction_( + 'assertEquals', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + + '(actual, expected, message)', + ' -- Asserts that a value equals another value.', + ' assert(' + resultsVar + ' ~= nil, ' + + '"Orphaned assert equals: " .. message)', + ' if type(actual) == "table" and type(expected) == "table" then', + ' local lists_match = #actual == #expected', + ' if lists_match then', + ' for i, v1 in ipairs(actual) do', + ' local v2 = expected[i]', + ' if type(v1) == "number" and type(v2) == "number" then', + ' if math.abs(v1 - v2) > 1e-9 then', + ' lists_match = false', + ' end', + ' elseif v1 ~= v2 then', + ' lists_match = false', + ' end', + ' end', + ' end', + ' if lists_match then', + ' table.insert(' + resultsVar + + ', {success=true, log="OK", title=message})', + ' return', + ' else', + ' -- produce the non-matching strings for a human-readable error', + ' expected = "{" .. table.concat(expected, ", ") .. "}"', + ' actual = "{" .. table.concat(actual, ", ") .. "}"', + ' end', + ' end', + ' if actual == expected or (type(actual) == "number" and ' + + 'type(expected) == "number" and math.abs(actual - expected) < ' + + '1e-9) then ', + ' table.insert(' + resultsVar + + ', {success=true, log="OK", title=message})', + ' else', + ' table.insert(' + resultsVar + ', {success=false, ' + + 'log=string.format("Expected: %s\\nActual: %s"' + + ', tostring(expected), tostring(actual)), title=message})', + ' end', + 'end']); + return functionName; +}; + +Blockly.Lua['unittest_assertequals'] = function(block) { + // Asserts that a value equals another value. + var message = Blockly.Lua.valueToCode(block, 'MESSAGE', + Blockly.Lua.ORDER_NONE) || ''; + var actual = Blockly.Lua.valueToCode(block, 'ACTUAL', + Blockly.Lua.ORDER_NONE) || 'nil'; + var expected = Blockly.Lua.valueToCode(block, 'EXPECTED', + Blockly.Lua.ORDER_NONE) || 'nil'; + return Blockly.Lua['unittest_main'].defineAssert_() + + '(' + actual + ', ' + expected + ', ' + message + ')\n'; +}; + +Blockly.Lua['unittest_assertvalue'] = function(block) { + // Asserts that a value is true, false, or null. + var message = Blockly.Lua.valueToCode(block, 'MESSAGE', + Blockly.Lua.ORDER_NONE) || ''; + var actual = Blockly.Lua.valueToCode(block, 'ACTUAL', + Blockly.Lua.ORDER_NONE) || 'nil'; + var expected = block.getFieldValue('EXPECTED'); + if (expected == 'TRUE') { + expected = 'true'; + } else if (expected == 'FALSE') { + expected = 'false'; + } else if (expected == 'NULL') { + expected = 'nil'; + } + return Blockly.Lua.unittest_main.defineAssert_() + + '(' + actual + ', ' + expected + ', ' + message + ')\n'; +}; + +Blockly.Lua['unittest_fail'] = function(block) { + // Always assert an error. + var resultsVar = Blockly.Lua.variableDB_.getName('unittestResults', + Blockly.Names.DEVELOPER_VARIABLE_TYPE); + var message = Blockly.Lua.quote_(block.getFieldValue('MESSAGE')); + var functionName = Blockly.Lua.provideFunction_( + 'unittest_fail', + ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(message)', + ' -- Always assert an error.', + ' assert(' + resultsVar + + ' ~= nil, "Orphaned assert fail: " .. message)', + ' table.insert(' + resultsVar + + ', {success=false, log="Fail.", title=message})', + 'end']); + return functionName + '(' + message + ')\n'; +}; + +Blockly.Lua['unittest_adjustindex'] = function(block) { + var index = Blockly.Lua.valueToCode(block, 'INDEX', + Blockly.Lua.ORDER_ADDITIVE) || '0'; + if (Blockly.isNumber(index)) { + // If the index is a naked number, adjust it right now. + return [Number(index) + 1, Blockly.Lua.ORDER_ATOMIC]; + } + // If the index is dynamic, adjust it in code. + return [index + ' + 1', Blockly.Lua.ORDER_ATOMIC]; +}; diff --git a/js/tests/generators/unittest_php.js b/js/tests/generators/unittest_php.js new file mode 100644 index 0000000..d208045 --- /dev/null +++ b/js/tests/generators/unittest_php.js @@ -0,0 +1,166 @@ +/** + * @license + * Copyright 2015 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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.Names.DEVELOPER_VARIABLE_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'; + // Say which test suite this is. + code += 'print("\\n====================\\n\\n' + + 'Running suite: ' + + block.getFieldValue('SUITE_NAME') + + '\\n");\n'; + // Run tests (unindented). + code += Blockly.PHP.statementToCode(block, 'DO') + .replace(/^ /, '').replace(/\n /g, '\n'); + // Send the report to the console (that's where errors will go anyway). + code += 'print(' + functionName + '());\n'; + // Destroy results. + code += resultsVar + ' = null;\n'; + return code; +}; + +Blockly.PHP['unittest_main'].defineAssert_ = function(block) { + var resultsVar = Blockly.PHP.variableDB_.getName('unittestResults', + Blockly.Names.DEVELOPER_VARIABLE_TYPE); + var functionName = Blockly.PHP.provideFunction_( + 'assertEquals', + ['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 ($actual == $expected) {', + ' array_push(' + resultsVar + ', [true, "OK", $message]);', + ' } else {', + ' $expected = is_array($expected) ? implode(" ", $expected) : ' + + '$expected;', + ' $actual = is_array($actual) ? implode(" ", $actual) : ' + + '$actual;', + ' array_push(' + resultsVar + ', [false, ' + + '"Expected: " . $expected . "\\nActual: " . $actual, $message]);', + ' }', + '}']); + return functionName; +}; + +Blockly.PHP['unittest_assertequals'] = function(block) { + // Asserts that a value equals another value. + var message = Blockly.PHP.valueToCode(block, 'MESSAGE', + Blockly.PHP.ORDER_NONE) || ''; + var actual = Blockly.PHP.valueToCode(block, 'ACTUAL', + Blockly.PHP.ORDER_COMMA) || 'null'; + var expected = Blockly.PHP.valueToCode(block, 'EXPECTED', + 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.valueToCode(block, 'MESSAGE', + Blockly.PHP.ORDER_NONE) || ''; + 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.Names.DEVELOPER_VARIABLE_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'; +}; + +Blockly.PHP['unittest_adjustindex'] = function(block) { + var index = Blockly.PHP.valueToCode(block, 'INDEX', + Blockly.PHP.ORDER_ADDITION) || '0'; + // Adjust index if using one-based indexing. + if (block.workspace.options.oneBasedIndex) { + if (Blockly.isNumber(index)) { + // If the index is a naked number, adjust it right now. + return [Number(index) + 1, Blockly.PHP.ORDER_ATOMIC]; + } else { + // If the index is dynamic, adjust it in code. + index = index + ' + 1'; + } + } else if (Blockly.isNumber(index)) { + return [index, Blockly.PHP.ORDER_ATOMIC]; + } + return [index, Blockly.PHP.ORDER_ADDITION]; +}; diff --git a/js/tests/generators/unittest_python.js b/js/tests/generators/unittest_python.js new file mode 100644 index 0000000..bafcb93 --- /dev/null +++ b/js/tests/generators/unittest_python.js @@ -0,0 +1,150 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview 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.Names.DEVELOPER_VARIABLE_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'; + // Say which test suite this is. + code += 'print(\'\\n====================\\n\\n' + + 'Running suite: ' + + block.getFieldValue('SUITE_NAME') + + '\')\n'; + // Run tests (unindented). + code += Blockly.Python.statementToCode(block, 'DO') + .replace(/^ /, '').replace(/\n /g, '\n'); + // Print the report. + code += 'print(' + functionName + '())\n'; + // Destroy results. + code += resultsVar + ' = None\n'; + return code; +}; + +Blockly.Python['unittest_main'].defineAssert_ = function() { + var resultsVar = Blockly.Python.variableDB_.getName('unittestResults', + Blockly.Names.DEVELOPER_VARIABLE_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.valueToCode(block, 'MESSAGE', + Blockly.Python.ORDER_NONE) || ''; + var actual = Blockly.Python.valueToCode(block, 'ACTUAL', + Blockly.Python.ORDER_NONE) || 'None'; + var expected = Blockly.Python.valueToCode(block, 'EXPECTED', + 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.valueToCode(block, 'MESSAGE', + Blockly.Python.ORDER_NONE) || ''; + 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.Names.DEVELOPER_VARIABLE_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'; +}; + +Blockly.Python['unittest_adjustindex'] = function(block) { + var index = Blockly.Python.valueToCode(block, 'INDEX', + Blockly.Python.ORDER_ADDITIVE) || '0'; + // Adjust index if using one-based indexing. + if (block.workspace.options.oneBasedIndex) { + if (Blockly.isNumber(index)) { + // If the index is a naked number, adjust it right now. + return [Number(index) + 1, Blockly.Python.ORDER_ATOMIC]; + } else { + // If the index is dynamic, adjust it in code. + index = index + ' + 1'; + } + } else if (Blockly.isNumber(index)) { + return [index, Blockly.Python.ORDER_ATOMIC]; + } + return [index, Blockly.Python.ORDER_ADDITIVE]; +}; diff --git a/js/tests/generators/variables.xml b/js/tests/generators/variables.xml new file mode 100644 index 0000000..9d53032 --- /dev/null +++ b/js/tests/generators/variables.xml @@ -0,0 +1,68 @@ + + + + Variables + + + item + + + 123 + + + + + + + variable + + + + + item + + + + + 123 + + + + + if + + + 123 + + + + + + + reserved variable + + + + + if + + + + + 123 + + + + + + + + + + + + + naked + Intentionally non-connected variable. + + diff --git a/js/tests/jsunit/block_test.js b/js/tests/jsunit/block_test.js new file mode 100644 index 0000000..603b4fd --- /dev/null +++ b/js/tests/jsunit/block_test.js @@ -0,0 +1,254 @@ +/** + * @license + * Copyright 2018 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + /** + * @fileoverview Tests for Blockly.Block + * @author fenichel@google.com (Rachel Fenichel) + */ + +'use strict'; + +var workspace; +var mockControl_; + +function defineTestBlocks() { + Blockly.defineBlocksWithJsonArray([{ + "type": "stack_block", + "message0": "", + "previousStatement": null, + "nextStatement": null + }, + { + "type": "row_block", + "message0": "%1", + "args0": [ + { + "type": "input_value", + "name": "INPUT" + } + ], + "output": null + }]); +} + +function undefineTestBlocks() { + delete Blockly.Blocks['stack_block']; + delete Blockly.Blocks['row_block']; +} + +function blockTest_setUp() { + defineTestBlocks(); + workspace = new Blockly.Workspace(); +} + +function blockTest_tearDown() { + undefineTestBlocks(); + workspace.dispose(); + if (mockControl_) { + mockControl_.restore(); + } +} + +function assertUnpluggedNoheal(blocks) { + // A has nothing connected to it. + assertEquals(0, blocks.A.getChildren().length); + // B and C are still connected. + assertEquals(blocks.B, blocks.C.getParent()); + // B is the top of its stack. + assertNull(blocks.B.getParent()); +} + +function assertUnpluggedHealed(blocks) { + // A and C are connected. + assertEquals(1, blocks.A.getChildren().length); + assertEquals(blocks.A, blocks.C.getParent()); + // B has nothing connected to it. + assertEquals(0, blocks.B.getChildren().length); + // B is the top of its stack. + assertNull(blocks.B.getParent()); +} + +function assertUnpluggedHealFailed(blocks) { + // A has nothing connected to it. + assertEquals(0, blocks.A.getChildren().length); + // B has nothing connected to it. + assertEquals(0, blocks.B.getChildren().length); + // B is the top of its stack. + assertNull(blocks.B.getParent()); + // C is the top of its stack. + assertNull(blocks.C.getParent()); +} + +function setUpRowBlocks() { + var blockA = workspace.newBlock('row_block'); + var blockB = workspace.newBlock('row_block'); + var blockC = workspace.newBlock('row_block'); + + blockA.inputList[0].connection.connect(blockB.outputConnection); + blockB.inputList[0].connection.connect(blockC.outputConnection); + + assertEquals(blockB, blockC.getParent()); + + return { + A: blockA, + B: blockB, + C: blockC + }; +} + +function setUpStackBlocks() { + var blockA = workspace.newBlock('stack_block'); + var blockB = workspace.newBlock('stack_block'); + var blockC = workspace.newBlock('stack_block'); + + blockA.nextConnection.connect(blockB.previousConnection); + blockB.nextConnection.connect(blockC.previousConnection); + + assertEquals(blockB, blockC.getParent()); + + return { + A: blockA, + B: blockB, + C: blockC + }; +} + + +function test_block_stack_unplug_noheal() { + blockTest_setUp(); + try { + var blocks = setUpStackBlocks(); + blocks.B.unplug(); + assertUnpluggedNoheal(blocks); + } finally { + blockTest_tearDown(); + } +} + +function test_block_stack_unplug_heal() { + blockTest_setUp(); + try { + var blocks = setUpStackBlocks(); + blocks.B.unplug(true); + assertUnpluggedHealed(blocks); + } finally { + blockTest_tearDown(); + } +} + +function test_block_stack_unplug_heal_bad_checks() { + blockTest_setUp(); + try { + var blocks = setUpStackBlocks(); + + // A and C can't connect, but both can connect to B. + blocks.A.nextConnection.setCheck('type1'); + blocks.C.previousConnection.setCheck('type2'); + + // The types don't work. + blocks.B.unplug(true); + + assertUnpluggedHealFailed(blocks); + } finally { + blockTest_tearDown(); + } +} + +function test_block_row_unplug_noheal() { + blockTest_setUp(); + try { + var blocks = setUpRowBlocks(); + blocks.B.unplug(false); + assertUnpluggedNoheal(blocks); + } finally { + blockTest_tearDown(); + } +} + +function test_block_row_unplug_heal() { + blockTest_setUp(); + try { + var blocks = setUpRowBlocks(); + // Each block has only one input, and the types work. + blocks.B.unplug(true); + assertUnpluggedHealed(blocks); + } finally { + blockTest_tearDown(); + } +} + +function test_block_row_unplug_heal_bad_checks() { + blockTest_setUp(); + try { + var blocks = setUpRowBlocks(); + + // A and C can't connect, but both can connect to B. + blocks.A.inputList[0].connection.setCheck('type1'); + blocks.C.outputConnection.setCheck('type2'); + + // Each block has only one input, but the types don't work. + blocks.B.unplug(true); + assertUnpluggedHealFailed(blocks); + } finally { + blockTest_tearDown(); + } +} + +function test_block_row_unplug_multi_inputs_parent() { + blockTest_setUp(); + try { + var blocks = setUpRowBlocks(); + // Add extra input to parent + blocks.A.appendValueInput('INPUT').setCheck(null); + + // Parent block has multiple inputs. + blocks.B.unplug(true); + assertUnpluggedHealed(blocks); + } finally { + blockTest_tearDown(); + } +} + +function test_block_row_unplug_multi_inputs_middle() { + blockTest_setUp(); + try { + var blocks = setUpRowBlocks(); + // Add extra input to middle block + blocks.B.appendValueInput('INPUT').setCheck(null); + + // Middle block has multiple inputs. + blocks.B.unplug(true); + assertUnpluggedHealed(blocks); + } finally { + blockTest_tearDown(); + } +} + +function test_block_row_unplug_multi_inputs_child() { + blockTest_setUp(); + try { + var blocks = setUpRowBlocks(); + // Add extra input to child block + blocks.C.appendValueInput('INPUT').setCheck(null); + + // Child block input count doesn't matter. + blocks.B.unplug(true); + assertUnpluggedHealed(blocks); + } finally { + blockTest_tearDown(); + } +} diff --git a/js/tests/jsunit/event_test.js b/js/tests/jsunit/event_test.js new file mode 100644 index 0000000..d6452e0 --- /dev/null +++ b/js/tests/jsunit/event_test.js @@ -0,0 +1,809 @@ +/** + * @license + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + /** + * @fileoverview Tests for Blockly.Events + * @author marisaleung@google.com (Marisa Leung) + */ +'use strict'; + +var mockControl_; +var workspace; + +function eventTest_setUp() { + workspace = new Blockly.Workspace(); +} + +function eventTest_setUpWithMockBlocks() { + eventTest_setUp(); + // TODO: Replace with defineGetVarBlock(); + Blockly.defineBlocksWithJsonArray([{ + 'type': 'field_variable_test_block', + 'message0': '%1', + 'args0': [ + { + 'type': 'field_variable', + 'name': 'VAR', + 'variable': 'item' + } + ], + }, + { + 'type': 'simple_test_block', + 'message0': 'simple test block' + }]); +} + +function eventTest_tearDown() { + delete Blockly.Blocks['field_variable_test_block']; + delete Blockly.Blocks['simple_test_block']; + if (mockControl_) { + mockControl_.restore(); + } + workspace.dispose(); +} + +function eventTest_tearDownWithMockBlocks() { + eventTest_tearDown(); + delete Blockly.Blocks.field_variable_test_block; +} + +function test_block_base_constructor() { + eventTest_setUpWithMockBlocks(); + mockControl_ = setUpMockMethod(Blockly.utils, 'genUid', null, '1'); + try { + var block = createSimpleTestBlock(workspace); + + // Here's the event we care about. + var event = new Blockly.Events.BlockBase(block); + assertUndefined(event.varId); + checkExactEventValues(event, {'blockId': '1', 'workspaceId': workspace.id, + 'group': '', 'recordUndo': true}); + } finally { + eventTest_tearDownWithMockBlocks(); + } +} + +function test_var_base_constructor() { + eventTest_setUpWithMockBlocks(); + mockControl_ = setUpMockMethod(Blockly.utils, 'genUid', null, '1'); + try { + var variable = workspace.createVariable('name1', 'type1', 'id1'); + + var event = new Blockly.Events.VarBase(variable); + assertUndefined(event.blockId); + checkExactEventValues(event, {'varId': 'id1', + 'workspaceId': workspace.id, 'group': '', 'recordUndo': true}); + } finally { + eventTest_tearDownWithMockBlocks(); + } +} + +function test_abstract_constructor() { + eventTest_setUpWithMockBlocks(); + try { + var event = new Blockly.Events.Abstract(); + assertUndefined(event.blockId); + assertUndefined(event.workspaceId); + assertUndefined(event.varId); + checkExactEventValues(event, {'group': '', 'recordUndo': true}); + } finally { + eventTest_tearDownWithMockBlocks(); + } +} + +// Test util +function checkCreateEventValues(event, block, ids, type) { + var expected_xml = Blockly.Xml.domToText(Blockly.Xml.blockToDom(block)); + var result_xml = Blockly.Xml.domToText(event.xml); + assertEquals(expected_xml, result_xml); + isEqualArrays(ids, event.ids); + assertEquals(type, event.type); +} + +// Test util +function checkDeleteEventValues(event, block, ids, type) { + var expected_xml = Blockly.Xml.domToText(Blockly.Xml.blockToDom(block)); + var result_xml = Blockly.Xml.domToText(event.oldXml); + assertEquals(expected_xml, result_xml); + isEqualArrays(ids, event.ids); + assertEquals(type, event.type); +} + +// Test util +function checkExactEventValues(event, values) { + var keys = Object.keys(values); + for (var i = 0, field; field = keys[i]; i++) { + assertEquals(values[field], event[field]); + } +} + +// Test util +function createSimpleTestBlock(workspace) { + // Disable events while constructing the block: this is a test of the + // Blockly.Event constructors, not the block constructor. + Blockly.Events.disable(); + var block = new Blockly.Block(workspace, 'simple_test_block'); + Blockly.Events.enable(); + return block; +} + +function test_create_constructor() { + eventTest_setUpWithMockBlocks(); + mockControl_ = setUpMockMethod(Blockly.utils, 'genUid', null, ['1']); + try { + var block = createSimpleTestBlock(workspace); + + var event = new Blockly.Events.Create(block); + checkCreateEventValues(event, block, ['1'], 'create'); + } finally { + eventTest_tearDownWithMockBlocks(); + } +} + +function test_blockCreate_constructor() { + // expect that blockCreate behaves the same as create. + eventTest_setUpWithMockBlocks(); + mockControl_ = setUpMockMethod(Blockly.utils, 'genUid', null, ['1']); + try { + var block = createSimpleTestBlock(workspace); + + var event = new Blockly.Events.BlockCreate(block); + checkCreateEventValues(event, block, ['1'], 'create'); + } finally { + eventTest_tearDownWithMockBlocks(); + } +} + +function test_delete_constructor() { + eventTest_setUpWithMockBlocks(); + mockControl_ = setUpMockMethod(Blockly.utils, 'genUid', null, ['1']); + try { + var block = createSimpleTestBlock(workspace); + var event = new Blockly.Events.Delete(block); + checkDeleteEventValues(event, block, ['1'], 'delete'); + } finally { + eventTest_tearDownWithMockBlocks(); + } +} + +function test_blockDelete_constructor() { + eventTest_setUpWithMockBlocks(); + mockControl_ = setUpMockMethod(Blockly.utils, 'genUid', null, ['1']); + try { + var block = createSimpleTestBlock(workspace); + block.setCommentText('test comment'); + var event = new Blockly.Events.BlockDelete(block); + checkDeleteEventValues(event, block, ['1'], 'delete'); + } finally { + eventTest_tearDownWithMockBlocks(); + } +} + +function test_change_constructor() { + eventTest_setUpWithMockBlocks(); + mockControl_ = setUpMockMethod(Blockly.utils, 'genUid', null, ['1']); + try { + Blockly.Events.disable(); + var block = new Blockly.Block(workspace, 'field_variable_test_block'); + Blockly.Events.enable(); + + var event = new Blockly.Events.Change(block, 'field', 'VAR', 'id1', 'id2'); + checkExactEventValues(event, {'element': 'field', 'name': 'VAR', + 'oldValue': 'id1', 'newValue': 'id2', 'type': 'change'}); + } finally { + eventTest_tearDownWithMockBlocks(); + } +} + +function test_blockChange_constructor() { + eventTest_setUpWithMockBlocks(); + mockControl_ = setUpMockMethod(Blockly.utils, 'genUid', null, ['1']); + try { + Blockly.Events.disable(); + var block = new Blockly.Block(workspace, 'field_variable_test_block'); + Blockly.Events.enable(); + + var event = new Blockly.Events.BlockChange(block, 'field', 'VAR', 'id1', + 'id2'); + checkExactEventValues(event, {'element': 'field', 'name': 'VAR', + 'oldValue': 'id1', 'newValue': 'id2', 'type': 'change'}); + } finally { + eventTest_tearDownWithMockBlocks(); + } +} + +function test_move_constructorCoordinate() { + // Expect the oldCoordinate to be set. + eventTest_setUpWithMockBlocks(); + mockControl_ = setUpMockMethod(Blockly.utils, 'genUid', null, ['1', '2']); + try { + var block1 = createSimpleTestBlock(workspace); + var coordinate = new Blockly.utils.Coordinate(3, 4); + block1.xy_ = coordinate; + + var event = new Blockly.Events.Move(block1); + checkExactEventValues(event, {'oldCoordinate': coordinate, + 'type': 'move'}); + } finally { + eventTest_tearDownWithMockBlocks(); + } +} + +function test_move_constructoroldParentId() { + // Expect the oldParentId to be set but not the oldCoordinate to be set. + eventTest_setUpWithMockBlocks(); + mockControl_ = setUpMockMethod(Blockly.utils, 'genUid', null, ['1', '2']); + try { + var block1 = createSimpleTestBlock(workspace); + var block2 = createSimpleTestBlock(workspace); + block1.parentBlock_ = block2; + block1.xy_ = new Blockly.utils.Coordinate(3, 4); + + var event = new Blockly.Events.Move(block1); + checkExactEventValues(event, {'oldCoordinate': undefined, + 'oldParentId': '2', 'type': 'move'}); + block1.parentBlock_ = null; + } finally { + eventTest_tearDownWithMockBlocks(); + } +} + +function test_blockMove_constructorCoordinate() { + // Expect the oldCoordinate to be set. + eventTest_setUpWithMockBlocks(); + mockControl_ = setUpMockMethod(Blockly.utils, 'genUid', null, ['1', '2']); + try { + var block1 = createSimpleTestBlock(workspace); + var coordinate = new Blockly.utils.Coordinate(3, 4); + block1.xy_ = coordinate; + + var event = new Blockly.Events.BlockMove(block1); + checkExactEventValues(event, {'oldCoordinate': coordinate, + 'type': 'move'}); + } finally { + eventTest_tearDownWithMockBlocks(); + } +} + +function test_blockMove_constructoroldParentId() { + // Expect the oldParentId to be set but not the oldCoordinate to be set. + eventTest_setUpWithMockBlocks(); + mockControl_ = setUpMockMethod(Blockly.utils, 'genUid', null, ['1', '2']); + try { + var block1 = createSimpleTestBlock(workspace); + var block2 = createSimpleTestBlock(workspace); + block1.parentBlock_ = block2; + block1.xy_ = new Blockly.utils.Coordinate(3, 4); + + var event = new Blockly.Events.BlockMove(block1); + checkExactEventValues(event, {'oldCoordinate': undefined, + 'oldParentId': '2', 'type': 'move'}); + block1.parentBlock_ = null; + } finally { + eventTest_tearDownWithMockBlocks(); + } +} + +function test_uiEvent_constructor_null() { + try { + Blockly.Events.setGroup('testGroup'); + var event = new Blockly.Events.Ui(null, 'foo', 'bar', 'baz'); + checkExactEventValues(event, + { + 'blockId': null, + 'workspaceId': null, + 'type': 'ui', + 'oldValue': 'bar', + 'newValue': 'baz', + 'element': 'foo', + 'recordUndo': false, + 'group': 'testGroup' + } + ); + } finally { + Blockly.Events.setGroup(false); + } +} + +function test_uiEvent_constructor_block() { + eventTest_setUpWithMockBlocks(); + mockControl_ = setUpMockMethod(Blockly.utils, 'genUid', null, ['1']); + try { + var block1 = createSimpleTestBlock(workspace); + Blockly.Events.setGroup('testGroup'); + var event = new Blockly.Events.Ui(block1, 'foo', 'bar', 'baz'); + checkExactEventValues(event, + { + 'blockId': '1', + 'workspaceId': workspace.id, + 'type': 'ui', + 'oldValue': 'bar', + 'newValue': 'baz', + 'element': 'foo', + 'recordUndo': false, + 'group': 'testGroup' + } + ); + } finally { + Blockly.Events.setGroup(false); + eventTest_tearDownWithMockBlocks(); + } +} + +function test_varCreate_constructor() { + eventTest_setUp(); + try { + var variable = workspace.createVariable('name1', 'type1', 'id1'); + var event = new Blockly.Events.VarCreate(variable); + checkExactEventValues(event, {'varName': 'name1', 'varType': 'type1', + 'type': 'var_create'}); + } finally { + eventTest_tearDown(); + } +} + +function test_varCreate_toJson() { + eventTest_setUp(); + try { + var variable = workspace.createVariable('name1', 'type1', 'id1'); + var event = new Blockly.Events.VarCreate(variable); + var json = event.toJson(); + var expectedJson = ({type: "var_create", varId: "id1", varType: "type1", + varName: "name1"}); + + assertEquals(JSON.stringify(expectedJson), JSON.stringify(json)); + } finally { + eventTest_tearDown(); + } +} + +function test_varCreate_fromJson() { + eventTest_setUp(); + try { + var variable = workspace.createVariable('name1', 'type1', 'id1'); + var event = new Blockly.Events.VarCreate(variable); + var event2 = new Blockly.Events.VarCreate(null); + var json = event.toJson(); + event2.fromJson(json); + + assertEquals(JSON.stringify(json), JSON.stringify(event2.toJson())); + } finally { + eventTest_tearDown(); + } +} + +function test_varCreate_runForward() { + eventTest_setUp(); + var json = {type: "var_create", varId: "id1", varType: "type1", + varName: "name1"}; + var event = Blockly.Events.fromJson(json, workspace); + assertNull(workspace.getVariableById('id1')); + event.run(true); + checkVariableValues(workspace, 'name1', 'type1', 'id1'); + eventTest_tearDown(); +} + +function test_varCreate_runBackwards() { + eventTest_setUp(); + var variable = workspace.createVariable('name1', 'type1', 'id1'); + var event = new Blockly.Events.VarCreate(variable); + assertNotNull(workspace.getVariableById('id1')); + event.run(false); + assertNull(workspace.getVariableById('id1')); + eventTest_tearDown(); +} + +function test_varDelete_constructor() { + eventTest_setUp(); + var variable = workspace.createVariable('name1', 'type1', 'id1'); + var event = new Blockly.Events.VarDelete(variable); + checkExactEventValues(event, {'varName': 'name1', 'varType': 'type1', + 'varId':'id1', 'type': 'var_delete'}); + eventTest_tearDown(); +} + +function test_varDelete_toJson() { + eventTest_setUp(); + var variable = workspace.createVariable('name1', 'type1', 'id1'); + var event = new Blockly.Events.VarDelete(variable); + var json = event.toJson(); + var expectedJson = ({type: "var_delete", varId: "id1", varType: "type1", + varName: "name1"}); + + assertEquals(JSON.stringify(expectedJson), JSON.stringify(json)); + eventTest_tearDown(); +} + +function test_varDelete_fromJson() { + eventTest_setUp(); + var variable = workspace.createVariable('name1', 'type1', 'id1'); + var event = new Blockly.Events.VarDelete(variable); + var event2 = new Blockly.Events.VarDelete(null); + var json = event.toJson(); + event2.fromJson(json); + + assertEquals(JSON.stringify(json), JSON.stringify(event2.toJson())); + eventTest_tearDown(); +} + +function test_varDelete_runForwards() { + eventTest_setUp(); + var variable = workspace.createVariable('name1', 'type1', 'id1'); + var event = new Blockly.Events.VarDelete(variable); + assertNotNull(workspace.getVariableById('id1')); + event.run(true); + assertNull(workspace.getVariableById('id1')); + eventTest_tearDown(); +} + +function test_varDelete_runBackwards() { + eventTest_setUp(); + var json = {type: "var_delete", varId: "id1", varType: "type1", + varName: "name1"}; + var event = Blockly.Events.fromJson(json, workspace); + assertNull(workspace.getVariableById('id1')); + event.run(false); + checkVariableValues(workspace, 'name1', 'type1', 'id1'); + eventTest_tearDown(); +} + +function test_varRename_constructor() { + eventTest_setUp(); + var variable = workspace.createVariable('name1', 'type1', 'id1'); + var event = new Blockly.Events.VarRename(variable, 'name2'); + checkExactEventValues(event, {'varId': 'id1', 'oldName': 'name1', + 'newName': 'name2', 'type': 'var_rename'}); + eventTest_tearDown(); +} + +function test_varRename_toJson() { + eventTest_setUp(); + var variable = workspace.createVariable('name1', 'type1', 'id1'); + var event = new Blockly.Events.VarRename(variable, 'name2'); + var json = event.toJson(); + var expectedJson = ({type: "var_rename", varId: "id1", oldName: "name1", + newName: "name2"}); + + assertEquals(JSON.stringify(expectedJson), JSON.stringify(json)); + eventTest_tearDown(); +} + +function test_varRename_fromJson() { + eventTest_setUp(); + var variable = workspace.createVariable('name1', 'type1', 'id1'); + var event = new Blockly.Events.VarRename(variable, ''); + var event2 = new Blockly.Events.VarRename(null); + var json = event.toJson(); + event2.fromJson(json); + + assertEquals(JSON.stringify(json), JSON.stringify(event2.toJson())); + eventTest_tearDown(); +} + +function test_varRename_runForward() { + eventTest_setUp(); + var variable = workspace.createVariable('name1', 'type1', 'id1'); + var event = new Blockly.Events.VarRename(variable, 'name2'); + event.run(true); + assertNull(workspace.getVariable('name1')); + checkVariableValues(workspace, 'name2', 'type1', 'id1'); + eventTest_tearDown(); +} + +function test_varBackard_runForward() { + eventTest_setUp(); + var variable = workspace.createVariable('name1', 'type1', 'id1'); + var event = new Blockly.Events.VarRename(variable, 'name2'); + event.run(false); + assertNull(workspace.getVariable('name2')); + checkVariableValues(workspace, 'name1', 'type1', 'id1'); + eventTest_tearDown(); +} + +function test_events_filter() { + eventTest_setUpWithMockBlocks(); + try { + var block1 = workspace.newBlock('field_variable_test_block', '1'); + var events = [ + new Blockly.Events.BlockCreate(block1), + new Blockly.Events.BlockMove(block1), + new Blockly.Events.BlockChange(block1, 'field', 'VAR', 'id1', 'id2'), + new Blockly.Events.Ui(block1, 'click') + ]; + var filteredEvents = Blockly.Events.filter(events, true); + assertEquals(4, filteredEvents.length); // no event should have been removed. + // test that the order hasn't changed + assertTrue(filteredEvents[0] instanceof Blockly.Events.BlockCreate); + assertTrue(filteredEvents[1] instanceof Blockly.Events.BlockMove); + assertTrue(filteredEvents[2] instanceof Blockly.Events.BlockChange); + assertTrue(filteredEvents[3] instanceof Blockly.Events.Ui); + } finally { + eventTest_tearDownWithMockBlocks(); + } +} + +function test_events_filterForward() { + eventTest_setUpWithMockBlocks(); + try { + var block1 = workspace.newBlock('field_variable_test_block', '1'); + var events = [ + new Blockly.Events.BlockCreate(block1), + ]; + helper_addMoveEvent(events, block1, 1, 1); + helper_addMoveEvent(events, block1, 2, 2); + helper_addMoveEvent(events, block1, 3, 3); + var filteredEvents = Blockly.Events.filter(events, true); + assertEquals(2, filteredEvents.length); // duplicate moves should have been removed. + // test that the order hasn't changed + assertTrue(filteredEvents[0] instanceof Blockly.Events.BlockCreate); + assertTrue(filteredEvents[1] instanceof Blockly.Events.BlockMove); + assertEquals(3, filteredEvents[1].newCoordinate.x); + assertEquals(3, filteredEvents[1].newCoordinate.y); + } finally { + eventTest_tearDownWithMockBlocks(); + } +} + +function test_events_filterBackward() { + eventTest_setUpWithMockBlocks(); + try { + var block1 = workspace.newBlock('field_variable_test_block', '1'); + var events = [ + new Blockly.Events.BlockCreate(block1), + ]; + helper_addMoveEvent(events, block1, 1, 1); + helper_addMoveEvent(events, block1, 2, 2); + helper_addMoveEvent(events, block1, 3, 3); + var filteredEvents = Blockly.Events.filter(events, false); + assertEquals(2, filteredEvents.length); // duplicate event should have been removed. + // test that the order hasn't changed + assertTrue(filteredEvents[0] instanceof Blockly.Events.BlockCreate); + assertTrue(filteredEvents[1] instanceof Blockly.Events.BlockMove); + assertEquals(1, filteredEvents[1].newCoordinate.x); + assertEquals(1, filteredEvents[1].newCoordinate.y); + } finally { + eventTest_tearDownWithMockBlocks(); + } +} + +function test_events_filterDifferentBlocks() { + eventTest_setUpWithMockBlocks(); + var block1 = workspace.newBlock('field_variable_test_block', '1'); + var block2 = workspace.newBlock('field_variable_test_block', '2'); + var events = [ + new Blockly.Events.BlockCreate(block1), + new Blockly.Events.BlockMove(block1), + new Blockly.Events.BlockCreate(block2), + new Blockly.Events.BlockMove(block2) + ]; + var filteredEvents = Blockly.Events.filter(events, true); + assertEquals(4, filteredEvents.length); // no event should have been removed. + eventTest_tearDownWithMockBlocks(); +} + +function test_events_mergeMove() { + eventTest_setUpWithMockBlocks(); + var block1 = workspace.newBlock('field_variable_test_block', '1'); + var events = []; + helper_addMoveEvent(events, block1, 0, 0); + helper_addMoveEvent(events, block1, 1, 1); + var filteredEvents = Blockly.Events.filter(events, true); + assertEquals(1, filteredEvents.length); // second move event merged into first + assertEquals(1, filteredEvents[0].newCoordinate.x); + assertEquals(1, filteredEvents[0].newCoordinate.y); + eventTest_tearDownWithMockBlocks(); +} + +function test_events_mergeChange() { + eventTest_setUpWithMockBlocks(); + var block1 = workspace.newBlock('field_variable_test_block', '1'); + var events = [ + new Blockly.Events.Change(block1, 'field', 'VAR', 'item', 'item1'), + new Blockly.Events.Change(block1, 'field', 'VAR', 'item1', 'item2') + ]; + var filteredEvents = Blockly.Events.filter(events, true); + assertEquals(1, filteredEvents.length); // second change event merged into first + assertEquals('item', filteredEvents[0].oldValue); + assertEquals('item2', filteredEvents[0].newValue); + eventTest_tearDownWithMockBlocks(); +} + +function test_events_mergeUi() { + eventTest_setUpWithMockBlocks(); + var block1 = workspace.newBlock('field_variable_test_block', '1'); + var block2 = workspace.newBlock('field_variable_test_block', '2'); + var block3 = workspace.newBlock('field_variable_test_block', '3'); + var events = [ + new Blockly.Events.Ui(block1, 'commentOpen', 'false', 'true'), + new Blockly.Events.Ui(block1, 'click', 'false', 'true'), + new Blockly.Events.Ui(block2, 'mutatorOpen', 'false', 'true'), + new Blockly.Events.Ui(block2, 'click', 'false', 'true'), + new Blockly.Events.Ui(block3, 'warningOpen', 'false', 'true'), + new Blockly.Events.Ui(block3, 'click', 'false', 'true') + ]; + var filteredEvents = Blockly.Events.filter(events, true); + assertEquals(3, filteredEvents.length); // click event merged into corresponding *Open event + assertEquals('commentOpen', filteredEvents[0].element); + assertEquals('mutatorOpen', filteredEvents[1].element); + assertEquals('warningOpen', filteredEvents[2].element); + eventTest_tearDownWithMockBlocks(); +} + +/** + * Tests that events that collide on a (event, block, workspace) tuple + * but cannot be merged do not get dropped during filtering. + */ +function test_events_stackclick() { + eventTest_setUpWithMockBlocks(); + var block = workspace.newBlock('field_variable_test_block', '1'); + var events = [ + new Blockly.Events.Ui(block, 'click', undefined, undefined), + new Blockly.Events.Ui(block, 'stackclick', undefined, undefined) + ]; + var filteredEvents = Blockly.Events.filter(events, true); + // click and stackclick should both exist + assertEquals(2, filteredEvents.length); + assertEquals('click', filteredEvents[0].element); + assertEquals('stackclick', filteredEvents[1].element); + eventTest_tearDownWithMockBlocks(); +} + +/** + * Mutator composition could result in move events for blocks + * connected to the mutated block that were null operations. This + * leads to events in the undo/redo queue that do nothing, requiring + * an extra undo/redo to proceed to the next event. This test ensures + * that two move events that do get merged (disconnecting and + * reconnecting a block in response to a mutator change) are filtered + * from the queue. + */ +function test_events_filteraftermerge() { + eventTest_setUpWithMockBlocks(); + var block = workspace.newBlock('field_variable_test_block', '1'); + block.setParent(null); + var events = []; + helper_addMoveEventParent(events, block, null); + helper_addMoveEventParent(events, block, null); + var filteredEvents = Blockly.Events.filter(events, true); + // The two events should be merged, but because nothing has changed + // they will be filtered out. + assertEquals(0, filteredEvents.length); + eventTest_tearDownWithMockBlocks(); +} + +/** + * Helper function to simulate block move events. + * + * @param {!Array.} events a queue of events. + * @param {!Blockly.Block} block the block to be moved + * @param {number} newX new X coordinate of the block + * @param {number} newY new Y coordinate of the block + */ +function helper_addMoveEvent(events, block, newX, newY) { + events.push(new Blockly.Events.BlockMove(block)); + block.xy_ = new Blockly.utils.Coordinate(newX, newY); + events[events.length-1].recordNew(); +} + +function helper_addMoveEventParent(events, block, parent) { + events.push(new Blockly.Events.BlockMove(block)); + block.setParent(parent); + events[events.length-1].recordNew(); +} + +function test_events_newblock_newvar() { + eventTest_setUpWithMockBlocks(); + + Blockly.Events.fire = temporary_fireEvent; + temporary_fireEvent.firedEvents_ = []; + // Expect three calls to genUid: one to set the block's ID, one for the event + // group's id, and one for the variable's ID. + mockControl_ = setUpMockMethod(Blockly.utils, 'genUid', null, ['1', '2', '3']); + try { + var block = workspace.newBlock('field_variable_test_block'); + + var firedEvents = workspace.undoStack_; + // Expect two events: varCreate and block create. + assertEquals(2, firedEvents.length); + + var event0 = firedEvents[0]; + var event1 = firedEvents[1]; + assertEquals('var_create', event0.type); + assertEquals('create', event1.type); + + // Expect the events to have the same group ID. + assertEquals(event0.group, event1.group); + + // Expect the group ID to be the result of the second call to genUid. + assertEquals('2', event0.group); + + // Expect the workspace to have a variable with ID '3'. + assertNotNull(workspace.getVariableById('3')); + assertEquals('3', event0.varId); + } finally { + eventTest_tearDownWithMockBlocks(); + Blockly.Events.fire = savedFireFunc; + } +} + +// The sequence of events should be the same whether the block was created from +// XML or directly. +function test_events_newblock_newvar_xml() { + eventTest_setUpWithMockBlocks(); + + Blockly.Events.fire = temporary_fireEvent; + temporary_fireEvent.firedEvents_ = []; + try { + var dom = Blockly.Xml.textToDom( + '' + + ' ' + + ' name1' + + ' ' + + ''); + Blockly.Xml.domToWorkspace(dom, workspace); + + var firedEvents = workspace.undoStack_; + // Expect two events: varCreate and block create. + assertEquals(2, firedEvents.length); + + var event0 = firedEvents[0]; + var event1 = firedEvents[1]; + assertEquals('var_create', event0.type); + assertEquals('create', event1.type); + + // Expect the events to have the same group ID. + assertEquals(event0.group, event1.group); + + // Expect the workspace to have a variable with ID 'id1'. + assertNotNull(workspace.getVariableById('id1')); + assertEquals('id1', event0.varId); + } finally { + eventTest_tearDownWithMockBlocks(); + Blockly.Events.fire = savedFireFunc; + } +} + +function test_events_filter_nomerge_move() { + // Move events should only merge if they refer to the same block and are + // consecutive. + // See github.com/google/blockly/pull/1892 for a worked example showing + // how merging non-consecutive events can fail when replacing a shadow + // block. + eventTest_setUpWithMockBlocks(); + try { + var block1 = createSimpleTestBlock(workspace); + var block2 = createSimpleTestBlock(workspace); + + var events = []; + helper_addMoveEvent(events, block1, 1, 1); + helper_addMoveEvent(events, block2, 1, 1); + events.push(new Blockly.Events.BlockDelete(block2)); + helper_addMoveEvent(events, block1, 2, 2); + + var filteredEvents = Blockly.Events.filter(events, true); + // Nothing should have merged. + assertEquals(4, filteredEvents.length); + // test that the order hasn't changed + assertTrue(filteredEvents[0] instanceof Blockly.Events.BlockMove); + assertTrue(filteredEvents[1] instanceof Blockly.Events.BlockMove); + assertTrue(filteredEvents[2] instanceof Blockly.Events.BlockDelete); + assertTrue(filteredEvents[3] instanceof Blockly.Events.BlockMove); + } finally { + eventTest_tearDownWithMockBlocks(); + } +} diff --git a/js/tests/jsunit/extensions_test.js b/js/tests/jsunit/extensions_test.js new file mode 100644 index 0000000..a465b4f --- /dev/null +++ b/js/tests/jsunit/extensions_test.js @@ -0,0 +1,654 @@ +/** + * @license + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + /** + * @fileoverview Tests for Blockly.Extensions + * @author Anm@anm.me (Andrew n marshall) + */ +'use strict'; + +function test_extension() { + var workspace = new Blockly.Workspace(); + var block; + try { + assertUndefined(Blockly.Extensions.ALL_['extensions_test']); + + var numCallsToBefore = 0; + var numCallsToAfter = 0; + + // Extension defined before the block type is defined. + Blockly.Extensions.register('extensions_test_before', function () { + numCallsToBefore++; + this.extendedWithBefore = true; + }); + + Blockly.defineBlocksWithJsonArray([{ + "type": "extension_test_block", + "message0": "extension_test_block", + "extensions": ["extensions_test_before", "extensions_test_after"] + }]); + + // Extension defined after the block type (but before instantiation). + Blockly.Extensions.register('extensions_test_after', function () { + numCallsToAfter++; + this.extendedWithAfter = true; + }); + + assert(typeof Blockly.Extensions.ALL_['extensions_test_before'] == 'function'); + assert(typeof Blockly.Extensions.ALL_['extensions_test_after'] == 'function'); + assertEquals(0, numCallsToBefore); + assertEquals(0, numCallsToAfter); + + block = new Blockly.Block(workspace, 'extension_test_block'); + + assertEquals(1, numCallsToBefore); + assertEquals(1, numCallsToAfter); + assert(block.extendedWithBefore); + assert(block.extendedWithAfter); + } finally { + block && block.dispose(); + workspace.dispose(); + + delete Blockly.Extensions.ALL_['extensions_test_before']; + delete Blockly.Extensions.ALL_['extensions_test_after']; + delete Blockly.Blocks['extension_test_block']; + } +} + +function test_extension_missing() { + var workspace = new Blockly.Workspace(); + var block; + var exceptionWasThrown = false; + try { + assertUndefined(Blockly.Extensions.ALL_['missing_extension']); + Blockly.defineBlocksWithJsonArray([{ + "type": "missing_extension_block", + "message0": "missing_extension_block", + "extensions": ["missing_extension"] + }]); + + block = new Blockly.Block(workspace, 'missing_extension_block'); + } catch (e) { + // Expected. + exceptionWasThrown = true; + } finally { + block && block.dispose(); + workspace.dispose(); + delete Blockly.Blocks['missing_extension_block']; + } + assert(exceptionWasThrown); +} + +function test_extension_not_a_function() { + var exceptionWasThrown = false; + try { + assertUndefined(Blockly.Extensions.ALL_['extension_just_a_string']); + Blockly.Extensions.register('extension_just_a_string', 'extension_just_a_string'); + } catch (e) { + // Expected. + exceptionWasThrown = true; + } finally { + delete Blockly.Extensions.ALL_['extension_just_a_string']; + } + assert(exceptionWasThrown); + + var exceptionWasThrown = false; + try { + assertUndefined(Blockly.Extensions.ALL_['extension_is_null']); + Blockly.Extensions.register('extension_is_null', null); + } catch (e) { + // Expected. + exceptionWasThrown = true; + } finally { + delete Blockly.Extensions.ALL_['extension_is_null']; + } + assert(exceptionWasThrown); + + var exceptionWasThrown = false; + try { + assertUndefined(Blockly.Extensions.ALL_['extension_is_undefined']); + Blockly.Extensions.register('extension_is_undefined'); + } catch (e) { + // Expected. + exceptionWasThrown = true; + } finally { + delete Blockly.Extensions.ALL_['extension_is_undefined']; + } + assert(exceptionWasThrown); +} + +function test_parent_tooltip_when_inline() { + var defaultTooltip = "defaultTooltip"; + var parentTooltip = "parentTooltip"; + + var workspace = new Blockly.Workspace(); + var block; + try { + Blockly.defineBlocksWithJsonArray([ + { + "type": "test_parent_tooltip_when_inline", + "message0": "test_parent_tooltip_when_inline", + "output": true, + "tooltip": defaultTooltip, + "extensions": ["parent_tooltip_when_inline"] + }, + { + "type": "test_parent", + "message0": "%1", + "args0": [ + { + "type": "input_value", + "name": "INPUT" + } + ], + "tooltip": parentTooltip + } + ]); + + block = new Blockly.Block(workspace, 'test_parent_tooltip_when_inline'); + + // Tooltip is dynamic after extension initialization. + assert(typeof block.tooltip == 'function'); + assertEquals(block.tooltip(), defaultTooltip); + + // Tooltip is normal before connected to parent. + var parent = new Blockly.Block(workspace, 'test_parent'); + assertEquals(parent.tooltip, parentTooltip); + assertFalse(!!parent.inputsInline); + + // Tooltip is normal when parent is not inline. + parent.getInput('INPUT').connection.connect(block.outputConnection); + assertEquals(block.getParent(), parent); + assertEquals(block.tooltip(), defaultTooltip); + + // Tooltip is parent's when parent is inline. + parent.setInputsInline(true); + assertEquals(block.tooltip(), parentTooltip); + + // Tooltip revert when disconnected. + parent.getInput('INPUT').connection.disconnect(); + assert(!block.getParent()); + assertEquals(block.tooltip(), defaultTooltip); + } finally { + block && block.dispose(); + workspace.dispose(); + + delete Blockly.Blocks['test_parent_tooltip_when_inline']; + delete Blockly.Blocks['test_parent']; + } +} + +function test_mixin_extension() { + var TEST_MIXIN = { + field: 'FIELD', + method: function() { + console.log('TEXT_MIXIN method()'); + } + }; + + var workspace = new Blockly.Workspace(); + var block; + try { + assertUndefined(Blockly.Extensions.ALL_['mixin_test']); + + // Extension defined before the block type is defined. + Blockly.Extensions.registerMixin('mixin_test', TEST_MIXIN); + assert(typeof Blockly.Extensions.ALL_['mixin_test'] == 'function'); + + Blockly.defineBlocksWithJsonArray([{ + "type": "test_block_mixin", + "message0": "test_block_mixin", + "extensions": ["mixin_test"] + }]); + + block = new Blockly.Block(workspace, 'test_block_mixin'); + + assertEquals(TEST_MIXIN.field, block.field); + assertEquals(TEST_MIXIN.method, block.method); + } finally { + block && block.dispose(); + workspace.dispose(); + + delete Blockly.Extensions.ALL_['mixin_test']; + delete Blockly.Blocks['test_block_mixin']; + } +} + +function test_bad_mixin_overwrites_local_value() { + var TEST_MIXIN_BAD_INPUTLIST = { + inputList: 'bad inputList' // Defined in constructor + }; + + var workspace = new Blockly.Workspace(); + var block; + try { + assertUndefined(Blockly.Extensions.ALL_['mixin_bad_inputList']); + + // Extension defined before the block type is defined. + Blockly.Extensions.registerMixin('mixin_bad_inputList', TEST_MIXIN_BAD_INPUTLIST); + assert(typeof Blockly.Extensions.ALL_['mixin_bad_inputList'] == 'function'); + + Blockly.defineBlocksWithJsonArray([{ + "type": "test_block_bad_inputList", + "message0": "test_block_bad_inputList", + "extensions": ["mixin_bad_inputList"] + }]); + + try { + block = new Blockly.Block(workspace, 'test_block_bad_inputList'); + } catch (e) { + // Expected Error + assert(e.message.indexOf('inputList') >= 0); // Reference the conflict + return; + } + fail('Expected error when constructing block'); + } finally { + block && block.dispose(); + workspace.dispose(); + + delete Blockly.Extensions.ALL_['mixin_bad_inputList']; + delete Blockly.Blocks['test_block_bad_inputList']; + } +} + +function test_bad_mixin_overwrites_prototype() { + var TEST_MIXIN_BAD_COLOUR = { + colour_: 'bad colour_' // Defined on prototype + }; + + var workspace = new Blockly.Workspace(); + var block; + try { + assertUndefined(Blockly.Extensions.ALL_['mixin_bad_colour_']); + + // Extension defined before the block type is defined. + Blockly.Extensions.registerMixin('mixin_bad_colour_', TEST_MIXIN_BAD_COLOUR); + assert(typeof Blockly.Extensions.ALL_['mixin_bad_colour_'] == 'function'); + + Blockly.defineBlocksWithJsonArray([{ + "type": "test_block_bad_colour", + "message0": "test_block_bad_colour", + "extensions": ["mixin_bad_colour_"] + }]); + + try { + block = new Blockly.Block(workspace, 'test_block_bad_colour'); + } catch (e) { + // Expected Error + assert(e.message.indexOf('colour_') >= 0); // Reference the conflict + return; + } + fail('Expected error when constructing block'); + } finally { + block && block.dispose(); + workspace.dispose(); + + delete Blockly.Extensions.ALL_['mixin_bad_colour_']; + delete Blockly.Blocks['test_block_bad_colour']; + } +} + +function test_mutator_mixin() { + var workspace = new Blockly.Workspace(); + var block; + + try { + Blockly.defineBlocksWithJsonArray([{ + "type": "mutator_test_block", + "message0": "mutator_test_block", + "mutator": "mutator_test" + }]); + + // Events code calls mutationToDom and expects it to give back a meaningful + // value. + Blockly.Events.disable(); + Blockly.Extensions.registerMutator('mutator_test', + { + domToMutation: function() { + return 'domToMutationFn'; + }, + mutationToDom: function() { + return 'mutationToDomFn'; + }, + compose: function() { + return 'composeFn'; + }, + decompose: function() { + return 'decomposeFn'; + } + }); + + block = new Blockly.Block(workspace, 'mutator_test_block'); + + // Make sure all of the functions were installed correctly. + assertEquals(block.domToMutation(), 'domToMutationFn'); + assertEquals(block.mutationToDom(), 'mutationToDomFn'); + assertEquals(block.compose(), 'composeFn'); + assertEquals(block.decompose(), 'decomposeFn'); + } finally { + if (block) { + block.dispose(); + } + workspace.dispose(); + Blockly.Events.enable(); + delete Blockly.Extensions.ALL_['mutator_test']; + } +} + +function test_mutator_mixin_no_dialog() { + var workspace = new Blockly.Workspace(); + var block; + + try { + Blockly.defineBlocksWithJsonArray([{ + "type": "mutator_test_block", + "message0": "mutator_test_block", + "mutator": "mutator_test" + }]); + + // Events code calls mutationToDom and expects it to give back a meaningful + // value. + Blockly.Events.disable(); + assertUndefined(Blockly.Extensions.ALL_['mutator_test']); + Blockly.Extensions.registerMutator('mutator_test', + { + domToMutation: function() { + return 'domToMutationFn'; + }, + mutationToDom: function() { + return 'mutationToDomFn'; + } + }); + + block = new Blockly.Block(workspace, 'mutator_test_block'); + + // Make sure all of the functions were installed correctly. + assertEquals(block.domToMutation(), 'domToMutationFn'); + assertEquals(block.mutationToDom(), 'mutationToDomFn'); + assertFalse(block.hasOwnProperty('compose')); + assertFalse(block.hasOwnProperty('decompose')); + } finally { + if (block) { + block.dispose(); + } + workspace.dispose(); + Blockly.Events.enable(); + delete Blockly.Extensions.ALL_['mutator_test']; + } +} + +// Explicitly check all four things that could be missing. +function test_mutator_mixin_no_decompose_fails() { + var exceptionWasThrown = false; + try { + Blockly.Extensions.registerMutator('mutator_test', + { + domToMutation: function() { + return 'domToMutationFn'; + }, + mutationToDom: function() { + return 'mutationToDomFn'; + }, + compose: function() { + return 'composeFn'; + } + }); + } catch (e) { + // Expected. + exceptionWasThrown = true; + } finally { + delete Blockly.Extensions.ALL_['mutator_test']; + } + assertTrue(exceptionWasThrown); +} + +function test_mutator_mixin_no_compose_fails() { + var exceptionWasThrown = false; + try { + Blockly.Extensions.registerMutator('mutator_test', + { + domToMutation: function() { + return 'domToMutationFn'; + }, + mutationToDom: function() { + return 'mutationToDomFn'; + }, + decompose: function() { + return 'decomposeFn'; + } + }); + } catch (e) { + // Expected. + exceptionWasThrown = true; + } finally { + delete Blockly.Extensions.ALL_['mutator_test']; + } + assertTrue(exceptionWasThrown); +} + +function test_mutator_mixin_no_domToMutation_fails() { + var exceptionWasThrown = false; + try { + Blockly.Extensions.registerMutator('mutator_test', + { + mutationToDom: function() { + return 'mutationToDomFn'; + }, + compose: function() { + return 'composeFn'; + }, + decompose: function() { + return 'decomposeFn'; + } + }); + } catch (e) { + // Expected. + exceptionWasThrown = true; + } finally { + delete Blockly.Extensions.ALL_['mutator_test']; + } + assertTrue(exceptionWasThrown); +} + +function test_mutator_mixin_no_mutationToDom_fails() { + var exceptionWasThrown = false; + try { + Blockly.Extensions.registerMutator('mutator_test', + { + domToMutation: function() { + return 'domToMutationFn'; + }, + compose: function() { + return 'composeFn'; + }, + decompose: function() { + return 'decomposeFn'; + } + }); + } catch (e) { + // Expected. + exceptionWasThrown = true; + } finally { + delete Blockly.Extensions.ALL_['mutator_test']; + } + assertTrue(exceptionWasThrown); +} + +function test_use_mutator_as_extension_fails() { + var workspace = new Blockly.Workspace(); + var block; + var exceptionWasThrown = false; + + try { + Blockly.defineBlocksWithJsonArray([{ + "type": "mutator_test_block", + "message0": "mutator_test_block", + "extensions": ["mutator_test"] + }]); + + Blockly.Events.disable(); + assertUndefined(Blockly.Extensions.ALL_['mutator_test']); + Blockly.Extensions.registerMutator('mutator_test', + { + domToMutation: function() { + return 'domToMutationFn'; + }, + mutationToDom: function() { + return 'mutationToDomFn'; + } + }); + + // Events code calls mutationToDom and expects it to give back a meaningful + // value. + block = new Blockly.Block(workspace, 'mutator_test_block'); + } catch (e) { + // Expected + exceptionWasThrown = true; + // Should have failed on apply, not on register. + assertNotNull(Blockly.Extensions.ALL_['mutator_test']); + } finally { + if (block) { + block.dispose(); + } + workspace.dispose(); + Blockly.Events.enable(); + delete Blockly.Extensions.ALL_['mutator_test']; + } + assertTrue(exceptionWasThrown); +} + +function test_use_mutator_mixin_as_extension_fails() { + var workspace = new Blockly.Workspace(); + var block; + var exceptionWasThrown = false; + + try { + Blockly.defineBlocksWithJsonArray([{ + "type": "mutator_test_block", + "message0": "mutator_test_block", + "extensions": ["mutator_test"] + }]); + + // Events code calls mutationToDom and expects it to give back a meaningful + // value. + Blockly.Events.disable(); + assertUndefined(Blockly.Extensions.ALL_['mutator_test']); + Blockly.Extensions.registerMixin('mutator_test', + { + domToMutation: function() { + return 'domToMutationFn'; + }, + mutationToDom: function() { + return 'mutationToDomFn'; + } + }); + + block = new Blockly.Block(workspace, 'mutator_test_block'); + } catch (e) { + // Expected + exceptionWasThrown = true; + // Should have failed on apply, not on register. + assertNotNull(Blockly.Extensions.ALL_['mutator_test']); + } finally { + if (block) { + block.dispose(); + } + workspace.dispose(); + Blockly.Events.enable(); + delete Blockly.Extensions.ALL_['mutator_test']; + } + assertTrue(exceptionWasThrown); +} + +function test_use_extension_as_mutator_fails() { + var workspace = new Blockly.Workspace(); + var block; + var exceptionWasThrown = false; + + try { + Blockly.defineBlocksWithJsonArray([{ + "type": "mutator_test_block", + "message0": "mutator_test_block", + "mutator": ["extensions_test"] + }]); + + // Events code calls mutationToDom and expects it to give back a meaningful + // value. + Blockly.Events.disable(); + assertUndefined(Blockly.Extensions.ALL_['extensions_test']); + Blockly.Extensions.register('extensions_test', function() { + return 'extensions_test_fn'; + }); + + block = new Blockly.Block(workspace, 'mutator_test_block'); + } catch (e) { + // Expected + exceptionWasThrown = true; + // Should have failed on apply, not on register. + assertNotNull(Blockly.Extensions.ALL_['extensions_test']); + } finally { + if (block) { + block.dispose(); + } + workspace.dispose(); + Blockly.Events.enable(); + delete Blockly.Extensions.ALL_['extensions_test']; + } + assertTrue(exceptionWasThrown); +} + +function test_mutator_mixin_plus_function() { + var workspace = new Blockly.Workspace(); + var block; + var fnWasCalled = false; + + try { + Blockly.defineBlocksWithJsonArray([{ + "type": "mutator_test_block", + "message0": "mutator_test_block", + "mutator": ["extensions_test"] + }]); + + Blockly.Events.disable(); + assertUndefined(Blockly.Extensions.ALL_['extensions_test']); + Blockly.Extensions.registerMutator('extensions_test', + { + domToMutation: function() { + return 'domToMutationFn'; + }, + mutationToDom: function() { + return 'mutationToDomFn'; + } + }, + function() { + fnWasCalled = true; + } + ); + + // Events code calls mutationToDom and expects it to give back a meaningful + // value. + block = new Blockly.Block(workspace, 'mutator_test_block'); + } finally { + if (block) { + block.dispose(); + } + workspace.dispose(); + Blockly.Events.enable(); + delete Blockly.Extensions.ALL_['extensions_test']; + } + assertTrue(fnWasCalled); +} diff --git a/js/tests/jsunit/generator_test.js b/js/tests/jsunit/generator_test.js new file mode 100644 index 0000000..4cdae64 --- /dev/null +++ b/js/tests/jsunit/generator_test.js @@ -0,0 +1,184 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + +goog.require('Blockly.Dart'); +goog.require('Blockly.JavaScript'); +goog.require('Blockly.Lua'); +goog.require('Blockly.PHP'); +goog.require('Blockly.Python'); + +var workspace; + +function defineGeneratorTestBlocks() { + Blockly.defineBlocksWithJsonArray([{ + "type": "stack_block", + "message0": "", + "previousStatement": null, + "nextStatement": null + }, + { + "type": "row_block", + "message0": "%1", + "args0": [ + { + "type": "input_value", + "name": "INPUT" + } + ], + "output": null, + "nextStatement": null + }, + { + "type": "controls_repeat_ext", + "message0": "Repeat Loop", + "message1": "%1", + "args1": [{ + "type": "input_statement", + "name": "DO" + }], + "previousStatement": null, + "nextStatement": null + }]); +} + +function undefineGeneratorTestBlocks() { + delete Blockly.Blocks['stack_block']; + delete Blockly.Blocks['row_block']; +} + +function generatorTest_setUp() { + defineGeneratorTestBlocks(); + workspace = new Blockly.Workspace(); +} + +function generatorTest_tearDown() { + undefineGeneratorTestBlocks(); + workspace.dispose(); +} + +function blockToCodeTestSetup(generator) { + var row_block = workspace.newBlock('row_block'); + var stack_block = workspace.newBlock('stack_block'); + + generator.row_block = function(block){return 'row_block'}; + generator.stack_block = function(block){return 'stack_block'}; + row_block.nextConnection.connect(stack_block.previousConnection); + return row_block; +} + +function blockToCodeTest(generator, opt_thisOnly) { + var row_block = blockToCodeTestSetup(generator); + return generator.blockToCode(row_block, opt_thisOnly); +} + +function disabledBlockTest(generator, opt_thisOnly) { + var row_block = blockToCodeTestSetup(generator); + row_block.disabled=true; + return generator.blockToCode(row_block, opt_thisOnly); +} + +function nestedLoopTest(generator, opt_thisOnly) { + Blockly.Msg['CONTROLS_REPEAT_TITLE'] = 'repeat %1 times'; + var blockA = workspace.newBlock('controls_repeat_ext'); + var blockB = workspace.newBlock('controls_repeat_ext'); + var blockC = workspace.newBlock('controls_repeat_ext'); + generator.controls_repeat_ext = getControlRepeatFunc(generator); + + blockA.getInput('DO').connection.connect(blockB.previousConnection); + blockA.nextConnection.connect(blockC.previousConnection); + return generator.blockToCode(blockA, opt_thisOnly); +} + +function getControlRepeatFunc(generator) { + return function(block){ + return '{' + generator.statementToCode(block, 'DO') + '}'; + }; +} + +function test_blockToCodeOnAllGeneartors() { + generatorTest_setUp(); + + assertEquals(blockToCodeTest(Blockly.Dart, true), 'row_block'); + assertEquals(blockToCodeTest(Blockly.Dart, false), 'row_blockstack_block'); + + assertEquals(blockToCodeTest(Blockly.JavaScript, true), 'row_block'); + assertEquals(blockToCodeTest(Blockly.JavaScript, false), 'row_blockstack_block'); + + assertEquals(blockToCodeTest(Blockly.Lua, true), 'row_block'); + assertEquals(blockToCodeTest(Blockly.Lua, false), 'row_blockstack_block'); + + assertEquals(blockToCodeTest(Blockly.PHP, true), 'row_block'); + assertEquals(blockToCodeTest(Blockly.PHP, false), 'row_blockstack_block'); + + assertEquals(blockToCodeTest(Blockly.Python, true), 'row_block'); + assertEquals(blockToCodeTest(Blockly.Python, false), 'row_blockstack_block'); + + generatorTest_tearDown(); +} + +function test_disabledBlockToCode() { + generatorTest_setUp(); + + assertEquals(disabledBlockTest(Blockly.Dart, true), ''); + assertEquals(disabledBlockTest(Blockly.Dart, false), 'stack_block'); + + assertEquals(disabledBlockTest(Blockly.JavaScript, true), ''); + assertEquals(disabledBlockTest(Blockly.JavaScript, false), 'stack_block'); + + assertEquals(disabledBlockTest(Blockly.Lua, true), ''); + assertEquals(disabledBlockTest(Blockly.Lua, false), 'stack_block'); + + assertEquals(disabledBlockTest(Blockly.PHP, true), ''); + assertEquals(disabledBlockTest(Blockly.PHP, false), 'stack_block'); + + assertEquals(disabledBlockTest(Blockly.Python, true), ''); + assertEquals(disabledBlockTest(Blockly.Python, false), 'stack_block'); + + generatorTest_tearDown(); +} + +// { {}} represents a nested block +//{ {}}{} represents a nested block with a block after it +function test_nestedLoopBlockToCode() { + generatorTest_setUp(); + + assertEquals(nestedLoopTest(Blockly.Dart, true), '{ {}}'); + assertEquals(nestedLoopTest(Blockly.Dart, false), '{ {}}{}'); + + assertEquals(nestedLoopTest(Blockly.JavaScript, true), '{ {}}'); + assertEquals(nestedLoopTest(Blockly.JavaScript, false), '{ {}}{}'); + + assertEquals(nestedLoopTest(Blockly.Lua, true), '{ {}}'); + assertEquals(nestedLoopTest(Blockly.Lua, false), '{ {}}{}'); + + assertEquals(nestedLoopTest(Blockly.PHP, true), '{ {}}'); + assertEquals(nestedLoopTest(Blockly.PHP, false), '{ {}}{}'); + + assertEquals(nestedLoopTest(Blockly.Python, true), '{ {}}'); + assertEquals(nestedLoopTest(Blockly.Python, false), '{ {}}{}'); + + generatorTest_tearDown(); +} + +function test_prefix() { + var generator = new Blockly.Generator('INTERCAL'); + assertEquals('Prefix nothing.', '', generator.prefixLines('', '')); + assertEquals('Prefix a word.', '@Hello', generator.prefixLines('Hello', '@')); + assertEquals('Prefix one line.', '12Hello\n', generator.prefixLines('Hello\n', '12')); + assertEquals('Prefix two lines.', '***Hello\n***World\n', generator.prefixLines('Hello\nWorld\n', '***')); +} \ No newline at end of file diff --git a/js/tests/jsunit/index.html b/js/tests/jsunit/index.html new file mode 100644 index 0000000..d7d36a7 --- /dev/null +++ b/js/tests/jsunit/index.html @@ -0,0 +1,41 @@ + + + + + Unit Tests for Blockly + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/js/tests/jsunit/json_test.js b/js/tests/jsunit/json_test.js new file mode 100644 index 0000000..f6127e2 --- /dev/null +++ b/js/tests/jsunit/json_test.js @@ -0,0 +1,367 @@ +/** + * @license + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + +/** Ensure a block can be instantiated from a JSON definition. */ +function test_json_minimal() { + var BLOCK_TYPE = 'test_json_minimal'; + + var workspace = new Blockly.Workspace(); + var block; + try { + var warnings = captureWarnings(function() { + Blockly.defineBlocksWithJsonArray([{ + "type": BLOCK_TYPE + }]); + block = new Blockly.Block(workspace, BLOCK_TYPE); + }); + + assertEquals(BLOCK_TYPE, block.type); + assertEquals( + 'Expecting no warnings when defining and creating a simple block.', + warnings.length, 0); + // TODO: asserts + } finally { + block.dispose(); + workspace.dispose(); + delete Blockly.Blocks[BLOCK_TYPE]; + } +} + +/** + * Ensure a block without a type id fails with a warning, but does not block + * later definitions. + */ +function test_json_nullOrUndefinedBlockTypeId() { + var BLOCK_TYPE1 = 'test_json_before_bad_blocks'; + var BLOCK_TYPE2 = 'test_json_after_bad_blocks'; + + assertUndefined(Blockly.Blocks[BLOCK_TYPE1]); + assertUndefined(Blockly.Blocks[BLOCK_TYPE2]); + var blockTypeCount = Object.keys(Blockly.Blocks).length; + + try { + var warnings = captureWarnings(function() { + Blockly.defineBlocksWithJsonArray([ + {"type": BLOCK_TYPE1}, + {"type": undefined}, + {"type": null}, + {"type": BLOCK_TYPE2}]); + }); + + assertNotNullNorUndefined('Block before bad blocks should be defined.', + Blockly.Blocks[BLOCK_TYPE1]); + assertNotNullNorUndefined('Block after bad blocks should be defined.', + Blockly.Blocks[BLOCK_TYPE2]); + assertEquals(Object.keys(Blockly.Blocks).length, blockTypeCount + 2); + assertEquals( + 'Expecting 2 warnings, one for each bad block.', warnings.length, 2); + } finally { + delete Blockly.Blocks[BLOCK_TYPE1]; + delete Blockly.Blocks[BLOCK_TYPE2]; + } +} + +/** Ensure message0 creates an input. */ +function test_json_message0() { + var BLOCK_TYPE = 'test_json_message0'; + var MESSAGE0 = 'message0'; + + var workspace = new Blockly.Workspace(); + var block; + try { + Blockly.defineBlocksWithJsonArray([{ + "type": BLOCK_TYPE, + "message0": MESSAGE0 + }]); + + block = new Blockly.Block(workspace, BLOCK_TYPE); + assertEquals(1, block.inputList.length); + assertEquals(1, block.inputList[0].fieldRow.length); + var textField = block.inputList[0].fieldRow[0]; + assertEquals(Blockly.FieldLabel, textField.constructor); + assertEquals(MESSAGE0, textField.getText()); + } finally { + block && block.dispose(); + workspace.dispose(); + delete Blockly.Blocks[BLOCK_TYPE]; + } +} + +/** Ensure message1 creates a new input. */ +function test_json_message1() { + var BLOCK_TYPE = 'test_json_message1'; + var MESSAGE0 = 'message0'; + var MESSAGE1 = 'message1'; + + var workspace = new Blockly.Workspace(); + var block; + try { + Blockly.defineBlocksWithJsonArray([{ + "type": BLOCK_TYPE, + "message0": MESSAGE0, + "message1": MESSAGE1 + }]); + + block = new Blockly.Block(workspace, BLOCK_TYPE); + assertEquals(2, block.inputList.length); + + assertEquals(1, block.inputList[0].fieldRow.length); + var textField = block.inputList[0].fieldRow[0]; + assertEquals(Blockly.FieldLabel, textField.constructor); + assertEquals(MESSAGE0, textField.getText()); + + assertEquals(1, block.inputList[1].fieldRow.length); + var textField = block.inputList[1].fieldRow[0]; + assertEquals(Blockly.FieldLabel, textField.constructor); + assertEquals(MESSAGE1, textField.getText()); + } finally { + block && block.dispose(); + workspace.dispose(); + delete Blockly.Blocks[BLOCK_TYPE]; + } +} + +/** Ensure message string is dereferenced. */ +function test_json_message0_i18n() { + var BLOCK_TYPE = 'test_json_message0_i18n'; + var MESSAGE0 = '%{BKY_MESSAGE}'; + var MESSAGE = 'message'; + + Blockly.Msg['MESSAGE'] = MESSAGE; + + var workspace = new Blockly.Workspace(); + var block; + try { + Blockly.defineBlocksWithJsonArray([{ + "type": BLOCK_TYPE, + "message0": MESSAGE0 + }]); + + block = new Blockly.Block(workspace, BLOCK_TYPE); + assertEquals(1, block.inputList.length); + assertEquals(1, block.inputList[0].fieldRow.length); + var textField = block.inputList[0].fieldRow[0]; + assertEquals(Blockly.FieldLabel, textField.constructor); + assertEquals(MESSAGE, textField.getText()); + } finally { + block && block.dispose(); // Disposes of textField, too. + workspace.dispose(); + delete Blockly.Blocks[BLOCK_TYPE]; + delete Blockly.Msg['MESSAGE']; + } +} + +function test_json_dropdown() { + var BLOCK_TYPE = 'test_json_dropdown'; + var FIELD_NAME = 'FIELD_NAME'; + var LABEL0 = 'LABEL0'; + var VALUE0 = 'VALUE0'; + var LABEL1 = 'LABEL1'; + var VALUE1 = 'VALUE1'; + + var workspace = new Blockly.Workspace(); + var block; + try { + Blockly.defineBlocksWithJsonArray([{ + "type": BLOCK_TYPE, + "message0": "%1", + "args0": [ + { + "type": "field_dropdown", + "name": FIELD_NAME, + "options": [ + [LABEL0, VALUE0], + [LABEL1, VALUE1] + ] + } + ] + }]); + + block = new Blockly.Block(workspace, BLOCK_TYPE); + assertEquals(1, block.inputList.length); + assertEquals(1, block.inputList[0].fieldRow.length); + var dropdown = block.inputList[0].fieldRow[0]; + assertEquals(dropdown, block.getField(FIELD_NAME)); + assertEquals(Blockly.FieldDropdown, dropdown.constructor); + assertEquals(VALUE0, dropdown.getValue()); + + var options = dropdown.getOptions(); + assertEquals(LABEL0, options[0][0]); + assertEquals(VALUE0, options[0][1]); + assertEquals(LABEL1, options[1][0]); + assertEquals(VALUE1, options[1][1]); + } finally { + block && block.dispose(); // Disposes of dropdown, too. + workspace.dispose(); + delete Blockly.Blocks[BLOCK_TYPE]; + } +} + +function test_json_dropdown_image() { + var BLOCK_TYPE = 'test_json_dropdown'; + var FIELD_NAME = 'FIELD_NAME'; + var IMAGE1_ALT_TEXT = 'Localized message.'; + Blockly.Msg['ALT_TEXT'] = IMAGE1_ALT_TEXT; + var IMAGE0 = { + 'width': 12, + 'height': 34, + 'src': 'http://image0.src', + 'alt': 'IMAGE0 alt text' + }; + var VALUE0 = 'VALUE0'; + var IMAGE1 = { + 'width': 56, + 'height': 78, + 'src': 'http://image1.src', + 'alt': '%{BKY_ALT_TEXT}' + }; + var VALUE1 = 'VALUE1'; + var IMAGE2 = { + 'width': 90, + 'height': 123, + 'src': 'http://image2.src' + }; + var VALUE2 = 'VALUE2'; + + var workspace = new Blockly.Workspace(); + var block; + try { + Blockly.defineBlocksWithJsonArray([{ + "type": BLOCK_TYPE, + "message0": "%1", + "args0": [ + { + "type": "field_dropdown", + "name": FIELD_NAME, + "options": [ + [IMAGE0, VALUE0], + [IMAGE1, VALUE1], + [IMAGE2, VALUE2] + ] + } + ] + }]); + + block = new Blockly.Block(workspace, BLOCK_TYPE); + assertEquals(1, block.inputList.length); + assertEquals(1, block.inputList[0].fieldRow.length); + var dropdown = block.inputList[0].fieldRow[0]; + assertEquals(dropdown, block.getField(FIELD_NAME)); + assertEquals(Blockly.FieldDropdown, dropdown.constructor); + assertEquals(VALUE0, dropdown.getValue()); + + var options = dropdown.getOptions(); + var image0 = options[0][0]; + assertEquals(IMAGE0.width, image0.width); + assertEquals(IMAGE0.height, image0.height); + assertEquals(IMAGE0.src, image0.src); + assertEquals(IMAGE0.alt, image0.alt); + assertEquals(VALUE0, options[0][1]); + + var image1 = options[1][0]; + assertEquals(IMAGE1.width, image1.width); + assertEquals(IMAGE1.height, image1.height); + assertEquals(IMAGE1.src, image1.src); + assertEquals(IMAGE1.alt, IMAGE1_ALT_TEXT); // Via Msg reference + assertEquals(VALUE1, options[1][1]); + + var image2 = options[2][0]; + assertEquals(IMAGE2.width, image2.width); + assertEquals(IMAGE2.height, image2.height); + assertEquals(IMAGE2.src, image2.src); + assert(image2.alt == null); // No alt specified. + assertEquals(VALUE2, options[2][1]); + } finally { + block && block.dispose(); // Disposes of dropdown, too. + workspace.dispose(); + delete Blockly.Blocks[BLOCK_TYPE]; + delete Blockly.Msg['ALTTEXT']; + } +} + +function test_defineBlocksWithJsonArray_nullItem() { + var BLOCK_TYPE1 = 'test_block_before_null'; + var BLOCK_TYPE2 = 'test_block_after_null'; + + assertUndefined(Blockly.Blocks[BLOCK_TYPE1]); + assertUndefined(Blockly.Blocks[BLOCK_TYPE2]); + var blockTypeCount = Object.keys(Blockly.Blocks).length; + + try { + var warnings = captureWarnings(function() { + Blockly.defineBlocksWithJsonArray([ + { + "type": BLOCK_TYPE1, + "message0": 'before' + }, + null, + { + "type": BLOCK_TYPE2, + "message0": 'after' + }]); + }); + assertNotNullNorUndefined( + 'Block before null in array should be defined.', + Blockly.Blocks[BLOCK_TYPE1]); + assertNotNullNorUndefined( + 'Block after null in array should be defined.', + Blockly.Blocks[BLOCK_TYPE2]); + assertEquals(Object.keys(Blockly.Blocks).length, blockTypeCount + 2); + assertEquals('Expected 1 warning for the bad block.', warnings.length, 1); + } finally { + workspace.dispose(); + delete Blockly.Blocks[BLOCK_TYPE1]; + delete Blockly.Blocks[BLOCK_TYPE2]; + } +} + +function test_defineBlocksWithJsonArray_undefinedItem() { + var BLOCK_TYPE1 = 'test_block_before_undefined'; + var BLOCK_TYPE2 = 'test_block_after_undefined'; + + assertUndefined(Blockly.Blocks[BLOCK_TYPE1]); + assertUndefined(Blockly.Blocks[BLOCK_TYPE2]); + var blockTypeCount = Object.keys(Blockly.Blocks).length; + + try { + var warnings = captureWarnings(function() { + Blockly.defineBlocksWithJsonArray([ + { + "type": BLOCK_TYPE1, + "message0": 'before' + }, + undefined, + { + "type": BLOCK_TYPE2, + "message0": 'after' + }]); + }); + assertNotNullNorUndefined( + 'Block before undefined in array should be defined.', + Blockly.Blocks[BLOCK_TYPE1]); + assertNotNullNorUndefined( + 'Block after undefined in array should be defined.', + Blockly.Blocks[BLOCK_TYPE2]); + assertEquals(Object.keys(Blockly.Blocks).length, blockTypeCount + 2); + assertEquals('Expected 1 warning for the bad block.', warnings.length, 1); + } finally { + workspace.dispose(); + delete Blockly.Blocks[BLOCK_TYPE1]; + delete Blockly.Blocks[BLOCK_TYPE2]; + } +} diff --git a/js/tests/jsunit/mocha_jsunit_test_runner.js b/js/tests/jsunit/mocha_jsunit_test_runner.js new file mode 100644 index 0000000..7de2401 --- /dev/null +++ b/js/tests/jsunit/mocha_jsunit_test_runner.js @@ -0,0 +1,110 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview A mocha test runner that mimics the behaviour of + * goog.testing.junit + * @author samelh@google.com (Sam El-Husseini) + */ +'use strict'; + + +/** + * Setup mocha + */ +mocha.setup({ + ui: 'tdd' +}); +// Add mocha div +var mochaDiv = document.createElement('div'); +mochaDiv.id = 'mocha'; +document.body.appendChild(mochaDiv); +var mochaCss = document.createElement('link'); +mochaCss.setAttribute('href', 'https://unpkg.com/mocha@5.2.0/mocha.css'); +mochaCss.setAttribute('rel', 'stylesheet'); +document.head.appendChild(mochaCss); + + +/** + * Begin by discovering all of the test methods, test methods are any + * function on the window object that begins with the prefix `test` + */ +var allMethods = Object.getOwnPropertyNames(window); +var allTests = []; +for (var i = 0, method; i < allMethods.length, method = allMethods[i]; i++) { + if (method.indexOf('test') === 0 && method !== 'test' && + typeof window[method] === 'function') { + allTests.push(method); + } +} + + +/** + * Split test methods into various suites by grouping them based on the + * test name. Tests the begin with the same prefix are grouped together + * into a suite. + */ +var suites = {}; +for (var i = 0, method; i < allTests.length, method = allTests[i]; i++) { + var testName = method.substr(5); + var underscore = testName.indexOf('_'); + var suiteName = underscore > -1 ? testName.substr(0, underscore) : 'test'; + if (!suites.hasOwnProperty(suiteName)) { + suites[suiteName] = []; + } + suites[suiteName].push(method); +} + + +/** + * Setup chai fail method + */ +function fail() { + chai.fail(); +} + + +/** + * Wrap all unit tests into mocha test cases. Slot them into the different + * suite groups that we found. + */ +suite('jsunit tests', function() { + for (var i = 0, suiteKeys = Object.keys(suites), suiteName; + i < suiteKeys.length, suiteName = suiteKeys[i]; i++) { + suite(suiteName, function() { + for (var j = 0, tests = suites[suiteName], method; + j < tests.length, method = tests[j]; j++) { + test(method, function() { + window[this.test.title](); + }); + } + }); + } +}); + + +/** + * Create a div for failure results, and run the mocha tests. + */ +var failureDiv = document.createElement('div'); +failureDiv.id = 'failureCount'; +failureDiv.style = 'display:none'; +failureDiv.setAttribute('tests_failed', 'unset'); +document.body.appendChild(failureDiv); +mocha.run(function(failures) { + failureDiv.setAttribute('tests_failed', failures); +}); diff --git a/js/tests/jsunit/run_jsunit_tests_in_browser.js b/js/tests/jsunit/run_jsunit_tests_in_browser.js new file mode 100644 index 0000000..90babad --- /dev/null +++ b/js/tests/jsunit/run_jsunit_tests_in_browser.js @@ -0,0 +1,84 @@ +/** + * @license + * Copyright 2018 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Node.js script to run JsUnit tests in Chrome, via webdriver. + */ +var webdriverio = require('webdriverio'); + +module.exports = runJsUnitTestsInBrowser; + +/** + * Runs the JsUnit tests in this directory in Chrome. It uses webdriverio to + * launch Chrome and load index.html. Outputs a summary of the test results + * to the console. + * @return 0 on success, 1 on failure. + */ +async function runJsUnitTestsInBrowser() { + var options = { + capabilities: { + browserName: 'chrome' + } + }; + // Run in headless mode on Travis. + if (process.env.TRAVIS_CI) { + options.capabilities['goog:chromeOptions'] = { + args: ['--headless', '--no-sandbox', '--disable-dev-shm-usage'] + }; + } + + var url = 'file://' + __dirname + '/index.html'; + console.log('Starting webdriverio...'); + const browser = await webdriverio.remote(options); + console.log('Initialized.\nLoading url: ' + url); + await browser.url(url); + + await browser.waitUntil(async () => { + var elem = await browser.$('#failureCount'); + var text = await elem.getAttribute('tests_failed'); + return text != 'unset'; + }, 6000); + + const elem = await browser.$('#failureCount'); + const numOfFailure = await elem.getAttribute('tests_failed'); + + console.log('============Blockly Unit Test Summary================='); + console.log(numOfFailure); + console.log(numOfFailure + ' tests failed'); + console.log('============Blockly Unit Test Summary================='); + if (parseInt(numOfFailure) !== 0) { + await browser.deleteSession(); + return 1; + } + await browser.deleteSession(); + return 0; +} + +if (require.main === module) { + runJsUnitTestsInBrowser().catch(e => { + console.error(e); + process.exit(1); + }).then(function(result) { + if (result) { + console.log('JSUnit tests failed'); + process.exit(1); + } else { + console.log('JSUnit tests passed'); + process.exit(0); + } + }); +} diff --git a/js/tests/jsunit/test_utilities.js b/js/tests/jsunit/test_utilities.js new file mode 100644 index 0000000..b47f341 --- /dev/null +++ b/js/tests/jsunit/test_utilities.js @@ -0,0 +1,171 @@ +/** + * @license + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + /** + * @fileoverview Test utilities. + * @author marisaleung@google.com (Marisa Leung) + */ +'use strict'; + + +/** + * The normal blockly event fire function. We sometimes override this. This + * handle lets us reset after an override. + */ +var savedFireFunc = Blockly.Events.fire; + +/** + * A helper function to replace Blockly.Events.fire in tests. + */ +function temporary_fireEvent(event) { + if (!Blockly.Events.isEnabled()) { + return; + } + Blockly.Events.FIRE_QUEUE_.push(event); + Blockly.Events.fireNow_(); +} + +/** + * Check that two arrays have the same content. + * @param {!Array.} array1 The first array. + * @param {!Array.} array2 The second array. + */ +function isEqualArrays(array1, array2) { + assertEquals(array1.length, array2.length); + for (var i = 0; i < array1.length; i++) { + assertEquals(array1[i], array2[i]); + } +} + +/** + * Creates a new method stub. Sets the expected return values and + * the parameters if any exist. + * @param {!Object} scope The scope of the method to be mocked out. + * @param {!string} funcName The name of the function we're going to mock. + * @param {Array.} parameters The parameters to call the mock with. + * @param {Array.} return_values The values to return when called. + * @return {!sinon.SinonStub} The stub method. + */ +function setUpMockMethod(scope, funcName, parameters, return_values) { + var stub = sinon.stub(scope, funcName); + if (return_values) { + for (var i = 0, return_value; return_value = return_values[i]; i++) { + if (parameters && i < parameters.length) { + stub(parameters[i]).returns(return_value); + } + else { + stub.onCall(i).returns(return_value); + } + } + } + // If there are no return values but there are parameters, we are only + // recording specific method calls. + else if (parameters) { + for (var i = 0; i < parameters.length; i++) { + stub(parameters[i]); + } + } + return stub; +} + +/** + * Check if a variable with the given values exists. + * @param {Blockly.Workspace|Blockly.VariableMap} container The workspace or + * variableMap the checked variable belongs to. + * @param {!string} name The expected name of the variable. + * @param {!string} type The expected type of the variable. + * @param {!string} id The expected id of the variable. + */ +function checkVariableValues(container, name, type, id) { + var variable = container.getVariableById(id); + assertNotUndefined(variable); + assertEquals(name, variable.name); + assertEquals(type, variable.type); + assertEquals(id, variable.getId()); +} + +/** + * Create a test get_var_block. + * Will fail if get_var_block isn't defined. + * @param {!Blockly.Workspace} workspace The workspace on which to create the + * block. + * @param {!string} variable_id The id of the variable to reference. + * @return {!Blockly.Block} The created block. + */ +function createMockVarBlock(workspace, variable_id) { + if (!Blockly.Blocks['get_var_block']) { + fail(); + } + // Turn off events to avoid testing XML at the same time. + Blockly.Events.disable(); + var block = new Blockly.Block(workspace, 'get_var_block'); + block.inputList[0].fieldRow[0].setValue(variable_id); + Blockly.Events.enable(); + return block; +} + +function createTwoVariablesAndBlocks(workspace) { + // Create two variables of different types. + workspace.createVariable('name1', 'type1', 'id1'); + workspace.createVariable('name2', 'type2', 'id2'); + // Create blocks to refer to both of them. + createMockVarBlock(workspace, 'id1'); + createMockVarBlock(workspace, 'id2'); +} + +function createVariableAndBlock(workspace) { + workspace.createVariable('name1', 'type1', 'id1'); + createMockVarBlock(workspace, 'id1'); +} + +function defineGetVarBlock() { + Blockly.defineBlocksWithJsonArray([{ + "type": "get_var_block", + "message0": "%1", + "args0": [ + { + "type": "field_variable", + "name": "VAR", + "variableTypes": ["", "type1", "type2"] + } + ] + }]); +} + +function undefineGetVarBlock() { + delete Blockly.Blocks['get_var_block']; +} + +/** + * Capture the strings sent to console.warn() when calling a function. + * @param {function} innerFunc The function where warnings may called. + * @return {string[]} The warning messages (only the first arguments). + */ +function captureWarnings(innerFunc) { + var msgs = []; + var nativeConsoleWarn = console.warn; + try { + console.warn = function(msg) { + msgs.push(msg); + nativeConsoleWarn.apply(console, arguments); + }; + innerFunc(); + } finally { + console.warn = nativeConsoleWarn; + } + return msgs; +} diff --git a/js/tests/jsunit/utils_dom_test.js b/js/tests/jsunit/utils_dom_test.js new file mode 100644 index 0000000..8cb8d28 --- /dev/null +++ b/js/tests/jsunit/utils_dom_test.js @@ -0,0 +1,58 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + +function test_addClass() { + var p = document.createElement('p'); + Blockly.utils.dom.addClass(p, 'one'); + assertEquals('Adding "one"', 'one', p.className); + Blockly.utils.dom.addClass(p, 'one'); + assertEquals('Adding duplicate "one"', 'one', p.className); + Blockly.utils.dom.addClass(p, 'two'); + assertEquals('Adding "two"', 'one two', p.className); + Blockly.utils.dom.addClass(p, 'two'); + assertEquals('Adding duplicate "two"', 'one two', p.className); + Blockly.utils.dom.addClass(p, 'three'); + assertEquals('Adding "three"', 'one two three', p.className); +} + +function test_hasClass() { + var p = document.createElement('p'); + p.className = ' one three two three '; + assertTrue('Has "one"', Blockly.utils.dom.hasClass(p, 'one')); + assertTrue('Has "two"', Blockly.utils.dom.hasClass(p, 'two')); + assertTrue('Has "three"', Blockly.utils.dom.hasClass(p, 'three')); + assertFalse('Has no "four"', Blockly.utils.dom.hasClass(p, 'four')); + assertFalse('Has no "t"', Blockly.utils.dom.hasClass(p, 't')); + } + +function test_removeClass() { + var p = document.createElement('p'); + p.className = ' one three two three '; + Blockly.utils.dom.removeClass(p, 'two'); + assertEquals('Removing "two"', 'one three three', p.className); + Blockly.utils.dom.removeClass(p, 'four'); + assertEquals('Removing "four"', 'one three three', p.className); + Blockly.utils.dom.removeClass(p, 'three'); + assertEquals('Removing "three"', 'one', p.className); + Blockly.utils.dom.removeClass(p, 'ne'); + assertEquals('Removing "ne"', 'one', p.className); + Blockly.utils.dom.removeClass(p, 'one'); + assertEquals('Removing "one"', '', p.className); + Blockly.utils.dom.removeClass(p, 'zero'); + assertEquals('Removing "zero"', '', p.className); +} diff --git a/js/tests/jsunit/utils_math_test.js b/js/tests/jsunit/utils_math_test.js new file mode 100644 index 0000000..6e4f4a3 --- /dev/null +++ b/js/tests/jsunit/utils_math_test.js @@ -0,0 +1,39 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + +function test_toRadians() { + var quarter = Math.PI / 2; + assertEquals('-90', -quarter, Blockly.utils.math.toRadians(-90)); + assertEquals('0', 0, Blockly.utils.math.toRadians(0)); + assertEquals('90', quarter, Blockly.utils.math.toRadians(90)); + assertEquals('180', 2 * quarter, Blockly.utils.math.toRadians(180)); + assertEquals('270', 3 * quarter, Blockly.utils.math.toRadians(270)); + assertEquals('360', 4 * quarter, Blockly.utils.math.toRadians(360)); + assertEquals('450', 5 * quarter, Blockly.utils.math.toRadians(360 + 90)); +} + +function test_toDegrees() { + var quarter = Math.PI / 2; + assertEquals('-90', -90, Blockly.utils.math.toDegrees(-quarter)); + assertEquals('0', 0, Blockly.utils.math.toDegrees(0)); + assertEquals('90', 90, Blockly.utils.math.toDegrees(quarter)); + assertEquals('180', 180, Blockly.utils.math.toDegrees(2 * quarter)); + assertEquals('270', 270, Blockly.utils.math.toDegrees(3 * quarter)); + assertEquals('360', 360, Blockly.utils.math.toDegrees(4 * quarter)); + assertEquals('450', 360 + 90, Blockly.utils.math.toDegrees(5 * quarter)); +} diff --git a/js/tests/jsunit/utils_string_test.js b/js/tests/jsunit/utils_string_test.js new file mode 100644 index 0000000..bdd2a65 --- /dev/null +++ b/js/tests/jsunit/utils_string_test.js @@ -0,0 +1,78 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + +function test_startsWith() { + assertEquals('Does not start with', false, Blockly.utils.string.startsWith('123', '2')); + assertEquals('Start with', true, Blockly.utils.string.startsWith('123', '12')); + assertEquals('Start with empty string 1', true, Blockly.utils.string.startsWith('123', '')); + assertEquals('Start with empty string 2', true, Blockly.utils.string.startsWith('', '')); +} + +function test_commonWordPrefix() { + var len = Blockly.utils.string.commonWordPrefix('one,two,three,four,five'.split(',')); + assertEquals('No prefix', 0, len); + len = Blockly.utils.string.commonWordPrefix('Xone,Xtwo,Xthree,Xfour,Xfive'.split(',')); + assertEquals('No word prefix', 0, len); + len = Blockly.utils.string.commonWordPrefix('abc de,abc de,abc de,abc de'.split(',')); + assertEquals('Full equality', 6, len); + len = Blockly.utils.string.commonWordPrefix('abc deX,abc deY'.split(',')); + assertEquals('One word prefix', 4, len); + len = Blockly.utils.string.commonWordPrefix('abc de,abc deY'.split(',')); + assertEquals('Overflow no', 4, len); + len = Blockly.utils.string.commonWordPrefix('abc de,abc de Y'.split(',')); + assertEquals('Overflow yes', 6, len); + len = Blockly.utils.string.commonWordPrefix(['Hello World']); + assertEquals('List of one', 11, len); + len = Blockly.utils.string.commonWordPrefix([]); + assertEquals('Empty list', 0, len); + len = Blockly.utils.string.commonWordPrefix('turn left,turn right'.split(',')); + assertEquals('No prefix due to &nbsp;', 0, len); + len = Blockly.utils.string.commonWordPrefix('turn\u00A0left,turn\u00A0right'.split(',')); + assertEquals('No prefix due to \\u00A0', 0, len); +} + +function test_commonWordSuffix() { + var len = Blockly.utils.string.commonWordSuffix('one,two,three,four,five'.split(',')); + assertEquals('No prefix', 0, len); + len = Blockly.utils.string.commonWordSuffix('oneX,twoX,threeX,fourX,fiveX'.split(',')); + assertEquals('No word prefix', 0, len); + len = Blockly.utils.string.commonWordSuffix('abc de,abc de,abc de,abc de'.split(',')); + assertEquals('Full equality', 6, len); + len = Blockly.utils.string.commonWordSuffix('Xabc de,Yabc de'.split(',')); + assertEquals('One word prefix', 3, len); + len = Blockly.utils.string.commonWordSuffix('abc de,Yabc de'.split(',')); + assertEquals('Overflow no', 3, len); + len = Blockly.utils.string.commonWordSuffix('abc de,Y abc de'.split(',')); + assertEquals('Overflow yes', 6, len); + len = Blockly.utils.string.commonWordSuffix(['Hello World']); + assertEquals('List of one', 11, len); + len = Blockly.utils.string.commonWordSuffix([]); + assertEquals('Empty list', 0, len); +} + +function test_shortestStringLength() { + var len = Blockly.utils.string.shortestStringLength('one,two,three,four,five'.split(',')); + assertEquals('Length of "one"', 3, len); + len = Blockly.utils.string.shortestStringLength('one,two,three,four,five,'.split(',')); + assertEquals('Length of ""', 0, len); + len = Blockly.utils.string.shortestStringLength(['Hello World']); + assertEquals('List of one', 11, len); + len = Blockly.utils.string.shortestStringLength([]); + assertEquals('Empty list', 0, len); +} + diff --git a/js/tests/jsunit/utils_test.js b/js/tests/jsunit/utils_test.js new file mode 100644 index 0000000..1edc696 --- /dev/null +++ b/js/tests/jsunit/utils_test.js @@ -0,0 +1,221 @@ +/** + * @license + * Copyright 2011 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + +function test_genUid() { + var uuids = {}; + for (var i = 0; i < 1000; i++) { + var uuid = Blockly.utils.genUid(); + assertFalse('UUID different: ' + uuid, uuid in uuids); + uuids[uuid] = true; + } +} + +function test_tokenizeInterpolation() { + var tokens = Blockly.utils.tokenizeInterpolation(''); + assertArrayEquals('Null interpolation', [], tokens); + + tokens = Blockly.utils.tokenizeInterpolation('Hello'); + assertArrayEquals('No interpolation', ['Hello'], tokens); + + tokens = Blockly.utils.tokenizeInterpolation('Hello%World'); + assertArrayEquals('Unescaped %.', ['Hello%World'], tokens); + + tokens = Blockly.utils.tokenizeInterpolation('Hello%%World'); + assertArrayEquals('Escaped %.', ['Hello%World'], tokens); + + tokens = Blockly.utils.tokenizeInterpolation('Hello %1 World'); + assertArrayEquals('Interpolation.', ['Hello ', 1, ' World'], tokens); + + tokens = Blockly.utils.tokenizeInterpolation('%123Hello%456World%789'); + assertArrayEquals('Interpolations.', [123, 'Hello', 456, 'World', 789], tokens); + + tokens = Blockly.utils.tokenizeInterpolation('%%%x%%0%00%01%'); + assertArrayEquals('Torture interpolations.', ['%%x%0', 0, 1, '%'], tokens); + + Blockly.Msg = Blockly.Msg || {}; + + Blockly.Msg.STRING_REF = 'test string'; + tokens = Blockly.utils.tokenizeInterpolation('%{bky_string_ref}'); + assertArrayEquals('String table reference, lowercase', ['test string'], tokens); + tokens = Blockly.utils.tokenizeInterpolation('%{BKY_STRING_REF}'); + assertArrayEquals('String table reference, uppercase', ['test string'], tokens); + + Blockly.Msg.WITH_PARAM = 'before %1 after'; + tokens = Blockly.utils.tokenizeInterpolation('%{bky_with_param}'); + assertArrayEquals('String table reference, with parameter', ['before ', 1, ' after'], tokens); + + Blockly.Msg.RECURSE = 'before %{bky_string_ref} after'; + tokens = Blockly.utils.tokenizeInterpolation('%{bky_recurse}'); + assertArrayEquals('String table reference, with subreference', ['before test string after'], tokens); + + // Error cases... + tokens = Blockly.utils.tokenizeInterpolation('%{bky_undefined}'); + assertArrayEquals('Undefined string table reference', ['%{bky_undefined}'], tokens); + + Blockly.Msg['1'] = 'Will not match'; + tokens = Blockly.utils.tokenizeInterpolation('before %{1} after'); + assertArrayEquals('Invalid initial digit in string table reference', ['before %{1} after'], tokens); + + Blockly.Msg['TWO WORDS'] = 'Will not match'; + tokens = Blockly.utils.tokenizeInterpolation('before %{two words} after'); + assertArrayEquals('Invalid character in string table reference: space', ['before %{two words} after'], tokens); + + Blockly.Msg['TWO-WORDS'] = 'Will not match'; + tokens = Blockly.utils.tokenizeInterpolation('before %{two-words} after'); + assertArrayEquals('Invalid character in string table reference: dash', ['before %{two-words} after'], tokens); + + Blockly.Msg['TWO.WORDS'] = 'Will not match'; + tokens = Blockly.utils.tokenizeInterpolation('before %{two.words} after'); + assertArrayEquals('Invalid character in string table reference: period', ['before %{two.words} after'], tokens); + + Blockly.Msg['AB&C'] = 'Will not match'; + tokens = Blockly.utils.tokenizeInterpolation('before %{ab&c} after'); + assertArrayEquals('Invalid character in string table reference: &', ['before %{ab&c} after'], tokens); + + Blockly.Msg['UNCLOSED'] = 'Will not match'; + tokens = Blockly.utils.tokenizeInterpolation('before %{unclosed'); + assertArrayEquals('String table reference, with parameter', ['before %{unclosed'], tokens); +} + +function test_replaceMessageReferences() { + Blockly.Msg = Blockly.Msg || {}; + Blockly.Msg.STRING_REF = 'test string'; + Blockly.Msg.SUBREF = 'subref'; + Blockly.Msg.STRING_REF_WITH_ARG = 'test %1 string'; + Blockly.Msg.STRING_REF_WITH_SUBREF = 'test %{bky_subref} string'; + + var resultString = Blockly.utils.replaceMessageReferences(''); + assertEquals('Empty string produces empty string', '', resultString); + + resultString = Blockly.utils.replaceMessageReferences('%%'); + assertEquals('Escaped %', '%', resultString); + resultString = Blockly.utils.replaceMessageReferences('%%{bky_string_ref}'); + assertEquals('Escaped %', '%{bky_string_ref}', resultString); + + resultString = Blockly.utils.replaceMessageReferences('%a'); + assertEquals('Unrecognized % escape code treated as literal', '%a', resultString); + + resultString = Blockly.utils.replaceMessageReferences('%1'); + assertEquals('Interpolation tokens ignored.', '%1', resultString); + resultString = Blockly.utils.replaceMessageReferences('%1 %2'); + assertEquals('Interpolation tokens ignored.', '%1 %2', resultString); + resultString = Blockly.utils.replaceMessageReferences('before %1 after'); + assertEquals('Interpolation tokens ignored.', 'before %1 after', resultString); + + // Blockly.Msg.STRING_REF cases: + resultString = Blockly.utils.replaceMessageReferences('%{bky_string_ref}'); + assertEquals('Message ref dereferenced.', 'test string', resultString); + resultString = Blockly.utils.replaceMessageReferences('before %{bky_string_ref} after'); + assertEquals('Message ref dereferenced.', 'before test string after', resultString); + + // Blockly.Msg.STRING_REF_WITH_ARG cases: + resultString = Blockly.utils.replaceMessageReferences('%{bky_string_ref_with_arg}'); + assertEquals('Message ref dereferenced with argument preserved.', 'test %1 string', resultString); + resultString = Blockly.utils.replaceMessageReferences('before %{bky_string_ref_with_arg} after'); + assertEquals('Message ref dereferenced with argument preserved.', 'before test %1 string after', resultString); + + // Blockly.Msg.STRING_REF_WITH_SUBREF cases: + resultString = Blockly.utils.replaceMessageReferences('%{bky_string_ref_with_subref}'); + assertEquals('Message ref and subref dereferenced.', 'test subref string', resultString); + resultString = Blockly.utils.replaceMessageReferences('before %{bky_string_ref_with_subref} after'); + assertEquals('Message ref and subref dereferenced.', 'before test subref string after', resultString); +} + +function test_arrayRemove() { + var arr = [1, 2, 3, 2]; + assertEquals('Remove Not found', false, Blockly.utils.arrayRemove(arr, 0)); + assertEquals('Remove Not found result', '1,2,3,2', arr.join(',')); + assertEquals('Remove item', true, Blockly.utils.arrayRemove(arr, 2)); + assertEquals('Remove item result', '1,3,2', arr.join(',')); + assertEquals('Remove item again', true, Blockly.utils.arrayRemove(arr, 2)); + assertEquals('Remove item again result', '1,3', arr.join(',')); +} + +function test_XY_REGEX() { + var regex = Blockly.utils.getRelativeXY.XY_REGEX_; + var m; + m = 'INVALID'.match(regex); + assertNull(m); + + m = 'translate(10)'.match(regex); + assertEquals('translate(10), x', '10', m[1]); + assertUndefined('translate(10), y', m[3]); + + m = 'translate(11, 12)'.match(regex); + assertEquals('translate(11, 12), x', '11', m[1]); + assertEquals('translate(11, 12), y', '12', m[3]); + + m = 'translate(13,14)'.match(regex); + assertEquals('translate(13,14), x', '13', m[1]); + assertEquals('translate(13,14), y', '14', m[3]); + + m = 'translate(15 16)'.match(regex); + assertEquals('translate(15 16), x', '15', m[1]); + assertEquals('translate(15 16), y', '16', m[3]); + + m = 'translate(1.23456e+42 0.123456e-42)'.match(regex); + assertEquals('translate(1.23456e+42 0.123456e-42), x', '1.23456e+42', m[1]); + assertEquals('translate(1.23456e+42 0.123456e-42), y', '0.123456e-42', m[3]); +} + +function XY_STYLE_REGEX_() { + var regex = Blockly.utils.getRelativeXY.XY_STYLE_REGEX_; + var m; + m = 'INVALID'.match(regex); + assertNull(m); + + m = 'transform:translate(9px)'.match(regex); + assertEquals('transform:translate(9px), x', '9', m[1]); + assertUndefined('transform:translate(9px), y', m[3]); + + m = 'transform:translate3d(10px)'.match(regex); + assertEquals('transform:translate3d(10px), x', '10', m[1]); + assertUndefined('transform:translate(10px), y', m[3]); + + m = 'transform: translate(11px, 12px)'.match(regex); + assertEquals('transform: translate(11px, 12px), x', '11', m[1]); + assertEquals('transform: translate(11px, 12px), y', '12', m[3]); + + m = 'transform: translate(13px,14px)'.match(regex); + assertEquals('transform: translate(13px,14px), x', '13', m[1]); + assertEquals('transform: translate(13px,14px), y', '14', m[3]); + + m = 'transform: translate(15px 16px)'.match(regex); + assertEquals('transform: translate(15px 16px), x', '15', m[1]); + assertEquals('transform: translate(15px 16px), y', '16', m[3]); + + m = 'transform: translate(1.23456e+42px 0.123456e-42px)'.match(regex); + assertEquals('transform: translate(1.23456e+42px 0.123456e-42px), x', '1.23456e+42', m[1]); + assertEquals('transform: translate(1.23456e+42px 0.123456e-42px), y', '0.123456e-42', m[3]); + + m = 'transform:translate3d(20px, 21px, 22px)'.match(regex); + assertEquals('transform:translate3d(20px, 21px, 22px), x', '21', m[1]); + assertEquals('transform:translate3d(20px, 21px, 22px), y', '22', m[3]); + + m = 'transform:translate3d(23px,24px,25px)'.match(regex); + assertEquals('transform:translate3d(23px,24px,25px), x', '23', m[1]); + assertEquals('transform:translate3d(23px,24px,25px), y', '24', m[3]); + + m = 'transform:translate3d(26px 27px 28px)'.match(regex); + assertEquals('transform:translate3d(26px 27px 28px), x', '26', m[1]); + assertEquals('transform:translate3d(26px 27px 28px), y', '27', m[3]); + + m = 'transform:translate3d(1.23456e+42px 0.123456e-42px 42px)'.match(regex); + assertEquals('transform:translate3d(1.23456e+42px 0.123456e-42px 42px), x', '1.23456e+42', m[1]); + assertEquals('transform:translate3d(1.23456e+42px 0.123456e-42px 42px), y', '0.123456e-42', m[3]); +} diff --git a/js/tests/jsunit/variable_map_test.js b/js/tests/jsunit/variable_map_test.js new file mode 100644 index 0000000..dc24abd --- /dev/null +++ b/js/tests/jsunit/variable_map_test.js @@ -0,0 +1,295 @@ +/** + * @license + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + /** + * @fileoverview Tests for variable map. + * @author marisaleung@google.com (Marisa Leung) + */ +'use strict'; + +var variable_map; +var mockControl_; +var workspace; + +function variableMapTest_setUp() { + workspace = new Blockly.Workspace(); + variable_map = new Blockly.VariableMap(workspace); +} + +function variableMapTest_tearDown() { + workspace.dispose(); + if (mockControl_) { + mockControl_.restore(); + } + variable_map = null; +} + +function test_getVariable_ByNameAndType() { + variableMapTest_setUp(); + var var_1 = variable_map.createVariable('name1', 'type1', 'id1'); + var var_2 = variable_map.createVariable('name2', 'type1', 'id2'); + var var_3 = variable_map.createVariable('name3', 'type2', 'id3'); + var result_1 = variable_map.getVariable('name1', 'type1'); + var result_2 = variable_map.getVariable('name2', 'type1'); + var result_3 = variable_map.getVariable('name3', 'type2'); + + // Searching by name + type is correct. + assertEquals(var_1, result_1); + assertEquals(var_2, result_2); + assertEquals(var_3, result_3); + + // Searching only by name defaults to the '' type. + assertNull(variable_map.getVariable('name1')); + assertNull(variable_map.getVariable('name2')); + assertNull(variable_map.getVariable('name3')); + variableMapTest_tearDown(); +} + +function test_getVariable_NotFound() { + variableMapTest_setUp(); + var result = variable_map.getVariable('name1'); + assertNull(result); + variableMapTest_tearDown(); +} + +function test_getVariableById_Trivial() { + variableMapTest_setUp(); + var var_1 = variable_map.createVariable('name1', 'type1', 'id1'); + var var_2 = variable_map.createVariable('name2', 'type1', 'id2'); + var var_3 = variable_map.createVariable('name3', 'type2', 'id3'); + var result_1 = variable_map.getVariableById('id1'); + var result_2 = variable_map.getVariableById('id2'); + var result_3 = variable_map.getVariableById('id3'); + + assertEquals(var_1, result_1); + assertEquals(var_2, result_2); + assertEquals(var_3, result_3); + variableMapTest_tearDown(); +} + +function test_getVariableById_NotFound() { + variableMapTest_setUp(); + var result = variable_map.getVariableById('id1'); + assertNull(result); + variableMapTest_tearDown(); +} + +function test_createVariableTrivial() { + variableMapTest_setUp(); + variable_map.createVariable('name1', 'type1', 'id1'); + checkVariableValues(variable_map, 'name1', 'type1', 'id1'); + variableMapTest_tearDown(); +} + +function test_createVariableAlreadyExists() { + // Expect that when the variable already exists, the variableMap_ is unchanged. + variableMapTest_setUp(); + variable_map.createVariable('name1', 'type1', 'id1'); + + // Assert there is only one variable in the variable_map. + var keys = Object.keys(variable_map.variableMap_); + assertEquals(1, keys.length); + var varMapLength = variable_map.variableMap_[keys[0]].length; + assertEquals(1, varMapLength); + + variable_map.createVariable('name1', 'type1'); + checkVariableValues(variable_map, 'name1', 'type1', 'id1'); + // Check that the size of the variableMap_ did not change. + keys = Object.keys(variable_map.variableMap_); + assertEquals(1, keys.length); + varMapLength = variable_map.variableMap_[keys[0]].length; + assertEquals(1, varMapLength); + variableMapTest_tearDown(); +} + +function test_createVariableNameAlreadyExists() { + // Expect that when a variable with the same name but a different type already + // exists, the new variable is created. + variableMapTest_setUp(); + variable_map.createVariable('name1', 'type1', 'id1'); + + // Assert there is only one variable in the variable_map. + var keys = Object.keys(variable_map.variableMap_); + assertEquals(1, keys.length); + var varMapLength = variable_map.variableMap_[keys[0]].length; + assertEquals(1, varMapLength); + + variable_map.createVariable('name1', 'type2', 'id2'); + checkVariableValues(variable_map, 'name1', 'type1', 'id1'); + checkVariableValues(variable_map, 'name1', 'type2', 'id2'); + // Check that the size of the variableMap_ did change. + keys = Object.keys(variable_map.variableMap_); + assertEquals(2, keys.length); + variableMapTest_tearDown(); +} +function test_createVariableNullAndUndefinedType() { + variableMapTest_setUp(); + variable_map.createVariable('name1', null, 'id1'); + variable_map.createVariable('name2', undefined, 'id2'); + + checkVariableValues(variable_map, 'name1', '', 'id1'); + checkVariableValues(variable_map, 'name2', '', 'id2'); + variableMapTest_tearDown(); +} + +function test_createVariableNullId() { + variableMapTest_setUp(); + mockControl_ = setUpMockMethod(Blockly.utils, 'genUid', null, ['1', '2']); + try { + variable_map.createVariable('name1', 'type1', null); + checkVariableValues(variable_map, 'name1', 'type1', '1'); + } finally { + variableMapTest_tearDown(); + } +} + +function test_createVariableUndefinedId() { + variableMapTest_setUp(); + mockControl_ = setUpMockMethod(Blockly.utils, 'genUid', null, ['1', '2']); + try { + variable_map.createVariable('name1', 'type1', undefined); + checkVariableValues(variable_map, 'name1', 'type1', '1'); + } finally { + variableMapTest_tearDown(); + } +} + +function test_createVariableIdAlreadyExists() { + variableMapTest_setUp(); + variable_map.createVariable('name1', 'type1', 'id1'); + try { + variable_map.createVariable('name2', 'type2', 'id1'); + fail(); + } catch (e) { + // expected + } + variableMapTest_tearDown(); +} + +function test_createVariableMismatchedIdAndType() { + variableMapTest_setUp(); + variable_map.createVariable('name1', 'type1', 'id1'); + try { + variable_map.createVariable('name1', 'type2', 'id1'); + fail(); + } catch (e) { + // expected + } + try { + variable_map.createVariable('name1', 'type1', 'id2'); + fail(); + } catch (e) { + // expected + } + variableMapTest_tearDown(); +} + +function test_createVariableTwoSameTypes() { + variableMapTest_setUp(); + variable_map.createVariable('name1', 'type1', 'id1'); + variable_map.createVariable('name2', 'type1', 'id2'); + + checkVariableValues(variable_map, 'name1', 'type1', 'id1'); + checkVariableValues(variable_map, 'name2', 'type1', 'id2'); + variableMapTest_tearDown(); +} + +function test_getVariablesOfType_Trivial() { + variableMapTest_setUp(); + var var_1 = variable_map.createVariable('name1', 'type1', 'id1'); + var var_2 = variable_map.createVariable('name2', 'type1', 'id2'); + variable_map.createVariable('name3', 'type2', 'id3'); + variable_map.createVariable('name4', 'type3', 'id4'); + var result_array_1 = variable_map.getVariablesOfType('type1'); + var result_array_2 = variable_map.getVariablesOfType('type5'); + isEqualArrays([var_1, var_2], result_array_1); + isEqualArrays([], result_array_2); + variableMapTest_tearDown(); +} + +function test_getVariablesOfType_Null() { + variableMapTest_setUp(); + var var_1 = variable_map.createVariable('name1', '', 'id1'); + var var_2 = variable_map.createVariable('name2', '', 'id2'); + var var_3 = variable_map.createVariable('name3', '', 'id3'); + variable_map.createVariable('name4', 'type1', 'id4'); + var result_array = variable_map.getVariablesOfType(null); + isEqualArrays([var_1, var_2, var_3], result_array); + variableMapTest_tearDown(); +} + +function test_getVariablesOfType_EmptyString() { + variableMapTest_setUp(); + var var_1 = variable_map.createVariable('name1', null, 'id1'); + var var_2 = variable_map.createVariable('name2', null, 'id2'); + var result_array = variable_map.getVariablesOfType(''); + isEqualArrays([var_1, var_2], result_array); + variableMapTest_tearDown(); +} + +function test_getVariablesOfType_Deleted() { + variableMapTest_setUp(); + var variable = variable_map.createVariable('name1', null, 'id1'); + variable_map.deleteVariable(variable); + var result_array = variable_map.getVariablesOfType(''); + isEqualArrays([], result_array); + variableMapTest_tearDown(); +} + +function test_getVariablesOfType_DoesNotExist() { + variableMapTest_setUp(); + var result_array = variable_map.getVariablesOfType('type1'); + isEqualArrays([], result_array); + variableMapTest_tearDown(); +} + +function test_getVariableTypes_Trivial() { + variableMapTest_setUp(); + variable_map.createVariable('name1', 'type1', 'id1'); + variable_map.createVariable('name2', 'type1', 'id2'); + variable_map.createVariable('name3', 'type2', 'id3'); + variable_map.createVariable('name4', 'type3', 'id4'); + var result_array = variable_map.getVariableTypes(); + // The empty string is always an option. + isEqualArrays(['type1', 'type2', 'type3', ''], result_array); + variableMapTest_tearDown(); +} + +function test_getVariableTypes_None() { + variableMapTest_setUp(); + // The empty string is always an option. + var result_array = variable_map.getVariableTypes(); + isEqualArrays([''], result_array); + variableMapTest_tearDown(); +} + +function test_getAllVariables_Trivial() { + variableMapTest_setUp(); + var var_1 = variable_map.createVariable('name1', 'type1', 'id1'); + var var_2 = variable_map.createVariable('name2', 'type1', 'id2'); + var var_3 = variable_map.createVariable('name3', 'type2', 'id3'); + var result_array = variable_map.getAllVariables(); + isEqualArrays([var_1, var_2, var_3], result_array); + variableMapTest_tearDown(); +} + +function test_getAllVariables_None() { + variableMapTest_setUp(); + var result_array = variable_map.getAllVariables(); + isEqualArrays([], result_array); + variableMapTest_tearDown(); +} diff --git a/js/tests/jsunit/variable_model_test.js b/js/tests/jsunit/variable_model_test.js new file mode 100644 index 0000000..4eb4cb0 --- /dev/null +++ b/js/tests/jsunit/variable_model_test.js @@ -0,0 +1,88 @@ +/** + * @license + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Tests for variable model. + * @author marisaleung@google.com (Marisa Leung) + */ +'use strict'; + +var variable; +var workspace; + +function variableModelTest_setUp() { + workspace = new Blockly.Workspace(); +} + +function variableModelTest_tearDown() { + workspace.dispose(); + variable = null; +} + +/** + * These tests check the constructor of the variable model. + */ +function testInit_Trivial() { + variableModelTest_setUp(); + variable = new Blockly.VariableModel(workspace, 'test', 'test_type', + 'test_id'); + assertEquals('test', variable.name); + assertEquals('test_type', variable.type); + assertEquals('test_id', variable.id_); + variableModelTest_tearDown(); +} + +function testInit_NullType() { + variableModelTest_setUp(); + variable = new Blockly.VariableModel(workspace, 'test', null, 'test_id'); + assertEquals('', variable.type); + variableModelTest_tearDown(); +} + +function testInit_UndefinedType() { + variableModelTest_setUp(); + variable = new Blockly.VariableModel(workspace, 'test', undefined, 'test_id'); + assertEquals('', variable.type); + variableModelTest_tearDown(); +} + +function testInit_NullId() { + variableModelTest_setUp(); + variable = new Blockly.VariableModel(workspace, 'test', 'test_type', null); + assertEquals('test', variable.name); + assertEquals('test_type', variable.type); + assertNotNull(variable.id_); + variableModelTest_tearDown(); +} + +function testInit_UndefinedId() { + variableModelTest_setUp(); + variable = new Blockly.VariableModel(workspace, 'test', 'test_type', undefined); + assertEquals('test', variable.name); + assertEquals('test_type', variable.type); + assertNotNull(variable.id_); + variableModelTest_tearDown(); +} + +function testInit_OnlyNameProvided() { + variableModelTest_setUp(); + variable = new Blockly.VariableModel(workspace, 'test'); + assertEquals('test', variable.name); + assertEquals('', variable.type); + assertNotNull(variable.id_); + variableModelTest_tearDown(); +} diff --git a/js/tests/jsunit/variables_test.js b/js/tests/jsunit/variables_test.js new file mode 100644 index 0000000..6d6515f --- /dev/null +++ b/js/tests/jsunit/variables_test.js @@ -0,0 +1,147 @@ +/** + * @license + * Copyright 2018 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Tests for variable utility functions in Blockly + * @author fenichel@google.com (Rachel Fenichel) + */ +'use strict'; + +function variablesTest_setUp() { + defineGetVarBlock(); + var workspace = new Blockly.Workspace(); + workspace.createVariable('foo', 'type1', '1'); + workspace.createVariable('bar', 'type1', '2'); + workspace.createVariable('baz', 'type1', '3'); + return workspace; +} + +function variablesTest_tearDown(workspace) { + undefineGetVarBlock(); + workspace.dispose(); +} + +function buildVariablesTest(testImpl) { + return function() { + var workspace = variablesTest_setUp(); + try { + testImpl(workspace); + } finally { + variablesTest_tearDown(workspace); + } + }; +} + +var test_allUsedVarModels = buildVariablesTest( + function(workspace) { + createMockVarBlock(workspace, '1'); + createMockVarBlock(workspace, '2'); + createMockVarBlock(workspace, '3'); + + var result = Blockly.Variables.allUsedVarModels(workspace); + assertEquals('Expected three variables in the list of used variables', + 3, result.length); + } +); + +var test_allUsedVarModels_someUnused = buildVariablesTest( + function(workspace) { + createMockVarBlock(workspace, '2'); + + var result = Blockly.Variables.allUsedVarModels(workspace); + assertEquals('Expected one variable in the list of used variables', + 1, result.length); + assertEquals('Expected variable with ID 2 in the list of used variables', + '2', result[0].getId()); + } +); + +var test_allUsedVarModels_varUsedTwice = buildVariablesTest( + function(workspace) { + createMockVarBlock(workspace, '2'); + createMockVarBlock(workspace, '2'); + + var result = Blockly.Variables.allUsedVarModels(workspace); + // Using the same variable multiple times should not change the number of + // elements in the list. + assertEquals('Expected one variable in the list of used variables', + 1, result.length); + assertEquals('Expected variable with ID 2 in the list of used variables', + '2', result[0].getId()); + } +); + +var test_allUsedVarModels_allUnused = buildVariablesTest( + function(workspace) { + var result = Blockly.Variables.allUsedVarModels(workspace); + assertEquals('Expected no variables in the list of used variables', + 0, result.length); + } +); + +var test_getVariable_byId = buildVariablesTest( + function(workspace) { + var var_1 = workspace.createVariable('name1', 'type1', 'id1'); + var var_2 = workspace.createVariable('name2', 'type1', 'id2'); + var var_3 = workspace.createVariable('name3', 'type2', 'id3'); + var result_1 = Blockly.Variables.getVariable(workspace, 'id1'); + var result_2 = Blockly.Variables.getVariable(workspace, 'id2'); + var result_3 = Blockly.Variables.getVariable(workspace, 'id3'); + + assertEquals(var_1, result_1); + assertEquals(var_2, result_2); + assertEquals(var_3, result_3); + } +); + +var test_getVariable_byNameAndType = buildVariablesTest( + function(workspace) { + var var_1 = workspace.createVariable('name1', 'type1', 'id1'); + var var_2 = workspace.createVariable('name2', 'type1', 'id2'); + var var_3 = workspace.createVariable('name3', 'type2', 'id3'); + var result_1 = + Blockly.Variables.getVariable(workspace, null, 'name1', 'type1'); + var result_2 = + Blockly.Variables.getVariable(workspace, null, 'name2', 'type1'); + var result_3 = + Blockly.Variables.getVariable(workspace, null, 'name3', 'type2'); + + // Searching by name + type is correct. + assertEquals(var_1, result_1); + assertEquals(var_2, result_2); + assertEquals(var_3, result_3); + } +); + +var test_getVariable_byIdThenName = buildVariablesTest( + function(workspace) { + var var_1 = workspace.createVariable('name1', 'type1', 'id1'); + var var_2 = workspace.createVariable('name2', 'type1', 'id2'); + var var_3 = workspace.createVariable('name3', 'type2', 'id3'); + var result_1 = + Blockly.Variables.getVariable(workspace, 'badId', 'name1', 'type1'); + var result_2 = + Blockly.Variables.getVariable(workspace, 'badId', 'name2', 'type1'); + var result_3 = + Blockly.Variables.getVariable(workspace, 'badId', 'name3', 'type2'); + + // Searching by ID failed, but falling back onto name + type is correct. + assertEquals(var_1, result_1); + assertEquals(var_2, result_2); + assertEquals(var_3, result_3); + } +); diff --git a/js/tests/jsunit/widget_div_test.js b/js/tests/jsunit/widget_div_test.js new file mode 100644 index 0000000..c064b5f --- /dev/null +++ b/js/tests/jsunit/widget_div_test.js @@ -0,0 +1,149 @@ +/** + * @license + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + + +function widgetdiv_testHelper_makeBBox(left, top, width, height) { + return { + left: left, + right: left + width, + top: top, + bottom: top + height + }; +} + +function widgetdiv_testHelper_makeSize(width, height) { + return { + width: width, + height: height + }; +} + +var widgetDiv_test_viewport = widgetdiv_testHelper_makeBBox(0, 0, 1000, 1000); +var widgetDiv_test_widgetSize = widgetdiv_testHelper_makeSize(100, 100); + +// Anchor is always 90 px wide and 90 px tall for this test. +var widgetDiv_test_anchorSize = 90; + +function widgetdiv_testHelper_makeAnchor(left, top) { + return { + left: left, + right: left + widgetDiv_test_anchorSize, + top: top, + bottom: top + widgetDiv_test_anchorSize + }; +} + +function test_widgetDiv_topConflict() { + var anchorTop = 50; + // Anchor placed close to the top. + var anchorBBox = widgetdiv_testHelper_makeAnchor(500, anchorTop); + + // The widget div should be placed just below the anchor. + var calculated = Blockly.WidgetDiv.calculateY_(widgetDiv_test_viewport, + anchorBBox, widgetDiv_test_widgetSize); + assertEquals(anchorTop + widgetDiv_test_anchorSize, calculated); +} + +function test_widgetDiv_bottomConflict() { + var anchorTop = 900; + // Anchor placed close to the bottom. + var anchorBBox = widgetdiv_testHelper_makeAnchor(500, anchorTop); + + // The widget div should be placed just above the anchor. + var calculated = Blockly.WidgetDiv.calculateY_(widgetDiv_test_viewport, + anchorBBox, widgetDiv_test_widgetSize); + assertEquals(anchorTop - widgetDiv_test_widgetSize.height, calculated); +} + +function test_widgetDiv_noYConflict() { + var anchorTop = 500; + // Anchor placed in the middle. + var anchorBBox = widgetdiv_testHelper_makeAnchor(500, anchorTop); + + // The widget div should be placed just below the anchor. + var calculated = Blockly.WidgetDiv.calculateY_(widgetDiv_test_viewport, + anchorBBox, widgetDiv_test_widgetSize); + assertEquals(anchorTop + widgetDiv_test_anchorSize, calculated); +} + + +function test_widgetDiv_leftConflict_LTR() { + var anchorLeft = 50; + // Anchor placed close to the left side. + var anchorBBox = widgetdiv_testHelper_makeAnchor(anchorLeft, 500); + + // The widget div should be placed at the anchor. + var calculated = Blockly.WidgetDiv.calculateX_(widgetDiv_test_viewport, + anchorBBox, widgetDiv_test_widgetSize, false /* rtl */); + assertEquals(anchorLeft, calculated); +} + +function test_widgetDiv_rightConflict_LTR() { + var anchorLeft = 950; + // Anchor placed close to the right side. + var anchorBBox = widgetdiv_testHelper_makeAnchor(anchorLeft, 500); + + // The widget div should be placed as far right as possible--at the edge of + // the screen. + var calculated = Blockly.WidgetDiv.calculateX_(widgetDiv_test_viewport, + anchorBBox, widgetDiv_test_widgetSize, false /* rtl */); + assertEquals(1000 - widgetDiv_test_widgetSize.width, calculated); +} + +function test_widgetDiv_noXConflict_LTR() { + var anchorLeft = 500; + // Anchor in the middle + var anchorBBox = widgetdiv_testHelper_makeAnchor(anchorLeft, 500); + // The widget div should be placed just at the left side of the anchor. + var calculated = Blockly.WidgetDiv.calculateX_(widgetDiv_test_viewport, + anchorBBox, widgetDiv_test_widgetSize, false /* rtl */); + assertEquals(anchorLeft, calculated); +} + +function test_widgetDiv_leftConflict_RTL() { + var anchorLeft = 10; + // Anchor placed close to the left side. + var anchorBBox = widgetdiv_testHelper_makeAnchor(anchorLeft, 500); + // The widget div should be placed as far left as possible--at the edge of + // the screen. + var calculated = Blockly.WidgetDiv.calculateX_(widgetDiv_test_viewport, + anchorBBox, widgetDiv_test_widgetSize, true /* rtl */); + assertEquals(0, calculated); +} + +function test_widgetDiv_rightConflict_RTL() { + var anchorLeft = 950; + // Anchor placed close to the right side. + var anchorBBox = widgetdiv_testHelper_makeAnchor(anchorLeft, 500); + + // The widget div should be placed as far right as possible--at the edge of + // the screen. + var calculated = Blockly.WidgetDiv.calculateX_(widgetDiv_test_viewport, + anchorBBox, widgetDiv_test_widgetSize, true /* rtl */); + assertEquals(1000 - widgetDiv_test_widgetSize.width, calculated); +} + +function test_widgetDiv_noXConflict_RTL() { + var anchorLeft = 500; + // anchor placed in the middle + var anchorBBox = widgetdiv_testHelper_makeAnchor(anchorLeft, 500); + // The widget div should be placed at the right side of the anchor. + var calculated = Blockly.WidgetDiv.calculateX_(widgetDiv_test_viewport, + anchorBBox, widgetDiv_test_widgetSize, true /* rtl */); + assertEquals(anchorBBox.right - widgetDiv_test_widgetSize.width, calculated); +} diff --git a/js/tests/jsunit/workspace_comment_test.js b/js/tests/jsunit/workspace_comment_test.js new file mode 100644 index 0000000..e746dfa --- /dev/null +++ b/js/tests/jsunit/workspace_comment_test.js @@ -0,0 +1,153 @@ +/** + * @license + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + +var workspace; + +function workspaceCommentTest_setUp() { + workspace = new Blockly.Workspace(); +} + +function workspaceCommentTest_tearDown() { + workspace.dispose(); +} + +function test_noWorkspaceComments() { + workspaceCommentTest_setUp(); + try { + assertEquals('Empty workspace: no comments (1).', 0, workspace.getTopComments(true).length); + assertEquals('Empty workspace: no comments (2).', 0, workspace.getTopComments(false).length); + workspace.clear(); + assertEquals('Empty workspace: no comments (3).', 0, workspace.getTopComments(true).length); + assertEquals('Empty workspace: no comments (4).', 0, workspace.getTopComments(false).length); + } finally { + workspaceCommentTest_tearDown(); + } +} + +function test_oneWorkspaceComment() { + workspaceCommentTest_setUp(); + try { + var comment = new Blockly.WorkspaceComment(workspace, 'comment text', 0, 0, 'comment id'); + assertEquals('One comment on workspace (1).', 1, workspace.getTopComments(true).length); + assertEquals('One comment on workspace (2).', 1, workspace.getTopComments(false).length); + assertEquals('Comment db contains this comment.', comment, workspace.commentDB_['comment id']); + workspace.clear(); + assertEquals('Cleared workspace: no comments (3).', 0, workspace.getTopComments(true).length); + assertEquals('Cleared workspace: no comments (4).', 0, workspace.getTopComments(false).length); + assertFalse('Comment DB does not contain this comment.', 'comment id' in workspace.commentDB_); + } finally { + workspaceCommentTest_tearDown(); + } +} + +function test_getWorkspaceCommentById() { + workspaceCommentTest_setUp(); + try { + var comment = new Blockly.WorkspaceComment(workspace, 'comment text', 0, 0, 'comment id'); + assertEquals('Getting a comment by id.', comment, workspace.getCommentById('comment id')); + assertEquals('No comment found.', null, workspace.getCommentById('not a comment')); + comment.dispose(); + assertEquals('Can\'t find the comment.', null, workspace.getCommentById('comment id')); + } finally { + workspaceCommentTest_tearDown(); + } +} + +function test_disposeWsCommentTwice() { + workspaceCommentTest_setUp(); + try { + var comment = new Blockly.WorkspaceComment(workspace, 'comment text', 0, 0, 'comment id'); + comment.dispose(); + // Nothing should go wrong the second time dispose is called. + comment.dispose(); + } finally { + workspaceCommentTest_tearDown(); + } +} + +function test_wsCommentHeightWidth() { + workspaceCommentTest_setUp(); + try { + var comment = + new Blockly.WorkspaceComment(workspace, 'comment text', 10, 20, 'comment id'); + assertEquals('Initial width', 20, comment.getWidth()); + assertEquals('Initial height', 10, comment.getHeight()); + + comment.setWidth(30); + assertEquals('New width should be different', 30, comment.getWidth()); + assertEquals('New height should not be different', 10, comment.getHeight()); + + comment.setHeight(40); + assertEquals('New width should not be different', 30, comment.getWidth()); + assertEquals('New height should be different', 40, comment.getHeight()); + comment.dispose(); + } finally { + workspaceCommentTest_tearDown(); + } +} + +function test_wsCommentXY() { + workspaceCommentTest_setUp(); + try { + var comment = + new Blockly.WorkspaceComment(workspace, 'comment text', 10, 20, 'comment id'); + var xy = comment.getXY(); + assertEquals('Initial X position', 0, xy.x); + assertEquals('Initial Y position', 0, xy.y); + + comment.moveBy(10, 100); + xy = comment.getXY(); + assertEquals('New X position', 10, xy.x); + assertEquals('New Y position', 100, xy.y); + comment.dispose(); + } finally { + workspaceCommentTest_tearDown(); + } +} + +function test_wsCommentContent() { + workspaceCommentTest_setUp(); + + Blockly.Events.fire = temporary_fireEvent; + temporary_fireEvent.firedEvents_ = []; + try { + var comment = + new Blockly.WorkspaceComment(workspace, 'comment text', 10, 20, 'comment id'); + assertEquals( + 'Check comment text', 'comment text', comment.getContent()); + assertEquals( + 'Workspace undo stack has one event', 1, workspace.undoStack_.length); + + comment.setContent('comment text'); + assertEquals( + 'Comment text has not changed', 'comment text', comment.getContent()); + // Setting the text to the old value does not fire an event. + assertEquals( + 'Workspace undo stack has one event', 1, workspace.undoStack_.length); + + comment.setContent('new comment text'); + assertEquals( + 'Comment text has changed', 'new comment text', comment.getContent()); + assertEquals( + 'Workspace undo stack has two events', 2, workspace.undoStack_.length); + comment.dispose(); + } finally { + workspaceCommentTest_tearDown(); + Blockly.Events.fire = savedFireFunc; + } +} diff --git a/js/tests/jsunit/workspace_test.js b/js/tests/jsunit/workspace_test.js new file mode 100644 index 0000000..916cbee --- /dev/null +++ b/js/tests/jsunit/workspace_test.js @@ -0,0 +1,372 @@ +/** + * @license + * Copyright 2012 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + + +var workspace; +var mockControl_; + +function workspaceTest_setUp() { + defineGetVarBlock(); + workspace = new Blockly.Workspace(); +} + +function workspaceTest_tearDown() { + undefineGetVarBlock(); + if (mockControl_) { + mockControl_.restore(); + } + workspace.dispose(); +} + +function test_emptyWorkspace() { + workspaceTest_setUp(); + try { + assertEquals('Empty workspace (1).', 0, workspace.getTopBlocks(true).length); + assertEquals('Empty workspace (2).', 0, workspace.getTopBlocks(false).length); + assertEquals('Empty workspace (3).', 0, workspace.getAllBlocks(false).length); + workspace.clear(); + assertEquals('Empty workspace (4).', 0, workspace.getTopBlocks(true).length); + assertEquals('Empty workspace (5).', 0, workspace.getTopBlocks(false).length); + assertEquals('Empty workspace (6).', 0, workspace.getAllBlocks(false).length); + } finally { + workspaceTest_tearDown(); + } +} + +function test_flatWorkspace() { + workspaceTest_setUp(); + try { + var blockA = workspace.newBlock(''); + assertEquals('One block workspace (1).', 1, workspace.getTopBlocks(true).length); + assertEquals('One block workspace (2).', 1, workspace.getTopBlocks(false).length); + assertEquals('One block workspace (3).', 1, workspace.getAllBlocks(false).length); + var blockB = workspace.newBlock(''); + assertEquals('Two block workspace (1).', 2, workspace.getTopBlocks(true).length); + assertEquals('Two block workspace (2).', 2, workspace.getTopBlocks(false).length); + assertEquals('Two block workspace (3).', 2, workspace.getAllBlocks(false).length); + blockA.dispose(); + assertEquals('One block workspace (4).', 1, workspace.getTopBlocks(true).length); + assertEquals('One block workspace (5).', 1, workspace.getTopBlocks(false).length); + assertEquals('One block workspace (6).', 1, workspace.getAllBlocks(false).length); + workspace.clear(); + assertEquals('Cleared workspace (1).', 0, workspace.getTopBlocks(true).length); + assertEquals('Cleared workspace (2).', 0, workspace.getTopBlocks(false).length); + assertEquals('Cleared workspace (3).', 0, workspace.getAllBlocks(false).length); + } finally { + workspaceTest_tearDown(); + } +} + +function test_maxBlocksWorkspace() { + workspaceTest_setUp(); + try { + var blockA = workspace.newBlock(''); + var blockB = workspace.newBlock(''); + assertEquals('Infinite capacity.', Infinity, workspace.remainingCapacity()); + workspace.options.maxBlocks = 3; + assertEquals('Three capacity.', 1, workspace.remainingCapacity()); + workspace.options.maxBlocks = 2; + assertEquals('Two capacity.', 0, workspace.remainingCapacity()); + workspace.options.maxBlocks = 1; + assertEquals('One capacity.', -1, workspace.remainingCapacity()); + workspace.options.maxBlocks = 0; + assertEquals('Zero capacity.', -2, workspace.remainingCapacity()); + workspace.clear(); + assertEquals('Cleared capacity.', 0, workspace.remainingCapacity()); + } finally { + workspaceTest_tearDown(); + } +} + +function test_getWorkspaceById() { + var workspaceA = new Blockly.Workspace(); + var workspaceB = new Blockly.Workspace(); + try { + assertEquals('Find workspaceA.', workspaceA, + Blockly.Workspace.getById(workspaceA.id)); + assertEquals('Find workspaceB.', workspaceB, + Blockly.Workspace.getById(workspaceB.id)); + assertEquals('No workspace found.', null, + Blockly.Workspace.getById('I do not exist.')); + workspaceA.dispose(); + assertEquals('Can\'t find workspaceA.', null, + Blockly.Workspace.getById(workspaceA.id)); + assertEquals('WorkspaceB exists.', workspaceB, + Blockly.Workspace.getById(workspaceB.id)); + } finally { + workspaceB.dispose(); + workspaceA.dispose(); + } +} + +function test_getBlockById() { + workspaceTest_setUp(); + try { + 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)); + } finally { + workspaceTest_tearDown(); + } +} + +function test_deleteVariable_InternalTrivial() { + workspaceTest_setUp(); + var var_1 = workspace.createVariable('name1', 'type1', 'id1'); + workspace.createVariable('name2', 'type2', 'id2'); + createMockVarBlock(workspace, 'id1'); + createMockVarBlock(workspace, 'id1'); + createMockVarBlock(workspace, 'id2'); + + var uses = workspace.getVariableUsesById(var_1.getId()); + workspace.deleteVariableInternal_(var_1, uses); + + var variable = workspace.getVariableById('id1'); + var block_var_name = workspace.topBlocks_[0].getVarModels()[0].name; + assertNull(variable); + checkVariableValues(workspace, 'name2', 'type2', 'id2'); + assertEquals('name2', block_var_name); + workspaceTest_tearDown(); +} + +// TODO(marisaleung): Test the alert for deleting a variable that is a procedure. + +function test_addTopBlock_TrivialFlyoutIsTrue() { + workspaceTest_setUp(); + var targetWorkspace = new Blockly.Workspace(); + workspace.isFlyout = true; + workspace.targetWorkspace = targetWorkspace; + targetWorkspace.createVariable('name1', '', '1'); + + // Flyout.init usually does this binding. + workspace.variableMap_ = targetWorkspace.getVariableMap(); + + try { + var block = createMockVarBlock(workspace, '1'); + workspace.removeTopBlock(block); + workspace.addTopBlock(block); + checkVariableValues(workspace, 'name1', '', '1'); + } finally { + workspaceTest_tearDown(); + // Have to dispose of the main workspace after the flyout workspace, because + // it holds the variable map. + // Normally the main workspace disposes of the flyout workspace. + targetWorkspace.dispose(); + } +} + +function test_clear_Trivial() { + workspaceTest_setUp(); + workspace.createVariable('name1', 'type1', 'id1'); + workspace.createVariable('name2', 'type2', 'id2'); + mockControl_ = setUpMockMethod(Blockly.Events, 'setGroup', [true, false], + null); + + try { + workspace.clear(); + var topBlocks_length = workspace.topBlocks_.length; + var varMapLength = Object.keys(workspace.variableMap_.variableMap_).length; + assertEquals(0, topBlocks_length); + assertEquals(0, varMapLength); + } finally { + workspaceTest_tearDown(); + } +} + +function test_clear_NoVariables() { + workspaceTest_setUp(); + mockControl_ = setUpMockMethod(Blockly.Events, 'setGroup', [true, false], + null); + + try { + workspace.clear(); + var topBlocks_length = workspace.topBlocks_.length; + var varMapLength = Object.keys(workspace.variableMap_.variableMap_).length; + assertEquals(0, topBlocks_length); + assertEquals(0, varMapLength); + } finally { + workspaceTest_tearDown(); + } +} + +function test_renameVariable_NoReference() { + // Test renaming a variable in the simplest case: when no blocks refer to it. + workspaceTest_setUp(); + var id = 'id1'; + var type = 'type1'; + var oldName = 'name1'; + var newName = 'name2'; + workspace.createVariable(oldName, type, id); + + try { + workspace.renameVariableById(id, newName); + checkVariableValues(workspace, newName, type, id); + // Renaming should not have created a new variable. + assertEquals(1, workspace.getAllVariables().length); + } finally { + workspaceTest_tearDown(); + } +} + +function test_renameVariable_ReferenceExists() { + // Test renaming a variable when a reference to it exists. + // Expect 'renameVariable' to change oldName variable name to newName. + workspaceTest_setUp(); + var newName = 'name2'; + + createVariableAndBlock(workspace); + + workspace.renameVariableById('id1', newName); + checkVariableValues(workspace, newName, 'type1', 'id1'); + // Renaming should not have created a new variable. + assertEquals(1, workspace.getAllVariables().length); + var block_var_name = workspace.topBlocks_[0].getVarModels()[0].name; + assertEquals(newName, block_var_name); + workspaceTest_tearDown(); +} + +function test_renameVariable_TwoVariablesSameType() { + // Expect 'renameVariable' to change oldName variable name to newName. + // Expect oldName block name to change to newName + workspaceTest_setUp(); + var id1 = 'id1'; + var id2 = 'id2'; + var type = 'type1'; + + var oldName = 'name1'; + var newName = 'name2'; + // Create two variables of the same type. + workspace.createVariable(oldName, type, id1); + workspace.createVariable(newName, type, id2); + // Create blocks to refer to both of them. + createMockVarBlock(workspace, id1); + createMockVarBlock(workspace, id2); + + workspace.renameVariableById(id1, newName); + checkVariableValues(workspace, newName, type, id2); + // The old variable should have been deleted. + var variable = workspace.getVariableById(id1); + assertNull(variable); + + // There should only be one variable left. + assertEquals(1, workspace.getAllVariables().length); + + // References should have the correct names. + var block_var_name_1 = workspace.topBlocks_[0].getVarModels()[0].name; + var block_var_name_2 = workspace.topBlocks_[1].getVarModels()[0].name; + assertEquals(newName, block_var_name_1); + assertEquals(newName, block_var_name_2); + + workspaceTest_tearDown(); +} + +function test_renameVariable_TwoVariablesDifferentType() { + // Expect the rename to succeed, because variables with different types are + // allowed to have the same name. + workspaceTest_setUp(); + createTwoVariablesAndBlocks(workspace); + + var newName = 'name2'; + workspace.renameVariableById('id1', newName); + + checkVariableValues(workspace, newName, 'type1', 'id1'); + checkVariableValues(workspace, newName, 'type2', 'id2'); + + // References shoul have the correct names. + var block_var_name_1 = workspace.topBlocks_[0].getVarModels()[0].name; + var block_var_name_2 = workspace.topBlocks_[1].getVarModels()[0].name; + assertEquals(newName, block_var_name_1); + assertEquals(newName, block_var_name_2); + + workspaceTest_tearDown(); +} + +function test_renameVariable_OldCase() { + // Rename a variable with a single reference. Update only the capitalization. + workspaceTest_setUp(); + var newName = 'Name1'; + + createVariableAndBlock(workspace); + + workspace.renameVariableById('id1', newName); + checkVariableValues(workspace, newName, 'type1', 'id1'); + var variable = workspace.getVariableById('id1'); + assertNotEquals('name1', variable.name); + workspaceTest_tearDown(); +} + +function test_renameVariable_TwoVariablesAndOldCase() { + // Test renaming a variable to an in-use name, but with different + // capitalization. The new capitalization should apply everywhere. + + // TODO (fenichel): What about different capitalization but also different + // types? + workspaceTest_setUp(); + var oldName = 'name1'; + var oldCase = 'Name2'; + var newName = 'name2'; + + var id1 = 'id1'; + var id2 = 'id2'; + + var type = 'type1'; + + workspace.createVariable(oldName, type, id1); + workspace.createVariable(oldCase, type, id2); + createMockVarBlock(workspace, id1); + createMockVarBlock(workspace, id2); + + workspace.renameVariableById(id1, newName); + + checkVariableValues(workspace, newName, type, id2); + + // The old variable should have been deleted. + var variable = workspace.getVariableById(id1); + assertNull(variable); + + // There should only be one variable left. + assertEquals(1, workspace.getAllVariables().length); + + // Blocks should now use the new capitalization. + var block_var_name_1 = workspace.topBlocks_[0].getVarModels()[0].name; + var block_var_name_2 = workspace.topBlocks_[1].getVarModels()[0].name; + assertEquals(newName, block_var_name_1); + assertEquals(newName, block_var_name_2); + workspaceTest_tearDown(); +} + +function test_deleteVariableById_Trivial() { + workspaceTest_setUp(); + createTwoVariablesAndBlocks(workspace); + + workspace.deleteVariableById('id1'); + checkVariableValues(workspace, 'name2', 'type2', 'id2'); + var variable = workspace.getVariableById('id1'); + var block_var_name = workspace.topBlocks_[0].getVarModels()[0].name; + assertNull(variable); + assertEquals('name2', block_var_name); + workspaceTest_tearDown(); +} diff --git a/js/tests/jsunit/workspace_undo_redo_test.js b/js/tests/jsunit/workspace_undo_redo_test.js new file mode 100644 index 0000000..9fc06d1 --- /dev/null +++ b/js/tests/jsunit/workspace_undo_redo_test.js @@ -0,0 +1,374 @@ +/** + * @license + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + /** + * @fileoverview Tests for Blockly.Workspace.undo. + * @author marisaleung@google.com (Marisa Leung) + */ +'use strict'; + + +var workspace; +var mockControl_; +var savedFireFunc = Blockly.Events.fire; + +function temporary_fireEvent(event) { + if (!Blockly.Events.isEnabled()) { + return; + } + Blockly.Events.FIRE_QUEUE_.push(event); + Blockly.Events.fireNow_(); +} + +function undoRedoTest_setUp() { + defineGetVarBlock(); + workspace = new Blockly.Workspace(); + Blockly.Events.fire = temporary_fireEvent; +} + +function undoRedoTest_tearDown() { + undefineGetVarBlock(); + if (mockControl_) { + mockControl_.restore(); + } + workspace.dispose(); + Blockly.Events.fire = savedFireFunc; +} + +/** + * Check that the top block with the given index contains a variable with + * the given name. + * @param {number} blockIndex The index of the top block. + * @param {string} name The expected name of the variable in the block. + */ +function undoRedoTest_checkBlockVariableName(blockIndex, name) { + var blockVarName = workspace.topBlocks_[blockIndex].getVarModels()[0].name; + assertEquals(name, blockVarName); +} + +function createTwoVarsEmptyType() { + workspace.createVariable('name1', '', 'id1'); + workspace.createVariable('name2', '', 'id2'); +} + +function createTwoVarsDifferentTypes() { + workspace.createVariable('name1', 'type1', 'id1'); + workspace.createVariable('name2', 'type2', 'id2'); +} + +function test_undoCreateVariable_Trivial() { + undoRedoTest_setUp(); + createTwoVarsDifferentTypes(); + + workspace.undo(); + checkVariableValues(workspace, 'name1', 'type1', 'id1'); + assertNull(workspace.getVariableById('id2')); + workspace.undo(); + assertNull(workspace.getVariableById('id1')); + assertNull(workspace.getVariableById('id2')); + undoRedoTest_tearDown(); +} + +function test_redoAndUndoCreateVariable_Trivial() { + undoRedoTest_setUp(); + createTwoVarsDifferentTypes(); + + workspace.undo(); + workspace.undo(true); + + // Expect that variable 'id2' is recreated + checkVariableValues(workspace, 'name1', 'type1', 'id1'); + checkVariableValues(workspace, 'name2', 'type2', 'id2'); + + workspace.undo(); + workspace.undo(); + workspace.undo(true); + + // Expect that variable 'id1' is recreated + checkVariableValues(workspace, 'name1', 'type1', 'id1'); + assertNull(workspace.getVariableById('id2')); + undoRedoTest_tearDown(); +} + +function test_undoDeleteVariable_NoBlocks() { + undoRedoTest_setUp(); + createTwoVarsDifferentTypes(); + workspace.deleteVariableById('id1'); + workspace.deleteVariableById('id2'); + + workspace.undo(); + assertNull(workspace.getVariableById('id1')); + checkVariableValues(workspace, 'name2', 'type2', 'id2'); + + workspace.undo(); + checkVariableValues(workspace, 'name1', 'type1', 'id1'); + checkVariableValues(workspace, 'name2', 'type2', 'id2'); + undoRedoTest_tearDown(); +} + +function test_undoDeleteVariable_WithBlocks() { + undoRedoTest_setUp(); + + createTwoVariablesAndBlocks(workspace); + + workspace.deleteVariableById('id1'); + workspace.deleteVariableById('id2'); + + workspace.undo(); + undoRedoTest_checkBlockVariableName(0, 'name2'); + assertNull(workspace.getVariableById('id1')); + checkVariableValues(workspace, 'name2', 'type2', 'id2'); + + workspace.undo(); + undoRedoTest_checkBlockVariableName(0, 'name2'); + undoRedoTest_checkBlockVariableName(1, 'name1'); + checkVariableValues(workspace, 'name1', 'type1', 'id1'); + checkVariableValues(workspace, 'name2', 'type2', 'id2'); + undoRedoTest_tearDown(); +} + +function test_redoAndUndoDeleteVariable_NoBlocks() { + undoRedoTest_setUp(); + + createTwoVarsDifferentTypes(); + + workspace.deleteVariableById('id1'); + workspace.deleteVariableById('id2'); + + workspace.undo(); + workspace.undo(true); + // Expect that both variables are deleted + assertNull(workspace.getVariableById('id1')); + assertNull(workspace.getVariableById('id2')); + + workspace.undo(); + workspace.undo(); + workspace.undo(true); + // Expect that variable 'id2' is recreated + assertNull(workspace.getVariableById('id1')); + checkVariableValues(workspace, 'name2', 'type2', 'id2'); + undoRedoTest_tearDown(); +} + +function test_redoAndUndoDeleteVariable_WithBlocks() { + undoRedoTest_setUp(); + + createTwoVariablesAndBlocks(workspace); + + workspace.deleteVariableById('id1'); + workspace.deleteVariableById('id2'); + + workspace.undo(); + workspace.undo(true); + // Expect that both variables are deleted + assertEquals(0, workspace.topBlocks_.length); + assertNull(workspace.getVariableById('id1')); + assertNull(workspace.getVariableById('id2')); + + workspace.undo(); + workspace.undo(); + workspace.undo(true); + // Expect that variable 'id2' is recreated + undoRedoTest_checkBlockVariableName(0, 'name2'); + assertNull(workspace.getVariableById('id1')); + checkVariableValues(workspace, 'name2', 'type2', 'id2'); + undoRedoTest_tearDown(); +} + +function test_redoAndUndoDeleteVariableTwice_NoBlocks() { + undoRedoTest_setUp(); + workspace.createVariable('name1', 'type1', 'id1'); + workspace.deleteVariableById('id1'); + workspace.deleteVariableById('id1'); + + // Check the undoStack only recorded one delete event. + var undoStack = workspace.undoStack_; + assertEquals('var_delete', undoStack[undoStack.length-1].type); + assertNotEquals('var_delete', undoStack[undoStack.length-2].type); + + // undo delete + workspace.undo(); + checkVariableValues(workspace, 'name1', 'type1', 'id1'); + + // redo delete + workspace.undo(true); + assertNull(workspace.getVariableById('id1')); + + // redo delete, nothing should happen + workspace.undo(true); + assertNull(workspace.getVariableById('id1')); + undoRedoTest_tearDown(); +} + +function test_redoAndUndoDeleteVariableTwice_WithBlocks() { + undoRedoTest_setUp(); + var id = 'id1'; + workspace.createVariable('name1', 'type1', id); + createMockVarBlock(workspace, id); + workspace.deleteVariableById(id); + workspace.deleteVariableById(id); + + // Check the undoStack only recorded one delete event. + var undoStack = workspace.undoStack_; + assertEquals('var_delete', undoStack[undoStack.length-1].type); + assertEquals('delete', undoStack[undoStack.length-2].type); + assertNotEquals('var_delete', undoStack[undoStack.length-3].type); + + // undo delete + workspace.undo(); + undoRedoTest_checkBlockVariableName(0, 'name1'); + checkVariableValues(workspace, 'name1', 'type1', id); + + // redo delete + workspace.undo(true); + assertEquals(0, workspace.topBlocks_.length); + assertNull(workspace.getVariableById(id)); + + // redo delete, nothing should happen + workspace.undo(true); + assertEquals(0, workspace.topBlocks_.length); + assertNull(workspace.getVariableById(id)); + undoRedoTest_tearDown(); +} + +function test_undoRedoRenameVariable_OneExists_NoBlocks() { + undoRedoTest_setUp(); + workspace.createVariable('name1', '', 'id1'); + workspace.renameVariableById('id1', 'name2'); + + workspace.undo(); + checkVariableValues(workspace, 'name1', '', 'id1'); + + workspace.undo(true); + checkVariableValues(workspace, 'name2', '', 'id1'); + undoRedoTest_tearDown(); +} + +function test_undoRedoRenameVariable_OneExists_WithBlocks() { + undoRedoTest_setUp(); + workspace.createVariable('name1', '', 'id1'); + createMockVarBlock(workspace, 'id1'); + workspace.renameVariableById('id1', 'name2'); + + workspace.undo(); + undoRedoTest_checkBlockVariableName(0, 'name1'); + checkVariableValues(workspace, 'name1', '', 'id1'); + + workspace.undo(true); + checkVariableValues(workspace, 'name2', '', 'id1'); + undoRedoTest_checkBlockVariableName(0, 'name2'); + undoRedoTest_tearDown(); +} + +function test_undoRedoRenameVariable_BothExist_NoBlocks() { + undoRedoTest_setUp(); + createTwoVarsEmptyType(); + workspace.renameVariableById('id1', 'name2'); + + workspace.undo(); + checkVariableValues(workspace, 'name1', '', 'id1'); + checkVariableValues(workspace, 'name2', '', 'id2'); + + workspace.undo(true); + checkVariableValues(workspace, 'name2', '', 'id2'); + assertNull(workspace.getVariableById('id1')); + undoRedoTest_tearDown(); +} + +function test_undoRedoRenameVariable_BothExist_WithBlocks() { + undoRedoTest_setUp(); + createTwoVarsEmptyType(); + createMockVarBlock(workspace, 'id1'); + createMockVarBlock(workspace, 'id2'); + workspace.renameVariableById('id1', 'name2'); + + workspace.undo(); + undoRedoTest_checkBlockVariableName(0, 'name1'); + undoRedoTest_checkBlockVariableName(1, 'name2'); + checkVariableValues(workspace, 'name1', '', 'id1'); + checkVariableValues(workspace, 'name2', '', 'id2'); + + workspace.undo(true); + undoRedoTest_checkBlockVariableName(0, 'name2'); + undoRedoTest_checkBlockVariableName(1, 'name2'); + undoRedoTest_tearDown(); +} + +function test_undoRedoRenameVariable_BothExistCaseChange_NoBlocks() { + undoRedoTest_setUp(); + createTwoVarsEmptyType(); + workspace.renameVariableById('id1', 'Name2'); + + workspace.undo(); + checkVariableValues(workspace, 'name1', '', 'id1'); + checkVariableValues(workspace, 'name2', '', 'id2'); + + workspace.undo(true); + checkVariableValues(workspace, 'Name2', '', 'id2'); + assertNull(workspace.getVariable('name1')); + undoRedoTest_tearDown(); +} + +function test_undoRedoRenameVariable_BothExistCaseChange_WithBlocks() { + undoRedoTest_setUp(); + createTwoVarsEmptyType(); + createMockVarBlock(workspace, 'id1'); + createMockVarBlock(workspace, 'id2'); + workspace.renameVariableById('id1', 'Name2'); + + workspace.undo(); + undoRedoTest_checkBlockVariableName(0, 'name1'); + undoRedoTest_checkBlockVariableName(1, 'name2'); + checkVariableValues(workspace, 'name1', '', 'id1'); + checkVariableValues(workspace, 'name2', '', 'id2'); + + workspace.undo(true); + checkVariableValues(workspace, 'Name2', '', 'id2'); + assertNull(workspace.getVariableById('id1')); + undoRedoTest_checkBlockVariableName(0, 'Name2'); + undoRedoTest_checkBlockVariableName(1, 'Name2'); + undoRedoTest_tearDown(); +} + +function test_undoRedoRenameVariable_OnlyCaseChange_NoBlocks() { + undoRedoTest_setUp(); + workspace.createVariable('name1', '', 'id1'); + workspace.renameVariableById('id1', 'Name1'); + + workspace.undo(); + checkVariableValues(workspace, 'name1', '', 'id1'); + + workspace.undo(true); + checkVariableValues(workspace, 'Name1', '', 'id1'); + undoRedoTest_tearDown(); +} + +function test_undoRedoRenameVariable_OnlyCaseChange_WithBlocks() { + undoRedoTest_setUp(); + workspace.createVariable('name1', '', 'id1'); + createMockVarBlock(workspace, 'id1'); + workspace.renameVariableById('id1', 'Name1'); + + workspace.undo(); + undoRedoTest_checkBlockVariableName(0, 'name1'); + checkVariableValues(workspace, 'name1', '', 'id1'); + + workspace.undo(true); + checkVariableValues(workspace, 'Name1', '', 'id1'); + undoRedoTest_checkBlockVariableName(0, 'Name1'); + undoRedoTest_tearDown(); +} diff --git a/js/tests/jsunit/xml_test.js b/js/tests/jsunit/xml_test.js new file mode 100644 index 0000000..afd3dc9 --- /dev/null +++ b/js/tests/jsunit/xml_test.js @@ -0,0 +1,386 @@ +/** + * @license + * Copyright 2014 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + +var mockControl_; +var workspace; +var XML_TEXT = ['', + ' ', + ' ', + ' ', + ' 10', + ' ', + ' ', + ' ', + ' ', + ' item', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' Hello', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ''].join('\n'); + +function xmlTest_setUp() { + workspace = new Blockly.Workspace(); +} + +function xmlTest_setUpWithMockBlocks() { + xmlTest_setUp(); + Blockly.defineBlocksWithJsonArray([{ + 'type': 'field_variable_test_block', + 'message0': '%1', + 'args0': [ + { + 'type': 'field_variable', + 'name': 'VAR', + 'variable': 'item' + } + ] + }]); +} + +function xmlTest_tearDown() { + if (mockControl_) { + mockControl_.restore(); + } + workspace.dispose(); +} + +function xmlTest_tearDownWithMockBlocks() { + xmlTest_tearDown(); + delete Blockly.Blocks.field_variable_test_block; +} + +/** + * Check the values of the non variable field DOM. + * @param {!Element} fieldDom The XML DOM of the non variable field. + * @param {!string} name The expected name of the variable. + * @param {!string} text The expected text of the variable. + */ +function xmlTest_checkNonVariableField(fieldDom, name, text) { + assertEquals('textContent', text, fieldDom.textContent); + assertEquals('name', name, fieldDom.getAttribute('name')); + assertNull('id', fieldDom.getAttribute('id')); + assertNull('variabletype', fieldDom.getAttribute('variabletype')); +} + +/** + * Check the values of the variable field DOM. + * @param {!Element} fieldDom The XML DOM of the variable field. + * @param {!string} name The expected name of the variable. + * @param {!string} type The expected type of the variable. + * @param {!string} id The expected ID of the variable. + * @param {!string} text The expected text of the variable. + */ +function xmlTest_checkVariableFieldDomValues(fieldDom, name, type, id, text) { + assertEquals('name', name, fieldDom.getAttribute('name')); + assertEquals('variabletype', type, fieldDom.getAttribute('variabletype')); + assertEquals('id', id, fieldDom.getAttribute('id')); + assertEquals('textContent', text, fieldDom.textContent); +} + +/** + * Check the values of the variable DOM. + * @param {!Element} variableDom The XML DOM of the variable. + * @param {!string} type The expected type of the variable. + * @param {!string} id The expected ID of the variable. + * @param {!string} text The expected text of the variable. + */ +function xmlTest_checkVariableDomValues(variableDom, type, id, text) { + assertEquals('type', type, variableDom.getAttribute('type')); + assertEquals('id', id, variableDom.getAttribute('id')); + assertEquals('textContent', text, variableDom.textContent); +} + +function test_textToDom() { + var dom = Blockly.Xml.textToDom(XML_TEXT); + assertEquals('XML tag', 'xml', dom.nodeName); + assertEquals('Block tags', 6, dom.getElementsByTagName('block').length); +} + +function test_domToText() { + var dom = Blockly.Xml.textToDom(XML_TEXT); + var text = Blockly.Xml.domToText(dom); + assertEquals('Round trip', XML_TEXT.replace(/\s+/g, ''), + text.replace(/\s+/g, '')); +} + +function test_domToWorkspace_BackwardCompatibility() { + // Expect that workspace still loads without serialized variables. + xmlTest_setUpWithMockBlocks(); + mockControl_ = setUpMockMethod(Blockly.utils, 'genUid', null, ['1', '1']); + try { + var dom = Blockly.Xml.textToDom( + '' + + ' ' + + ' name1' + + ' ' + + ''); + Blockly.Xml.domToWorkspace(dom, workspace); + assertEquals('Block count', 1, workspace.getAllBlocks(false).length); + checkVariableValues(workspace, 'name1', '', '1'); + } finally { + xmlTest_tearDownWithMockBlocks(); + } +} + +function test_domToWorkspace_VariablesAtTop() { + // Expect that unused variables are preserved. + xmlTest_setUpWithMockBlocks(); + try { + var dom = Blockly.Xml.textToDom( + '' + + ' ' + + ' name1' + + ' name2' + + ' name3' + + ' ' + + ' ' + + ' name3' + + ' ' + + ''); + Blockly.Xml.domToWorkspace(dom, workspace); + assertEquals('Block count', 1, workspace.getAllBlocks(false).length); + checkVariableValues(workspace, 'name1', 'type1', 'id1'); + checkVariableValues(workspace, 'name2', 'type2', 'id2'); + checkVariableValues(workspace, 'name3', '', 'id3'); + } finally { + xmlTest_tearDownWithMockBlocks(); + } +} + +function test_domToWorkspace_VariablesAtTop_DuplicateVariablesTag() { + // Expect thrown Error because of duplicate 'variables' tag. + xmlTest_setUpWithMockBlocks(); + try { + var dom = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ''); + Blockly.Xml.domToWorkspace(dom, workspace); + fail(); + } + catch (e) { + // expected + } finally { + xmlTest_tearDownWithMockBlocks(); + } +} + +function test_domToWorkspace_VariablesAtTop_MissingType() { + // Expect thrown error when a variable tag is missing the type attribute. + workspace = new Blockly.Workspace(); + try { + var dom = Blockly.Xml.textToDom( + '' + + ' ' + + ' name1' + + ' ' + + ' ' + + ' name3' + + ' ' + + ''); + Blockly.Xml.domToWorkspace(dom, workspace); + fail(); + } catch (e) { + // expected + } finally { + workspace.dispose(); + } +} + +function test_domToWorkspace_VariablesAtTop_MismatchBlockType() { + // Expect thrown error when the serialized type of a variable does not match + // the type of a variable field that references it. + xmlTest_setUpWithMockBlocks(); + try { + var dom = Blockly.Xml.textToDom( + '' + + ' ' + + ' name1' + + ' ' + + ' ' + + ' name1' + + ' ' + + ''); + Blockly.Xml.domToWorkspace(dom, workspace); + fail(); + } catch (e) { + // expected + } finally { + xmlTest_tearDownWithMockBlocks(); + } +} + +function test_domToPrettyText() { + var dom = Blockly.Xml.textToDom(XML_TEXT); + var text = Blockly.Xml.domToPrettyText(dom); + assertEquals('Round trip', XML_TEXT.replace(/\s+/g, ''), + text.replace(/\s+/g, '')); +} + +/** + * Tests the that appendDomToWorkspace works in a headless mode. + * Also see test_appendDomToWorkspace() in workspace_svg_test.js. + */ +function test_appendDomToWorkspace() { + Blockly.Blocks.test_block = { + init: function() { + this.jsonInit({ + message0: 'test', + }); + } + }; + + try { + var dom = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ''); + workspace = new Blockly.Workspace(); + Blockly.Xml.appendDomToWorkspace(dom, workspace); + assertEquals('Block count', 1, workspace.getAllBlocks(false).length); + var newBlockIds = Blockly.Xml.appendDomToWorkspace(dom, workspace); + assertEquals('Block count', 2, workspace.getAllBlocks(false).length); + assertEquals('Number of new block ids',1,newBlockIds.length); + } finally { + delete Blockly.Blocks.test_block; + workspace.dispose(); + } +} + +function test_blockToDom_fieldToDom_defaultCase() { + xmlTest_setUpWithMockBlocks(); + mockControl_ = setUpMockMethod(Blockly.utils, 'genUid', null, ['1', '1']); + try { + workspace.createVariable('name1'); + + Blockly.Events.disable(); + var block = new Blockly.Block(workspace, 'field_variable_test_block'); + block.inputList[0].fieldRow[0].setValue('1'); + Blockly.Events.enable(); + + var resultFieldDom = Blockly.Xml.blockToDom(block).childNodes[0]; + // Expect type is null and ID is '1' since we don't specify type and ID. + xmlTest_checkVariableFieldDomValues(resultFieldDom, 'VAR', null, '1', + 'name1'); + } finally { + xmlTest_tearDownWithMockBlocks(); + } +} + +function test_blockToDom_fieldToDom_notAFieldVariable() { + Blockly.defineBlocksWithJsonArray([{ + "type": "field_angle_test_block", + "message0": "%1", + "args0": [ + { + "type": "field_angle", + "name": "VAR", + "angle": 90 + } + ], + }]); + xmlTest_setUpWithMockBlocks(); + var block = new Blockly.Block(workspace, 'field_angle_test_block'); + var resultFieldDom = Blockly.Xml.blockToDom(block).childNodes[0]; + xmlTest_checkNonVariableField(resultFieldDom, 'VAR', '90'); + delete Blockly.Blocks.field_angle_block; + xmlTest_tearDownWithMockBlocks(); +} + +function test_variablesToDom_oneVariable() { + xmlTest_setUp(); + mockControl_ = setUpMockMethod(Blockly.utils, 'genUid', null, ['1']); + + workspace.createVariable('name1'); + var resultDom = Blockly.Xml.variablesToDom(workspace.getAllVariables()); + assertEquals(1, resultDom.children.length); + var resultVariableDom = resultDom.children[0]; + assertEquals('name1', resultVariableDom.textContent); + assertEquals(null, resultVariableDom.getAttribute('type')); + assertEquals('1', resultVariableDom.getAttribute('id')); + xmlTest_tearDown(); +} + +function test_variablesToDom_twoVariables_oneBlock() { + xmlTest_setUpWithMockBlocks(); + + workspace.createVariable('name1', '', 'id1'); + workspace.createVariable('name2', 'type2', 'id2'); + // If events are enabled during block construction, it will create a default + // variable. + Blockly.Events.disable(); + var block = new Blockly.Block(workspace, 'field_variable_test_block'); + block.inputList[0].fieldRow[0].setValue('id1'); + Blockly.Events.enable(); + + var resultDom = Blockly.Xml.variablesToDom(workspace.getAllVariables()); + assertEquals(2, resultDom.children.length); + xmlTest_checkVariableDomValues(resultDom.children[0], null, 'id1', + 'name1'); + xmlTest_checkVariableDomValues(resultDom.children[1], 'type2', 'id2', + 'name2'); + xmlTest_tearDownWithMockBlocks(); +} + +function test_variablesToDom_noVariables() { + xmlTest_setUp(); + workspace.createVariable('name1'); + var resultDom = Blockly.Xml.variablesToDom(workspace.getAllVariables()); + assertEquals(1, resultDom.children.length); + xmlTest_tearDown(); +} + +function test_variableFieldXml_caseSensitive() { + var id = 'testId'; + var type = 'testType'; + var name = 'testName'; + + var mockVariableModel = { + type: type, + name: name, + getId: function() { + return id; + } + }; + + var generatedXml = Blockly.Xml.domToText( + Blockly.Variables.generateVariableFieldDom(mockVariableModel)); + var goldenXml = + '' + name + ''; + assertEquals(goldenXml, generatedXml); +} diff --git a/js/tests/media/200px.png b/js/tests/media/200px.png new file mode 100644 index 0000000..8671954 Binary files /dev/null and b/js/tests/media/200px.png differ diff --git a/js/tests/media/30px.png b/js/tests/media/30px.png new file mode 100644 index 0000000..adf98a5 Binary files /dev/null and b/js/tests/media/30px.png differ diff --git a/js/tests/media/50px.png b/js/tests/media/50px.png new file mode 100644 index 0000000..b3d4fc2 Binary files /dev/null and b/js/tests/media/50px.png differ diff --git a/js/tests/media/a.png b/js/tests/media/a.png new file mode 100644 index 0000000..24c8483 Binary files /dev/null and b/js/tests/media/a.png differ diff --git a/js/tests/media/arrow.png b/js/tests/media/arrow.png new file mode 100644 index 0000000..d310bd2 Binary files /dev/null and b/js/tests/media/arrow.png differ diff --git a/js/tests/media/b.png b/js/tests/media/b.png new file mode 100644 index 0000000..416276c Binary files /dev/null and b/js/tests/media/b.png differ diff --git a/js/tests/media/c.png b/js/tests/media/c.png new file mode 100644 index 0000000..ba0127d Binary files /dev/null and b/js/tests/media/c.png differ diff --git a/js/tests/media/d.png b/js/tests/media/d.png new file mode 100644 index 0000000..89f5d5c Binary files /dev/null and b/js/tests/media/d.png differ diff --git a/js/tests/media/e.png b/js/tests/media/e.png new file mode 100644 index 0000000..2070b06 Binary files /dev/null and b/js/tests/media/e.png differ diff --git a/js/tests/media/f.png b/js/tests/media/f.png new file mode 100644 index 0000000..beb8b9e Binary files /dev/null and b/js/tests/media/f.png differ diff --git a/js/tests/media/g.png b/js/tests/media/g.png new file mode 100644 index 0000000..aad1e57 Binary files /dev/null and b/js/tests/media/g.png differ diff --git a/js/tests/media/h.png b/js/tests/media/h.png new file mode 100644 index 0000000..33cbb44 Binary files /dev/null and b/js/tests/media/h.png differ diff --git a/js/tests/media/i.png b/js/tests/media/i.png new file mode 100644 index 0000000..cf4d90c Binary files /dev/null and b/js/tests/media/i.png differ diff --git a/js/tests/media/j.png b/js/tests/media/j.png new file mode 100644 index 0000000..81da544 Binary files /dev/null and b/js/tests/media/j.png differ diff --git a/js/tests/media/k.png b/js/tests/media/k.png new file mode 100644 index 0000000..a9ea5a7 Binary files /dev/null and b/js/tests/media/k.png differ diff --git a/js/tests/media/l.png b/js/tests/media/l.png new file mode 100644 index 0000000..c43626e Binary files /dev/null and b/js/tests/media/l.png differ diff --git a/js/tests/media/m.png b/js/tests/media/m.png new file mode 100644 index 0000000..ee98eb8 Binary files /dev/null and b/js/tests/media/m.png differ diff --git a/js/tests/mocha/.eslintrc.json b/js/tests/mocha/.eslintrc.json new file mode 100644 index 0000000..b4bb40f --- /dev/null +++ b/js/tests/mocha/.eslintrc.json @@ -0,0 +1,23 @@ +{ + "env": { + "browser": true, + "mocha": true + }, + "globals": { + "chai": false, + "sinon": false, + "assertNull": true, + "assertNotNull": true, + "assertEquals": true, + "assertTrue": true, + "assertFalse": true, + "isEqualArrays": true, + "assertUndefined": true, + "assertNotUndefined": true, + "defineStackBlock": true, + "defineRowBlock": true, + "defineStatementBlock": true + + }, + "extends": "../../.eslintrc.json" +} diff --git a/js/tests/mocha/astnode_test.js b/js/tests/mocha/astnode_test.js new file mode 100644 index 0000000..b172de8 --- /dev/null +++ b/js/tests/mocha/astnode_test.js @@ -0,0 +1,912 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +suite('ASTNode', function() { + setup(function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "input_statement", + "message0": "%1 %2 %3 %4", + "args0": [ + { + "type": "field_input", + "name": "NAME", + "text": "default" + }, + { + "type": "field_input", + "name": "NAME", + "text": "default" + }, + { + "type": "input_value", + "name": "NAME" + }, + { + "type": "input_statement", + "name": "NAME" + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": 230, + "tooltip": "", + "helpUrl": "" + }, + { + "type": "value_input", + "message0": "%1", + "args0": [ + { + "type": "input_value", + "name": "NAME" + } + ], + "colour": 230, + "tooltip": "", + "helpUrl": "" + }, + { + "type": "field_input", + "message0": "%1", + "args0": [ + { + "type": "field_input", + "name": "NAME", + "text": "default" + } + ], + "output": null, + "colour": 230, + "tooltip": "", + "helpUrl": "" + } + ]); + this.workspace = new Blockly.Workspace(); + this.cursor = this.workspace.cursor; + var statementInput1 = this.workspace.newBlock('input_statement'); + var statementInput2 = this.workspace.newBlock('input_statement'); + var statementInput3 = this.workspace.newBlock('input_statement'); + var statementInput4 = this.workspace.newBlock('input_statement'); + var fieldWithOutput = this.workspace.newBlock('field_input'); + var valueInput = this.workspace.newBlock('value_input'); + + statementInput1.nextConnection.connect(statementInput2.previousConnection); + statementInput1.inputList[0].connection + .connect(fieldWithOutput.outputConnection); + statementInput2.inputList[1].connection + .connect(statementInput3.previousConnection); + + this.blocks = { + statementInput1: statementInput1, + statementInput2: statementInput2, + statementInput3: statementInput3, + statementInput4: statementInput4, + fieldWithOutput: fieldWithOutput, + valueInput: valueInput + }; + sinon.stub(Blockly, "getMainWorkspace").returns(new Blockly.Workspace()); + }); + teardown(function() { + delete Blockly.Blocks['input_statement']; + delete Blockly.Blocks['field_input']; + delete Blockly.Blocks['value_input']; + + this.workspace.dispose(); + sinon.restore(); + }); + + suite('HelperFunctions', function() { + test('findNextForInput_', function() { + var input = this.blocks.statementInput1.inputList[0]; + var input2 = this.blocks.statementInput1.inputList[1]; + var connection = input.connection; + var node = Blockly.ASTNode.createConnectionNode(connection); + var newASTNode = node.findNextForInput_(input); + assertEquals(newASTNode.getLocation(), input2.connection); + }); + + test('findPrevForInput_', function() { + var input = this.blocks.statementInput1.inputList[0]; + var input2 = this.blocks.statementInput1.inputList[1]; + var connection = input2.connection; + var node = Blockly.ASTNode.createConnectionNode(connection); + var newASTNode = node.findPrevForInput_(input2); + assertEquals(newASTNode.getLocation(), input.connection); + }); + + test('findNextForField_', function() { + var field = this.blocks.statementInput1.inputList[0].fieldRow[0]; + var field2 = this.blocks.statementInput1.inputList[0].fieldRow[1]; + var node = Blockly.ASTNode.createFieldNode(field); + var newASTNode = node.findNextForField_(field); + assertEquals(newASTNode.getLocation(), field2); + }); + + test('findPrevForField_', function() { + var field = this.blocks.statementInput1.inputList[0].fieldRow[0]; + var field2 = this.blocks.statementInput1.inputList[0].fieldRow[1]; + var node = Blockly.ASTNode.createFieldNode(field2); + var newASTNode = node.findPrevForField_(field2); + assertEquals(newASTNode.getLocation(), field); + }); + + test('navigateBetweenStacks_Forward', function() { + var node = new Blockly.ASTNode( + Blockly.ASTNode.types.NEXT, this.blocks.statementInput1.nextConnection); + var newASTNode = node.navigateBetweenStacks_(true); + assertEquals(newASTNode.getLocation(), this.blocks.statementInput4); + }); + + test('navigateBetweenStacks_Backward', function() { + var node = new Blockly.ASTNode( + Blockly.ASTNode.types.BLOCK, this.blocks.statementInput4); + var newASTNode = node.navigateBetweenStacks_(false); + assertEquals(newASTNode.getLocation(), this.blocks.statementInput1); + }); + test('getOutAstNodeForBlock_', function() { + var node = new Blockly.ASTNode( + Blockly.ASTNode.types.BLOCK, this.blocks.statementInput2); + var newASTNode = node.getOutAstNodeForBlock_(this.blocks.statementInput2); + assertEquals(newASTNode.getLocation(), this.blocks.statementInput1); + }); + test('getOutAstNodeForBlock_OneBlock', function() { + var node = new Blockly.ASTNode( + Blockly.ASTNode.types.BLOCK, this.blocks.statementInput4); + var newASTNode = node.getOutAstNodeForBlock_(this.blocks.statementInput4); + assertEquals(newASTNode.getLocation(), this.blocks.statementInput4); + }); + test('findFirstFieldOrInput_', function() { + var node = new Blockly.ASTNode( + Blockly.ASTNode.types.BLOCK, this.blocks.statementInput4); + var field = this.blocks.statementInput4.inputList[0].fieldRow[0]; + var newASTNode = node.findFirstFieldOrInput_(this.blocks.statementInput4); + assertEquals(newASTNode.getLocation(), field); + }); + + }); + + suite('NavigationFunctions', function() { + suite('Next', function() { + setup(function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "top_connection", + "message0": "", + "previousStatement": null, + "colour": 230, + "tooltip": "", + "helpUrl": "" + }, + { + "type": "fields_and_input", + "message0": "%1 hi %2 %3 %4", + "args0": [ + { + "type": "field_input", + "name": "NAME", + "text": "default" + }, + { + "type": "input_dummy" + }, + { + "type": "field_input", + "name": "NAME", + "text": "default" + }, + { + "type": "input_value", + "name": "NAME" + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": 230, + "tooltip": "", + "helpUrl": "" + }, + { + "type": "two_fields", + "message0": "%1 hi", + "args0": [ + { + "type": "field_input", + "name": "NAME", + "text": "default" + } + ], + "colour": 230, + "tooltip": "", + "helpUrl": "" + }, + { + "type": "fields_and_input2", + "message0": "%1 %2 %3 hi %4 bye", + "args0": [ + { + "type": "input_value", + "name": "NAME" + }, + { + "type": "field_input", + "name": "NAME", + "text": "default" + }, + { + "type": "input_value", + "name": "NAME" + }, + { + "type": "input_statement", + "name": "NAME" + } + ], + "colour": 230, + "tooltip": "", + "helpUrl": "" + }]); + + this.singleBlockWorkspace = new Blockly.Workspace(); + + var noNextConnection = this.workspace.newBlock('top_connection'); + var fieldAndInputs = this.workspace.newBlock('fields_and_input'); + var twoFields = this.workspace.newBlock('two_fields'); + var fieldAndInputs2 = this.workspace.newBlock('fields_and_input2'); + var singleBlock = this.singleBlockWorkspace.newBlock('two_fields'); + + this.blocks.noNextConnection = noNextConnection; + this.blocks.fieldAndInputs = fieldAndInputs; + this.blocks.twoFields = twoFields; + this.blocks.fieldAndInputs2 = fieldAndInputs2; + this.blocks.singleBlock = singleBlock; + + + }); + teardown(function() { + delete this.blocks.noNextConnection; + delete this.blocks.fieldAndInputs; + delete this.blocks.twoFields; + delete this.blocks.fieldAndInputs2; + delete this.blocks.singleBlock; + + delete Blockly.Blocks['fields_and_input2']; + delete Blockly.Blocks['two_fields']; + delete Blockly.Blocks['fields_and_input']; + delete Blockly.Blocks['top_connection']; + }); + + test('fromPreviousToBlock', function() { + var prevConnection = this.blocks.statementInput1.previousConnection; + var node = Blockly.ASTNode.createConnectionNode(prevConnection); + var nextNode = node.next(); + assertEquals(nextNode.getLocation(), this.blocks.statementInput1); + }); + test('fromBlockToNext', function() { + var nextConnection = this.blocks.statementInput1.nextConnection; + var node = Blockly.ASTNode.createBlockNode(this.blocks.statementInput1); + var nextNode = node.next(); + assertEquals(nextNode.getLocation(), nextConnection); + }); + test('fromBlockToNull', function() { + var node = Blockly.ASTNode.createBlockNode(this.blocks.noNextConnection); + var nextNode = node.next(); + assertEquals(nextNode, null); + }); + test('fromNextToPrevious', function() { + var nextConnection = this.blocks.statementInput1.nextConnection; + var prevConnection = this.blocks.statementInput2.previousConnection; + var node = Blockly.ASTNode.createConnectionNode(nextConnection); + var nextNode = node.next(); + assertEquals(nextNode.getLocation(), prevConnection); + }); + test('fromNextToNull', function() { + var nextConnection = this.blocks.statementInput2.nextConnection; + var node = Blockly.ASTNode.createConnectionNode(nextConnection); + var nextNode = node.next(); + assertEquals(nextNode, null); + }); + test('fromInputToInput', function() { + var input = this.blocks.statementInput1.inputList[0]; + var inputConnection = this.blocks.statementInput1.inputList[1].connection; + var node = Blockly.ASTNode.createInputNode(input); + var nextNode = node.next(); + assertEquals(nextNode.getLocation(), inputConnection); + }); + test('fromInputToStatementInput', function() { + var input = this.blocks.fieldAndInputs2.inputList[1]; + var inputConnection = this.blocks.fieldAndInputs2.inputList[2].connection; + var node = Blockly.ASTNode.createInputNode(input); + var nextNode = node.next(); + assertEquals(nextNode.getLocation(), inputConnection); + }); + test('fromInputToField', function() { + var input = this.blocks.fieldAndInputs2.inputList[0]; + var field = this.blocks.fieldAndInputs2.inputList[1].fieldRow[0]; + var node = Blockly.ASTNode.createInputNode(input); + var nextNode = node.next(); + assertEquals(nextNode.getLocation(), field); + }); + test('fromInputToNull', function() { + var input = this.blocks.fieldAndInputs2.inputList[2]; + var node = Blockly.ASTNode.createInputNode(input); + var nextNode = node.next(); + assertEquals(nextNode, null); + }); + test('fromOutputToBlock', function() { + var output = this.blocks.fieldWithOutput.outputConnection; + var node = Blockly.ASTNode.createConnectionNode(output); + var nextNode = node.next(); + assertEquals(nextNode.getLocation(), this.blocks.fieldWithOutput); + }); + test('fromFieldToInput', function() { + var field = this.blocks.statementInput1.inputList[0].fieldRow[1]; + var inputConnection = this.blocks.statementInput1.inputList[0].connection; + var node = Blockly.ASTNode.createFieldNode(field); + var nextNode = node.next(); + assertEquals(nextNode.getLocation(), inputConnection); + }); + test('fromFieldToField', function() { + var field = this.blocks.fieldAndInputs.inputList[0].fieldRow[0]; + var node = Blockly.ASTNode.createFieldNode(field); + var field2 = this.blocks.fieldAndInputs.inputList[1].fieldRow[0]; + var nextNode = node.next(); + assertEquals(nextNode.getLocation(), field2); + }); + test('fromFieldToNull', function() { + var field = this.blocks.twoFields.inputList[0].fieldRow[0]; + var node = Blockly.ASTNode.createFieldNode(field); + var nextNode = node.next(); + assertEquals(nextNode, null); + }); + test('fromStackToStack', function() { + var node = Blockly.ASTNode.createStackNode(this.blocks.statementInput1); + var nextNode = node.next(); + assertEquals(nextNode.getLocation(), this.blocks.statementInput4); + assertEquals(nextNode.getType(), Blockly.ASTNode.types.STACK); + }); + test('fromStackToNull', function() { + var node = Blockly.ASTNode.createStackNode(this.blocks.singleBlock); + var nextNode = node.next(); + assertEquals(nextNode, null); + }); + }); + + suite('Previous', function() { + setup(function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "start_block", + "message0": "", + "nextStatement": null, + "colour": 230, + "tooltip": "", + "helpUrl": "" + }, + { + "type": "fields_and_input", + "message0": "%1 hi %2 %3 %4", + "args0": [ + { + "type": "field_input", + "name": "NAME", + "text": "default" + }, + { + "type": "input_dummy" + }, + { + "type": "field_input", + "name": "NAME", + "text": "default" + }, + { + "type": "input_value", + "name": "NAME" + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": 230, + "tooltip": "", + "helpUrl": "" + }, + { + "type": "fields_and_input2", + "message0": "%1 %2 %3 hi %4 bye", + "args0": [ + { + "type": "input_value", + "name": "NAME" + }, + { + "type": "field_input", + "name": "NAME", + "text": "default" + }, + { + "type": "input_value", + "name": "NAME" + }, + { + "type": "input_statement", + "name": "NAME" + } + ], + "colour": 230, + "tooltip": "", + "helpUrl": "" + }]); + + var noPrevConnection = this.workspace.newBlock('start_block'); + var fieldsAndInputs = this.workspace.newBlock('fields_and_input'); + var fieldsAndInputs2 = this.workspace.newBlock('fields_and_input2'); + + this.blocks.noPrevConnection = noPrevConnection; + this.blocks.fieldsAndInputs = fieldsAndInputs; + this.blocks.fieldsAndInputs2 = fieldsAndInputs2; + }); + teardown(function() { + delete this.blocks.noPrevConnection; + delete this.blocks.fieldAndInputs; + delete this.blocks.fieldsAndInputs2; + + delete Blockly.Blocks['fields_and_input2']; + delete Blockly.Blocks['start_block']; + delete Blockly.Blocks['fields_and_input']; + }); + + test('fromPreviousToNull', function() { + var prevConnection = this.blocks.statementInput1.previousConnection; + var node = Blockly.ASTNode.createConnectionNode(prevConnection); + var prevNode = node.prev(); + assertEquals(prevNode, null); + }); + test('fromPreviousToNext', function() { + var prevConnection = this.blocks.statementInput2.previousConnection; + var node = Blockly.ASTNode.createConnectionNode(prevConnection); + var prevNode = node.prev(); + var nextConnection = this.blocks.statementInput1.nextConnection; + assertEquals(prevNode.getLocation(), nextConnection); + }); + test('fromPreviousToInput', function() { + var prevConnection = this.blocks.statementInput3.previousConnection; + var node = Blockly.ASTNode.createConnectionNode(prevConnection); + var prevNode = node.prev(); + assertEquals(prevNode, null); + }); + test('fromBlockToPrevious', function() { + var node = Blockly.ASTNode.createBlockNode(this.blocks.statementInput1); + var prevNode = node.prev(); + var prevConnection = this.blocks.statementInput1.previousConnection; + assertEquals(prevNode.getLocation(), prevConnection); + }); + test('fromBlockToNull', function() { + var node = Blockly.ASTNode.createBlockNode(this.blocks.noPrevConnection); + var prevNode = node.prev(); + assertEquals(prevNode, null); + }); + test('fromBlockToOutput', function() { + var node = Blockly.ASTNode.createBlockNode(this.blocks.fieldWithOutput); + var prevNode = node.prev(); + var outputConnection = this.blocks.fieldWithOutput.outputConnection; + assertEquals(prevNode.getLocation(), outputConnection); + }); + test('fromNextToBlock', function() { + var nextConnection = this.blocks.statementInput1.nextConnection; + var node = Blockly.ASTNode.createConnectionNode(nextConnection); + var prevNode = node.prev(); + assertEquals(prevNode.getLocation(), this.blocks.statementInput1); + }); + test('fromInputToField', function() { + var input = this.blocks.statementInput1.inputList[0]; + var node = Blockly.ASTNode.createInputNode(input); + var prevNode = node.prev(); + assertEquals(prevNode.getLocation(), input.fieldRow[1]); + }); + test('fromInputToNull', function() { + var input = this.blocks.fieldsAndInputs2.inputList[0]; + var node = Blockly.ASTNode.createInputNode(input); + var prevNode = node.prev(); + assertEquals(prevNode, null); + }); + test('fromInputToInput', function() { + var input = this.blocks.fieldsAndInputs2.inputList[2]; + var inputConnection = this.blocks.fieldsAndInputs2.inputList[1].connection; + var node = Blockly.ASTNode.createInputNode(input); + var prevNode = node.prev(); + assertEquals(prevNode.getLocation(), inputConnection); + }); + test('fromOutputToNull', function() { + var output = this.blocks.fieldWithOutput.outputConnection; + var node = Blockly.ASTNode.createConnectionNode(output); + var prevNode = node.prev(); + assertEquals(prevNode, null); + }); + test('fromFieldToNull', function() { + var field = this.blocks.statementInput1.inputList[0].fieldRow[0]; + var node = Blockly.ASTNode.createFieldNode(field); + var prevNode = node.prev(); + assertEquals(prevNode, null); + }); + test('fromFieldToInput', function() { + var field = this.blocks.fieldsAndInputs2.inputList[1].fieldRow[0]; + var inputConnection = this.blocks.fieldsAndInputs2.inputList[0].connection; + var node = Blockly.ASTNode.createFieldNode(field); + var prevNode = node.prev(); + assertEquals(prevNode.getLocation(), inputConnection); + }); + test('fromFieldToField', function() { + var field = this.blocks.fieldsAndInputs.inputList[1].fieldRow[0]; + var field2 = this.blocks.fieldsAndInputs.inputList[0].fieldRow[0]; + var node = Blockly.ASTNode.createFieldNode(field); + var prevNode = node.prev(); + assertEquals(prevNode.getLocation(), field2); + }); + test('fromStackToStack', function() { + var node = Blockly.ASTNode.createStackNode(this.blocks.statementInput4); + var prevNode = node.prev(); + assertEquals(prevNode.getLocation(), this.blocks.statementInput1); + assertEquals(prevNode.getType(), Blockly.ASTNode.types.STACK); + }); + }); + + suite('In', function() { + setup(function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "dummy_input", + "message0": "Hello", + "colour": 230, + "tooltip": "", + "helpUrl": "" + }, + { + "type": "dummy_inputValue", + "message0": "Hello %1 %2", + "args0": [ + { + "type": "input_dummy" + }, + { + "type": "input_value", + "name": "NAME" + } + ], + "colour": 230, + "tooltip": "", + "helpUrl": "" + }]); + var dummyInput = this.workspace.newBlock('dummy_input'); + var dummyInputValue = this.workspace.newBlock('dummy_inputValue'); + var fieldWithOutput2 = this.workspace.newBlock('field_input'); + + this.blocks.dummyInput = dummyInput; + this.blocks.dummyInputValue = dummyInputValue; + this.blocks.fieldWithOutput2 = fieldWithOutput2; + this.emptyWorkspace = new Blockly.Workspace(); + }); + teardown(function() { + delete this.blocks.dummyInput; + delete this.blocks.dummyInputValue; + delete this.blocks.fieldWithOutput2; + delete this.emptyWorkspace; + + delete Blockly.Blocks['dummy_input']; + delete Blockly.Blocks['dummy_inputValue']; + }); + + test('fromInputToOutput', function() { + var input = this.blocks.statementInput1.inputList[0]; + var node = Blockly.ASTNode.createInputNode(input); + var inNode = node.in(); + var outputConnection = this.blocks.fieldWithOutput.outputConnection; + assertEquals(inNode.getLocation(), outputConnection); + }); + test('fromInputToNull', function() { + var input = this.blocks.statementInput2.inputList[0]; + var node = Blockly.ASTNode.createInputNode(input); + var inNode = node.in(); + assertEquals(inNode, null); + }); + test('fromInputToPrevious', function() { + var input = this.blocks.statementInput2.inputList[1]; + var previousConnection = this.blocks.statementInput3.previousConnection; + var node = Blockly.ASTNode.createInputNode(input); + var inNode = node.in(); + assertEquals(inNode.getLocation(), previousConnection); + }); + test('fromBlockToInput', function() { + var input = this.blocks.valueInput.inputList[0]; + var node = Blockly.ASTNode.createBlockNode(this.blocks.valueInput); + var inNode = node.in(); + assertEquals(inNode.getLocation(), input.connection); + }); + test('fromBlockToField', function() { + var node = Blockly.ASTNode.createBlockNode(this.blocks.statementInput1); + var inNode = node.in(); + var field = this.blocks.statementInput1.inputList[0].fieldRow[0]; + assertEquals(inNode.getLocation(), field); + }); + test('fromBlockToPrevious', function() { + var prevConnection = this.blocks.statementInput4.previousConnection; + var node = Blockly.ASTNode.createStackNode(this.blocks.statementInput4); + var inNode = node.in(); + assertEquals(inNode.getLocation(), prevConnection); + assertEquals(inNode.getType(), Blockly.ASTNode.types.PREVIOUS); + }); + test('fromBlockToNull_DummyInput', function() { + var node = Blockly.ASTNode.createBlockNode(this.blocks.dummyInput); + var inNode = node.in(); + assertEquals(inNode, null); + }); + test('fromBlockToInput_DummyInputValue', function() { + var node = Blockly.ASTNode.createBlockNode(this.blocks.dummyInputValue); + var inputConnection = this.blocks.dummyInputValue.inputList[1].connection; + var inNode = node.in(); + assertEquals(inNode.getLocation(), inputConnection); + }); + test('fromOuputToNull', function() { + var output = this.blocks.fieldWithOutput.outputConnection; + var node = Blockly.ASTNode.createConnectionNode(output); + var inNode = node.in(); + assertEquals(inNode, null); + }); + test('fromFieldToNull', function() { + var field = this.blocks.statementInput1.inputList[0].fieldRow[0]; + var node = Blockly.ASTNode.createFieldNode(field); + var inNode = node.in(); + assertEquals(inNode, null); + }); + test('fromWorkspaceToStack', function() { + var coordinate = new Blockly.utils.Coordinate(100, 100); + var node = Blockly.ASTNode.createWorkspaceNode(this.workspace, coordinate); + var inNode = node.in(); + assertEquals(inNode.getLocation(), this.workspace.getTopBlocks()[0]); + assertEquals(inNode.getType(), Blockly.ASTNode.types.STACK); + }); + test('fromWorkspaceToNull', function() { + var coordinate = new Blockly.utils.Coordinate(100, 100); + var node = Blockly.ASTNode.createWorkspaceNode( + this.emptyWorkspace, coordinate); + var inNode = node.in(); + assertEquals(inNode, null); + }); + test('fromStackToPrevious', function() { + var node = Blockly.ASTNode.createStackNode(this.blocks.statementInput1); + var previous = this.blocks.statementInput1.previousConnection; + var inNode = node.in(); + assertEquals(inNode.getLocation(), previous); + assertEquals(inNode.getType(), Blockly.ASTNode.types.PREVIOUS); + }); + test('fromStackToOutput', function() { + var node = Blockly.ASTNode.createStackNode(this.blocks.fieldWithOutput2); + var output = this.blocks.fieldWithOutput2.outputConnection; + var inNode = node.in(); + assertEquals(inNode.getLocation(), output); + assertEquals(inNode.getType(), Blockly.ASTNode.types.OUTPUT); + }); + test('fromStackToBlock', function() { + var node = Blockly.ASTNode.createStackNode(this.blocks.dummyInput); + var inNode = node.in(); + assertEquals(inNode.getLocation(), this.blocks.dummyInput); + assertEquals(inNode.getType(), Blockly.ASTNode.types.BLOCK); + }); + }); + + suite('Out', function() { + setup(function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "start_block", + "message0": "", + "nextStatement": null, + "colour": 230, + "tooltip": "", + "helpUrl": "" + }, + { + "type": "output_next", + "message0": "", + "output": null, + "colour": 230, + "tooltip": "", + "helpUrl": "", + "nextStatement": null + }]); + var noPrevConnection = this.workspace.newBlock('start_block'); + var secondBlock = this.workspace.newBlock('input_statement'); + var outputNextBlock = this.workspace.newBlock('output_next'); + var fieldWithOutput2 = this.workspace.newBlock('field_input'); + + noPrevConnection.nextConnection.connect(secondBlock.previousConnection); + secondBlock.inputList[0].connection + .connect(outputNextBlock.outputConnection); + this.blocks.noPrevConnection = noPrevConnection; + this.blocks.secondBlock = secondBlock; + this.blocks.outputNextBlock = outputNextBlock; + this.blocks.fieldWithOutput2 = fieldWithOutput2; + }); + teardown(function() { + delete this.blocks.noPrevConnection; + delete this.blocks.secondBlock; + delete this.blocks.outputNextBlock; + delete this.blocks.fieldWithOutput2; + + delete Blockly.Blocks['start_block']; + delete Blockly.Blocks['output_next']; + }); + + test('fromInputToBlock', function() { + var input = this.blocks.statementInput1.inputList[0]; + var node = Blockly.ASTNode.createInputNode(input); + var outNode = node.out(); + chai.assert.equal(outNode.getType(), Blockly.ASTNode.types.BLOCK); + chai.assert.equal(outNode.getLocation(), this.blocks.statementInput1); + }); + test('fromOutputToInput', function() { + var output = this.blocks.fieldWithOutput.outputConnection; + var node = Blockly.ASTNode.createConnectionNode(output); + var outNode = node.out(); + chai.assert.equal(outNode.getType(), Blockly.ASTNode.types.INPUT); + chai.assert.equal(outNode.getLocation(), + this.blocks.statementInput1.inputList[0].connection); + }); + test('fromOutputToStack', function() { + var output = this.blocks.fieldWithOutput2.outputConnection; + var node = Blockly.ASTNode.createConnectionNode(output); + var outNode = node.out(); + chai.assert.equal(outNode.getType(), Blockly.ASTNode.types.STACK); + chai.assert.equal(outNode.getLocation(), this.blocks.fieldWithOutput2); + }); + test('fromFieldToBlock', function() { + var field = this.blocks.statementInput1.inputList[0].fieldRow[0]; + var node = Blockly.ASTNode.createFieldNode(field); + var outNode = node.out(); + chai.assert.equal(outNode.getType(), Blockly.ASTNode.types.BLOCK); + chai.assert.equal(outNode.getLocation(), this.blocks.statementInput1); + }); + test('fromStackToWorkspace', function() { + var stub = sinon.stub(this.blocks.statementInput4, + "getRelativeToSurfaceXY").returns({x: 10, y:10}); + var node = Blockly.ASTNode.createStackNode(this.blocks.statementInput4); + var outNode = node.out(); + chai.assert.equal(outNode.getType(), Blockly.ASTNode.types.WORKSPACE); + chai.assert.equal(outNode.wsCoordinate_.x, 10); + chai.assert.equal(outNode.wsCoordinate_.y, -10); + stub.restore(); + }); + test('fromPreviousToInput', function() { + var previous = this.blocks.statementInput3.previousConnection; + var inputConnection = this.blocks.statementInput2.inputList[1].connection; + var node = Blockly.ASTNode.createConnectionNode(previous); + var outNode = node.out(); + chai.assert.equal(outNode.getType(), Blockly.ASTNode.types.INPUT); + chai.assert.equal(outNode.getLocation(), inputConnection); + }); + test('fromPreviousToStack', function() { + var previous = this.blocks.statementInput2.previousConnection; + var node = Blockly.ASTNode.createConnectionNode(previous); + var outNode = node.out(); + chai.assert.equal(outNode.getType(), Blockly.ASTNode.types.STACK); + chai.assert.equal(outNode.getLocation(), this.blocks.statementInput1); + }); + test('fromNextToInput', function() { + var next = this.blocks.statementInput3.nextConnection; + var inputConnection = this.blocks.statementInput2.inputList[1].connection; + var node = Blockly.ASTNode.createConnectionNode(next); + var outNode = node.out(); + chai.assert.equal(outNode.getType(), Blockly.ASTNode.types.INPUT); + chai.assert.equal(outNode.getLocation(), inputConnection); + }); + test('fromNextToStack', function() { + var next = this.blocks.statementInput2.nextConnection; + var node = Blockly.ASTNode.createConnectionNode(next); + var outNode = node.out(); + chai.assert.equal(outNode.getType(), Blockly.ASTNode.types.STACK); + chai.assert.equal(outNode.getLocation(), this.blocks.statementInput1); + }); + test('fromNextToStack_NoPreviousConnection', function() { + var next = this.blocks.secondBlock.nextConnection; + var node = Blockly.ASTNode.createConnectionNode(next); + var outNode = node.out(); + chai.assert.equal(outNode.getType(), Blockly.ASTNode.types.STACK); + chai.assert.equal(outNode.getLocation(), this.blocks.noPrevConnection); + }); + /** + * This is where there is a block with both an output connection and a + * next connection attached to an input. + */ + test('fromNextToInput_OutputAndPreviousConnection', function() { + var next = this.blocks.outputNextBlock.nextConnection; + var node = Blockly.ASTNode.createConnectionNode(next); + var outNode = node.out(); + chai.assert.equal(outNode.getType(), Blockly.ASTNode.types.INPUT); + chai.assert.equal(outNode.getLocation(), + this.blocks.secondBlock.inputList[0].connection); + }); + test('fromBlockToStack', function() { + var node = Blockly.ASTNode.createBlockNode(this.blocks.statementInput2); + var outNode = node.out(); + chai.assert.equal(outNode.getType(), Blockly.ASTNode.types.STACK); + chai.assert.equal(outNode.getLocation(), this.blocks.statementInput1); + }); + test('fromBlockToInput', function() { + var input = this.blocks.statementInput2.inputList[1].connection; + var node = Blockly.ASTNode.createBlockNode(this.blocks.statementInput3); + var outNode = node.out(); + chai.assert.equal(outNode.getType(), Blockly.ASTNode.types.INPUT); + chai.assert.equal(outNode.getLocation(), input); + }); + test('fromTopBlockToStack', function() { + var node = Blockly.ASTNode.createBlockNode(this.blocks.statementInput1); + var outNode = node.out(); + chai.assert.equal(outNode.getType(), Blockly.ASTNode.types.STACK); + chai.assert.equal(outNode.getLocation(), this.blocks.statementInput1); + }); + test('fromBlockToStack_OutputConnection', function() { + var node = Blockly.ASTNode.createBlockNode(this.blocks.fieldWithOutput2); + var outNode = node.out(); + chai.assert.equal(outNode.getType(), Blockly.ASTNode.types.STACK); + chai.assert.equal(outNode.getLocation(), this.blocks.fieldWithOutput2); + }); + test('fromBlockToInput_OutputConnection', function() { + var node = Blockly.ASTNode.createBlockNode(this.blocks.outputNextBlock); + var inputConnection = this.blocks.secondBlock.inputList[0].connection; + var outNode = node.out(); + chai.assert.equal(outNode.getType(), Blockly.ASTNode.types.INPUT); + chai.assert.equal(outNode.getLocation(), inputConnection); + }); + }); + + suite('createFunctions', function() { + test('createFieldNode', function() { + var field = this.blocks.statementInput1.inputList[0].fieldRow[0]; + var node = Blockly.ASTNode.createFieldNode(field); + assertEquals(node.getLocation(), field); + assertEquals(node.getType(), Blockly.ASTNode.types.FIELD); + assertFalse(node.isConnection()); + }); + test('createConnectionNode', function() { + var prevConnection = this.blocks.statementInput4.previousConnection; + var node = Blockly.ASTNode.createConnectionNode(prevConnection); + assertEquals(node.getLocation(), prevConnection); + assertEquals(node.getType(), Blockly.ASTNode.types.PREVIOUS); + assertTrue(node.isConnection()); + }); + test('createInputNode', function() { + var input = this.blocks.statementInput1.inputList[0]; + var node = Blockly.ASTNode.createInputNode(input); + assertEquals(node.getLocation(), input.connection); + assertEquals(node.getType(), Blockly.ASTNode.types.INPUT); + assertTrue(node.isConnection()); + }); + test('createWorkspaceNode', function() { + var coordinate = new Blockly.utils.Coordinate(100, 100); + var node = Blockly.ASTNode + .createWorkspaceNode(this.workspace, coordinate); + assertEquals(node.getLocation(), this.workspace); + assertEquals(node.getType(), Blockly.ASTNode.types.WORKSPACE); + assertEquals(node.getWsCoordinate(), coordinate); + assertFalse(node.isConnection()); + }); + test('createStatementConnectionNode', function() { + var nextConnection = this.blocks.statementInput1.inputList[1].connection; + var inputConnection = this.blocks.statementInput1.inputList[1].connection; + var node = Blockly.ASTNode.createConnectionNode(nextConnection); + assertEquals(node.getLocation(), inputConnection); + assertEquals(node.getType(), Blockly.ASTNode.types.INPUT); + assertTrue(node.isConnection()); + }); + }); + }); +}); diff --git a/js/tests/mocha/block_test.js b/js/tests/mocha/block_test.js new file mode 100644 index 0000000..80dca09 --- /dev/null +++ b/js/tests/mocha/block_test.js @@ -0,0 +1,1314 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +suite('Blocks', function() { + setup(function() { + this.workspace = new Blockly.Workspace(); + Blockly.defineBlocksWithJsonArray([ + { + "type": "empty_block", + "message0": "" + }, + { + "type": "stack_block", + "message0": "", + "previousStatement": null, + "nextStatement": null + }, + { + "type": "row_block", + "message0": "%1", + "args0": [ + { + "type": "input_value", + "name": "INPUT" + } + ], + "output": null + }, + { + "type": "statement_block", + "message0": "%1", + "args0": [ + { + "type": "input_statement", + "name": "STATEMENT" + } + ], + "previousStatement": null, + "nextStatement": null + }]); + }); + teardown(function() { + this.workspace.dispose(); + delete Blockly.Blocks['stack_block']; + delete Blockly.Blocks['row_block']; + delete Blockly.Blocks['statement_block']; + }); + + suite('Unplug', function() { + function assertUnpluggedNoheal(blocks) { + // A has nothing connected to it. + assertEquals(0, blocks.A.getChildren().length); + // B and C are still connected. + assertEquals(blocks.B, blocks.C.getParent()); + // B is the top of its stack. + assertNull(blocks.B.getParent()); + } + function assertUnpluggedHealed(blocks) { + // A and C are connected. + assertEquals(1, blocks.A.getChildren().length); + assertEquals(blocks.A, blocks.C.getParent()); + // B has nothing connected to it. + assertEquals(0, blocks.B.getChildren().length); + // B is the top of its stack. + assertNull(blocks.B.getParent()); + } + function assertUnpluggedHealFailed(blocks) { + // A has nothing connected to it. + assertEquals(0, blocks.A.getChildren().length); + // B has nothing connected to it. + assertEquals(0, blocks.B.getChildren().length); + // B is the top of its stack. + assertNull(blocks.B.getParent()); + // C is the top of its stack. + assertNull(blocks.C.getParent()); + } + + suite('Row', function() { + setup(function() { + var blockA = this.workspace.newBlock('row_block'); + var blockB = this.workspace.newBlock('row_block'); + var blockC = this.workspace.newBlock('row_block'); + + blockA.inputList[0].connection.connect(blockB.outputConnection); + blockB.inputList[0].connection.connect(blockC.outputConnection); + + assertEquals(blockB, blockC.getParent()); + + this.blocks = { + A: blockA, + B: blockB, + C: blockC + }; + }); + + test('Don\'t heal', function() { + this.blocks.B.unplug(false); + assertUnpluggedNoheal(this.blocks); + }); + test('Heal', function() { + this.blocks.B.unplug(true); + // Each block has only one input, and the types work. + assertUnpluggedHealed(this.blocks); + }); + test('Heal with bad checks', function() { + var blocks = this.blocks; + + // A and C can't connect, but both can connect to B. + blocks.A.inputList[0].connection.setCheck('type1'); + blocks.C.outputConnection.setCheck('type2'); + + // Each block has only one input, but the types don't work. + blocks.B.unplug(true); + assertUnpluggedHealFailed(blocks); + }); + test('A has multiple inputs', function() { + var blocks = this.blocks; + // Add extra input to parent + blocks.A.appendValueInput("INPUT").setCheck(null); + blocks.B.unplug(true); + assertUnpluggedHealed(blocks); + }); + test('B has multiple inputs', function() { + var blocks = this.blocks; + // Add extra input to middle block + blocks.B.appendValueInput("INPUT").setCheck(null); + blocks.B.unplug(true); + assertUnpluggedHealed(blocks); + }); + test('C has multiple inputs', function() { + var blocks = this.blocks; + // Add extra input to child block + blocks.C.appendValueInput("INPUT").setCheck(null); + // Child block input count doesn't matter. + blocks.B.unplug(true); + assertUnpluggedHealed(blocks); + }); + test('C is Shadow', function() { + var blocks = this.blocks; + blocks.C.setShadow(true); + blocks.B.unplug(true); + // Even though we're asking to heal, it will appear as if it has not + // healed because shadows always stay with the parent. + assertUnpluggedNoheal(blocks); + }); + }); + suite('Stack', function() { + setup(function() { + var blockA = this.workspace.newBlock('stack_block'); + var blockB = this.workspace.newBlock('stack_block'); + var blockC = this.workspace.newBlock('stack_block'); + + blockA.nextConnection.connect(blockB.previousConnection); + blockB.nextConnection.connect(blockC.previousConnection); + + assertEquals(blockB, blockC.getParent()); + + this.blocks = { + A: blockA, + B: blockB, + C: blockC + }; + }); + + test('Don\'t heal', function() { + this.blocks.B.unplug(); + assertUnpluggedNoheal(this.blocks); + }); + test('Heal', function() { + this.blocks.B.unplug(true); + assertUnpluggedHealed(this.blocks); + }); + test('Heal with bad checks', function() { + var blocks = this.blocks; + // A and C can't connect, but both can connect to B. + blocks.A.nextConnection.setCheck('type1'); + blocks.C.previousConnection.setCheck('type2'); + + // The types don't work. + blocks.B.unplug(true); + + assertUnpluggedHealFailed(blocks); + }); + test('C is Shadow', function() { + var blocks = this.blocks; + blocks.C.setShadow(true); + blocks.B.unplug(true); + // Even though we're asking to heal, it will appear as if it has not + // healed because shadows always stay with the parent. + assertUnpluggedNoheal(blocks); + }); + }); + }); + suite('Dispose', function() { + function assertDisposedNoheal(blocks) { + chai.assert.isFalse(blocks.A.disposed); + // A has nothing connected to it. + chai.assert.equal(0, blocks.A.getChildren().length); + // B is disposed. + chai.assert.isTrue(blocks.B.disposed); + // And C is disposed. + chai.assert.isTrue(blocks.C.disposed); + } + function assertDisposedHealed(blocks) { + chai.assert.isFalse(blocks.A.disposed); + chai.assert.isFalse(blocks.C.disposed); + // A and C are connected. + assertEquals(1, blocks.A.getChildren().length); + assertEquals(blocks.A, blocks.C.getParent()); + // B is disposed. + chai.assert.isTrue(blocks.B.disposed); + } + function assertDisposedHealFailed(blocks) { + chai.assert.isFalse(blocks.A.disposed); + chai.assert.isFalse(blocks.C.disposed); + // A has nothing connected to it. + chai.assert.equal(0, blocks.A.getChildren().length); + // B is disposed. + chai.assert.isTrue(blocks.B.disposed); + // C is the top of its stack. + assertNull(blocks.C.getParent()); + } + + suite('Row', function() { + setup(function() { + var blockA = this.workspace.newBlock('row_block'); + var blockB = this.workspace.newBlock('row_block'); + var blockC = this.workspace.newBlock('row_block'); + + blockA.inputList[0].connection.connect(blockB.outputConnection); + blockB.inputList[0].connection.connect(blockC.outputConnection); + + assertEquals(blockB, blockC.getParent()); + + this.blocks = { + A: blockA, + B: blockB, + C: blockC + }; + }); + + test('Don\'t heal', function() { + this.blocks.B.dispose(false); + assertDisposedNoheal(this.blocks); + }); + test('Heal', function() { + this.blocks.B.dispose(true); + // Each block has only one input, and the types work. + assertDisposedHealed(this.blocks); + }); + test('Heal with bad checks', function() { + var blocks = this.blocks; + + // A and C can't connect, but both can connect to B. + blocks.A.inputList[0].connection.setCheck('type1'); + blocks.C.outputConnection.setCheck('type2'); + + // Each block has only one input, but the types don't work. + blocks.B.dispose(true); + assertDisposedHealFailed(blocks); + }); + test('A has multiple inputs', function() { + var blocks = this.blocks; + // Add extra input to parent + blocks.A.appendValueInput("INPUT").setCheck(null); + blocks.B.dispose(true); + assertDisposedHealed(blocks); + }); + test('B has multiple inputs', function() { + var blocks = this.blocks; + // Add extra input to middle block + blocks.B.appendValueInput("INPUT").setCheck(null); + blocks.B.dispose(true); + assertDisposedHealed(blocks); + }); + test('C has multiple inputs', function() { + var blocks = this.blocks; + // Add extra input to child block + blocks.C.appendValueInput("INPUT").setCheck(null); + // Child block input count doesn't matter. + blocks.B.dispose(true); + assertDisposedHealed(blocks); + }); + test('C is Shadow', function() { + var blocks = this.blocks; + blocks.C.setShadow(true); + blocks.B.dispose(true); + // Even though we're asking to heal, it will appear as if it has not + // healed because shadows always get destroyed. + assertDisposedNoheal(blocks); + }); + }); + suite('Stack', function() { + setup(function() { + var blockA = this.workspace.newBlock('stack_block'); + var blockB = this.workspace.newBlock('stack_block'); + var blockC = this.workspace.newBlock('stack_block'); + + blockA.nextConnection.connect(blockB.previousConnection); + blockB.nextConnection.connect(blockC.previousConnection); + + assertEquals(blockB, blockC.getParent()); + + this.blocks = { + A: blockA, + B: blockB, + C: blockC + }; + }); + + test('Don\'t heal', function() { + this.blocks.B.dispose(); + assertDisposedNoheal(this.blocks); + }); + test('Heal', function() { + this.blocks.B.dispose(true); + assertDisposedHealed(this.blocks); + }); + test('Heal with bad checks', function() { + var blocks = this.blocks; + // A and C can't connect, but both can connect to B. + blocks.A.nextConnection.setCheck('type1'); + blocks.C.previousConnection.setCheck('type2'); + + // The types don't work. + blocks.B.dispose(true); + + assertDisposedHealFailed(blocks); + }); + test('C is Shadow', function() { + var blocks = this.blocks; + blocks.C.setShadow(true); + blocks.B.dispose(true); + // Even though we're asking to heal, it will appear as if it has not + // healed because shadows always get destroyed. + assertDisposedNoheal(blocks); + }); + }); + }); + suite('Remove Input', function() { + setup(function() { + Blockly.defineBlocksWithJsonArray([ + { + "type": "value_block", + "message0": "%1", + "args0": [ + { + "type": "input_value", + "name": "VALUE" + } + ] + }, + { + "type": "statement_block", + "message0": "%1", + "args0": [ + { + "type": "input_statement", + "name": "STATEMENT" + } + ] + }, + ]); + }); + teardown(function() { + delete Blockly.Blocks['value_block']; + delete Blockly.Blocks['statement_block']; + }); + + suite('Value', function() { + setup(function() { + this.blockA = this.workspace.newBlock('value_block'); + }); + + test('No Connected', function() { + this.blockA.removeInput('VALUE'); + chai.assert.isNull(this.blockA.getInput('VALUE')); + }); + test('Block Connected', function() { + var blockB = this.workspace.newBlock('row_block'); + this.blockA.getInput('VALUE').connection + .connect(blockB.outputConnection); + + this.blockA.removeInput('VALUE'); + chai.assert.isFalse(blockB.disposed); + chai.assert.equal(this.blockA.getChildren().length, 0); + }); + test('Shadow Connected', function() { + var blockB = this.workspace.newBlock('row_block'); + blockB.setShadow(true); + this.blockA.getInput('VALUE').connection + .connect(blockB.outputConnection); + + this.blockA.removeInput('VALUE'); + chai.assert.isTrue(blockB.disposed); + chai.assert.equal(this.blockA.getChildren().length, 0); + }); + }); + suite('Statement', function() { + setup(function() { + this.blockA = this.workspace.newBlock('statement_block'); + }); + + test('No Connected', function() { + this.blockA.removeInput('STATEMENT'); + chai.assert.isNull(this.blockA.getInput('STATEMENT')); + }); + test('Block Connected', function() { + var blockB = this.workspace.newBlock('stack_block'); + this.blockA.getInput('STATEMENT').connection + .connect(blockB.previousConnection); + + this.blockA.removeInput('STATEMENT'); + chai.assert.isFalse(blockB.disposed); + chai.assert.equal(this.blockA.getChildren().length, 0); + }); + test('Shadow Connected', function() { + var blockB = this.workspace.newBlock('stack_block'); + blockB.setShadow(true); + this.blockA.getInput('STATEMENT').connection + .connect(blockB.previousConnection); + + this.blockA.removeInput('STATEMENT'); + chai.assert.isTrue(blockB.disposed); + chai.assert.equal(this.blockA.getChildren().length, 0); + }); + }); + }); + suite('Connection Tracking', function() { + setup(function() { + this.workspace.dispose(); + // The new rendered workspace will get disposed by the parent teardown. + this.workspace = Blockly.inject('blocklyDiv'); + + this.getInputs = function() { + return this.workspace + .connectionDBList[Blockly.INPUT_VALUE].connections_; + }; + this.getOutputs = function() { + return this.workspace + .connectionDBList[Blockly.OUTPUT_VALUE].connections_; + }; + this.getNext = function() { + return this.workspace + .connectionDBList[Blockly.NEXT_STATEMENT].connections_; + }; + this.getPrevious = function() { + return this.workspace + .connectionDBList[Blockly.PREVIOUS_STATEMENT].connections_; + }; + + this.assertConnectionsEmpty = function() { + chai.assert.isEmpty(this.getInputs()); + chai.assert.isEmpty(this.getOutputs()); + chai.assert.isEmpty(this.getNext()); + chai.assert.isEmpty(this.getPrevious()); + }; + + this.clock = sinon.useFakeTimers(); + }); + teardown(function() { + this.clock.restore(); + }); + suite('Deserialization', function() { + test('Stack', function() { + Blockly.Xml.appendDomToWorkspace(Blockly.Xml.textToDom( + '' + + ' ' + + '' + ), this.workspace); + this.assertConnectionsEmpty(); + this.clock.tick(1); + chai.assert.equal(this.getPrevious().length, 1); + chai.assert.equal(this.getNext().length, 1); + }); + test('Multi-Stack', function() { + Blockly.Xml.appendDomToWorkspace(Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '' + ), this.workspace); + this.assertConnectionsEmpty(); + this.clock.tick(1); + chai.assert.equal(this.getPrevious().length, 3); + chai.assert.equal(this.getNext().length, 3); + }); + test('Collapsed Stack', function() { + Blockly.Xml.appendDomToWorkspace(Blockly.Xml.textToDom( + '' + + ' ' + + '' + ), this.workspace); + this.assertConnectionsEmpty(); + this.clock.tick(1); + chai.assert.equal(this.getPrevious().length, 1); + chai.assert.equal(this.getNext().length, 1); + }); + test('Collapsed Multi-Stack', function() { + Blockly.Xml.appendDomToWorkspace(Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '' + ), this.workspace); + this.assertConnectionsEmpty(); + this.clock.tick(1); + chai.assert.equal(this.getPrevious().length, 3); + chai.assert.equal(this.getNext().length, 3); + }); + test('Row', function() { + Blockly.Xml.appendDomToWorkspace(Blockly.Xml.textToDom( + '' + + ' ' + + '' + ), this.workspace); + this.assertConnectionsEmpty(); + this.clock.tick(1); + chai.assert.equal(this.getOutputs().length, 1); + chai.assert.equal(this.getInputs().length, 1); + }); + test('Multi-Row', function() { + Blockly.Xml.appendDomToWorkspace(Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '' + ), this.workspace); + this.assertConnectionsEmpty(); + this.clock.tick(1); + chai.assert.equal(this.getOutputs().length, 3); + chai.assert.equal(this.getInputs().length, 3); + }); + test('Collapsed Row', function() { + Blockly.Xml.appendDomToWorkspace(Blockly.Xml.textToDom( + '' + + ' ' + + '' + ), this.workspace); + this.assertConnectionsEmpty(); + this.clock.tick(1); + chai.assert.equal(this.getOutputs().length, 1); + chai.assert.equal(this.getInputs().length, 0); + }); + test('Collapsed Multi-Row', function() { + Blockly.Xml.appendDomToWorkspace(Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '' + ), this.workspace); + this.assertConnectionsEmpty(); + this.clock.tick(1); + chai.assert.equal(this.getOutputs().length, 1); + chai.assert.equal(this.getInputs().length, 0); + }); + test('Collapsed Multi-Row Middle', function() { + Blockly.Xml.appendDomToWorkspace(Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '' + ), this.workspace); + this.assertConnectionsEmpty(); + this.clock.tick(1); + chai.assert.equal(this.getOutputs().length, 2); + chai.assert.equal(this.getInputs().length, 1); + }); + test('Statement', function() { + Blockly.Xml.appendDomToWorkspace(Blockly.Xml.textToDom( + '' + + ' ' + + '' + ), this.workspace); + this.assertConnectionsEmpty(); + this.clock.tick(1); + chai.assert.equal(this.getPrevious().length, 1); + chai.assert.equal(this.getNext().length, 2); + }); + test('Multi-Statement', function() { + Blockly.Xml.appendDomToWorkspace(Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '' + ), this.workspace); + this.assertConnectionsEmpty(); + this.clock.tick(1); + chai.assert.equal(this.getPrevious().length, 3); + chai.assert.equal(this.getNext().length, 6); + }); + test('Collapsed Statement', function() { + Blockly.Xml.appendDomToWorkspace(Blockly.Xml.textToDom( + '' + + ' ' + + '' + ), this.workspace); + this.assertConnectionsEmpty(); + this.clock.tick(1); + chai.assert.equal(this.getPrevious().length, 1); + chai.assert.equal(this.getNext().length, 1); + }); + test('Collapsed Multi-Statement', function() { + Blockly.Xml.appendDomToWorkspace(Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '' + ), this.workspace); + this.assertConnectionsEmpty(); + this.clock.tick(1); + chai.assert.equal(this.getPrevious().length, 1); + chai.assert.equal(this.getNext().length, 1); + }); + test('Collapsed Multi-Statement Middle', function() { + Blockly.Xml.appendDomToWorkspace(Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '' + ), this.workspace); + this.assertConnectionsEmpty(); + this.clock.tick(1); + chai.assert.equal(this.getPrevious().length, 2); + chai.assert.equal(this.getNext().length, 3); + }); + }); + suite('Programmatic Block Creation', function() { + test('Stack', function() { + var block = this.workspace.newBlock('stack_block'); + this.assertConnectionsEmpty(); + block.initSvg(); + block.render(); + + chai.assert.equal(this.getPrevious().length, 1); + chai.assert.equal(this.getNext().length, 1); + }); + test('Row', function() { + var block = this.workspace.newBlock('row_block'); + this.assertConnectionsEmpty(); + block.initSvg(); + block.render(); + + chai.assert.equal(this.getOutputs().length, 1); + chai.assert.equal(this.getInputs().length, 1); + }); + test('Statement', function() { + var block = this.workspace.newBlock('statement_block'); + this.assertConnectionsEmpty(); + block.initSvg(); + block.render(); + + chai.assert.equal(this.getPrevious().length, 1); + chai.assert.equal(this.getNext().length, 2); + }); + }); + suite('setCollapsed', function() { + test('Stack', function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + ), this.workspace); + this.clock.tick(1); + chai.assert.equal(this.getPrevious().length, 1); + chai.assert.equal(this.getNext().length, 1); + + block.setCollapsed(true); + chai.assert.equal(this.getPrevious().length, 1); + chai.assert.equal(this.getNext().length, 1); + + block.setCollapsed(false); + chai.assert.equal(this.getPrevious().length, 1); + chai.assert.equal(this.getNext().length, 1); + }); + test('Multi-Stack', function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '' + ), this.workspace); + this.assertConnectionsEmpty(); + this.clock.tick(1); + chai.assert.equal(this.getPrevious().length, 3); + chai.assert.equal(this.getNext().length, 3); + + block.setCollapsed(true); + chai.assert.equal(this.getPrevious().length, 3); + chai.assert.equal(this.getNext().length, 3); + + block.setCollapsed(false); + chai.assert.equal(this.getPrevious().length, 3); + chai.assert.equal(this.getNext().length, 3); + }); + test('Row', function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + ), this.workspace); + this.clock.tick(1); + chai.assert.equal(this.getOutputs().length, 1); + chai.assert.equal(this.getInputs().length, 1); + + block.setCollapsed(true); + chai.assert.equal(this.getOutputs().length, 1); + chai.assert.equal(this.getInputs().length, 0); + + block.setCollapsed(false); + chai.assert.equal(this.getOutputs().length, 1); + chai.assert.equal(this.getInputs().length, 1); + }); + test('Multi-Row', function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '' + ), this.workspace); + this.clock.tick(1); + chai.assert.equal(this.getOutputs().length, 3); + chai.assert.equal(this.getInputs().length, 3); + + block.setCollapsed(true); + chai.assert.equal(this.getOutputs().length, 1); + chai.assert.equal(this.getInputs().length, 0); + + block.setCollapsed(false); + chai.assert.equal(this.getOutputs().length, 3); + chai.assert.equal(this.getInputs().length, 3); + }); + test('Multi-Row Middle', function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '' + ), this.workspace); + this.clock.tick(1); + chai.assert.equal(this.getOutputs().length, 3); + chai.assert.equal(this.getInputs().length, 3); + + block = block.getInputTargetBlock('INPUT'); + block.setCollapsed(true); + chai.assert.equal(this.getOutputs().length, 2); + chai.assert.equal(this.getInputs().length, 1); + + block.setCollapsed(false); + chai.assert.equal(this.getOutputs().length, 3); + chai.assert.equal(this.getInputs().length, 3); + }); + test('Multi-Row Double Collapse', function() { + // Collapse middle -> Collapse top -> + // Uncollapse top -> Uncollapse middle + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '' + ), this.workspace); + this.clock.tick(1); + chai.assert.equal(this.getOutputs().length, 3); + chai.assert.equal(this.getInputs().length, 3); + + var middleBlock = block.getInputTargetBlock('INPUT'); + middleBlock.setCollapsed(true); + chai.assert.equal(this.getOutputs().length, 2); + chai.assert.equal(this.getInputs().length, 1); + + block.setCollapsed(true); + chai.assert.equal(this.getOutputs().length, 1); + chai.assert.equal(this.getInputs().length, 0); + + block.setCollapsed(false); + chai.assert.equal(this.getOutputs().length, 2); + chai.assert.equal(this.getInputs().length, 1); + + middleBlock.setCollapsed(false); + chai.assert.equal(this.getOutputs().length, 3); + chai.assert.equal(this.getInputs().length, 3); + }); + test('Statement', function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + ), this.workspace); + this.clock.tick(1); + chai.assert.equal(this.getPrevious().length, 1); + chai.assert.equal(this.getNext().length, 2); + + block.setCollapsed(true); + chai.assert.equal(this.getPrevious().length, 1); + chai.assert.equal(this.getNext().length, 1); + + block.setCollapsed(false); + chai.assert.equal(this.getPrevious().length, 1); + chai.assert.equal(this.getNext().length, 2); + }); + test('Multi-Statement', function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '' + ), this.workspace); + this.assertConnectionsEmpty(); + this.clock.tick(1); + chai.assert.equal(this.getPrevious().length, 3); + chai.assert.equal(this.getNext().length, 6); + + block.setCollapsed(true); + chai.assert.equal(this.getPrevious().length, 1); + chai.assert.equal(this.getNext().length, 1); + + block.setCollapsed(false); + chai.assert.equal(this.getPrevious().length, 3); + chai.assert.equal(this.getNext().length, 6); + }); + test('Multi-Statement Middle', function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '' + ), this.workspace); + this.assertConnectionsEmpty(); + this.clock.tick(1); + chai.assert.equal(this.getPrevious().length, 3); + chai.assert.equal(this.getNext().length, 6); + + block = block.getInputTargetBlock('STATEMENT'); + block.setCollapsed(true); + chai.assert.equal(this.getPrevious().length, 2); + chai.assert.equal(this.getNext().length, 3); + + block.setCollapsed(false); + chai.assert.equal(this.getPrevious().length, 3); + chai.assert.equal(this.getNext().length, 6); + }); + test('Multi-Statement Double Collapse', function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '' + ), this.workspace); + this.assertConnectionsEmpty(); + this.clock.tick(1); + chai.assert.equal(this.getPrevious().length, 3); + chai.assert.equal(this.getNext().length, 6); + + var middleBlock = block.getInputTargetBlock('STATEMENT'); + middleBlock.setCollapsed(true); + chai.assert.equal(this.getPrevious().length, 2); + chai.assert.equal(this.getNext().length, 3); + + block.setCollapsed(true); + chai.assert.equal(this.getPrevious().length, 1); + chai.assert.equal(this.getNext().length, 1); + + block.setCollapsed(false); + chai.assert.equal(this.getPrevious().length, 2); + chai.assert.equal(this.getNext().length, 3); + + middleBlock.setCollapsed(false); + chai.assert.equal(this.getPrevious().length, 3); + chai.assert.equal(this.getNext().length, 6); + }); + }); + suite('Remove Connections Programmatically', function() { + test('Output', function() { + var block = this.workspace.newBlock('row_block'); + block.initSvg(); + block.render(); + + block.setOutput(false); + + chai.assert.equal(this.getOutputs().length, 0); + chai.assert.equal(this.getInputs().length, 1); + }); + test('Value', function() { + var block = this.workspace.newBlock('row_block'); + block.initSvg(); + block.render(); + + block.removeInput('INPUT'); + + chai.assert.equal(this.getOutputs().length, 1); + chai.assert.equal(this.getInputs().length, 0); + }); + test('Previous', function() { + var block = this.workspace.newBlock('stack_block'); + block.initSvg(); + block.render(); + + block.setPreviousStatement(false); + + chai.assert.equal(this.getPrevious().length, 0); + chai.assert.equal(this.getNext().length, 1); + }); + test('Next', function() { + var block = this.workspace.newBlock('stack_block'); + block.initSvg(); + block.render(); + + block.setNextStatement(false); + + chai.assert.equal(this.getPrevious().length, 1); + chai.assert.equal(this.getNext().length, 0); + }); + test('Statement', function() { + var block = this.workspace.newBlock('statement_block'); + block.initSvg(); + block.render(); + + block.removeInput('STATEMENT'); + + chai.assert.equal(this.getPrevious().length, 1); + chai.assert.equal(this.getNext().length, 1); + }); + }); + suite('Add Connections Programmatically', function() { + test('Output', function() { + var block = this.workspace.newBlock('empty_block'); + block.initSvg(); + block.render(); + + block.setOutput(true); + + chai.assert.equal(this.getOutputs().length, 1); + }); + test('Value', function() { + var block = this.workspace.newBlock('empty_block'); + block.initSvg(); + block.render(); + + block.appendValueInput('INPUT'); + + chai.assert.equal(this.getInputs().length, 1); + }); + test('Previous', function() { + var block = this.workspace.newBlock('empty_block'); + block.initSvg(); + block.render(); + + block.setPreviousStatement(true); + + chai.assert.equal(this.getPrevious().length, 1); + }); + test('Next', function() { + var block = this.workspace.newBlock('empty_block'); + block.initSvg(); + block.render(); + + block.setNextStatement(true); + + chai.assert.equal(this.getNext().length, 1); + }); + test('Statement', function() { + var block = this.workspace.newBlock('empty_block'); + block.initSvg(); + block.render(); + + block.appendStatementInput('STATEMENT'); + + chai.assert.equal(this.getNext().length, 1); + }); + }); + }); + suite('Comments', function() { + setup(function() { + Blockly.defineBlocksWithJsonArray([ + { + "type": "empty_block", + "message0": "", + "args0": [] + }, + ]); + this.eventSpy = sinon.spy(Blockly.Events, 'fire'); + }); + teardown(function() { + delete Blockly.Blocks['empty_block']; + this.eventSpy.restore(); + }); + suite('Set/Get Text', function() { + function assertCommentEvent(eventSpy, oldValue, newValue) { + var calls = eventSpy.getCalls(); + var event = calls[calls.length - 1].args[0]; + chai.assert.equal(event.type, Blockly.Events.BLOCK_CHANGE); + chai.assert.equal(event.element, 'comment'); + chai.assert.equal(event.oldValue, oldValue); + chai.assert.equal(event.newValue, newValue); + } + function assertNoCommentEvent(eventSpy) { + var calls = eventSpy.getCalls(); + var event = calls[calls.length - 1].args[0]; + chai.assert.notEqual(event.type, Blockly.Events.BLOCK_CHANGE); + } + suite('Headless', function() { + setup(function() { + this.block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + ), this.workspace); + }); + test('Text', function() { + this.block.setCommentText('test text'); + chai.assert.equal(this.block.getCommentText(), 'test text'); + assertCommentEvent(this.eventSpy, null, 'test text'); + }); + test('Text Empty', function() { + this.block.setCommentText(''); + chai.assert.equal(this.block.getCommentText(), ''); + assertCommentEvent(this.eventSpy, null, ''); + }); + test('Text Null', function() { + this.block.setCommentText(null); + chai.assert.equal(this.block.getCommentText(), null); + assertNoCommentEvent(this.eventSpy); + }); + test('Text -> Null', function() { + this.block.setCommentText('first text'); + + this.block.setCommentText(null); + chai.assert.equal(this.block.getCommentText(), null); + assertCommentEvent(this.eventSpy, 'first text', null); + }); + }); + suite('Rendered', function() { + setup(function() { + this.workspace = Blockly.inject('blocklyDiv', { + comments: true, + scrollbars: true + }); + this.block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + ), this.workspace); + }); + teardown(function() { + this.workspace.dispose(); + }); + test('Text', function() { + this.block.setCommentText('test text'); + chai.assert.equal(this.block.getCommentText(), 'test text'); + assertCommentEvent(this.eventSpy, null, 'test text'); + }); + test('Text Empty', function() { + this.block.setCommentText(''); + chai.assert.equal(this.block.getCommentText(), ''); + assertCommentEvent(this.eventSpy, null, ''); + }); + test('Text Null', function() { + this.block.setCommentText(null); + chai.assert.equal(this.block.getCommentText(), null); + assertNoCommentEvent(this.eventSpy); + }); + test('Text -> Null', function() { + this.block.setCommentText('first text'); + + this.block.setCommentText(null); + chai.assert.equal(this.block.getCommentText(), null); + assertCommentEvent(this.eventSpy, 'first text', null); + }); + test('Set While Visible - Editable', function() { + this.block.setCommentText('test1'); + var icon = this.block.getCommentIcon(); + icon.setVisible(true); + + this.block.setCommentText('test2'); + chai.assert.equal(this.block.getCommentText(), 'test2'); + assertCommentEvent(this.eventSpy, 'test1', 'test2'); + chai.assert.equal(icon.textarea_.value, 'test2'); + }); + test('Set While Visible - NonEditable', function() { + this.block.setCommentText('test1'); + var editableStub = sinon.stub(this.block, 'isEditable').returns(false); + var icon = this.block.getCommentIcon(); + icon.setVisible(true); + + this.block.setCommentText('test2'); + chai.assert.equal(this.block.getCommentText(), 'test2'); + assertCommentEvent(this.eventSpy, 'test1', 'test2'); + chai.assert.equal(icon.paragraphElement_.firstChild.textContent, + 'test2'); + + editableStub.restore(); + }); + test('Get Text While Editing', function() { + this.block.setCommentText('test1'); + var icon = this.block.getCommentIcon(); + icon.setVisible(true); + icon.textarea_.value = 'test2'; + icon.textarea_.dispatchEvent(new Event('input')); + + chai.assert.equal(this.block.getCommentText(), 'test2'); + }); + }); + }); + }); + suite('Icon Management', function() { + suite('Bubbles and Collapsing', function() { + setup(function() { + this.workspace.dispose(); + this.workspace = Blockly.inject('blocklyDiv'); + }); + teardown(function() { + this.workspace.dispose(); + }); + + test('Has Icon', function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + ), this.workspace); + block.setCommentText('test text'); + block.comment.setVisible(true); + chai.assert.isTrue(block.comment.isVisible()); + block.setCollapsed(true); + chai.assert.isFalse(block.comment.isVisible()); + }); + test('Child Has Icon', function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + '' + ), this.workspace); + var childBlock = block.getInputTargetBlock('STATEMENT'); + childBlock.setCommentText('test text'); + childBlock.comment.setVisible(true); + chai.assert.isTrue(childBlock.comment.isVisible()); + block.setCollapsed(true); + chai.assert.isFalse(childBlock.comment.isVisible()); + }); + test('Next Block Has Icon', function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + '' + ), this.workspace); + var nextBlock = block.getNextBlock(); + nextBlock.setCommentText('test text'); + nextBlock.comment.setVisible(true); + chai.assert.isTrue(nextBlock.comment.isVisible()); + block.setCollapsed(true); + chai.assert.isTrue(nextBlock.comment.isVisible()); + }); + }); + }); + + suite('Style', function() { + suite('Headless', function() { + setup(function() { + this.block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + ), this.workspace); + }); + test('Set colour', function() { + this.block.setColour('20'); + assertEquals(this.block.getColour(), '#a5745b'); + assertEquals(this.block.colour_, this.block.getColour()); + assertEquals(this.block.hue_, '20'); + }); + test('Set style', function() { + this.block.setStyle('styleOne'); + assertEquals(this.block.getStyleName(), 'styleOne'); + assertEquals(this.block.hue_, null); + // Calling setStyle does not update the colour on a headless block. + assertEquals(this.block.getColour(), '#000000'); + }); + }); + suite('Rendered', function() { + setup(function() { + this.workspace = Blockly.inject('blocklyDiv', {}); + this.block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + ), this.workspace); + this.workspace.setTheme(new Blockly.Theme('test', { + "styleOne" : { + "colourPrimary": "#000000", + "colourSecondary": "#999999", + "colourTertiary": "#4d4d4d", + "hat": '' + } + }), {}); + }); + teardown(function() { + this.workspace.dispose(); + }); + test('Set colour hue', function() { + this.block.setColour('20'); + assertEquals(this.block.getStyleName(), 'auto_#a5745b'); + assertEquals(this.block.getColour(), '#a5745b'); + assertEquals(this.block.colour_, this.block.getColour()); + assertEquals(this.block.hue_, '20'); + }); + test('Set colour hex', function() { + this.block.setColour('#000000'); + assertEquals(this.block.getStyleName(), 'auto_#000000'); + assertEquals(this.block.getColour(), '#000000'); + assertEquals(this.block.colour_, this.block.getColour()); + assertEquals(this.block.hue_, null); + }); + test('Set style', function() { + this.block.setStyle('styleOne'); + assertEquals(this.block.getStyleName(), 'styleOne'); + assertEquals(this.block.getColour(), '#000000'); + assertEquals(this.block.colour_, this.block.getColour()); + }); + }); + }); +}); diff --git a/js/tests/mocha/comment_test.js b/js/tests/mocha/comment_test.js new file mode 100644 index 0000000..901edd6 --- /dev/null +++ b/js/tests/mocha/comment_test.js @@ -0,0 +1,141 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +suite('Comments', function() { + setup(function() { + Blockly.defineBlocksWithJsonArray([ + { + "type": "empty_block", + "message0": "", + "args0": [] + }, + ]); + + this.workspace = Blockly.inject('blocklyDiv', { + comments: true, + scrollbars: true + }); + this.block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + ), this.workspace); + this.comment = new Blockly.Comment(this.block); + this.comment.computeIconLocation(); + }); + teardown(function() { + delete Blockly.Blocks['empty_block']; + this.workspace.dispose(); + }); + suite('Visibility and Editability', function() { + setup(function() { + this.comment.setText('test text'); + this.eventSpy = sinon.stub(Blockly.Events, 'fire'); + }); + teardown(function() { + this.eventSpy.restore(); + }); + function assertEvent(eventSpy, type, element, oldValue, newValue) { + var calls = eventSpy.getCalls(); + var event = calls[calls.length - 1].args[0]; + chai.assert.equal(event.type, type); + chai.assert.equal(event.element, element); + chai.assert.equal(event.oldValue, oldValue); + chai.assert.equal(event.newValue, newValue); + } + function assertEditable(comment) { + chai.assert.isNotOk(comment.paragraphElement_); + chai.assert.isOk(comment.textarea_); + chai.assert.equal(comment.textarea_.value, 'test text'); + } + function assertNotEditable(comment) { + chai.assert.isNotOk(comment.textarea_); + chai.assert.isOk(comment.paragraphElement_); + chai.assert.equal(comment.paragraphElement_.firstChild.textContent, + 'test text'); + } + test('Editable', function() { + this.comment.setVisible(true); + chai.assert.isTrue(this.comment.isVisible()); + assertEditable(this.comment); + assertEvent(this.eventSpy, Blockly.Events.UI, 'commentOpen', false, true); + }); + test('Not Editable', function() { + var editableStub = sinon.stub(this.block, 'isEditable').returns(false); + + this.comment.setVisible(true); + chai.assert.isTrue(this.comment.isVisible()); + assertNotEditable(this.comment); + assertEvent(this.eventSpy, Blockly.Events.UI, 'commentOpen', false, true); + + editableStub.restore(); + }); + test('Editable -> Not Editable', function() { + this.comment.setVisible(true); + var editableStub = sinon.stub(this.block, 'isEditable').returns(false); + + this.comment.updateEditable(); + chai.assert.isTrue(this.comment.isVisible()); + assertNotEditable(this.comment); + assertEvent(this.eventSpy, Blockly.Events.UI, 'commentOpen', false, true); + + editableStub.restore(); + }); + test('Not Editable -> Editable', function() { + var editableStub = sinon.stub(this.block, 'isEditable').returns(false); + this.comment.setVisible(true); + editableStub.returns(true); + + this.comment.updateEditable(); + chai.assert.isTrue(this.comment.isVisible()); + assertEditable(this.comment); + assertEvent(this.eventSpy, Blockly.Events.UI, 'commentOpen', false, true); + + editableStub.restore(); + }); + }); + suite('Set/Get Bubble Size', function() { + function assertBubbleSize(comment, height, width) { + var size = comment.getBubbleSize(); + chai.assert.equal(size.height, height); + chai.assert.equal(size.width, width); + } + function assertBubbleSizeDefault(comment) { + assertBubbleSize(comment, 80, 160); + } + test('Set Size While Visible', function() { + this.comment.setVisible(true); + var bubbleSizeSpy = sinon.spy(this.comment.bubble_, 'setBubbleSize'); + + assertBubbleSizeDefault(this.comment); + this.comment.setBubbleSize(100, 100); + assertBubbleSize(this.comment, 100, 100); + chai.assert(bubbleSizeSpy.calledOnce); + + this.comment.setVisible(false); + assertBubbleSize(this.comment, 100, 100); + + bubbleSizeSpy.restore(); + }); + test('Set Size While Invisible', function() { + assertBubbleSizeDefault(this.comment); + this.comment.setBubbleSize(100, 100); + assertBubbleSize(this.comment, 100, 100); + + this.comment.setVisible(true); + assertBubbleSize(this.comment, 100, 100); + }); + }); +}); diff --git a/js/tests/mocha/connection_db_test.js b/js/tests/mocha/connection_db_test.js new file mode 100644 index 0000000..9c9c1a2 --- /dev/null +++ b/js/tests/mocha/connection_db_test.js @@ -0,0 +1,276 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +suite('Connection Database', function() { + setup(function() { + this.database = new Blockly.ConnectionDB(); + + this.assertOrder = function() { + var length = this.database.connections_.length; + for (var i = 1; i < length; i++) { + chai.assert.isAtMost(this.database.connections_[i - 1].y, + this.database.connections_[i].y); + } + }; + this.createConnection = function(x, y, type, opt_database) { + var workspace = { + connectionDBList: [] + }; + workspace.connectionDBList[type] = opt_database || this.database; + var connection = new Blockly.RenderedConnection( + {workspace: workspace}, type); + connection.x = x; + connection.y = y; + return connection; + }; + this.createSimpleTestConnections = function() { + for (var i = 0; i < 10; i++) { + var connection = this.createConnection(0, i, Blockly.PREVIOUS_STATEMENT); + this.database.addConnection(connection, i); + } + }; + }); + test('Add Connection', function() { + var y2 = {y: 2}; + var y4 = {y: 4}; + var y1 = {y: 1}; + var y3a = {y: 3}; + var y3b = {y: 3}; + + this.database.addConnection(y2, 2); + chai.assert.sameOrderedMembers( + this.database.connections_, [y2]); + + this.database.addConnection(y4, 4); + chai.assert.sameOrderedMembers( + this.database.connections_, [y2, y4]); + + this.database.addConnection(y1, 1); + chai.assert.sameOrderedMembers( + this.database.connections_, [y1, y2, y4]); + + this.database.addConnection(y3a, 3); + chai.assert.sameOrderedMembers( + this.database.connections_, [y1, y2, y3a, y4]); + + this.database.addConnection(y3b, 3); + chai.assert.sameOrderedMembers( + this.database.connections_, [y1, y2, y3b, y3a, y4]); + + }); + test('Remove Connection', function() { + var y2 = {y: 2}; + var y4 = {y: 4}; + var y1 = {y: 1}; + var y3a = {y: 3}; + var y3b = {y: 3}; + var y3c = {y: 3}; + + this.database.addConnection(y2, 2); + this.database.addConnection(y4, 4); + this.database.addConnection(y1, 1); + this.database.addConnection(y3c, 3); + this.database.addConnection(y3b, 3); + this.database.addConnection(y3a, 3); + + chai.assert.sameOrderedMembers( + this.database.connections_, [y1, y2, y3a, y3b, y3c, y4]); + + this.database.removeConnection(y2, 2); + chai.assert.sameOrderedMembers( + this.database.connections_, [y1, y3a, y3b, y3c, y4]); + + this.database.removeConnection(y4, 4); + chai.assert.sameOrderedMembers( + this.database.connections_, [y1, y3a, y3b, y3c]); + + this.database.removeConnection(y1, 1); + chai.assert.sameOrderedMembers( + this.database.connections_, [y3a, y3b, y3c]); + + this.database.removeConnection(y3a, 3); + chai.assert.sameOrderedMembers( + this.database.connections_, [y3b, y3c]); + + this.database.removeConnection(y3c, 3); + chai.assert.sameOrderedMembers( + this.database.connections_, [y3b]); + + this.database.removeConnection(y3b, 3); + chai.assert.isEmpty(this.database.connections_); + }); + suite('Get Neighbors', function() { + test('Empty Database', function() { + var connection = this.createConnection(0, 0, Blockly.NEXT_STATEMENT, + new Blockly.ConnectionDB()); + chai.assert.isEmpty(this.database.getNeighbours(connection), 100); + }); + test('Block At Top', function() { + this.createSimpleTestConnections(); + + var checkConnection = this.createConnection(0, 0, Blockly.NEXT_STATEMENT, + new Blockly.ConnectionDB()); + var neighbors = this.database.getNeighbours(checkConnection, 4); + chai.assert.sameMembers(neighbors, this.database.connections_.slice(0, 5)); + }); + test('Block In Middle', function() { + this.createSimpleTestConnections(); + + var checkConnection = this.createConnection(0, 4, Blockly.NEXT_STATEMENT, + new Blockly.ConnectionDB()); + var neighbors = this.database.getNeighbours(checkConnection, 2); + chai.assert.sameMembers(neighbors, this.database.connections_.slice(2, 7)); + }); + test('Block At End', function() { + this.createSimpleTestConnections(); + + var checkConnection = this.createConnection(0, 9, Blockly.NEXT_STATEMENT, + new Blockly.ConnectionDB()); + var neighbors = this.database.getNeighbours(checkConnection, 4); + chai.assert.sameMembers(neighbors, this.database.connections_.slice(5, 10)); + }); + test('Out of Range X', function() { + this.createSimpleTestConnections(); + + var checkConnection = this.createConnection(10, 9, Blockly.NEXT_STATEMENT, + new Blockly.ConnectionDB()); + var neighbors = this.database.getNeighbours(checkConnection, 4); + chai.assert.isEmpty(neighbors); + }); + test('Out of Range Y', function() { + this.createSimpleTestConnections(); + + var checkConnection = this.createConnection(0, 19, Blockly.NEXT_STATEMENT, + new Blockly.ConnectionDB()); + var neighbors = this.database.getNeighbours(checkConnection, 4); + chai.assert.isEmpty(neighbors); + }); + test('Out of Range Diagonal', function() { + this.createSimpleTestConnections(); + + var checkConnection = this.createConnection(-2, -2, Blockly.NEXT_STATEMENT, + new Blockly.ConnectionDB()); + var neighbors = this.database.getNeighbours(checkConnection, 2); + chai.assert.isEmpty(neighbors); + }); + }); + suite('Ordering', function() { + test('Simple', function() { + for (var i = 0; i < 10; i++) { + var connection = this.createConnection(0, i, Blockly.NEXT_STATEMENT); + this.database.addConnection(connection, i); + } + this.assertOrder(); + }); + test('Quasi-Random', function() { + 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]; + + var length = xCoords.length; + for (var i = 0; i < length; i++) { + var connection = this.createConnection(xCoords[i], yCoords[i], + Blockly.NEXT_STATEMENT); + this.database.addConnection(connection, yCoords[i]); + } + this.assertOrder(); + }); + }); + // Does not cover logic for isConnectionAllowed + suite('Search For Closest', function() { + setup(function() { + this.allowedStub = null; + + this.createCheckConnection = function(x, y) { + var checkConnection = this.createConnection(x, y, Blockly.NEXT_STATEMENT, + new Blockly.ConnectionDB()); + this.allowedStub = sinon.stub(checkConnection, 'isConnectionAllowed') + .callsFake(function(candidate, maxRadius) { + if (this.distanceFrom(candidate) > maxRadius) { + return false; + } + // Ignore non-distance parameters. + return true; + }); + return checkConnection; + }; + }); + teardown(function() { + if (this.allowedStub) { + this.allowedStub.restore(); + } + }); + test('Empty Database', function() { + var checkConnection = this.createConnection(0, 0, Blockly.NEXT_STATEMENT, + new Blockly.ConnectionDB()); + chai.assert.isNull(this.database.searchForClosest( + checkConnection, 100, {x: 0, y: 0}).connection); + }); + test('Too Far', function() { + var connection = this.createConnection(0, 100, Blockly.PREVIOUS_STATEMENT); + this.database.addConnection(connection, 100); + + var checkConnection = this.createConnection(0, 0, Blockly.NEXT_STATEMENT, + new Blockly.ConnectionDB()); + chai.assert.isNull(this.database.searchForClosest( + checkConnection, 50, {x: 0, y: 0}).connection); + }); + test('Single in Range', function() { + this.createSimpleTestConnections(); + + var checkConnection = this.createCheckConnection(0, 14); + + var last = this.database.connections_[9]; + var closest = this.database.searchForClosest( + checkConnection, 5, {x: 0, y: 0}).connection; + chai.assert.equal(last, closest); + }); + test('Many in Range', function() { + this.createSimpleTestConnections(); + + var checkConnection = this.createCheckConnection(0, 10); + + var last = this.database.connections_[9]; + var closest = this.database.searchForClosest( + checkConnection, 5, {x: 0, y: 0}).connection; + chai.assert.equal(last, closest); + }); + test('No Y-Coord Priority', function() { + var connection1 = this.createConnection(6, 6, Blockly.PREVIOUS_STATEMENT); + this.database.addConnection(connection1, 6); + var connection2 = this.createConnection(5, 5, Blockly.PREVIOUS_STATEMENT); + this.database.addConnection(connection2, 5); + + var checkConnection = this.createCheckConnection(4, 6); + + var closest = this.database.searchForClosest( + checkConnection, 3, {x: 0, y: 0}).connection; + chai.assert.equal(connection2, closest); + }); + }); +}); diff --git a/js/tests/mocha/connection_test.js b/js/tests/mocha/connection_test.js new file mode 100644 index 0000000..5ea5d99 --- /dev/null +++ b/js/tests/mocha/connection_test.js @@ -0,0 +1,198 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +suite('Connections', function() { + suite('Can Connect With Reason', function() { + test('Target Null', function() { + var connection = new Blockly.Connection({}, Blockly.INPUT_VALUE); + chai.assert.equal(connection.canConnectWithReason(null), + Blockly.Connection.REASON_TARGET_NULL); + }); + test('Target Self', function() { + var block = {workspace: 1}; + var connection1 = new Blockly.Connection(block, Blockly.INPUT_VALUE); + var connection2 = new Blockly.Connection(block, Blockly.OUTPUT_VALUE); + + chai.assert.equal(connection1.canConnectWithReason(connection2), + Blockly.Connection.REASON_SELF_CONNECTION); + }); + test('Different Workspaces', function() { + var connection1 = new Blockly.Connection( + {workspace: 1}, Blockly.INPUT_VALUE); + var connection2 = new Blockly.Connection( + {workspace: 2}, Blockly.OUTPUT_VALUE); + + chai.assert.equal(connection1.canConnectWithReason(connection2), + Blockly.Connection.REASON_DIFFERENT_WORKSPACES); + }); + suite('Types', function() { + setup(function() { + // We have to declare each separately so that the connections belong + // on different blocks. + var prevBlock = { isShadow: function() {}}; + var nextBlock = { isShadow: function() {}}; + var outBlock = { isShadow: function() {}}; + var inBlock = { isShadow: function() {}}; + this.previous = new Blockly.Connection( + prevBlock, Blockly.PREVIOUS_STATEMENT); + this.next = new Blockly.Connection( + nextBlock, Blockly.NEXT_STATEMENT); + this.output = new Blockly.Connection( + outBlock, Blockly.OUTPUT_VALUE); + this.input = new Blockly.Connection( + inBlock, Blockly.INPUT_VALUE); + }); + test('Previous, Next', function() { + chai.assert.equal(this.previous.canConnectWithReason(this.next), + Blockly.Connection.CAN_CONNECT); + }); + test('Previous, Output', function() { + chai.assert.equal(this.previous.canConnectWithReason(this.output), + Blockly.Connection.REASON_WRONG_TYPE); + }); + test('Previous, Input', function() { + chai.assert.equal(this.previous.canConnectWithReason(this.input), + Blockly.Connection.REASON_WRONG_TYPE); + }); + test('Next, Previous', function() { + chai.assert.equal(this.next.canConnectWithReason(this.previous), + Blockly.Connection.CAN_CONNECT); + }); + test('Next, Output', function() { + chai.assert.equal(this.next.canConnectWithReason(this.output), + Blockly.Connection.REASON_WRONG_TYPE); + }); + test('Next, Input', function() { + chai.assert.equal(this.next.canConnectWithReason(this.input), + Blockly.Connection.REASON_WRONG_TYPE); + }); + test('Output, Previous', function() { + chai.assert.equal(this.output.canConnectWithReason(this.previous), + Blockly.Connection.REASON_WRONG_TYPE); + }); + test('Output, Next', function() { + chai.assert.equal(this.output.canConnectWithReason(this.next), + Blockly.Connection.REASON_WRONG_TYPE); + }); + test('Output, Input', function() { + chai.assert.equal(this.output.canConnectWithReason(this.input), + Blockly.Connection.CAN_CONNECT); + }); + test('Input, Previous', function() { + chai.assert.equal(this.input.canConnectWithReason(this.previous), + Blockly.Connection.REASON_WRONG_TYPE); + }); + test('Input, Next', function() { + chai.assert.equal(this.input.canConnectWithReason(this.next), + Blockly.Connection.REASON_WRONG_TYPE); + }); + test('Input, Output', function() { + chai.assert.equal(this.input.canConnectWithReason(this.output), + Blockly.Connection.CAN_CONNECT); + }); + }); + suite('Shadows', function() { + test('Previous Shadow', function() { + var prevBlock = { isShadow: function() { return true; }}; + var nextBlock = { isShadow: function() { return false; }}; + var prev = new Blockly.Connection(prevBlock, Blockly.PREVIOUS_STATEMENT); + var next = new Blockly.Connection(nextBlock, Blockly.NEXT_STATEMENT); + + chai.assert.equal(prev.canConnectWithReason(next), + Blockly.Connection.CAN_CONNECT); + }); + test('Next Shadow', function() { + var prevBlock = { isShadow: function() { return false; }}; + var nextBlock = { isShadow: function() { return true; }}; + var prev = new Blockly.Connection(prevBlock, Blockly.PREVIOUS_STATEMENT); + var next = new Blockly.Connection(nextBlock, Blockly.NEXT_STATEMENT); + + chai.assert.equal(prev.canConnectWithReason(next), + Blockly.Connection.REASON_SHADOW_PARENT); + }); + test('Prev and Next Shadow', function() { + var prevBlock = { isShadow: function() { return true; }}; + var nextBlock = { isShadow: function() { return true; }}; + var prev = new Blockly.Connection(prevBlock, Blockly.PREVIOUS_STATEMENT); + var next = new Blockly.Connection(nextBlock, Blockly.NEXT_STATEMENT); + + chai.assert.equal(prev.canConnectWithReason(next), + Blockly.Connection.CAN_CONNECT); + }); + test('Output Shadow', function() { + var outBlock = { isShadow: function() { return true; }}; + var inBlock = { isShadow: function() { return false; }}; + var outCon = new Blockly.Connection(outBlock, Blockly.OUTPUT_VALUE); + var inCon = new Blockly.Connection(inBlock, Blockly.INPUT_VALUE); + + chai.assert.equal(outCon.canConnectWithReason(inCon), + Blockly.Connection.CAN_CONNECT); + }); + test('Input Shadow', function() { + var outBlock = { isShadow: function() { return false; }}; + var inBlock = { isShadow: function() { return true; }}; + var outCon = new Blockly.Connection(outBlock, Blockly.OUTPUT_VALUE); + var inCon = new Blockly.Connection(inBlock, Blockly.INPUT_VALUE); + + chai.assert.equal(outCon.canConnectWithReason(inCon), + Blockly.Connection.REASON_SHADOW_PARENT); + }); + test('Output and Input Shadow', function() { + var outBlock = { isShadow: function() { return true; }}; + var inBlock = { isShadow: function() { return true; }}; + var outCon = new Blockly.Connection(outBlock, Blockly.OUTPUT_VALUE); + var inCon = new Blockly.Connection(inBlock, Blockly.INPUT_VALUE); + + chai.assert.equal(outCon.canConnectWithReason(inCon), + Blockly.Connection.CAN_CONNECT); + }); + }); + }); + suite('Check Types', function() { + setup(function() { + this.con1 = new Blockly.Connection({}, Blockly.PREVIOUS_STATEMENT); + this.con2 = new Blockly.Connection({}, Blockly.NEXT_STATEMENT); + }); + test('No Types', function() { + chai.assert.isTrue(this.con1.checkType((this.con2))); + }); + test('Same Type', function() { + this.con1.setCheck('type1'); + this.con2.setCheck('type1'); + chai.assert.isTrue(this.con1.checkType((this.con2))); + }); + test('Same Types', function() { + this.con1.setCheck(['type1', 'type2']); + this.con2.setCheck(['type1', 'type2']); + chai.assert.isTrue(this.con1.checkType((this.con2))); + }); + test('Single Same Type', function() { + this.con1.setCheck(['type1', 'type2']); + this.con2.setCheck(['type1', 'type3']); + chai.assert.isTrue(this.con1.checkType((this.con2))); + }); + test('One Typed, One Promiscuous', function() { + this.con1.setCheck('type1'); + chai.assert.isTrue(this.con1.checkType((this.con2))); + }); + test('No Compatible Types', function() { + this.con1.setCheck('type1'); + this.con2.setCheck('type2'); + chai.assert.isFalse(this.con1.checkType((this.con2))); + }); + }); +}); diff --git a/js/tests/mocha/cursor_test.js b/js/tests/mocha/cursor_test.js new file mode 100644 index 0000000..0afad68 --- /dev/null +++ b/js/tests/mocha/cursor_test.js @@ -0,0 +1,133 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +suite('Cursor', function() { + setup(function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "input_statement", + "message0": "%1 %2 %3 %4", + "args0": [ + { + "type": "field_input", + "name": "NAME", + "text": "default" + }, + { + "type": "field_input", + "name": "NAME", + "text": "default" + }, + { + "type": "input_value", + "name": "NAME" + }, + { + "type": "input_statement", + "name": "NAME" + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": 230, + "tooltip": "", + "helpUrl": "" + }, + { + "type": "field_input", + "message0": "%1", + "args0": [ + { + "type": "field_input", + "name": "NAME", + "text": "default" + } + ], + "output": null, + "colour": 230, + "tooltip": "", + "helpUrl": "" + } + ]); + this.workspace = Blockly.inject('blocklyDiv', {}); + this.cursor = this.workspace.getCursor(); + var blockA = this.workspace.newBlock('input_statement'); + var blockB = this.workspace.newBlock('input_statement'); + var blockC = this.workspace.newBlock('input_statement'); + var blockD = this.workspace.newBlock('input_statement'); + var blockE = this.workspace.newBlock('field_input'); + + blockA.nextConnection.connect(blockB.previousConnection); + blockA.inputList[0].connection.connect(blockE.outputConnection); + blockB.inputList[1].connection.connect(blockC.previousConnection); + this.cursor.drawer_ = null; + this.blocks = { + A: blockA, + B: blockB, + C: blockC, + D: blockD, + E: blockE + }; + }); + teardown(function() { + delete Blockly.Blocks['input_statement']; + delete Blockly.Blocks['field_input']; + + this.workspace.dispose(); + }); + + test('Next - From a Previous skip over next connection and block', function() { + var prevNode = Blockly.ASTNode.createConnectionNode(this.blocks.A.previousConnection); + this.cursor.setCurNode(prevNode); + this.cursor.next(); + var curNode = this.cursor.getCurNode(); + assertEquals(curNode.getLocation(), this.blocks.B.previousConnection); + }); + test('Next - From last block in a stack go to next connection', function() { + var prevNode = Blockly.ASTNode.createConnectionNode(this.blocks.B.previousConnection); + this.cursor.setCurNode(prevNode); + this.cursor.next(); + var curNode = this.cursor.getCurNode(); + assertEquals(curNode.getLocation(), this.blocks.B.nextConnection); + }); + + test('In - From output connection', function() { + var fieldBlock = this.blocks.E; + var outputNode = Blockly.ASTNode.createConnectionNode(fieldBlock.outputConnection); + this.cursor.setCurNode(outputNode); + this.cursor.in(); + var curNode = this.cursor.getCurNode(); + assertEquals(curNode.getLocation(), fieldBlock.inputList[0].fieldRow[0]); + }); + + test('Prev - From previous connection skip over next connection', function() { + var prevConnection = this.blocks.B.previousConnection; + var prevConnectionNode = Blockly.ASTNode.createConnectionNode(prevConnection); + this.cursor.setCurNode(prevConnectionNode); + this.cursor.prev(); + var curNode = this.cursor.getCurNode(); + assertEquals(curNode.getLocation(), this.blocks.A.previousConnection); + }); + + test('Out - From field skip over block node', function() { + var field = this.blocks.E.inputList[0].fieldRow[0]; + var fieldNode = Blockly.ASTNode.createFieldNode(field); + this.cursor.setCurNode(fieldNode); + this.cursor.out(); + var curNode = this.cursor.getCurNode(); + assertEquals(curNode.getLocation(), this.blocks.E.outputConnection); + }); +}); diff --git a/js/tests/mocha/dropdowndiv_test.js b/js/tests/mocha/dropdowndiv_test.js new file mode 100644 index 0000000..0f7c89b --- /dev/null +++ b/js/tests/mocha/dropdowndiv_test.js @@ -0,0 +1,88 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +suite('DropDownDiv', function() { + suite('Positioning', function() { + setup(function() { + this.boundsStub = sinon.stub(Blockly.DropDownDiv, 'getBoundsInfo_') + .returns({ + left: 0, + right: 100, + top: 0, + bottom: 100, + width: 100, + height: 100 + }); + this.sizeStub = sinon.stub(Blockly.utils.style, 'getSize') + .returns({ + width: 60, + height: 60 + }); + this.clientHeightStub = sinon.stub(document.documentElement, 'clientHeight') + .get(function() { return 1000; }); + this.clientTopStub = sinon.stub(document.documentElement, 'clientTop') + .get(function() { return 0; }); + }); + teardown(function() { + this.boundsStub.restore(); + this.sizeStub.restore(); + this.clientHeightStub.restore(); + this.clientTopStub.restore(); + }); + test('Below, in Bounds', function() { + var metrics = Blockly.DropDownDiv.getPositionMetrics_(50, 0, 50, -10); + // "Above" in value actually means below in render. + chai.assert.isAtLeast(metrics.initialY, 0); + chai.assert.isAbove(metrics.finalY, 0); + chai.assert.isTrue(metrics.arrowVisible); + chai.assert.isTrue(metrics.arrowAtTop); + }); + test('Above, in Bounds', function() { + var metrics = Blockly.DropDownDiv.getPositionMetrics_(50, 100, 50, 90); + // "Below" in value actually means above in render. + chai.assert.isAtMost(metrics.initialY, 100); + chai.assert.isBelow(metrics.finalY, 100); + chai.assert.isTrue(metrics.arrowVisible); + chai.assert.isFalse(metrics.arrowAtTop); + }); + test('Below, out of Bounds', function() { + var metrics = Blockly.DropDownDiv.getPositionMetrics_(50, 60, 50, 50); + // "Above" in value actually means below in render. + chai.assert.isAtLeast(metrics.initialY, 60); + chai.assert.isAbove(metrics.finalY, 60); + chai.assert.isTrue(metrics.arrowVisible); + chai.assert.isTrue(metrics.arrowAtTop); + }); + test('Above, in Bounds', function() { + var metrics = Blockly.DropDownDiv.getPositionMetrics_(50, 100, 50, 90); + // "Below" in value actually means above in render. + chai.assert.isAtMost(metrics.initialY, 100); + chai.assert.isBelow(metrics.finalY, 100); + chai.assert.isTrue(metrics.arrowVisible); + chai.assert.isFalse(metrics.arrowAtTop); + }); + test('No Solution, Render At Top', function() { + this.clientHeightStub.get(function() { return 100; }); + var metrics = Blockly.DropDownDiv.getPositionMetrics_(50, 60, 50, 50); + // "Above" in value actually means below in render. + chai.assert.equal(metrics.initialY, 0); + chai.assert.equal(metrics.finalY, 0); + chai.assert.isFalse(metrics.arrowVisible); + chai.assert.isNotOk(metrics.arrowAtTop); + }); + }); +}); diff --git a/js/tests/mocha/event_test.js b/js/tests/mocha/event_test.js new file mode 100644 index 0000000..cf86769 --- /dev/null +++ b/js/tests/mocha/event_test.js @@ -0,0 +1,395 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +suite('Events', function() { + setup(function() { + this.workspace = new Blockly.Workspace(); + Blockly.defineBlocksWithJsonArray([{ + 'type': 'field_variable_test_block', + 'message0': '%1', + 'args0': [ + { + 'type': 'field_variable', + 'name': 'VAR', + 'variable': 'item' + } + ], + }, + { + 'type': 'simple_test_block', + 'message0': 'simple test block' + }]); + }); + + teardown(function() { + delete Blockly.Blocks['field_variable_test_block']; + delete Blockly.Blocks['simple_test_block']; + this.workspace.dispose(); + + // Clear Blockly.Event state. + Blockly.Events.setGroup(false); + Blockly.Events.disabled_ = 0; + }); + + function checkExactEventValues(event, values) { + var keys = Object.keys(values); + for (var i = 0; i < keys.length; i++) { + var field = keys[i]; + assertEquals(values[field], event[field]); + } + } + + function checkCreateEventValues(event, block, ids, type) { + var expected_xml = Blockly.Xml.domToText(Blockly.Xml.blockToDom(block)); + var result_xml = Blockly.Xml.domToText(event.xml); + assertEquals(expected_xml, result_xml); + isEqualArrays(ids, event.ids); + assertEquals(type, event.type); + } + + function checkDeleteEventValues(event, block, ids, type) { + var expected_xml = Blockly.Xml.domToText(Blockly.Xml.blockToDom(block)); + var result_xml = Blockly.Xml.domToText(event.oldXml); + assertEquals(expected_xml, result_xml); + isEqualArrays(ids, event.ids); + assertEquals(type, event.type); + } + + suite('Constructors', function() { + test('Abstract', function() { + var event = new Blockly.Events.Abstract(); + assertUndefined(event.blockId); + assertUndefined(event.workspaceId); + assertUndefined(event.varId); + checkExactEventValues(event, {'group': '', 'recordUndo': true}); + }); + + test('UI event without block', function() { + Blockly.Events.setGroup('testGroup'); + var event = new Blockly.Events.Ui(null, 'foo', 'bar', 'baz'); + checkExactEventValues(event, + { + 'blockId': null, + 'workspaceId': null, + 'type': 'ui', + 'oldValue': 'bar', + 'newValue': 'baz', + 'element': 'foo', + 'recordUndo': false, + 'group': 'testGroup' + }); + }); + + suite('With simple blocks', function() { + setup(function() { + this.FAKE_ID = 'hedgehog'; + sinon.stub(Blockly.utils, "genUid").returns(this.FAKE_ID); + + // Disable events while constructing the block: this is a test of the + // Blockly.Event constructors, not the block constructor. + Blockly.Events.disable(); + this.block = new Blockly.Block(this.workspace, 'simple_test_block'); + Blockly.Events.enable(); + sinon.restore(); + }); + + teardown(function() { + }); + + test('Block base', function() { + var event = new Blockly.Events.BlockBase(this.block); + assertUndefined(event.varId); + checkExactEventValues(event, + { + 'blockId': this.FAKE_ID, + 'workspaceId': this.workspace.id, + 'group': '', + 'recordUndo': true + }); + }); + + test('Create', function() { + var event = new Blockly.Events.Create(this.block); + checkCreateEventValues(event, this.block, [this.FAKE_ID], 'create'); + }); + + test('Block create', function() { + var event = new Blockly.Events.BlockCreate(this.block); + checkCreateEventValues(event, this.block, [this.FAKE_ID], 'create'); + }); + + test('Delete', function() { + var event = new Blockly.Events.Delete(this.block); + checkDeleteEventValues(event, this.block, [this.FAKE_ID], 'delete'); + }); + + test('Block delete', function() { + var event = new Blockly.Events.BlockDelete(this.block); + checkDeleteEventValues(event, this.block, [this.FAKE_ID], 'delete'); + }); + + test('UI event with block', function() { + Blockly.Events.setGroup('testGroup'); + var event = new Blockly.Events.Ui(this.block, 'foo', 'bar', 'baz'); + checkExactEventValues(event, + { + 'blockId': this.FAKE_ID, + 'workspaceId': this.workspace.id, + 'type': 'ui', + 'oldValue': 'bar', + 'newValue': 'baz', + 'element': 'foo', + 'recordUndo': false, + 'group': 'testGroup' + }); + }); + + suite('Move', function() { + test('Move by coordinate', function() { + var coordinate = new Blockly.utils.Coordinate(3, 4); + this.block.xy_ = coordinate; + + var event = new Blockly.Events.Move(this.block); + checkExactEventValues(event, + {'oldCoordinate': coordinate, 'type': 'move'}); + }); + + test('Block move by coordinate', function() { + var coordinate = new Blockly.utils.Coordinate(3, 4); + this.block.xy_ = coordinate; + + var event = new Blockly.Events.BlockMove(this.block); + checkExactEventValues(event, + {'oldCoordinate': coordinate, 'type': 'move'}); + }); + + suite('Move by parent', function() { + setup(function() { + sinon.stub(Blockly.utils, "genUid").returns("parent"); + Blockly.Events.disable(); + this.parentBlock = new Blockly.Block(this.workspace, 'simple_test_block'); + Blockly.Events.enable(); + sinon.restore(); + + this.block.parentBlock_ = this.parentBlock; + this.block.xy_ = new Blockly.utils.Coordinate(3, 4); + }); + + teardown(function() { + this.block.parentBlock_ = null; + }); + + test('Move by parent', function() { + // Expect the oldParentId to be set but not the oldCoordinate to be set. + var event = new Blockly.Events.Move(this.block); + checkExactEventValues(event, {'oldCoordinate': undefined, + 'oldParentId': 'parent', 'type': 'move'}); + }); + + test('Block move by parent', function() { + // Expect the oldParentId to be set but not the oldCoordinate to be set. + var event = new Blockly.Events.BlockMove(this.block); + checkExactEventValues(event, {'oldCoordinate': undefined, + 'oldParentId': 'parent', 'type': 'move'}); + }); + }); + }); + }); + + suite('With variable getter blocks', function() { + setup(function() { + // Disable events while constructing the block: this is a test of the + // Blockly.Event constructors, not the block constructor. + Blockly.Events.disable(); + this.block = new Blockly.Block(this.workspace, 'field_variable_test_block'); + Blockly.Events.enable(); + }); + + teardown(function() { + + }); + + test('Change', function() { + var event = + new Blockly.Events.Change(this.block, 'field', 'VAR', 'id1', 'id2'); + checkExactEventValues(event, {'element': 'field', 'name': 'VAR', + 'oldValue': 'id1', 'newValue': 'id2', 'type': 'change'}); + }); + + test('Block change', function() { + var event = new Blockly.Events.BlockChange( + this.block, 'field', 'VAR', 'id1', 'id2'); + checkExactEventValues(event, {'element': 'field', 'name': 'VAR', + 'oldValue': 'id1', 'newValue': 'id2', 'type': 'change'}); + }); + }); + }); + + suite('Variable events', function() { + setup(function() { + this.variable = this.workspace.createVariable('name1', 'type1', 'id1'); + }); + + /** + * Check if a variable with the given values exists. + * @param {Blockly.Workspace|Blockly.VariableMap} container The workspace or + * variableMap the checked variable belongs to. + * @param {!string} name The expected name of the variable. + * @param {!string} type The expected type of the variable. + * @param {!string} id The expected id of the variable. + */ + function checkVariableValues(container, name, type, id) { + var variable = container.getVariableById(id); + assertNotUndefined(variable); + assertEquals(name, variable.name); + assertEquals(type, variable.type); + assertEquals(id, variable.getId()); + } + suite('Constructors', function() { + test('Var base', function() { + var event = new Blockly.Events.VarBase(this.variable); + assertUndefined(event.blockId); + checkExactEventValues(event, {'varId': 'id1', + 'workspaceId': this.workspace.id, 'group': '', 'recordUndo': true}); + }); + + test('Var create', function() { + var event = new Blockly.Events.VarCreate(this.variable); + checkExactEventValues(event, {'varName': 'name1', 'varType': 'type1', + 'type': 'var_create'}); + }); + + test('Var delete', function() { + var event = new Blockly.Events.VarDelete(this.variable); + checkExactEventValues(event, {'varName': 'name1', 'varType': 'type1', + 'varId':'id1', 'type': 'var_delete'}); + }); + + test('Var rename', function() { + var event = new Blockly.Events.VarRename(this.variable, 'name2'); + checkExactEventValues(event, {'varId': 'id1', 'oldName': 'name1', + 'newName': 'name2', 'type': 'var_rename'}); + }); + }); + + suite('fromJson', function() { + test('Var create', function() { + var event = new Blockly.Events.VarCreate(this.variable); + var event2 = new Blockly.Events.VarCreate(null); + var json = event.toJson(); + event2.fromJson(json); + + assertEquals(JSON.stringify(json), JSON.stringify(event2.toJson())); + }); + test('Var delete', function() { + var event = new Blockly.Events.VarDelete(this.variable); + var event2 = new Blockly.Events.VarDelete(null); + var json = event.toJson(); + event2.fromJson(json); + + assertEquals(JSON.stringify(json), JSON.stringify(event2.toJson())); + }); + test('Var rename', function() { + var event = new Blockly.Events.VarRename(this.variable, ''); + var event2 = new Blockly.Events.VarRename(null); + var json = event.toJson(); + event2.fromJson(json); + + assertEquals(JSON.stringify(json), JSON.stringify(event2.toJson())); + }); + }); + + suite('toJson', function() { + test('Var create', function() { + var variable = this.workspace.createVariable('name1', 'type1', 'id1'); + var event = new Blockly.Events.VarCreate(variable); + var json = event.toJson(); + var expectedJson = ({type: "var_create", varId: "id1", varType: "type1", + varName: "name1"}); + + assertEquals(JSON.stringify(expectedJson), JSON.stringify(json)); + }); + + test('Var delete', function() { + var event = new Blockly.Events.VarDelete(this.variable); + var json = event.toJson(); + var expectedJson = ({type: "var_delete", varId: "id1", varType: "type1", + varName: "name1"}); + + assertEquals(JSON.stringify(expectedJson), JSON.stringify(json)); + }); + + test('Var rename', function() { + var event = new Blockly.Events.VarRename(this.variable, 'name2'); + var json = event.toJson(); + var expectedJson = ({type: "var_rename", varId: "id1", oldName: "name1", + newName: "name2"}); + + assertEquals(JSON.stringify(expectedJson), JSON.stringify(json)); + }); + }); + + suite.skip('Run Forward', function() { + test('Var create', function() { + var json = {type: "var_create", varId: "id1", varType: "type1", + varName: "name1"}; + var event = Blockly.Events.fromJson(json, this.workspace); + assertNull(this.workspace.getVariableById('id1')); + event.run(true); + checkVariableValues(this.workspace, 'name1', 'type1', 'id1'); + }); + + test('Var delete', function() { + var event = new Blockly.Events.VarDelete(this.variable); + assertNotNull(this.workspace.getVariableById('id1')); + event.run(true); + assertNull(this.workspace.getVariableById('id1')); + }); + + test('Var rename', function() { + var event = new Blockly.Events.VarRename(this.variable, 'name2'); + event.run(true); + assertNull(this.workspace.getVariable('name1')); + checkVariableValues(this.workspace, 'name2', 'type1', 'id1'); + }); + }); + suite.skip('Run Backward', function() { + test('Var create', function() { + var variable = this.workspace.createVariable('name1', 'type1', 'id1'); + var event = new Blockly.Events.VarCreate(variable); + assertNotNull(this.workspace.getVariableById('id1')); + event.run(false); + }); + + test('Var delete', function() { + var json = {type: "var_delete", varId: "id1", varType: "type1", + varName: "name1"}; + var event = Blockly.Events.fromJson(json, this.workspace); + assertNull(this.workspace.getVariableById('id1')); + event.run(false); + checkVariableValues(this.workspace, 'name1', 'type1', 'id1'); + }); + + test('Var rename', function() { + var event = new Blockly.Events.VarRename(this.variable, 'name2'); + event.run(false); + assertNull(this.workspace.getVariable('name2')); + checkVariableValues(this.workspace, 'name1', 'type1', 'id1'); + }); + }); + }); +}); diff --git a/js/tests/mocha/field_angle_test.js b/js/tests/mocha/field_angle_test.js new file mode 100644 index 0000000..08141c4 --- /dev/null +++ b/js/tests/mocha/field_angle_test.js @@ -0,0 +1,429 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +suite('Angle Fields', function() { + function assertValue(angleField, expectedValue, opt_expectedText) { + var actualValue = angleField.getValue(); + var actualText = angleField.getText(); + opt_expectedText = opt_expectedText || String(expectedValue); + assertEquals(String(actualValue), String(expectedValue)); + assertEquals(Number(actualValue), expectedValue); + assertEquals(actualText, opt_expectedText); + } + function assertValueDefault(angleField) { + assertValue(angleField, 0); + } + suite('Constructor', function() { + test('Empty', function() { + var angleField = new Blockly.FieldAngle(); + assertValueDefault(angleField); + }); + test('Undefined', function() { + var angleField = new Blockly.FieldAngle(undefined); + assertValueDefault(angleField); + }); + test('NaN', function() { + var angleField = new Blockly.FieldAngle(NaN); + assertValueDefault(angleField); + }); + test('Integer', function() { + var angleField = new Blockly.FieldAngle(1); + assertValue(angleField, 1); + }); + test('Float', function() { + var angleField = new Blockly.FieldAngle(1.5); + assertValue(angleField, 1.5); + }); + test('Integer String', function() { + var angleField = new Blockly.FieldAngle('1'); + assertValue(angleField, 1); + }); + test('Float String', function() { + var angleField = new Blockly.FieldAngle('1.5'); + assertValue(angleField, 1.5); + }); + test('> 360°', function() { + var angleField = new Blockly.FieldAngle(362); + assertValue(angleField, 2); + }); + }); + suite('fromJson', function() { + test('Empty', function() { + var angleField = Blockly.FieldAngle.fromJson({}); + assertValueDefault(angleField); + }); + test('Undefined', function() { + var angleField = Blockly.FieldAngle.fromJson({ angle:undefined }); + assertValueDefault(angleField); + }); + test('NaN', function() { + var angleField = Blockly.FieldAngle.fromJson({ angle:NaN }); + assertValueDefault(angleField); + }); + test('Integer', function() { + var angleField = Blockly.FieldAngle.fromJson({ angle:1 }); + assertValue(angleField, 1); + }); + test('Float', function() { + var angleField = Blockly.FieldAngle.fromJson({ angle:1.5 }); + assertValue(angleField, 1.5); + }); + test('Integer String', function() { + var angleField = Blockly.FieldAngle.fromJson({ angle:'1' }); + assertValue(angleField, 1); + }); + test('Float String', function() { + var angleField = Blockly.FieldAngle.fromJson({ angle:'1.5' }); + assertValue(angleField, 1.5); + }); + test('> 360°', function() { + var angleField = Blockly.FieldAngle.fromJson({ angle:362 }); + assertValue(angleField, 2); + }); + }); + suite('setValue', function() { + suite('Empty -> New Value', function() { + setup(function() { + this.angleField = new Blockly.FieldAngle(); + }); + test('Null', function() { + this.angleField.setValue(null); + assertValueDefault(this.angleField); + }); + test('Undefined', function() { + this.angleField.setValue(undefined); + assertValueDefault(this.angleField); + }); + test('Non-Parsable String', function() { + this.angleField.setValue('bad'); + assertValueDefault(this.angleField); + }); + test('NaN', function() { + this.angleField.setValue(NaN); + assertValueDefault(this.angleField); + }); + test('Integer', function() { + this.angleField.setValue(2); + assertValue(this.angleField, 2); + }); + test('Float', function() { + this.angleField.setValue(2.5); + assertValue(this.angleField, 2.5); + }); + test('Integer String', function() { + this.angleField.setValue('2'); + assertValue(this.angleField, 2); + }); + test('Float', function() { + this.angleField.setValue('2.5'); + assertValue(this.angleField, 2.5); + }); + test('>360°', function() { + this.angleField.setValue(362); + assertValue(this.angleField, 2); + }); + test('Infinity', function() { + this.angleField.setValue(Infinity); + assertValueDefault(this.angleField); + }); + test('Negative Infinity String', function() { + this.angleField.setValue('-Infinity'); + assertValueDefault(this.angleField); + }); + }); + suite('Value -> New Value', function() { + setup(function() { + this.angleField = new Blockly.FieldAngle(1); + }); + test('Null', function() { + this.angleField.setValue(null); + assertValue(this.angleField, 1); + }); + test('Undefined', function() { + this.angleField.setValue(undefined); + assertValue(this.angleField, 1); + }); + test('Non-Parsable String', function() { + this.angleField.setValue('bad'); + assertValue(this.angleField, 1); + }); + test('NaN', function() { + this.angleField.setValue(NaN); + assertValue(this.angleField, 1); + }); + test('Integer', function() { + this.angleField.setValue(2); + assertValue(this.angleField, 2); + }); + test('Float', function() { + this.angleField.setValue(2.5); + assertValue(this.angleField, 2.5); + }); + test('Integer String', function() { + this.angleField.setValue('2'); + assertValue(this.angleField, 2); + }); + test('Float', function() { + this.angleField.setValue('2.5'); + assertValue(this.angleField, 2.5); + }); + test('>360°', function() { + this.angleField.setValue(362); + assertValue(this.angleField, 2); + }); + test('Infinity', function() { + this.angleField.setValue(Infinity); + assertValue(this.angleField, 1); + }); + test('Negative Infinity String', function() { + this.angleField.setValue('-Infinity'); + assertValue(this.angleField, 1); + }); + }); + }); + suite('Validators', function() { + setup(function() { + this.angleField = new Blockly.FieldAngle(1); + this.angleField.htmlInput_ = Object.create(null); + this.angleField.htmlInput_.oldValue_ = '1'; + this.angleField.htmlInput_.untypedDefaultValue_ = 1; + this.stub = sinon.stub(this.angleField, 'resizeEditor_'); + }); + teardown(function() { + this.angleField.setValidator(null); + this.angleField.htmlInput_ = null; + if (this.stub) { + this.stub.restore(); + } + }); + suite('Null Validator', function() { + setup(function() { + this.angleField.setValidator(function() { + return null; + }); + }); + test('When Editing', function() { + this.angleField.isBeingEdited_ = true; + this.angleField.htmlInput_.value = '2'; + this.angleField.onHtmlInputChange_(null); + assertValue(this.angleField, 1, '2'); + this.angleField.isBeingEdited_ = false; + }); + test('When Not Editing', function() { + this.angleField.setValue(2); + assertValue(this.angleField, 1); + }); + }); + suite('Force Mult of 30 Validator', function() { + setup(function() { + this.angleField.setValidator(function(newValue) { + return Math.round(newValue / 30) * 30; + }); + }); + test('When Editing', function() { + this.angleField.isBeingEdited_ = true; + this.angleField.htmlInput_.value = '25'; + this.angleField.onHtmlInputChange_(null); + assertValue(this.angleField, 30, '25'); + this.angleField.isBeingEdited_ = false; + }); + test('When Not Editing', function() { + this.angleField.setValue(25); + assertValue(this.angleField, 30); + }); + }); + suite('Returns Undefined Validator', function() { + setup(function() { + this.angleField.setValidator(function() {}); + }); + test('When Editing', function() { + this.angleField.isBeingEdited_ = true; + this.angleField.htmlInput_.value = '2'; + this.angleField.onHtmlInputChange_(null); + assertValue(this.angleField, 2); + this.angleField.isBeingEdited_ = false; + }); + test('When Not Editing', function() { + this.angleField.setValue(2); + assertValue(this.angleField, 2); + }); + }); + }); + suite('Customizations', function() { + suite('Clockwise', function() { + test('JS Configuration', function() { + var field = new Blockly.FieldAngle(0, null, { + clockwise: true + }); + chai.assert.isTrue(field.clockwise_); + }); + test('JSON Definition', function() { + var field = Blockly.FieldAngle.fromJson({ + value: 0, + clockwise: true + }); + chai.assert.isTrue(field.clockwise_); + }); + test('Constant', function() { + // Note: Generally constants should be set at compile time, not + // runtime (since they are constants) but for testing purposes we + // can do this. + Blockly.FieldAngle.CLOCKWISE = true; + var field = new Blockly.FieldAngle(); + chai.assert.isTrue(field.clockwise_); + }); + }); + suite('Offset', function() { + test('JS Configuration', function() { + var field = new Blockly.FieldAngle(0, null, { + offset: 90 + }); + chai.assert.equal(field.offset_, 90); + }); + test('JSON Definition', function() { + var field = Blockly.FieldAngle.fromJson({ + value: 0, + offset: 90 + }); + chai.assert.equal(field.offset_, 90); + }); + test('Constant', function() { + // Note: Generally constants should be set at compile time, not + // runtime (since they are constants) but for testing purposes we + // can do this. + Blockly.FieldAngle.OFFSET = 90; + var field = new Blockly.FieldAngle(); + chai.assert.equal(field.offset_, 90); + }); + test('Null', function() { + // Note: Generally constants should be set at compile time, not + // runtime (since they are constants) but for testing purposes we + // can do this. + Blockly.FieldAngle.OFFSET = 90; + var field = Blockly.FieldAngle.fromJson({ + value: 0, + offset: null + }); + chai.assert.equal(field.offset_, 90); + }); + }); + suite('Wrap', function() { + test('JS Configuration', function() { + var field = new Blockly.FieldAngle(0, null, { + wrap: 180 + }); + chai.assert.equal(field.wrap_, 180); + }); + test('JSON Definition', function() { + var field = Blockly.FieldAngle.fromJson({ + value: 0, + wrap: 180 + }); + chai.assert.equal(field.wrap_, 180); + }); + test('Constant', function() { + // Note: Generally constants should be set at compile time, not + // runtime (since they are constants) but for testing purposes we + // can do this. + Blockly.FieldAngle.WRAP = 180; + var field = new Blockly.FieldAngle(); + chai.assert.equal(field.wrap_, 180); + }); + test('Null', function() { + // Note: Generally constants should be set at compile time, not + // runtime (since they are constants) but for testing purposes we + // can do this. + Blockly.FieldAngle.WRAP = 180; + var field = Blockly.FieldAngle.fromJson({ + value: 0, + wrap: null + }); + chai.assert.equal(field.wrap_, 180); + }); + }); + suite('Round', function() { + test('JS Configuration', function() { + var field = new Blockly.FieldAngle(0, null, { + round: 30 + }); + chai.assert.equal(field.round_, 30); + }); + test('JSON Definition', function() { + var field = Blockly.FieldAngle.fromJson({ + value: 0, + round: 30 + }); + chai.assert.equal(field.round_, 30); + }); + test('Constant', function() { + // Note: Generally constants should be set at compile time, not + // runtime (since they are constants) but for testing purposes we + // can do this. + Blockly.FieldAngle.ROUND = 30; + var field = new Blockly.FieldAngle(); + chai.assert.equal(field.round_, 30); + }); + test('Null', function() { + // Note: Generally constants should be set at compile time, not + // runtime (since they are constants) but for testing purposes we + // can do this. + Blockly.FieldAngle.ROUND = 30; + var field = Blockly.FieldAngle.fromJson({ + value: 0, + round: null + }); + chai.assert.equal(field.round_, 30); + }); + }); + suite('Mode', function() { + suite('Compass', function() { + test('JS Configuration', function() { + var field = new Blockly.FieldAngle(0, null, { + mode: 'compass' + }); + chai.assert.equal(field.offset_, 90); + chai.assert.isTrue(field.clockwise_); + }); + test('JS Configuration', function() { + var field = Blockly.FieldAngle.fromJson({ + value: 0, + mode: 'compass' + }); + chai.assert.equal(field.offset_, 90); + chai.assert.isTrue(field.clockwise_); + }); + }); + suite('Protractor', function() { + test('JS Configuration', function() { + var field = new Blockly.FieldAngle(0, null, { + mode: 'protractor' + }); + chai.assert.equal(field.offset_, 0); + chai.assert.isFalse(field.clockwise_); + }); + test('JS Configuration', function() { + var field = Blockly.FieldAngle.fromJson({ + value: 0, + mode: 'protractor' + }); + chai.assert.equal(field.offset_, 0); + chai.assert.isFalse(field.clockwise_); + }); + }); + }); + }); +}); diff --git a/js/tests/mocha/field_checkbox_test.js b/js/tests/mocha/field_checkbox_test.js new file mode 100644 index 0000000..d9c3aa8 --- /dev/null +++ b/js/tests/mocha/field_checkbox_test.js @@ -0,0 +1,229 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +suite('Checkbox Fields', function() { + function assertValue(checkboxField, expectedValue, expectedText) { + var actualValue = checkboxField.getValue(); + var actualText = checkboxField.getText(); + assertEquals(actualValue, expectedValue); + assertEquals(actualText, expectedText); + } + function assertValueDefault(checkboxField) { + assertValue(checkboxField, 'FALSE', 'false'); + } + suite('Constructor', function() { + test('Empty', function() { + var checkboxField = new Blockly.FieldCheckbox(); + assertValueDefault(checkboxField); + }); + test('Undefined', function() { + var checkboxField = new Blockly.FieldCheckbox(undefined); + assertValueDefault(checkboxField); + }); + test('True', function() { + var checkboxField = new Blockly.FieldCheckbox(true); + assertValue(checkboxField, 'TRUE', 'true'); + }); + test('False', function() { + var checkboxField = new Blockly.FieldCheckbox(false); + assertValue(checkboxField, 'FALSE', 'false'); + }); + test('String TRUE', function() { + var checkboxField = new Blockly.FieldCheckbox('TRUE'); + assertValue(checkboxField, 'TRUE', 'true'); + }); + test('String FALSE', function() { + var checkboxField = new Blockly.FieldCheckbox('FALSE'); + assertValue(checkboxField, 'FALSE', 'false'); + }); + }); + suite('fromJson', function() { + test('Empty', function() { + var checkboxField = Blockly.FieldCheckbox.fromJson({}); + assertValueDefault(checkboxField); + }); + test('Undefined', function() { + var checkboxField = Blockly.FieldCheckbox.fromJson({ checked: undefined}); + assertValueDefault(checkboxField); + }); + test('True', function() { + var checkboxField = Blockly.FieldCheckbox.fromJson({ checked: true}); + assertValue(checkboxField, 'TRUE', 'true'); + }); + test('False', function() { + var checkboxField = Blockly.FieldCheckbox.fromJson({ checked: false}); + assertValue(checkboxField, 'FALSE', 'false'); + }); + test('String TRUE', function() { + var checkboxField = Blockly.FieldCheckbox.fromJson({ checked: 'TRUE'}); + assertValue(checkboxField, 'TRUE', 'true'); + }); + test('String FALSE', function() { + var checkboxField = Blockly.FieldCheckbox.fromJson({ checked: 'FALSE'}); + assertValue(checkboxField, 'FALSE', 'false'); + }); + }); + suite('setValue', function() { + suite('True -> New Value', function() { + setup(function() { + this.checkboxField = new Blockly.FieldCheckbox('TRUE'); + }); + test('Null', function() { + this.checkboxField.setValue(null); + assertValue(this.checkboxField, 'TRUE', 'true'); + }); + test('Undefined', function() { + this.checkboxField.setValue(undefined); + assertValue(this.checkboxField, 'TRUE', 'true'); + }); + test('Non-Parsable String', function() { + this.checkboxField.setValue('bad'); + assertValue(this.checkboxField, 'TRUE', 'true'); + }); + test('False', function() { + this.checkboxField.setValue('FALSE'); + assertValue(this.checkboxField, 'FALSE', 'false'); + }); + }); + suite('False -> New Value', function() { + setup(function() { + this.checkboxField = new Blockly.FieldCheckbox('FALSE'); + }); + test('Null', function() { + this.checkboxField.setValue(null); + assertValue(this.checkboxField, 'FALSE', 'false'); + }); + test('Undefined', function() { + this.checkboxField.setValue(undefined); + assertValue(this.checkboxField, 'FALSE', 'false'); + }); + test('Non-Parsable String', function() { + this.checkboxField.setValue('bad'); + assertValue(this.checkboxField, 'FALSE', 'false'); + }); + test('True', function() { + this.checkboxField.setValue('TRUE'); + assertValue(this.checkboxField, 'TRUE', 'true'); + }); + }); + }); + suite('Validators', function() { + setup(function() { + this.checkboxField = new Blockly.FieldCheckbox(true); + }); + teardown(function() { + this.checkboxField.setValidator(null); + }); + suite('Null Validator', function() { + setup(function() { + this.checkboxField.setValidator(function() { + return null; + }); + }); + test('New Value', function() { + this.checkboxField.setValue('FALSE'); + assertValue(this.checkboxField, 'TRUE', 'true'); + }); + }); + suite('Always True Validator', function() { + setup(function() { + this.checkboxField.setValidator(function() { + return 'TRUE'; + }); + }); + test('New Value', function() { + this.checkboxField.setValue('FALSE'); + assertValue(this.checkboxField, 'TRUE', 'true'); + }); + }); + suite('Always False Validator', function() { + setup(function() { + this.checkboxField.setValidator(function() { + return 'FALSE'; + }); + }); + test('New Value', function() { + this.checkboxField.setValue('TRUE'); + assertValue(this.checkboxField, 'FALSE', 'false'); + }); + }); + suite('Returns Undefined Validator', function() { + setup(function() { + this.checkboxField.setValidator(function() {}); + }); + test('New Value', function() { + this.checkboxField.setValue('FALSE'); + assertValue(this.checkboxField, 'FALSE', 'false'); + }); + }); + }); + suite('Customizations', function() { + suite('Check Character', function() { + function assertCharacter(field, char) { + field.fieldGroup_ = Blockly.utils.dom.createSvgElement('g', {}, null); + field.constants_ = { + FIELD_CHECKBOX_X_OFFSET: 2, + FIELD_CHECKBOX_Y_OFFSET: 2 + }; + field.initView(); + chai.assert(field.textContent_.nodeValue, char); + } + test('Constant', function() { + var checkChar = Blockly.FieldCheckbox.CHECK_CHAR; + // Note: Developers shouldn't actually do this. IMO they should change + // the file and then recompile. But this is fine for testing. + Blockly.FieldCheckbox.CHECK_CHAR = '\u2661'; + var field = new Blockly.FieldCheckbox(true); + assertCharacter(field, '\u2661'); + Blockly.FieldCheckbox.CHECK_CHAR = checkChar; + }); + test('JS Constructor', function() { + var field = new Blockly.FieldCheckbox(true, null, { + checkCharacter: '\u2661' + }); + assertCharacter(field, '\u2661'); + }); + test('JSON Definition', function() { + var field = Blockly.FieldCheckbox.fromJson({ + checkCharacter: '\u2661' + }); + assertCharacter(field, '\u2661'); + }); + test('setCheckCharacter', function() { + var field = new Blockly.FieldCheckbox(); + assertCharacter(field, Blockly.FieldCheckbox.CHECK_CHAR); + field.setCheckCharacter('\u2661'); + // Don't call assertCharacter b/c we don't want to re-initialize. + chai.assert.equal(field.textContent_.nodeValue, '\u2661'); + }); + test('setCheckCharacter Before Init', function() { + var field = new Blockly.FieldCheckbox(); + field.setCheckCharacter('\u2661'); + assertCharacter(field, '\u2661'); + }); + test('Remove Custom Character', function() { + var field = new Blockly.FieldCheckbox(true, null, { + 'checkCharacter': '\u2661' + }); + assertCharacter(field, '\u2661'); + field.setCheckCharacter(null); + chai.assert(field.textContent_.nodeValue, + Blockly.FieldCheckbox.CHECK_CHAR); + }); + }); + }); +}); diff --git a/js/tests/mocha/field_colour_test.js b/js/tests/mocha/field_colour_test.js new file mode 100644 index 0000000..d28620e --- /dev/null +++ b/js/tests/mocha/field_colour_test.js @@ -0,0 +1,375 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +suite('Colour Fields', function() { + function assertValue(colourField, expectedValue, expectedText) { + var actualValue = colourField.getValue(); + var actualText = colourField.getText(); + assertEquals(actualValue, expectedValue); + assertEquals(actualText, expectedText); + } + function assertValueDefault(colourField) { + var expectedValue = Blockly.FieldColour.COLOURS[0]; + var expectedText = expectedValue; + var m = expectedValue.match(/^#(.)\1(.)\2(.)\3$/); + if (m) { + expectedText = '#' + m[1] + m[2] + m[3]; + } + assertValue(colourField, expectedValue, expectedText); + } + + setup(function() { + this.previousColours = Blockly.FieldColour.COLOURS; + Blockly.FieldColour.Colours = [ + '#ffffff', '#ff0000', '#00ff00', '#0000ff', '#ffffff' + ]; + }); + teardown(function() { + Blockly.FieldColour.Colours = this.previousColours; + }); + suite('Constructor', function() { + test('Empty', function() { + var colourField = new Blockly.FieldColour(); + assertValueDefault(colourField); + }); + test('Undefined', function() { + var colourField = new Blockly.FieldColour(undefined); + assertValueDefault(colourField); + }); + test('#AAAAAA', function() { + var colourField = new Blockly.FieldColour('#AAAAAA'); + assertValue(colourField, '#aaaaaa', '#aaa'); + }); + test('#aaaaaa', function() { + var colourField = new Blockly.FieldColour('#aaaaaa'); + assertValue(colourField, '#aaaaaa', '#aaa'); + }); + test('#AAAA00', function() { + var colourField = new Blockly.FieldColour('#AAAA00'); + assertValue(colourField, '#aaaa00', '#aa0'); + }); + test('#aaaa00', function() { + var colourField = new Blockly.FieldColour('#aaaa00'); + assertValue(colourField, '#aaaa00', '#aa0'); + }); + test('#BCBCBC', function() { + var colourField = new Blockly.FieldColour('#BCBCBC'); + assertValue(colourField, '#bcbcbc', '#bcbcbc'); + }); + test('#bcbcbc', function() { + var colourField = new Blockly.FieldColour('#bcbcbc'); + assertValue(colourField, '#bcbcbc', '#bcbcbc'); + }); + test('#AA0', function() { + var colourField = new Blockly.FieldColour('#AA0'); + assertValue(colourField, '#aaaa00', '#aa0'); + }); + test('#aa0', function() { + var colourField = new Blockly.FieldColour('#aa0'); + assertValue(colourField, '#aaaa00', '#aa0'); + }); + test('rgb(170, 170, 0)', function() { + var colourField = new Blockly.FieldColour('rgb(170, 170, 0)'); + assertValue(colourField, '#aaaa00', '#aa0'); + }); + test('red', function() { + var colourField = new Blockly.FieldColour('red'); + assertValue(colourField, '#ff0000', '#f00'); + }); + }); + suite('fromJson', function() { + test('Empty', function() { + var colourField = new Blockly.FieldColour.fromJson({}); + assertValueDefault(colourField); + }); + test('Undefined', function() { + var colourField = new Blockly.FieldColour.fromJson({ colour:undefined }); + assertValueDefault(colourField); + }); + test('#AAAAAA', function() { + var colourField = Blockly.FieldColour.fromJson({ colour: '#AAAAAA' }); + assertValue(colourField, '#aaaaaa', '#aaa'); + }); + test('#aaaaaa', function() { + var colourField = Blockly.FieldColour.fromJson({ colour: '#aaaaaa' }); + assertValue(colourField, '#aaaaaa', '#aaa'); + }); + test('#AAAA00', function() { + var colourField = Blockly.FieldColour.fromJson({ colour: '#AAAA00' }); + assertValue(colourField, '#aaaa00', '#aa0'); + }); + test('#aaaa00', function() { + var colourField = Blockly.FieldColour.fromJson({ colour: '#aaaa00' }); + assertValue(colourField, '#aaaa00', '#aa0'); + }); + test('#BCBCBC', function() { + var colourField = Blockly.FieldColour.fromJson({ colour: '#BCBCBC' }); + assertValue(colourField, '#bcbcbc', '#bcbcbc'); + }); + test('#bcbcbc', function() { + var colourField = Blockly.FieldColour.fromJson({ colour: '#bcbcbc' }); + assertValue(colourField, '#bcbcbc', '#bcbcbc'); + }); + test('#AA0', function() { + var colourField = Blockly.FieldColour.fromJson({ colour: '#AA0' }); + assertValue(colourField, '#aaaa00', '#aa0'); + }); + test('#aa0', function() { + var colourField = Blockly.FieldColour.fromJson({ colour: '#aa0' }); + assertValue(colourField, '#aaaa00', '#aa0'); + }); + test('rgb(170, 170, 0)', function() { + var colourField = Blockly.FieldColour.fromJson( + { colour: 'rgb(170, 170, 0)' }); + assertValue(colourField, '#aaaa00', '#aa0'); + }); + test('red', function() { + var colourField = Blockly.FieldColour.fromJson({ colour: 'red' }); + assertValue(colourField, '#ff0000', '#f00'); + }); + }); + suite('setValue', function() { + suite('Empty -> New Value', function() { + setup(function() { + this.colourField = new Blockly.FieldColour(); + }); + test('Null', function() { + this.colourField.setValue(null); + assertValueDefault(this.colourField); + }); + test('Undefined', function() { + this.colourField.setValue(undefined); + assertValueDefault(this.colourField); + }); + test('Non-Parsable String', function() { + this.colourField.setValue('not_a_colour'); + assertValueDefault(this.colourField); + }); + test('#000000', function() { + this.colourField.setValue('#000000'); + assertValue(this.colourField, '#000000', '#000'); + }); + test('#bcbcbc', function() { + this.colourField.setValue('#bcbcbc'); + assertValue(this.colourField, '#bcbcbc', '#bcbcbc'); + }); + test('#aa0', function() { + this.colourField.setValue('#aa0'); + assertValue(this.colourField, '#aaaa00', '#aa0'); + }); + test('rgb(170, 170, 0)', function() { + this.colourField.setValue('rgb(170, 170, 0)'); + assertValue(this.colourField, '#aaaa00', '#aa0'); + }); + test('red', function() { + this.colourField.setValue('red'); + assertValue(this.colourField, '#ff0000', '#f00'); + }); + }); + suite('Value -> New Value', function() { + setup(function() { + this.colourField = new Blockly.FieldColour('#aaaaaa'); + }); + test('Null', function() { + this.colourField.setValue(null); + assertValue(this.colourField, '#aaaaaa', '#aaa'); + }); + test('Undefined', function() { + this.colourField.setValue(undefined); + assertValue(this.colourField, '#aaaaaa', '#aaa'); + }); + test('Non-Parsable String', function() { + this.colourField.setValue('not_a_colour'); + assertValue(this.colourField, '#aaaaaa', '#aaa'); + }); + test('#000000', function() { + this.colourField.setValue('#000000'); + assertValue(this.colourField, '#000000', '#000'); + }); + test('#bcbcbc', function() { + this.colourField.setValue('#bcbcbc'); + assertValue(this.colourField, '#bcbcbc', '#bcbcbc'); + }); + test('#aa0', function() { + this.colourField.setValue('#aa0'); + assertValue(this.colourField, '#aaaa00', '#aa0'); + }); + test('rgb(170, 170, 0)', function() { + this.colourField.setValue('rgb(170, 170, 0)'); + assertValue(this.colourField, '#aaaa00', '#aa0'); + }); + test('red', function() { + this.colourField.setValue('red'); + assertValue(this.colourField, '#ff0000', '#f00'); + }); + }); + }); + suite('Validators', function() { + setup(function() { + this.colourField = new Blockly.FieldColour('#aaaaaa'); + }); + teardown(function() { + this.colourField.setValidator(null); + }); + suite('Null Validator', function() { + setup(function() { + this.colourField.setValidator(function() { + return null; + }); + }); + test('New Value', function() { + this.colourField.setValue('#000000'); + assertValue(this.colourField, '#aaaaaa', '#aaa'); + }); + }); + suite('Force Full Red Validator', function() { + setup(function() { + this.colourField.setValidator(function(newValue) { + return '#ff' + newValue.substr(3, 4); + }); + }); + test('New Value', function() { + this.colourField.setValue('#000000'); + assertValue(this.colourField, '#ff0000', '#f00'); + }); + }); + suite('Returns Undefined Validator', function() { + setup(function() { + this.colourField.setValidator(function() {}); + }); + test('New Value', function() { + this.colourField.setValue('#000000'); + assertValue(this.colourField, '#000000', '#000'); + }); + }); + }); + suite('Customizations', function() { + suite('Colours and Titles', function() { + function assertColoursAndTitles(field, colours, titles) { + var editor = field.dropdownCreate_(); + var index = 0; + var node = editor.firstChild.firstChild; + while (node) { + chai.assert.equal(node.getAttribute('title'), titles[index]); + chai.assert.equal( + Blockly.utils.colour.parse( + node.style.backgroundColor), + colours[index]); + + var nextNode = node.nextSibling; + if (!nextNode) { + nextNode = node.parentElement.nextSibling; + if (!nextNode) { + break; + } + nextNode = nextNode.firstChild; + } + node = nextNode; + + index++; + } + } + test('Constants', function() { + var colours = Blockly.FieldColour.COLOURS; + var titles = Blockly.FieldColour.TITLES; + // Note: Developers shouldn't actually do this. IMO they should + // change the file and then recompile. But this is fine for testing. + Blockly.FieldColour.COLOURS = ['#aaaaaa']; + Blockly.FieldColour.TITLES = ['grey']; + var field = new Blockly.FieldColour(); + + assertColoursAndTitles(field, ['#aaaaaa'], ['grey']); + + Blockly.FieldColour.COLOURS = colours; + Blockly.FieldColour.TITLES = titles; + }); + test('JS Constructor', function() { + var field = new Blockly.FieldColour('#aaaaaa', null, { + colourOptions: ['#aaaaaa'], + colourTitles: ['grey'] + }); + assertColoursAndTitles(field, ['#aaaaaa'], ['grey']); + }); + test('JSON Definition', function() { + var field = Blockly.FieldColour.fromJson({ + colour: '#aaaaaa', + colourOptions: ['#aaaaaa'], + colourTitles: ['grey'] + }); + assertColoursAndTitles(field, ['#aaaaaa'], ['grey']); + }); + test('setColours', function() { + var field = new Blockly.FieldColour(); + field.setColours(['#aaaaaa'], ['grey']); + assertColoursAndTitles(field, ['#aaaaaa'], ['grey']); + }); + test('Titles Undefined', function() { + var field = new Blockly.FieldColour(); + field.setColours(['#aaaaaa']); + assertColoursAndTitles(field, ['#aaaaaa'], ['#aaaaaa']); + }); + test('Some Titles Undefined', function() { + var field = new Blockly.FieldColour(); + field.setColours(['#aaaaaa', '#ff0000'], ['grey']); + assertColoursAndTitles(field, + ['#aaaaaa', '#ff0000'], ['grey', '#ff0000']); + }); + // This is kinda derpy behavior, but I wanted to document it. + test('Overwriting Colours While Leaving Titles', function() { + var field = new Blockly.FieldColour(); + field.setColours(['#aaaaaa'], ['grey']); + field.setColours(['#ff0000']); + assertColoursAndTitles(field, ['#ff0000'], ['grey']); + }); + }); + suite('Columns', function() { + function assertColumns(field, columns) { + var editor = field.dropdownCreate_(); + chai.assert.equal(editor.firstChild.children.length, columns); + } + test('Constants', function() { + var columns = Blockly.FieldColour.COLUMNS; + // Note: Developers shouldn't actually do this. IMO they should edit + // the file and tehn recompile. But this is fine for testing. + Blockly.FieldColour.COLUMNS = 3; + var field = new Blockly.FieldColour(); + + assertColumns(field, 3); + + Blockly.FieldColour.COLUMNS = columns; + }); + test('JS Constructor', function() { + var field = new Blockly.FieldColour('#ffffff', null, { + columns: 3 + }); + assertColumns(field, 3); + }); + test('JSON Definition', function() { + var field = Blockly.FieldColour.fromJson({ + 'colour': '#ffffff', + 'columns': 3 + }); + assertColumns(field, 3); + }); + test('setColumns', function() { + var field = new Blockly.FieldColour(); + field.setColumns(3); + assertColumns(field, 3); + }); + }); + }); +}); diff --git a/js/tests/mocha/field_date_test.js b/js/tests/mocha/field_date_test.js new file mode 100644 index 0000000..852eed5 --- /dev/null +++ b/js/tests/mocha/field_date_test.js @@ -0,0 +1,184 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* If you want to run date tests add the date picker here: + * https://github.com/google/blockly/blob/master/core/blockly.js#L41 + * before unskipping. + */ +suite.skip('Date Fields', function() { + function assertValue(dateField, expectedValue) { + var actualValue = dateField.getValue(); + var actualText = dateField.getText(); + assertEquals(actualValue, expectedValue); + assertEquals(actualText, expectedValue); + } + function assertValueDefault(dateField) { + var today = new goog.date.Date().toIsoString(true); + assertValue(dateField, today); + } + suite('Constructor', function() { + test('Empty', function() { + var dateField = new Blockly.FieldDate(); + assertValueDefault(dateField); + }); + test('Undefined', function() { + var dateField = new Blockly.FieldDate(undefined); + assertValueDefault(dateField); + }); + test('Non-Parsable String', function() { + var dateField = new Blockly.FieldDate('bad'); + assertValueDefault(dateField); + }); + test('2020-02-20', function() { + var dateField = new Blockly.FieldDate('2020-02-20'); + assertValue(dateField, '2020-02-20'); + }); + test('Invalid Date - Month(2020-13-20)', function() { + var dateField = new Blockly.FieldDate('2020-13-20'); + assertValueDefault(dateField); + }); + test('Invalid Date - Day(2020-02-32)', function() { + var dateField = new Blockly.FieldDate('2020-02-32'); + assertValueDefault(dateField); + }); + }); + suite('fromJson', function() { + test('Empty', function() { + var dateField = Blockly.FieldDate.fromJson({}); + assertValueDefault(dateField); + }); + test('Undefined', function() { + var dateField = Blockly.FieldDate.fromJson({ date: undefined }); + assertValueDefault(dateField); + }); + test('Non-Parsable String', function() { + var dateField = Blockly.FieldDate.fromJson({ date: 'bad' }); + assertValueDefault(dateField); + }); + test('2020-02-20', function() { + var dateField = Blockly.FieldDate.fromJson({ date: '2020-02-20' }); + assertValue(dateField, '2020-02-20'); + }); + test('Invalid Date - Month(2020-13-20)', function() { + var dateField = Blockly.FieldDate.fromJson({ date: '2020-13-20' }); + assertValueDefault(dateField); + }); + test('Invalid Date - Day(2020-02-32)', function() { + var dateField = Blockly.FieldDate.fromJson({ date: '2020-02-32' }); + assertValueDefault(dateField); + }); + }); + suite('setValue', function() { + suite('Empty -> New Value', function() { + setup(function() { + this.dateField = new Blockly.FieldDate(); + }); + test('Null', function() { + this.dateField.setValue(null); + assertValueDefault(this.dateField); + }); + test('Undefined', function() { + this.dateField.setValue(undefined); + assertValueDefault(this.dateField); + }); + test('Non-Parsable String', function() { + this.dateField.setValue('bad'); + assertValueDefault(this.dateField); + }); + test('Invalid Date - Month(2020-13-20)', function() { + this.dateField.setValue('2020-13-20'); + assertValueDefault(this.dateField); + }); + test('Invalid Date - Day(2020-02-32)', function() { + this.dateField.setValue('2020-02-32'); + assertValueDefault(this.dateField); + }); + test('3030-03-30', function() { + this.dateField.setValue('3030-03-30'); + assertValue(this.dateField, '3030-03-30'); + }); + }); + suite('Value -> New Value', function() { + setup(function() { + this.dateField = new Blockly.FieldDate('2020-02-20'); + }); + test('Null', function() { + this.dateField.setValue(null); + assertValue(this.dateField, '2020-02-20'); + }); + test('Undefined', function() { + this.dateField.setValue(undefined); + assertValue(this.dateField, '2020-02-20'); + }); + test('Non-Parsable String', function() { + this.dateField.setValue('bad'); + assertValue(this.dateField, '2020-02-20'); + }); + test('Invalid Date - Month(2020-13-20)', function() { + this.dateField.setValue('2020-13-20'); + assertValue(this.dateField, '2020-02-20'); + }); + test('Invalid Date - Day(2020-02-32)', function() { + this.dateField.setValue('2020-02-32'); + assertValue(this.dateField, '2020-02-20'); + }); + test('3030-03-30', function() { + this.dateField.setValue('3030-03-30'); + assertValue(this.dateField, '3030-03-30'); + }); + }); + }); + suite('Validators', function() { + setup(function() { + this.dateField = new Blockly.FieldDate('2020-02-20'); + }); + teardown(function() { + this.dateField.setValidator(null); + }); + suite('Null Validator', function() { + setup(function() { + this.dateField.setValidator(function() { + return null; + }); + }); + test('New Value', function() { + this.dateField.setValue('3030-03-30'); + assertValue(this.dateField, '2020-02-20'); + }); + }); + suite('Force Day 20s Validator', function() { + setup(function() { + this.dateField.setValidator(function(newValue) { + return newValue.substr(0, 8) + '2' + newValue.substr(9, 1); + }); + }); + test('New Value', function() { + this.dateField.setValue('3030-03-30'); + assertValue(this.dateField, '3030-03-20'); + }); + }); + suite('Returns Undefined Validator', function() { + setup(function() { + this.dateField.setValidator(function() {}); + }); + test('New Value', function() { + this.dateField.setValue('3030-03-30'); + assertValue(this.dateField, '3030-03-30'); + }); + }); + }); +}); diff --git a/js/tests/mocha/field_dropdown_test.js b/js/tests/mocha/field_dropdown_test.js new file mode 100644 index 0000000..896e2ef --- /dev/null +++ b/js/tests/mocha/field_dropdown_test.js @@ -0,0 +1,204 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +suite('Dropdown Fields', function() { + function assertValue(dropdownField, expectedValue, expectedText) { + var actualValue = dropdownField.getValue(); + var actualText = dropdownField.getText(); + assertEquals(actualValue, expectedValue); + assertEquals(actualText, expectedText); + } + suite('Constructor', function() { + test('Empty', function() { + chai.assert.throws(function() { + new Blockly.FieldDropdown(); + }); + }); + test('Undefined', function() { + chai.assert.throws(function() { + new Blockly.FieldDropdown(undefined); + }); + }); + test('Array Items not Arrays', function() { + var stub = sinon.stub(console, 'error'); + chai.assert.throws(function() { + new Blockly.FieldDropdown([1, 2, 3]); + }); + chai.assert(stub.calledThrice); + stub.restore(); + }); + test('Array Items with Invalid IDs', function() { + var stub = sinon.stub(console, 'error'); + chai.assert.throws(function() { + new Blockly.FieldDropdown([['1', 1], ['2', 2], ['3', 3]]); + }); + chai.assert(stub.calledThrice); + stub.restore(); + }); + test('Array Items with Invalid Content', function() { + var stub = sinon.stub(console, 'error'); + chai.assert.throws(function() { + new Blockly.FieldDropdown([[1, '1'], [2, '2'], [3, '3']]); + }); + chai.assert(stub.calledThrice); + stub.restore(); + }); + test('Text Dropdown', function() { + var dropdownField = new Blockly.FieldDropdown( + [['a', 'A'], ['b', 'B'], ['c', 'C']]); + assertValue(dropdownField, 'A', 'a'); + }); + test('Image Dropdown', function() { + var dropdownField = new Blockly.FieldDropdown([ + [{ src:'scrA', alt:'a' }, 'A'], + [{ src:'scrB', alt:'b' }, 'B'], + [{ src:'scrC', alt:'c' }, 'C']]); + assertValue(dropdownField, 'A', 'a'); + }); + test('Dynamic Dropdown Text', function() { + var dynamicDropdownFunc = function() { + return [['a', 'A'], ['b', 'B'], ['c', 'C']]; + }; + var dropdownField = new Blockly.FieldDropdown(dynamicDropdownFunc); + assertValue(dropdownField, 'A', 'a'); + }); + test('Dynamic Dropdown Image', function() { + var dynamicDropdownFunc = function() { + return [ + [{ src:'scrA', alt:'a' }, 'A'], + [{ src:'scrB', alt:'b' }, 'B'], + [{ src:'scrC', alt:'c' }, 'C'] + ]; + }; + var dropdownField = new Blockly.FieldDropdown(dynamicDropdownFunc); + assertValue(dropdownField, 'A', 'a'); + }); + }); + suite('fromJson', function() { + test('Empty', function() { + chai.assert.throws(function() { + Blockly.FieldDropdown.fromJson({}); + }); + }); + test('Undefined', function() { + chai.assert.throws(function() { + Blockly.FieldDropdown.fromJson({ options: undefined }); + }); + }); + test('Array Items not Arrays', function() { + var stub = sinon.stub(console, 'error'); + chai.assert.throws(function() { + Blockly.FieldDropdown.fromJson({ options: [1, 2, 3] }); + }); + chai.assert(stub.calledThrice); + stub.restore(); + }); + test('Array Items with Invalid IDs', function() { + var stub = sinon.stub(console, 'error'); + chai.assert.throws(function() { + Blockly.FieldDropdown.fromJson( + { options:[['1', 1], ['2', 2], ['3', 3]] }); + }); + chai.assert(stub.calledThrice); + stub.restore(); + }); + test('Array Items with Invalid Content', function() { + var stub = sinon.stub(console, 'error'); + chai.assert.throws(function() { + Blockly.FieldDropdown.fromJson( + { options:[[1, '1'], [2, '2'], [3, '3']] }); + }); + chai.assert(stub.calledThrice); + stub.restore(); + }); + test('Text Dropdown', function() { + var dropdownField = Blockly.FieldDropdown.fromJson( + { options:[['a', 'A'], ['b', 'B'], ['c', 'C']] }); + assertValue(dropdownField, 'A', 'a'); + }); + test('Image Dropdown', function() { + var dropdownField = Blockly.FieldDropdown.fromJson({ options:[ + [{ src:'scrA', alt:'a' }, 'A'], + [{ src:'scrB', alt:'b' }, 'B'], + [{ src:'scrC', alt:'c' }, 'C']] }); + assertValue(dropdownField, 'A', 'a'); + }); + }); + suite('setValue', function() { + setup(function() { + this.dropdownField = new Blockly.FieldDropdown( + [['a', 'A'], ['b', 'B'], ['c', 'C']]); + }); + test('Null', function() { + this.dropdownField.setValue(null); + assertValue(this.dropdownField, 'A', 'a'); + }); + test('Undefined', function() { + this.dropdownField.setValue(undefined); + assertValue(this.dropdownField, 'A', 'a'); + }); + test('Invalid ID', function() { + this.dropdownField.setValue('bad'); + assertValue(this.dropdownField, 'A', 'a'); + }); + test('Valid ID', function() { + this.dropdownField.setValue('B'); + assertValue(this.dropdownField, 'B', 'b'); + }); + }); + suite('Validators', function() { + setup(function() { + this.dropdownField = new Blockly.FieldDropdown([ + ["1a","1A"], ["1b","1B"], ["1c","1C"], + ["2a","2A"], ["2b","2B"], ["2c","2C"]]); + }); + teardown(function() { + this.dropdownField.setValidator(null); + }); + suite('Null Validator', function() { + setup(function() { + this.dropdownField.setValidator(function() { + return null; + }); + }); + test('New Value', function() { + this.dropdownField.setValue('1B'); + assertValue(this.dropdownField, '1A', '1a'); + }); + }); + suite('Force 1s Validator', function() { + setup(function() { + this.dropdownField.setValidator(function(newValue) { + return '1' + newValue.charAt(1); + }); + }); + test('New Value', function() { + this.dropdownField.setValue('2B'); + assertValue(this.dropdownField, '1B', '1b'); + }); + }); + suite('Returns Undefined Validator', function() { + setup(function() { + this.dropdownField.setValidator(function() {}); + }); + test('New Value', function() { + this.dropdownField.setValue('1B'); + assertValue(this.dropdownField, '1B', '1b'); + }); + }); + }); +}); diff --git a/js/tests/mocha/field_image_test.js b/js/tests/mocha/field_image_test.js new file mode 100644 index 0000000..415faf8 --- /dev/null +++ b/js/tests/mocha/field_image_test.js @@ -0,0 +1,249 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +suite('Image Fields', function() { + function assertValue(imageField, expectedValue, expectedText) { + var actualValue = imageField.getValue(); + var actualText = imageField.getText(); + assertEquals(actualValue, expectedValue); + assertEquals(actualText, expectedText); + } + suite('Constructor', function() { + test('Empty', function() { + chai.assert.throws(function() { + new Blockly.FieldImage(); + }); + }); + test('Undefined Src', function() { + chai.assert.throws(function() { + new Blockly.FieldImage(undefined, 1, 1); + }); + }); + test('Undefined Size', function() { + chai.assert.throws(function() { + new Blockly.FieldImage('src', undefined, undefined); + }); + }); + test('Zero Size', function() { + chai.assert.throws(function() { + new Blockly.FieldImage('src', 0, 0); + }); + }); + test('Non-Parsable String for Size', function() { + chai.assert.throws(function() { + new Blockly.FieldImage('src', 'bad', 'bad'); + }); + }); + test('With Alt', function() { + var imageField = new Blockly.FieldImage('src', 1, 1, 'alt'); + assertValue(imageField, 'src', 'alt'); + }); + test('Without Alt', function() { + var imageField = new Blockly.FieldImage('src', 1, 1); + assertValue(imageField, 'src', ''); + }); + }); + suite('fromJson', function() { + test('Empty', function() { + chai.assert.throws(function() { + Blockly.FieldImage.fromJson({}); + }); + }); + test('Undefined Src', function() { + chai.assert.throws(function() { + Blockly.FieldImage.fromJson({ + src: undefined, + width: 1, + height: 1 + }); + }); + }); + test('Undefined Size', function() { + chai.assert.throws(function() { + Blockly.FieldImage.fromJson({ + src: 'src', + width: undefined, + height: undefined + }); + }); + }); + test('Non-Parsable String for Size', function() { + chai.assert.throws(function() { + Blockly.FieldImage.fromJson({ + src: 'src', + width: 'bad', + height: 'bad' + }); + }); + }); + test('With Alt', function() { + var imageField = Blockly.FieldImage.fromJson({ + src: 'src', + width: 1, + height: 1, + alt: 'alt' + }); + assertValue(imageField, 'src', 'alt'); + }); + test('Without Alt', function() { + var imageField = Blockly.FieldImage.fromJson({ + src: 'src', + width: 1, + height: 1 + }); + assertValue(imageField, 'src', ''); + }); + }); + suite('setValue', function() { + setup(function() { + this.imageField = new Blockly.FieldImage('src', 1, 1, 'alt'); + }); + test('Null', function() { + this.imageField.setValue(null); + assertValue(this.imageField, 'src', 'alt'); + }); + test('Undefined', function() { + this.imageField.setValue(undefined); + assertValue(this.imageField, 'src', 'alt'); + }); + test('Good Src', function() { + this.imageField.setValue('newSrc'); + assertValue(this.imageField, 'newSrc', 'alt'); + }); + }); + suite('Customizations', function() { + suite('On Click Handler', function() { + setup(function() { + this.onClick = function() { + console.log('on click'); + }; + }); + teardown(function() { + delete this.onClick; + }); + test('JS Constructor', function() { + var field = new Blockly.FieldImage('src', 10, 10, null, this.onClick); + chai.assert.equal(field.clickHandler_, this.onClick); + }); + test('setOnClickHandler', function() { + var field = new Blockly.FieldImage('src', 10, 10); + field.setOnClickHandler(this.onClick); + chai.assert.equal(field.clickHandler_, this.onClick); + }); + test('Remove Click Handler', function() { + var field = new Blockly.FieldImage('src', 10, 10, null, this.onClick); + field.setOnClickHandler(null); + chai.assert.equal(field.clickHandler_, null); + }); + }); + suite('Alt', function() { + test('JS Constructor', function() { + var field = new Blockly.FieldImage('src', 10, 10, 'alt'); + chai.assert.equal(field.altText_, 'alt'); + }); + test('JSON Definition', function() { + var field = Blockly.FieldImage.fromJson({ + src: 'src', + width: 10, + height: 10, + alt: 'alt' + }); + chai.assert.equal(field.altText_, 'alt'); + }); + test('Deprecated - setText', function() { + var field = new Blockly.FieldImage('src', 10, 10, 'alt'); + chai.assert.throws(function() { + field.setText('newAlt'); + }); + }); + suite('SetAlt', function() { + setup(function() { + this.imageField = new Blockly.FieldImage('src', 10, 10, 'alt'); + }); + test('Null', function() { + this.imageField.setAlt(null); + assertValue(this.imageField, 'src', ''); + }); + test('Empty String', function() { + this.imageField.setAlt(''); + assertValue(this.imageField, 'src', ''); + }); + test('Good Alt', function() { + this.imageField.setAlt('newAlt'); + assertValue(this.imageField, 'src', 'newAlt'); + }); + }); + test('JS Configuration - Simple', function() { + var field = new Blockly.FieldImage('src', 10, 10, null, null, null, { + alt: 'alt' + }); + chai.assert.equal(field.altText_, 'alt'); + }); + test('JS Configuration - Ignore', function() { + var field = new Blockly.FieldImage('src', 10, 10, 'alt', null, null, { + alt: 'configAlt' + }); + chai.assert.equal(field.altText_, 'configAlt'); + }); + test('JS Configuration - Ignore - \'\'', function() { + var field = new Blockly.FieldImage('src', 10, 10, '', null, null, { + alt: 'configAlt' + }); + chai.assert.equal(field.altText_, 'configAlt'); + }); + test('JS Configuration - Ignore - Config \'\'', function() { + var field = new Blockly.FieldImage('src', 10, 10, 'alt', null, null, { + alt: '' + }); + chai.assert.equal(field.altText_, ''); + }); + }); + suite('Flip RTL', function() { + test('JS Constructor', function() { + var field = new Blockly.FieldImage('src', 10, 10, null, null, true); + chai.assert.isTrue(field.getFlipRtl()); + }); + test('JSON Definition', function() { + var field = Blockly.FieldImage.fromJson({ + src: 'src', + width: 10, + height: 10, + flipRtl: true + }); + chai.assert.isTrue(field.getFlipRtl()); + }); + test('JS Configuration - Simple', function() { + var field = new Blockly.FieldImage('src', 10, 10, null, null, null, { + flipRtl: true + }); + chai.assert.isTrue(field.getFlipRtl()); + }); + test('JS Configuration - Ignore - True', function() { + var field = new Blockly.FieldImage('src', 10, 10, null, null, true, { + flipRtl: false + }); + chai.assert.isFalse(field.getFlipRtl()); + }); + test('JS Configuration - Ignore - False', function() { + var field = new Blockly.FieldImage('src', 10, 10, null, null, false, { + flipRtl: true + }); + chai.assert.isTrue(field.getFlipRtl()); + }); + }); + }); +}); diff --git a/js/tests/mocha/field_label_serializable_test.js b/js/tests/mocha/field_label_serializable_test.js new file mode 100644 index 0000000..9111980 --- /dev/null +++ b/js/tests/mocha/field_label_serializable_test.js @@ -0,0 +1,250 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +suite('Label Serializable Fields', function() { + function assertValue(labelField, expectedValue) { + var actualValue = labelField.getValue(); + var actualText = labelField.getText(); + assertEquals(actualValue, expectedValue); + assertEquals(actualText, expectedValue); + } + function assertValueDefault(labelField) { + assertValue(labelField, ''); + } + function assertHasClass(labelField, cssClass) { + labelField.fieldGroup_ = Blockly.utils.dom.createSvgElement('g', {}, null); + labelField.constants_ = { + FIELD_TEXT_BASELINE_Y: 13 + }; + labelField.initView(); + chai.assert.isTrue(Blockly.utils.dom.hasClass( + labelField.textElement_, cssClass)); + } + function assertDoesNotHaveClass(labelField, cssClass) { + labelField.fieldGroup_ = Blockly.utils.dom.createSvgElement('g', {}, null); + labelField.constants_ = { + FIELD_TEXT_BASELINE_Y: 13 + }; + labelField.initView(); + chai.assert.isFalse(Blockly.utils.dom.hasClass( + labelField.textElement_, cssClass)); + } + suite('Constructor', function() { + test('Empty', function() { + var labelField = new Blockly.FieldLabelSerializable(); + assertValueDefault(labelField); + }); + test('Null', function() { + var labelField = new Blockly.FieldLabelSerializable(null); + assertValueDefault(labelField); + }); + test('Undefined', function() { + var labelField = new Blockly.FieldLabelSerializable(undefined); + assertValueDefault(labelField); + }); + test('String', function() { + var labelField = new Blockly.FieldLabelSerializable('value'); + assertValue(labelField, 'value'); + }); + test('Number (Truthy)', function() { + var labelField = new Blockly.FieldLabelSerializable(1); + assertValue(labelField, '1'); + }); + test('Number (Falsy)', function() { + var labelField = new Blockly.FieldLabelSerializable(0); + assertValue(labelField, '0'); + }); + test('Boolean True', function() { + var labelField = new Blockly.FieldLabelSerializable(true); + assertValue(labelField, 'true'); + }); + test('Boolean False', function() { + var labelField = new Blockly.FieldLabelSerializable(false); + assertValue(labelField, 'false'); + }); + }); + suite('fromJson', function() { + test('Empty', function() { + var labelField = new Blockly.FieldLabelSerializable.fromJson({}); + assertValueDefault(labelField); + }); + test('Null', function() { + var labelField = new Blockly.FieldLabelSerializable + .fromJson({ text:null }); + assertValueDefault(labelField); + }); + test('Undefined', function() { + var labelField = new Blockly.FieldLabelSerializable + .fromJson({ text:undefined }); + assertValueDefault(labelField); + }); + test('String', function() { + var labelField = Blockly.FieldLabelSerializable + .fromJson({ text:'value' }); + assertValue(labelField, 'value'); + }); + test('Number (Truthy)', function() { + var labelField = Blockly.FieldLabelSerializable.fromJson({ text:1 }); + assertValue(labelField, '1'); + }); + test('Number (Falsy)', function() { + var labelField = Blockly.FieldLabelSerializable.fromJson({ text:0 }); + assertValue(labelField, '0'); + }); + test('Boolean True', function() { + var labelField = Blockly.FieldLabelSerializable.fromJson({ text:true }); + assertValue(labelField, 'true'); + }); + test('Boolean False', function() { + var labelField = Blockly.FieldLabelSerializable.fromJson({ text:false }); + assertValue(labelField, 'false'); + }); + }); + suite('setValue', function() { + suite('Empty -> New Value', function() { + setup(function() { + this.labelField = new Blockly.FieldLabelSerializable(); + }); + test('Null', function() { + this.labelField.setValue(null); + assertValueDefault(this.labelField); + }); + test('Undefined', function() { + this.labelField.setValue(undefined); + assertValueDefault(this.labelField); + }); + test('New String', function() { + this.labelField.setValue('newValue'); + assertValue(this.labelField, 'newValue'); + }); + test('Number (Truthy)', function() { + this.labelField.setValue(1); + assertValue(this.labelField, '1'); + }); + test('Number (Falsy)', function() { + this.labelField.setValue(0); + assertValue(this.labelField, '0'); + }); + test('Boolean True', function() { + this.labelField.setValue(true); + assertValue(this.labelField, 'true'); + }); + test('Boolean False', function() { + this.labelField.setValue(false); + assertValue(this.labelField, 'false'); + }); + }); + suite('Value -> New Value', function() { + setup(function() { + this.labelField = new Blockly.FieldLabelSerializable('value'); + }); + test('Null', function() { + this.labelField.setValue(null); + assertValue(this.labelField, 'value'); + }); + test('Undefined', function() { + this.labelField.setValue(undefined); + assertValue(this.labelField, 'value'); + }); + test('New String', function() { + this.labelField.setValue('newValue'); + assertValue(this.labelField, 'newValue'); + }); + test('Number (Truthy)', function() { + this.labelField.setValue(1); + assertValue(this.labelField, '1'); + }); + test('Number (Falsy)', function() { + this.labelField.setValue(0); + assertValue(this.labelField, '0'); + }); + test('Boolean True', function() { + this.labelField.setValue(true); + assertValue(this.labelField, 'true'); + }); + test('Boolean False', function() { + this.labelField.setValue(false); + assertValue(this.labelField, 'false'); + }); + }); + }); + suite('Customizations', function() { + test('JS Constructor', function() { + var field = new Blockly.FieldLabelSerializable('text', 'testClass'); + assertHasClass(field, 'testClass'); + }); + test('JSON Definition', function() { + var field = Blockly.FieldLabelSerializable.fromJson({ + class: 'testClass' + }); + assertHasClass(field, 'testClass'); + }); + test('JS Configuration - Simple', function() { + var field = new Blockly.FieldLabelSerializable('text', null, { + class: 'testClass' + }); + assertHasClass(field, 'testClass'); + }); + test('JS Configuration - Ignore', function() { + var field = new Blockly.FieldLabelSerializable('text', 'paramClass', { + class: 'configClass' + }); + assertDoesNotHaveClass(field, 'paramClass'); + assertHasClass(field, 'configClass'); + }); + test('JS Configuration - Ignore - \'\'', function() { + var field = new Blockly.FieldLabelSerializable('text', '', { + class: 'configClass' + }); + assertHasClass(field, 'configClass'); + }); + test('JS Configuration - Ignore - Config \'\'', function() { + var field = new Blockly.FieldLabelSerializable('text', 'paramClass', { + class: '' + }); + assertDoesNotHaveClass(field, 'paramClass'); + }); + suite('setClass', function() { + test('setClass', function() { + var field = new Blockly.FieldLabelSerializable(); + field.fieldGroup_ = Blockly.utils.dom.createSvgElement('g', {}, null); + field.constants_ = { + FIELD_TEXT_BASELINE_Y: 13 + }; + field.initView(); + field.setClass('testClass'); + // Don't call assertHasClass b/c we don't want to re-initialize. + chai.assert.isTrue(Blockly.utils.dom.hasClass( + field.textElement_, 'testClass')); + }); + test('setClass Before Initialization', function() { + var field = new Blockly.FieldLabelSerializable(); + field.setClass('testClass'); + assertHasClass(field, 'testClass'); + }); + test('Remove Class', function() { + var field = new Blockly.FieldLabelSerializable('text', null, { + class: 'testClass' + }); + assertHasClass(field, 'testClass'); + field.setClass(null); + chai.assert.isFalse(Blockly.utils.dom.hasClass( + field.textElement_, 'testClass')); + }); + }); + }); +}); diff --git a/js/tests/mocha/field_label_test.js b/js/tests/mocha/field_label_test.js new file mode 100644 index 0000000..1e3578e --- /dev/null +++ b/js/tests/mocha/field_label_test.js @@ -0,0 +1,239 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +suite('Label Fields', function() { + function assertValue(labelField, expectedValue) { + var actualValue = labelField.getValue(); + var actualText = labelField.getText(); + assertEquals(actualValue, expectedValue); + assertEquals(actualText, expectedValue); + } + function assertValueDefault(labelField) { + assertValue(labelField, ''); + } + function assertHasClass(labelField, cssClass) { + labelField.fieldGroup_ = Blockly.utils.dom.createSvgElement('g', {}, null); + labelField.constants_ = { + FIELD_TEXT_BASELINE_Y: 13 + }; + labelField.initView(); + chai.assert.isTrue(Blockly.utils.dom.hasClass( + labelField.textElement_, cssClass)); + } + function assertDoesNotHaveClass(labelField, cssClass) { + labelField.fieldGroup_ = Blockly.utils.dom.createSvgElement('g', {}, null); + labelField.constants_ = { + FIELD_TEXT_BASELINE_Y: 13 + }; + labelField.initView(); + chai.assert.isFalse(Blockly.utils.dom.hasClass( + labelField.textElement_, cssClass)); + } + suite('Constructor', function() { + test('Empty', function() { + var labelField = new Blockly.FieldLabel(); + assertValueDefault(labelField); + }); + test('Undefined', function() { + var labelField = new Blockly.FieldLabel(undefined); + assertValueDefault(labelField); + }); + test('String', function() { + var labelField = new Blockly.FieldLabel('value'); + assertValue(labelField, 'value'); + }); + test('Number (Truthy)', function() { + var labelField = new Blockly.FieldLabel(1); + assertValue(labelField, '1'); + }); + test('Number (Falsy)', function() { + var labelField = new Blockly.FieldLabel(0); + assertValue(labelField, '0'); + }); + test('Boolean True', function() { + var labelField = new Blockly.FieldLabel(true); + assertValue(labelField, 'true'); + }); + test('Boolean False', function() { + var labelField = new Blockly.FieldLabel(false); + assertValue(labelField, 'false'); + }); + }); + suite('fromJson', function() { + test('Empty', function() { + var labelField = new Blockly.FieldLabel.fromJson({}); + assertValueDefault(labelField); + }); + test('Undefined', function() { + var labelField = new Blockly.FieldLabel.fromJson({ text:undefined }); + assertValueDefault(labelField); + }); + test('String', function() { + var labelField = Blockly.FieldLabel.fromJson({ text:'value' }); + assertValue(labelField, 'value'); + }); + test('Number (Truthy)', function() { + var labelField = Blockly.FieldLabel.fromJson({ text:1 }); + assertValue(labelField, '1'); + }); + test('Number (Falsy)', function() { + var labelField = Blockly.FieldLabel.fromJson({ text:0 }); + assertValue(labelField, '0'); + }); + test('Boolean True', function() { + var labelField = Blockly.FieldLabel.fromJson({ text:true }); + assertValue(labelField, 'true'); + }); + test('Boolean False', function() { + var labelField = Blockly.FieldLabel.fromJson({ text:false }); + assertValue(labelField, 'false'); + }); + }); + suite('setValue', function() { + suite('Empty -> New Value', function() { + setup(function() { + this.labelField = new Blockly.FieldLabel(); + }); + test('Null', function() { + this.labelField.setValue(null); + assertValueDefault(this.labelField); + }); + test('Undefined', function() { + this.labelField.setValue(undefined); + assertValueDefault(this.labelField); + }); + test('New String', function() { + this.labelField.setValue('newValue'); + assertValue(this.labelField, 'newValue'); + }); + test('Number (Truthy)', function() { + this.labelField.setValue(1); + assertValue(this.labelField, '1'); + }); + test('Number (Falsy)', function() { + this.labelField.setValue(0); + assertValue(this.labelField, '0'); + }); + test('Boolean True', function() { + this.labelField.setValue(true); + assertValue(this.labelField, 'true'); + }); + test('Boolean False', function() { + this.labelField.setValue(false); + assertValue(this.labelField, 'false'); + }); + }); + suite('Value -> New Value', function() { + setup(function() { + this.labelField = new Blockly.FieldLabel('value'); + }); + test('Null', function() { + this.labelField.setValue(null); + assertValue(this.labelField, 'value'); + }); + test('Undefined', function() { + this.labelField.setValue(undefined); + assertValue(this.labelField, 'value'); + }); + test('New String', function() { + this.labelField.setValue('newValue'); + assertValue(this.labelField, 'newValue'); + }); + test('Number (Truthy)', function() { + this.labelField.setValue(1); + assertValue(this.labelField, '1'); + }); + test('Number (Falsy)', function() { + this.labelField.setValue(0); + assertValue(this.labelField, '0'); + }); + test('Boolean True', function() { + this.labelField.setValue(true); + assertValue(this.labelField, 'true'); + }); + test('Boolean False', function() { + this.labelField.setValue(false); + assertValue(this.labelField, 'false'); + }); + }); + }); + suite('Customizations', function() { + test('JS Constructor', function() { + var field = new Blockly.FieldLabel('text', 'testClass'); + assertHasClass(field, 'testClass'); + }); + test('JSON Definition', function() { + var field = Blockly.FieldLabel.fromJson({ + class: 'testClass' + }); + assertHasClass(field, 'testClass'); + }); + test('JS Configuration - Simple', function() { + var field = new Blockly.FieldLabel('text', null, { + class: 'testClass' + }); + assertHasClass(field, 'testClass'); + }); + test('JS Configuration - Ignore', function() { + var field = new Blockly.FieldLabel('text', 'paramClass', { + class: 'configClass' + }); + assertDoesNotHaveClass(field, 'paramClass'); + assertHasClass(field, 'configClass'); + }); + test('JS Configuration - Ignore - \'\'', function() { + var field = new Blockly.FieldLabel('text', '', { + class: 'configClass' + }); + assertHasClass(field, 'configClass'); + }); + test('JS Configuration - Ignore - Config \'\'', function() { + var field = new Blockly.FieldLabel('text', 'paramClass', { + class: '' + }); + assertDoesNotHaveClass(field, 'paramClass'); + }); + suite('setClass', function() { + test('setClass', function() { + var field = new Blockly.FieldLabel(); + field.fieldGroup_ = Blockly.utils.dom.createSvgElement('g', {}, null); + field.constants_ = { + FIELD_TEXT_BASELINE_Y: 13 + }; + field.initView(); + field.setClass('testClass'); + // Don't call assertHasClass b/c we don't want to re-initialize. + chai.assert.isTrue(Blockly.utils.dom.hasClass( + field.textElement_, 'testClass')); + }); + test('setClass Before Initialization', function() { + var field = new Blockly.FieldLabel(); + field.setClass('testClass'); + assertHasClass(field, 'testClass'); + }); + test('Remove Class', function() { + var field = new Blockly.FieldLabel('text', null, { + class: 'testClass' + }); + assertHasClass(field, 'testClass'); + field.setClass(null); + chai.assert.isFalse(Blockly.utils.dom.hasClass( + field.textElement_, 'testClass')); + }); + }); + }); +}); diff --git a/js/tests/mocha/field_number_test.js b/js/tests/mocha/field_number_test.js new file mode 100644 index 0000000..081cfa7 --- /dev/null +++ b/js/tests/mocha/field_number_test.js @@ -0,0 +1,504 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +suite('Number Fields', function() { + function assertValue(numberField, expectedValue, opt_expectedText) { + var actualValue = numberField.getValue(); + var actualText = numberField.getText(); + opt_expectedText = opt_expectedText || String(expectedValue); + assertEquals(String(actualValue), String(expectedValue)); + assertEquals(Number(actualValue), expectedValue); + assertEquals(actualText, opt_expectedText); + } + function assertValueDefault(numberField) { + assertValue(numberField, 0); + } + function assertNumberField(numberField, expectedMin, expectedMax, + expectedPrecision, expectedValue) { + assertValue(numberField, expectedValue); + chai.assert.equal(numberField.getMin(), expectedMin); + chai.assert.equal(numberField.getMax(), expectedMax); + chai.assert.equal(numberField.getPrecision(), expectedPrecision); + } + function assertNumberFieldDefault(numberField) { + assertNumberField(numberField, -Infinity, Infinity, 0, 0); + } + function createNumberFieldSameValuesConstructor(value) { + return new Blockly.FieldNumber(value, value, value, value); + } + function createNumberFieldSameValuesJson(value) { + return Blockly.FieldNumber.fromJson( + { 'value': value, min: value, max: value, precision: value }); + } + function assertNumberFieldSameValues(numberField, value) { + assertNumberField(numberField, value, value, value, value); + } + suite('Constructor', function() { + test('Empty', function() { + var numberField = new Blockly.FieldNumber(); + assertNumberFieldDefault(numberField); + }); + test('Undefined', function() { + var numberField = createNumberFieldSameValuesConstructor(undefined); + assertNumberFieldDefault(numberField); + }); + test('NaN', function() { + var numberField = createNumberFieldSameValuesConstructor(NaN); + assertNumberFieldDefault(numberField); + }); + test('Integer', function() { + var numberField = createNumberFieldSameValuesConstructor(1); + assertNumberFieldSameValues(numberField, 1); + }); + test('Float', function() { + var numberField = createNumberFieldSameValuesConstructor(1.5); + assertNumberFieldSameValues(numberField, 1.5); + }); + test('Integer String', function() { + var numberField = createNumberFieldSameValuesConstructor('1'); + assertNumberFieldSameValues(numberField, 1); + }); + test('Float String', function() { + var numberField = createNumberFieldSameValuesConstructor('1.5'); + assertNumberFieldSameValues(numberField, 1.5); + }); + test('Infinity', function() { + var numberField = createNumberFieldSameValuesConstructor('Infinity'); + assertNumberFieldSameValues(numberField, Infinity); + }); + test('Negative Infinity String', function() { + var numberField = createNumberFieldSameValuesConstructor('-Infinity'); + assertNumberFieldSameValues(numberField, -Infinity); + }); + }); + suite('fromJson', function() { + test('Empty', function() { + var numberField = Blockly.FieldNumber.fromJson({}); + assertNumberFieldDefault(numberField); + }); + test('Undefined', function() { + var numberField = createNumberFieldSameValuesJson(undefined); + assertNumberFieldDefault(numberField); + }); + test('NaN', function() { + var numberField = createNumberFieldSameValuesJson(NaN); + assertNumberFieldDefault(numberField); + }); + test('Integer', function() { + var numberField = createNumberFieldSameValuesJson(1); + assertNumberFieldSameValues(numberField, 1); + }); + test('Float', function() { + var numberField = createNumberFieldSameValuesJson(1.5); + assertNumberFieldSameValues(numberField, 1.5); + }); + test('Integer String', function() { + var numberField = createNumberFieldSameValuesJson('1'); + assertNumberFieldSameValues(numberField, 1); + }); + test('Float String', function() { + var numberField = createNumberFieldSameValuesJson('1.5'); + assertNumberFieldSameValues(numberField, 1.5); + }); + test('Infinity', function() { + var numberField = createNumberFieldSameValuesJson('Infinity'); + assertNumberFieldSameValues(numberField, Infinity); + }); + test('Negative Infinity String', function() { + var numberField = createNumberFieldSameValuesJson('-Infinity'); + assertNumberFieldSameValues(numberField, -Infinity); + }); + }); + suite('setValue', function() { + suite('Value Types', function() { + suite('Empty -> New Value', function() { + setup(function() { + this.numberField = new Blockly.FieldNumber(); + }); + test('Null', function() { + this.numberField.setValue(null); + assertValueDefault(this.numberField); + }); + test('Undefined', function() { + this.numberField.setValue(undefined); + assertValueDefault(this.numberField); + }); + test('Non-Parsable String', function() { + this.numberField.setValue('bad'); + assertValueDefault(this.numberField); + }); + test('NaN', function() { + this.numberField.setValue(NaN); + assertValueDefault(this.numberField); + }); + test('Integer', function() { + this.numberField.setValue(2); + assertValue(this.numberField, 2); + }); + test('Float', function() { + this.numberField.setValue(2.5); + assertValue(this.numberField, 2.5); + }); + test('Integer String', function() { + this.numberField.setValue('2'); + assertValue(this.numberField, 2); + }); + test('Float String', function() { + this.numberField.setValue('2.5'); + assertValue(this.numberField, 2.5); + }); + test('Infinity', function() { + this.numberField.setValue(Infinity); + assertValue(this.numberField, Infinity); + }); + test('Negative Infinity String', function() { + this.numberField.setValue('-Infinity'); + assertValue(this.numberField, -Infinity); + }); + }); + suite('Value -> New Value', function() { + setup(function() { + this.numberField = new Blockly.FieldNumber(1); + }); + test('Null', function() { + this.numberField.setValue(null); + assertValue(this.numberField, 1); + }); + test('Undefined', function() { + this.numberField.setValue(undefined); + assertValue(this.numberField, 1); + }); + test('Non-Parsable String', function() { + this.numberField.setValue('bad'); + assertValue(this.numberField, 1); + }); + test('NaN', function() { + this.numberField.setValue(NaN); + assertValue(this.numberField, 1); + }); + test('Integer', function() { + this.numberField.setValue(2); + assertValue(this.numberField, 2); + }); + test('Float', function() { + this.numberField.setValue(2.5); + assertValue(this.numberField, 2.5); + }); + test('Integer String', function() { + this.numberField.setValue('2'); + assertValue(this.numberField, 2); + }); + test('Float String', function() { + this.numberField.setValue('2.5'); + assertValue(this.numberField, 2.5); + }); + test('Infinity', function() { + this.numberField.setValue(Infinity); + assertValue(this.numberField, Infinity); + }); + test('Negative Infinity String', function() { + this.numberField.setValue('-Infinity'); + assertValue(this.numberField, -Infinity); + }); + }); + }); + suite('Constraints', function() { + suite('Precision', function() { + test('Float', function() { + var numberField = new Blockly.FieldNumber(); + numberField.setValue(123.456); + assertValue(numberField, 123.456); + }); + test('0.01', function() { + var numberField = new Blockly.FieldNumber + .fromJson({ precision: .01 }); + numberField.setValue(123.456); + assertValue(numberField, 123.46); + }); + test('0.5', function() { + var numberField = new Blockly.FieldNumber + .fromJson({ precision: .5 }); + numberField.setValue(123.456); + assertValue(numberField, 123.5); + }); + test('1', function() { + var numberField = new Blockly.FieldNumber + .fromJson({ precision: 1 }); + numberField.setValue(123.456); + assertValue(numberField, 123); + }); + test('1.5', function() { + var numberField = new Blockly.FieldNumber + .fromJson({ precision: 1.5 }); + numberField.setValue(123.456); + assertValue(numberField, 123); + }); + test('Null', function() { + var numberField = new Blockly.FieldNumber + .fromJson({ precision: null}); + assertEquals(numberField.getPrecision(), 0); + }); + }); + suite('Min', function() { + test('-10', function() { + var numberField = new Blockly.FieldNumber.fromJson({ min: -10 }); + numberField.setValue(-20); + assertValue(numberField, -10); + numberField.setValue(0); + assertValue(numberField, 0); + numberField.setValue(20); + assertValue(numberField, 20); + }); + test('0', function() { + var numberField = new Blockly.FieldNumber.fromJson({ min: 0 }); + numberField.setValue(-20); + assertValue(numberField, 0); + numberField.setValue(0); + assertValue(numberField, 0); + numberField.setValue(20); + assertValue(numberField, 20); + }); + test('+10', function() { + var numberField = new Blockly.FieldNumber.fromJson({ min: 10 }); + numberField.setValue(-20); + assertValue(numberField, 10); + numberField.setValue(0); + assertValue(numberField, 10); + numberField.setValue(20); + assertValue(numberField, 20); + }); + test('Null', function() { + var numberField = new Blockly.FieldNumber + .fromJson({ min: null}); + assertEquals(numberField.getMin(), -Infinity); + }); + }); + suite('Max', function() { + test('-10', function() { + var numberField = new Blockly.FieldNumber.fromJson({ max: -10 }); + numberField.setValue(-20); + assertValue(numberField, -20); + numberField.setValue(0); + assertValue(numberField, -10); + numberField.setValue(20); + assertValue(numberField, -10); + }); + test('0', function() { + var numberField = new Blockly.FieldNumber.fromJson({ max: 0 }); + numberField.setValue(-20); + assertValue(numberField, -20); + numberField.setValue(0); + assertValue(numberField, 0); + numberField.setValue(20); + assertValue(numberField, 0); + }); + test('+10', function() { + var numberField = new Blockly.FieldNumber.fromJson({ max: 10 }); + numberField.setValue(-20); + assertValue(numberField, -20); + numberField.setValue(0); + assertValue(numberField, 0); + numberField.setValue(20); + assertValue(numberField, 10); + }); + test('null', function() { + var numberField = new Blockly.FieldNumber + .fromJson({ max: null}); + assertEquals(numberField.getMax(), Infinity); + }); + }); + }); + }); + suite('Validators', function() { + setup(function() { + this.numberField = new Blockly.FieldNumber(1); + this.numberField.htmlInput_ = Object.create(null); + this.numberField.htmlInput_.oldValue_ = '1'; + this.numberField.htmlInput_.untypedDefaultValue_ = 1; + this.stub = sinon.stub(this.numberField, 'resizeEditor_'); + }); + teardown(function() { + this.numberField.setValidator(null); + this.numberField.htmlInput_ = null; + if (this.stub) { + this.stub.restore(); + } + }); + suite('Null Validator', function() { + setup(function() { + this.numberField.setValidator(function() { + return null; + }); + }); + test('When Editing', function() { + this.numberField.isBeingEdited_ = true; + this.numberField.htmlInput_.value = '2'; + this.numberField.onHtmlInputChange_(null); + assertValue(this.numberField, 1, '2'); + this.numberField.isBeingEdited_ = false; + }); + test('When Not Editing', function() { + this.numberField.setValue(2); + assertValue(this.numberField, 1); + }); + }); + suite('Force End with 6 Validator', function() { + setup(function() { + this.numberField.setValidator(function(newValue) { + return String(newValue).replace(/.$/, "6"); + }); + }); + test('When Editing', function() { + this.numberField.isBeingEdited_ = true; + this.numberField.htmlInput_.value = '25'; + this.numberField.onHtmlInputChange_(null); + assertValue(this.numberField, 26, '25'); + this.numberField.isBeingEdited_ = false; + }); + test('When Not Editing', function() { + this.numberField.setValue(25); + assertValue(this.numberField, 26); + }); + }); + suite('Returns Undefined Validator', function() { + setup(function() { + this.numberField.setValidator(function() {}); + }); + test('When Editing', function() { + this.numberField.isBeingEdited_ = true; + this.numberField.htmlInput_.value = '2'; + this.numberField.onHtmlInputChange_(null); + assertValue(this.numberField, 2); + this.numberField.isBeingEdited_ = false; + }); + test('When Not Editing', function() { + this.numberField.setValue(2); + assertValue(this.numberField, 2); + }); + }); + }); + suite('Customizations', function() { + suite('Min', function() { + test('JS Constructor', function() { + var field = new Blockly.FieldNumber(0, -10); + assertNumberField(field, -10, Infinity, 0, 0); + }); + test('JSON Definition', function() { + var field = Blockly.FieldNumber.fromJson({ + min: -10, + }); + assertNumberField(field, -10, Infinity, 0, 0); + }); + test('Set Constraints', function() { + var field = new Blockly.FieldNumber(); + field.setConstraints(-10); + assertNumberField(field, -10, Infinity, 0, 0); + }); + test('Set Min', function() { + var field = new Blockly.FieldNumber(); + field.setMin(-10); + assertNumberField(field, -10, Infinity, 0, 0); + }); + test('JS Configuration - Simple', function() { + var field = new Blockly.FieldNumber( + undefined, undefined, undefined, undefined, undefined, { + min: -10 + }); + assertNumberField(field, -10, Infinity, 0, 0); + }); + test('JS Configuration - Ignore', function() { + var field = new Blockly.FieldNumber( + undefined, -1, undefined, undefined, undefined, { + min: -10 + }); + assertNumberField(field, -10, Infinity, 0, 0); + }); + }); + suite('Max', function() { + test('JS Constructor', function() { + var field = new Blockly.FieldNumber(0, undefined, 10); + assertNumberField(field, -Infinity, 10, 0, 0); + }); + test('JSON Definition', function() { + var field = Blockly.FieldNumber.fromJson({ + max: 10, + }); + assertNumberField(field, -Infinity, 10, 0, 0); + }); + test('Set Constraints', function() { + var field = new Blockly.FieldNumber(); + field.setConstraints(undefined, 10); + assertNumberField(field, -Infinity, 10, 0, 0); + }); + test('Set Max', function() { + var field = new Blockly.FieldNumber(); + field.setMax(10); + assertNumberField(field, -Infinity, 10, 0, 0); + }); + test('JS Configuration - Simple', function() { + var field = new Blockly.FieldNumber( + undefined, undefined, undefined, undefined, undefined, { + max: 10 + }); + assertNumberField(field, -Infinity, 10, 0, 0); + }); + test('JS Configuration - Ignore', function() { + var field = new Blockly.FieldNumber( + undefined, undefined, 1, undefined, undefined, { + max: 10 + }); + assertNumberField(field, -Infinity, 10, 0, 0); + }); + }); + suite('Precision', function() { + test('JS Constructor', function() { + var field = new Blockly.FieldNumber(0, undefined, undefined, 1); + assertNumberField(field, -Infinity, Infinity, 1, 0); + }); + test('JSON Definition', function() { + var field = Blockly.FieldNumber.fromJson({ + precision: 1, + }); + assertNumberField(field, -Infinity, Infinity, 1, 0); + }); + test('Set Constraints', function() { + var field = new Blockly.FieldNumber(); + field.setConstraints(undefined, undefined, 1); + assertNumberField(field, -Infinity, Infinity, 1, 0); + }); + test('Set Precision', function() { + var field = new Blockly.FieldNumber(); + field.setPrecision(1); + assertNumberField(field, -Infinity, Infinity, 1, 0); + }); + test('JS Configuration - Simple', function() { + var field = new Blockly.FieldNumber( + undefined, undefined, undefined, undefined, undefined, { + precision: 1 + }); + assertNumberField(field, -Infinity, Infinity, 1, 0); + }); + test('JS Configuration - Ignore', function() { + var field = new Blockly.FieldNumber( + undefined, undefined, undefined, .5, undefined, { + precision: 1 + }); + assertNumberField(field, -Infinity, Infinity, 1, 0); + }); + }); + }); +}); diff --git a/js/tests/mocha/field_registry_test.js b/js/tests/mocha/field_registry_test.js new file mode 100644 index 0000000..574e6df --- /dev/null +++ b/js/tests/mocha/field_registry_test.js @@ -0,0 +1,123 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Tests for Blockly.fieldRegistry + * @author bekawestberg@gmail.com (Beka Westberg) + */ +'use strict'; + +suite('Field Registry', function() { + function CustomFieldType(value) { + CustomFieldType.superClass_.constructor.call(this, value); + } + Blockly.utils.object.inherits(CustomFieldType, Blockly.Field); + CustomFieldType.fromJson = function(options) { + return new CustomFieldType(options['value']); + }; + + teardown(function() { + if (Blockly.fieldRegistry.typeMap_['field_custom_test']) { + delete Blockly.fieldRegistry.typeMap_['field_custom_test']; + } + }); + suite('Registration', function() { + test('Simple', function() { + Blockly.fieldRegistry.register('field_custom_test', CustomFieldType); + }); + test('Empty String Key', function() { + chai.assert.throws(function() { + Blockly.fieldRegistry.register('', CustomFieldType); + }, 'Invalid field type'); + }); + test('Class as Key', function() { + chai.assert.throws(function() { + Blockly.fieldRegistry.register(CustomFieldType, ''); + }, 'Invalid field type'); + }); + test('fromJson as Key', function() { + chai.assert.throws(function() { + Blockly.fieldRegistry.register(CustomFieldType.fromJson, ''); + }, 'Invalid field type'); + }); + test('Overwrite a Key', function() { + Blockly.fieldRegistry.register('field_custom_test', CustomFieldType); + chai.assert.throws(function() { + Blockly.fieldRegistry.register('field_custom_test', CustomFieldType); + }, 'already registered'); + }); + test('Null Value', function() { + chai.assert.throws(function() { + Blockly.fieldRegistry.register('field_custom_test', null); + }, 'fromJson function'); + }); + test('No fromJson', function() { + var fromJson = CustomFieldType.fromJson; + delete CustomFieldType.fromJson; + chai.assert.throws(function() { + Blockly.fieldRegistry.register('field_custom_test', CustomFieldType); + }, 'fromJson function'); + CustomFieldType.fromJson = fromJson; + }); + test('fromJson not a function', function() { + var fromJson = CustomFieldType.fromJson; + CustomFieldType.fromJson = true; + chai.assert.throws(function() { + Blockly.fieldRegistry.register('field_custom_test', CustomFieldType); + }, 'fromJson function'); + CustomFieldType.fromJson = fromJson; + }); + }); + suite('Retrieval', function() { + test('Simple', function() { + Blockly.fieldRegistry.register('field_custom_test', CustomFieldType); + + var json = { + type: 'field_custom_test', + value: 'ok' + }; + + var field = Blockly.fieldRegistry.fromJson(json); + chai.assert.isNotNull(field); + chai.assert.equal('ok', field.getValue()); + }); + test('Not Registered', function() { + var json = { + type: 'field_custom_test', + value: 'ok' + }; + + var spy = sinon.stub(console, 'warn'); + var field = Blockly.fieldRegistry.fromJson(json); + chai.assert.isNull(field); + chai.assert.isTrue(spy.called); + spy.restore(); + }); + test('Case Different', function() { + Blockly.fieldRegistry.register('field_custom_test', CustomFieldType); + + var json = { + type: 'FIELD_CUSTOM_TEST', + value: 'ok' + }; + + var field = Blockly.fieldRegistry.fromJson(json); + chai.assert.isNotNull(field); + chai.assert.equal('ok', field.getValue()); + }); + }); +}); diff --git a/js/tests/mocha/field_test.js b/js/tests/mocha/field_test.js new file mode 100644 index 0000000..f700fa1 --- /dev/null +++ b/js/tests/mocha/field_test.js @@ -0,0 +1,537 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +suite('Abstract Fields', function() { + suite('Is Serializable', function() { + // Both EDITABLE and SERIALIZABLE are default. + function FieldDefault() { + this.name = 'NAME'; + } + FieldDefault.prototype = Object.create(Blockly.Field.prototype); + // EDITABLE is false and SERIALIZABLE is default. + function FieldFalseDefault() { + this.name = 'NAME'; + } + FieldFalseDefault.prototype = Object.create(Blockly.Field.prototype); + FieldFalseDefault.prototype.EDITABLE = false; + // EDITABLE is default and SERIALIZABLE is true. + function FieldDefaultTrue() { + this.name = 'NAME'; + } + FieldDefaultTrue.prototype = Object.create(Blockly.Field.prototype); + FieldDefaultTrue.prototype.SERIALIZABLE = true; + // EDITABLE is false and SERIALIZABLE is true. + function FieldFalseTrue() { + this.name = 'NAME'; + } + FieldFalseTrue.prototype = Object.create(Blockly.Field.prototype); + FieldFalseTrue.prototype.EDITABLE = false; + FieldFalseTrue.prototype.SERIALIZABLE = true; + + /* Test Backwards Compatibility */ + test('Editable Default(true), Serializable Default(false)', function() { + // An old default field should be serialized. + var field = new FieldDefault(); + var stub = sinon.stub(console, 'warn'); + assertEquals(true, field.isSerializable()); + chai.assert(stub.calledOnce); + stub.restore(); + }); + test('Editable False, Serializable Default(false)', function() { + // An old non-editable field should not be serialized. + var field = new FieldFalseDefault(); + assertEquals(false, field.isSerializable()); + }); + /* Test Other Cases */ + test('Editable Default(true), Serializable True', function() { + // A field that is both editable and serializable should be serialized. + var field = new FieldDefaultTrue(); + assertEquals(true, field.isSerializable()); + }); + test('Editable False, Serializable True', function() { + // A field that is not editable, but overrides serializable to true + // should be serialized (e.g. field_label_serializable) + var field = new FieldFalseTrue(); + assertEquals(true, field.isSerializable()); + }); + }); + suite('setValue', function() { + function addSpies(field) { + if (!this.isSpying) { + sinon.spy(field, 'doValueInvalid_'); + sinon.spy(field, 'doValueUpdate_'); + sinon.spy(field, 'forceRerender'); + this.isSpying = true; + } + } + function removeSpies(field) { + if (this.isSpying) { + field.doValueInvalid_.restore(); + field.doValueUpdate_.restore(); + field.forceRerender.restore(); + this.isSpying = false; + } + } + setup(function() { + this.field = new Blockly.Field(); + this.field.isDirty_ = false; + this.cachedDoClassValidation = this.field.doClassValidation_; + this.cachedDoValueUpdate = this.field.doValueUpdate_; + this.cachedDoValueInvalid = this.field.doValueInvalid_; + }); + teardown(function() { + removeSpies(this.field); + this.field.doClassValidation_ = this.cachedDoClassValidation; + this.field.doValueUpdate_ = this.cachedDoValueUpdate; + this.field.doValueInvalid_ = this.cachedDoValueInvalid; + this.field.setValidator(null); + }); + test('Null', function() { + addSpies(this.field); + this.field.setValue(null); + chai.assert(this.field.doValueInvalid_.notCalled); + chai.assert(this.field.doValueUpdate_.notCalled); + chai.assert(this.field.forceRerender.notCalled); + }); + test('No Validators, Dirty (Default)', function() { + addSpies(this.field); + this.field.setValue('value'); + chai.assert(this.field.doValueInvalid_.notCalled); + chai.assert(this.field.doValueUpdate_.calledOnce); + chai.assert(this.field.forceRerender.calledOnce); + }); + test('No Validators, Not Dirty', function() { + this.field.doValueUpdate_ = function(newValue) { + this.value_ = newValue; + this.isDirty_ = false; + }; + addSpies(this.field); + this.field.setValue('value'); + chai.assert(this.field.doValueInvalid_.notCalled); + chai.assert(this.field.doValueUpdate_.calledOnce); + chai.assert(this.field.forceRerender.notCalled); + }); + test('Class Validator Returns Invalid, Not Dirty (Default)', function() { + this.field.doClassValidation_ = function() { + return null; + }; + addSpies(this.field); + this.field.setValue('value'); + chai.assert(this.field.doValueInvalid_.calledOnce); + chai.assert(this.field.doValueUpdate_.notCalled); + chai.assert(this.field.forceRerender.notCalled); + }); + test('Class Validator Returns Invalid, Dirty', function() { + this.field.doClassValidation_ = function() { + return null; + }; + this.field.doValueInvalid_ = function() { + this.isDirty_ = true; + }; + addSpies(this.field); + this.field.setValue('value'); + chai.assert(this.field.doValueInvalid_.calledOnce); + chai.assert(this.field.doValueUpdate_.notCalled); + chai.assert(this.field.forceRerender.calledOnce); + }); + test('Class Validator Returns Valid, Not Dirty', function() { + this.field.doClassValidation_ = function(newValue) { + return newValue; + }; + this.field.doValueUpdate_ = function() { + this.isDirty_ = false; + }; + addSpies(this.field); + this.field.setValue('value'); + chai.assert(this.field.doValueInvalid_.notCalled); + chai.assert(this.field.doValueUpdate_.calledOnce); + chai.assert(this.field.forceRerender.notCalled); + }); + test('Class Validator Returns Valid, Dirty (Default)', function() { + this.field.doClassValidation_ = function(newValue) { + return newValue; + }; + addSpies(this.field); + this.field.setValue('value'); + chai.assert(this.field.doValueInvalid_.notCalled); + chai.assert(this.field.doValueUpdate_.calledOnce); + chai.assert(this.field.forceRerender.calledOnce); + }); + test('Local Validator Returns Invalid, Not Dirty (Default)', function() { + this.field.setValidator(function() { + return null; + }); + addSpies(this.field); + this.field.setValue('value'); + chai.assert(this.field.doValueInvalid_.calledOnce); + chai.assert(this.field.doValueUpdate_.notCalled); + chai.assert(this.field.forceRerender.notCalled); + }); + test('Local Validator Returns Invalid, Dirty', function() { + this.field.setValidator(function() { + return null; + }); + this.field.doValueInvalid_ = function() { + this.isDirty_ = true; + }; + addSpies(this.field); + this.field.setValue('value'); + chai.assert(this.field.doValueInvalid_.calledOnce); + chai.assert(this.field.doValueUpdate_.notCalled); + chai.assert(this.field.forceRerender.calledOnce); + }); + test('Local Validator Returns Valid, Not Dirty', function() { + this.field.setValidator(function(newValue) { + return newValue; + }); + this.field.doValueUpdate_ = function() { + this.isDirty_ = false; + }; + addSpies(this.field); + this.field.setValue('value'); + chai.assert(this.field.doValueInvalid_.notCalled); + chai.assert(this.field.doValueUpdate_.calledOnce); + chai.assert(this.field.forceRerender.notCalled); + }); + test('Local Validator Returns Valid, Dirty (Default)', function() { + this.field.setValidator(function(newValue) { + return newValue; + }); + addSpies(this.field); + this.field.setValue('value'); + chai.assert(this.field.doValueInvalid_.notCalled); + chai.assert(this.field.doValueUpdate_.calledOnce); + chai.assert(this.field.forceRerender.calledOnce); + }); + test('New Value Matches Old Value', function() { + this.field.setValue('value'); + addSpies(this.field); + this.field.setValue('value'); + chai.assert(this.field.doValueInvalid_.notCalled); + chai.assert(this.field.doValueUpdate_.notCalled); + chai.assert(this.field.forceRerender.notCalled); + }); + test('New Value (Class)Validates to Old Value', function() { + this.field.setValue('value'); + this.field.doClassValidation_ = function() { + return 'value'; + }; + addSpies(this.field); + this.field.setValue('notValue'); + chai.assert(this.field.doValueInvalid_.notCalled); + chai.assert(this.field.doValueUpdate_.notCalled); + chai.assert(this.field.forceRerender.notCalled); + }); + test('New Value (Local)Validates to Old Value', function() { + this.field.setValue('value'); + this.field.setValidator(function() { + return 'value'; + }); + addSpies(this.field); + this.field.setValue('notValue'); + chai.assert(this.field.doValueInvalid_.notCalled); + chai.assert(this.field.doValueUpdate_.notCalled); + chai.assert(this.field.forceRerender.notCalled); + }); + test('New Value (Class)Validates to not Old Value', function() { + this.field.setValue('value'); + this.field.doClassValidation_ = function() { + return 'notValue'; + }; + addSpies(this.field); + this.field.setValue('value'); + chai.assert(this.field.doValueInvalid_.notCalled); + chai.assert(this.field.doValueUpdate_.calledOnce); + }); + test('New Value (Local)Validates to not Old Value', function() { + this.field.setValue('value'); + this.field.setValidator(function() { + return 'notValue'; + }); + addSpies(this.field); + this.field.setValue('value'); + chai.assert(this.field.doValueInvalid_.notCalled); + chai.assert(this.field.doValueUpdate_.calledOnce); + }); + test('Class Validator Returns Null', function() { + this.field.doClassValidation_ = function() { + return null; + }; + addSpies(this.field); + this.field.setValue('value'); + chai.assert(this.field.doValueInvalid_.calledOnce); + chai.assert(this.field.doValueUpdate_.notCalled); + }); + test('Class Validator Returns Same', function() { + this.field.doClassValidation_ = function(newValue) { + return newValue; + }; + addSpies(this.field); + this.field.setValue('value'); + chai.assert(this.field.doValueInvalid_.notCalled); + chai.assert(this.field.doValueUpdate_.calledOnce); + }); + test('Class Validator Returns Different', function() { + this.field.doClassValidation_ = function() { + return 'differentValue'; + }; + addSpies(this.field); + this.field.setValue('value'); + chai.assert(this.field.doValueInvalid_.notCalled); + chai.assert(this.field.doValueUpdate_.calledOnce); + }); + test('Class Validator Returns Undefined', function() { + this.field.doClassValidation_ = function() {}; + addSpies(this.field); + this.field.setValue('value'); + chai.assert.equal(this.field.getValue(), 'value'); + chai.assert(this.field.doValueInvalid_.notCalled); + chai.assert(this.field.doValueUpdate_.calledOnce); + }); + test('Local Validator Returns Null', function() { + this.field.setValidator(function() { + return null; + }); + addSpies(this.field); + this.field.setValue('value'); + chai.assert(this.field.doValueInvalid_.calledOnce); + chai.assert(this.field.doValueUpdate_.notCalled); + }); + test('Local Validator Returns Same', function() { + this.field.setValidator(function(newValue) { + return newValue; + }); + addSpies(this.field); + this.field.setValue('value'); + chai.assert(this.field.doValueInvalid_.notCalled); + chai.assert(this.field.doValueUpdate_.calledOnce); + }); + test('Local Validator Returns Different', function() { + this.field.setValidator(function() { + return 'differentValue'; + }); + addSpies(this.field); + this.field.setValue('value'); + chai.assert(this.field.doValueInvalid_.notCalled); + chai.assert(this.field.doValueUpdate_.calledOnce); + }); + test('Local Validator Returns Undefined', function() { + this.field.setValidator(function() {}); + addSpies(this.field); + this.field.setValue('value'); + chai.assert.equal(this.field.getValue(), 'value'); + chai.assert(this.field.doValueInvalid_.notCalled); + chai.assert(this.field.doValueUpdate_.calledOnce); + }); + }); + suite('Customization', function() { + // All this field does is wrap the abstract field. + function CustomField(opt_config) { + CustomField.superClass_.constructor.call( + this, 'value', null, opt_config); + } + Blockly.utils.object.inherits(CustomField, Blockly.Field); + CustomField.fromJson = function(options) { + return new CustomField(options); + }; + + suite('Tooltip', function() { + test('JS Constructor', function() { + var field = new Blockly.Field('value', null, { + tooltip: 'test tooltip', + }); + chai.assert.equal(field.tooltip_, 'test tooltip'); + }); + test('JS Constructor - Dynamic', function() { + var returnTooltip = function() { + return 'dynamic tooltip text'; + }; + var field = new Blockly.Field('value', null, { + tooltip: returnTooltip + }); + chai.assert.equal(field.tooltip_, returnTooltip); + }); + test('JSON Definition', function() { + var field = CustomField.fromJson({ + tooltip: "test tooltip" + }); + chai.assert.equal(field.tooltip_, 'test tooltip'); + }); + suite('W/ Msg References', function() { + setup(function() { + Blockly.Msg['TOOLTIP'] = 'test tooltip'; + }); + teardown(function() { + delete Blockly.Msg['TOOLTIP']; + }); + test('JS Constructor', function() { + var field = new Blockly.Field('value', null, { + tooltip: '%{BKY_TOOLTIP}', + }); + chai.assert.equal(field.tooltip_, 'test tooltip'); + }); + test('JSON Definition', function() { + var field = CustomField.fromJson({ + tooltip: "%{BKY_TOOLTIP}" + }); + chai.assert.equal(field.tooltip_, 'test tooltip'); + }); + }); + suite('setTooltip', function() { + setup(function() { + this.workspace = new Blockly.WorkspaceSvg({}); + this.workspace.createDom(); + }); + teardown(function() { + this.workspace = null; + }); + test('Before Append', function() { + Blockly.Blocks['tooltip'] = { + init: function() { + var field = new Blockly.FieldTextInput('default'); + field.setTooltip('tooltip'); + this.appendDummyInput() + .appendField(field, 'TOOLTIP'); + }, + }; + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + '' + ).children[0], this.workspace); + var field = block.getField('TOOLTIP'); + chai.assert.equal(field.getClickTarget_().tooltip, 'tooltip'); + delete Blockly.Blocks['tooltip']; + }); + test('After Append', function() { + Blockly.Blocks['tooltip'] = { + init: function() { + var field = new Blockly.FieldTextInput('default'); + this.appendDummyInput() + .appendField(field, 'TOOLTIP'); + field.setTooltip('tooltip'); + }, + }; + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + '' + ).children[0], this.workspace); + var field = block.getField('TOOLTIP'); + chai.assert.equal(field.getClickTarget_().tooltip, 'tooltip'); + delete Blockly.Blocks['tooltip']; + }); + test('After Block Creation', function() { + Blockly.Blocks['tooltip'] = { + init: function() { + var field = new Blockly.FieldTextInput('default'); + this.appendDummyInput() + .appendField(field, 'TOOLTIP'); + }, + }; + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + '' + ).children[0], this.workspace); + var field = block.getField('TOOLTIP'); + field.setTooltip('tooltip'); + chai.assert.equal(field.getClickTarget_().tooltip, 'tooltip'); + delete Blockly.Blocks['tooltip']; + }); + test('Dynamic Function', function() { + Blockly.Blocks['tooltip'] = { + init: function() { + var field = new Blockly.FieldTextInput('default'); + field.setTooltip(this.tooltipFunc); + this.appendDummyInput() + .appendField(field, 'TOOLTIP'); + }, + + tooltipFunc: function() { + return this.getFieldValue('TOOLTIP'); + } + }; + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + '' + ).children[0], this.workspace); + var field = block.getField('TOOLTIP'); + chai.assert.equal(field.getClickTarget_().tooltip, block.tooltipFunc); + delete Blockly.Blocks['tooltip']; + }); + test('Element', function() { + Blockly.Blocks['tooltip'] = { + init: function() { + var field = new Blockly.FieldTextInput('default'); + field.setTooltip(this.element); + this.appendDummyInput() + .appendField(field, 'TOOLTIP'); + }, + element: { + tooltip: 'tooltip' + } + }; + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + '' + ).children[0], this.workspace); + var field = block.getField('TOOLTIP'); + chai.assert.equal(field.getClickTarget_().tooltip, block.element); + delete Blockly.Blocks['tooltip']; + }); + test('Null', function() { + Blockly.Blocks['tooltip'] = { + init: function() { + var field = new Blockly.FieldTextInput('default'); + field.setTooltip(null); + this.appendDummyInput() + .appendField(field, 'TOOLTIP'); + }, + }; + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + '' + ).children[0], this.workspace); + var field = block.getField('TOOLTIP'); + chai.assert.equal(field.getClickTarget_().tooltip, block); + delete Blockly.Blocks['tooltip']; + }); + test('Undefined', function() { + Blockly.Blocks['tooltip'] = { + init: function() { + var field = new Blockly.FieldTextInput('default'); + this.appendDummyInput() + .appendField(field, 'TOOLTIP'); + }, + }; + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + '' + ).children[0], this.workspace); + var field = block.getField('TOOLTIP'); + chai.assert.equal(field.getClickTarget_().tooltip, block); + delete Blockly.Blocks['tooltip']; + }); + }); + }); + }); +}); diff --git a/js/tests/mocha/field_textinput_test.js b/js/tests/mocha/field_textinput_test.js new file mode 100644 index 0000000..6598b08 --- /dev/null +++ b/js/tests/mocha/field_textinput_test.js @@ -0,0 +1,293 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +suite('Text Input Fields', function() { + function assertValue(textInputField, expectedValue, opt_expectedText) { + var actualValue = textInputField.getValue(); + var actualText = textInputField.getText(); + opt_expectedText = opt_expectedText || expectedValue; + assertEquals(actualValue, expectedValue); + assertEquals(actualText, opt_expectedText); + } + function assertValueDefault(textInputField) { + assertValue(textInputField, ''); + } + suite('Constructor', function() { + test('Empty', function() { + var textInputField = new Blockly.FieldTextInput(); + assertValueDefault(textInputField); + }); + test('Undefined', function() { + var textInputField = new Blockly.FieldTextInput(undefined); + assertValueDefault(textInputField); + }); + test('String', function() { + var textInputField = new Blockly.FieldTextInput('value'); + assertValue(textInputField, 'value'); + }); + test('Number (Truthy)', function() { + var textInputField = new Blockly.FieldTextInput(1); + assertValue(textInputField, '1'); + }); + test('Number (Falsy)', function() { + var textInputField = new Blockly.FieldTextInput(0); + assertValue(textInputField, '0'); + }); + test('Boolean True', function() { + var textInputField = new Blockly.FieldTextInput(true); + assertValue(textInputField, 'true'); + }); + test('Boolean False', function() { + var textInputField = new Blockly.FieldTextInput(false); + assertValue(textInputField, 'false'); + }); + }); + suite('fromJson', function() { + test('Empty', function() { + var textInputField = new Blockly.FieldTextInput.fromJson({}); + assertValueDefault(textInputField); + }); + test('Undefined', function() { + var textInputField = new Blockly.FieldTextInput + .fromJson({ text: undefined}); + assertValueDefault(textInputField); + }); + test('String', function() { + var textInputField = Blockly.FieldTextInput.fromJson({ text:'value' }); + assertValue(textInputField, 'value'); + }); + test('Number (Truthy)', function() { + var textInputField = Blockly.FieldTextInput.fromJson({ text:1 }); + assertValue(textInputField, '1'); + }); + test('Number (Falsy)', function() { + var textInputField = Blockly.FieldTextInput.fromJson({ text:0 }); + assertValue(textInputField, '0'); + }); + test('Boolean True', function() { + var textInputField = Blockly.FieldTextInput.fromJson({ text:true }); + assertValue(textInputField, 'true'); + }); + test('Boolean False', function() { + var textInputField = Blockly.FieldTextInput.fromJson({ text:false }); + assertValue(textInputField, 'false'); + }); + }); + suite('setValue', function() { + suite('Empty -> New Value', function() { + setup(function() { + this.textInputField = new Blockly.FieldTextInput(); + }); + test('Null', function() { + this.textInputField.setValue(null); + assertValueDefault(this.textInputField); + }); + test('Undefined', function() { + this.textInputField.setValue(undefined); + assertValueDefault(this.textInputField); + }); + test('New String', function() { + this.textInputField.setValue('newValue'); + assertValue(this.textInputField, 'newValue'); + }); + test('Number (Truthy)', function() { + this.textInputField.setValue(1); + assertValue(this.textInputField, '1'); + }); + test('Number (Falsy)', function() { + this.textInputField.setValue(0); + assertValue(this.textInputField, '0'); + }); + test('Boolean True', function() { + this.textInputField.setValue(true); + assertValue(this.textInputField, 'true'); + }); + test('Boolean False', function() { + this.textInputField.setValue(false); + assertValue(this.textInputField, 'false'); + }); + }); + suite('Value -> New Value', function() { + setup(function() { + this.textInputField = new Blockly.FieldTextInput('value'); + }); + test('Null', function() { + this.textInputField.setValue(null); + assertValue(this.textInputField, 'value'); + }); + test('Undefined', function() { + this.textInputField.setValue(undefined); + assertValue(this.textInputField, 'value'); + }); + test('New String', function() { + this.textInputField.setValue('newValue'); + assertValue(this.textInputField, 'newValue'); + }); + test('Number (Truthy)', function() { + this.textInputField.setValue(1); + assertValue(this.textInputField, '1'); + }); + test('Number (Falsy)', function() { + this.textInputField.setValue(0); + assertValue(this.textInputField, '0'); + }); + test('Boolean True', function() { + this.textInputField.setValue(true); + assertValue(this.textInputField, 'true'); + }); + test('Boolean False', function() { + this.textInputField.setValue(false); + assertValue(this.textInputField, 'false'); + }); + }); + }); + suite('Validators', function() { + setup(function() { + this.textInputField = new Blockly.FieldTextInput('value'); + this.textInputField.htmlInput_ = Object.create(null); + this.textInputField.htmlInput_.oldValue_ = 'value'; + this.textInputField.htmlInput_.untypedDefaultValue_ = 'value'; + this.stub = sinon.stub(this.textInputField, 'resizeEditor_'); + }); + teardown(function() { + this.textInputField.setValidator(null); + Blockly.FieldTextInput.htmlInput_ = null; + if (this.stub) { + this.stub.restore(); + } + }); + suite('Null Validator', function() { + setup(function() { + this.textInputField.setValidator(function() { + return null; + }); + }); + test('When Editing', function() { + this.textInputField.isBeingEdited_ = true; + this.textInputField.htmlInput_.value = 'newValue'; + this.textInputField.onHtmlInputChange_(null); + assertValue(this.textInputField, 'value', 'newValue'); + this.textInputField.isBeingEdited_ = false; + }); + test('When Not Editing', function() { + this.textInputField.setValue('newValue'); + assertValue(this.textInputField, 'value'); + }); + }); + suite('Remove \'a\' Validator', function() { + setup(function() { + this.textInputField.setValidator(function(newValue) { + return newValue.replace(/a/g, ''); + }); + }); + test('When Editing', function() { + this.textInputField.isBeingEdited_ = true; + this.textInputField.htmlInput_.value = 'bbbaaa'; + this.textInputField.onHtmlInputChange_(null); + assertValue(this.textInputField, 'bbb', 'bbbaaa'); + this.textInputField.isBeingEdited_ = false; + }); + test('When Not Editing', function() { + this.textInputField.setValue('bbbaaa'); + assertValue(this.textInputField, 'bbb'); + }); + }); + suite('Returns Undefined Validator', function() { + setup(function() { + this.textInputField.setValidator(function() {}); + }); + test('When Editing', function() { + this.textInputField.isBeingEdited_ = true; + this.textInputField.htmlInput_.value = 'newValue'; + this.textInputField.onHtmlInputChange_(null); + assertValue(this.textInputField, 'newValue'); + this.textInputField.isBeingEdited_ = false; + }); + test('When Not Editing', function() { + this.textInputField.setValue('newValue'); + assertValue(this.textInputField, 'newValue'); + }); + }); + }); + suite('Customization', function() { + suite('Spellcheck', function() { + setup(function() { + this.prepField = function(field) { + var workspace = { + scale: 1, + getRenderer: function() { return {}; }, + getTheme: function() { return {}; }, + markFocused: function() {} + }; + field.sourceBlock_ = { + workspace: workspace + }; + field.constants_ = { + FIELD_TEXT_FONTSIZE: 11, + FIELD_TEXT_FONTWEIGHT: 'normal', + FIELD_TEXT_FONTFAMILY: 'sans-serif' + }; + field.clickTarget_ = document.createElement('div'); + Blockly.mainWorkspace = workspace; + Blockly.WidgetDiv.DIV = document.createElement('div'); + this.stub = sinon.stub(field, 'resizeEditor_'); + }; + + this.assertSpellcheck = function(field, value) { + this.prepField(field); + field.showEditor_(); + chai.assert.equal(field.htmlInput_.getAttribute('spellcheck'), + value.toString()); + }; + }); + teardown(function() { + if (this.stub) { + this.stub.restore(); + } + }); + test('Default', function() { + var field = new Blockly.FieldTextInput('test'); + this.assertSpellcheck(field, true); + }); + test('JS Constructor', function() { + var field = new Blockly.FieldTextInput('test', null, { + spellcheck: false + }); + this.assertSpellcheck(field, false); + }); + test('JSON Definition', function() { + var field = Blockly.FieldTextInput.fromJson({ + text: 'test', + spellcheck: false + }); + this.assertSpellcheck(field, false); + }); + test('setSpellcheck Editor Hidden', function() { + var field = new Blockly.FieldTextInput('test'); + field.setSpellcheck(false); + this.assertSpellcheck(field, false); + }); + test('setSpellcheck Editor Shown', function() { + var field = new Blockly.FieldTextInput('test'); + this.prepField(field); + field.showEditor_(); + field.setSpellcheck(false); + chai.assert.equal(field.htmlInput_.getAttribute('spellcheck'), 'false'); + }); + }); + }); +}); diff --git a/js/tests/mocha/field_variable_test.js b/js/tests/mocha/field_variable_test.js new file mode 100644 index 0000000..0c64742 --- /dev/null +++ b/js/tests/mocha/field_variable_test.js @@ -0,0 +1,356 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +suite('Variable Fields', function() { + var FAKE_VARIABLE_NAME = 'yertle'; + var FAKE_ID = 'turtle'; + + function getMockBlock(workspace) { + return { + 'workspace': workspace, + 'isShadow': function() { + return false; + }, + 'renameVarById': Blockly.Block.prototype.renameVarById, + 'updateVarName': Blockly.Block.prototype.updateVarName, + }; + } + function initField(fieldVariable, workspace) { + var mockBlock = getMockBlock(workspace); + fieldVariable.setSourceBlock(mockBlock); + // No view to initialize, but still need to init the model. + fieldVariable.initModel(); + return fieldVariable; + } + function createAndInitFieldConstructor(workspace, variableName) { + return initField(new Blockly.FieldVariable(variableName), workspace); + } + function createAndInitFieldJson(workspace, variableName) { + return initField(Blockly.FieldVariable.fromJson( + { variable:variableName }), workspace); + } + function assertValue(variableField, expectedName, opt_expectedId) { + var actualName = variableField.getText(); + var actualId = variableField.getValue(); + opt_expectedId = opt_expectedId || FAKE_ID; + assertEquals(actualName, expectedName); + assertEquals(actualId, opt_expectedId); + } + function assertValueDefault(variableField) { + assertValue(variableField, FAKE_VARIABLE_NAME, FAKE_ID); + } + + setup(function() { + this.workspace = new Blockly.Workspace(); + + sinon.stub(Blockly.utils, 'genUid') + .returns(FAKE_ID); + sinon.stub(Blockly.Variables, 'generateUniqueName') + .returns(FAKE_VARIABLE_NAME); + }); + teardown(function() { + this.workspace.dispose(); + sinon.restore(); + }); + + test('Dropdown contains variables', function() { + // Expect that the dropdown options will contain the variables that exist + this.workspace.createVariable('name1', '', 'id1'); + this.workspace.createVariable('name2', '', 'id2'); + var fieldVariable = createAndInitFieldConstructor(this.workspace, 'name1'); + + // Expect that variables created after field creation will show up too. + this.workspace.createVariable('name3', '', 'id3'); + + var result_options = Blockly.FieldVariable.dropdownCreate.call( + fieldVariable); + + // Expect three variable options, a rename option, and a delete option. + assertEquals(result_options.length, 5); + isEqualArrays(result_options[0], ['name1', 'id1']); + isEqualArrays(result_options[1], ['name2', 'id2']); + isEqualArrays(result_options[2], ['name3', 'id3']); + }); + suite('Constructor', function() { + test('Null', function() { + var variableField = createAndInitFieldConstructor(this.workspace, null); + assertValueDefault(variableField); + }); + test('Undefined', function() { + var variableField = createAndInitFieldConstructor( + this.workspace, undefined); + assertValueDefault(variableField); + }); + test('No Value Before InitModel', function() { + var fieldVariable = new Blockly.FieldVariable('name1'); + assertEquals('', fieldVariable.getText()); + assertNull(fieldVariable.getValue()); + }); + test('Given Variable Name', function() { + var fieldVariable = createAndInitFieldConstructor( + this.workspace, 'name1'); + assertValue(fieldVariable, 'name1'); + }); + }); + suite('fromJson', function() { + test('Null', function() { + var variableField = createAndInitFieldJson(this.workspace, null); + assertValueDefault(variableField); + }); + test('Undefined', function() { + var variableField = createAndInitFieldJson(this.workspace, undefined); + assertValueDefault(variableField); + }); + test('No Value Before InitModel', function() { + var variableField = new Blockly.FieldVariable('name1'); + assertEquals('', variableField.getText()); + assertNull(variableField.getValue()); + }); + test('Given Variable Name', function() { + var variableField = createAndInitFieldJson(this.workspace, 'name1'); + assertValue(variableField, 'name1'); + }); + }); + suite('setValue', function() { + test('Null', function() { + var variableField = createAndInitFieldConstructor( + this.workspace, 'name1'); + variableField.setValue(null); + assertValue(variableField, 'name1'); + }); + test('Undefined', function() { + var variableField = createAndInitFieldConstructor( + this.workspace, 'name1'); + var stub = sinon.stub(console, 'warn'); + variableField.setValue(undefined); + assertValue(variableField, 'name1'); + chai.assert(stub.calledOnce); + stub.restore(); + }); + test('New Variable ID', function() { + this.workspace.createVariable('name2', null, 'id2'); + + var variableField = createAndInitFieldConstructor( + this.workspace, 'name1'); + var oldId = variableField.getValue(); + + variableField.setValue('id2'); + // Setting value by ID gives us the right text as well. + assertEquals('name2', variableField.getText()); + assertEquals('id2', variableField.getValue()); + chai.assert.notEqual(oldId, variableField.getValue()); + }); + test('Variable Does not Exist', function() { + var variableField = createAndInitFieldConstructor( + this.workspace, 'name1'); + var stub = sinon.stub(console, 'warn'); + variableField.setValue('id1'); + assertValue(variableField, 'name1'); + chai.assert(stub.calledOnce); + stub.restore(); + }); + }); + suite('Validators', function() { + setup(function() { + this.workspace.createVariable('name1', null, 'id1'); + this.workspace.createVariable('name2', null, 'id2'); + this.workspace.createVariable('name3', null, 'id3'); + this.variableField = createAndInitFieldConstructor(this.workspace, 'name1'); + }); + teardown(function() { + this.variableField.setValidator(null); + }); + suite('Null Validator', function() { + setup(function() { + this.variableField.setValidator(function() { + return null; + }); + }); + test('New Value', function() { + this.variableField.setValue('id2'); + assertValue(this.variableField, 'name1', 'id1'); + }); + }); + suite('Force \'id\' ID Validator', function() { + setup(function() { + this.variableField.setValidator(function(newValue) { + return 'id' + newValue.charAt(newValue.length - 1); + }); + }); + test('New Value', function() { + // Must create the var so that the field doesn't throw an error. + this.workspace.createVariable('thing2', null, 'other2'); + this.variableField.setValue('other2'); + assertValue(this.variableField, 'name2', 'id2'); + }); + }); + suite('Returns Undefined Validator', function() { + setup(function() { + this.variableField.setValidator(function() {}); + }); + test('New Value', function() { + this.variableField.setValue('id2'); + assertValue(this.variableField, 'name2', 'id2'); + }); + }); + }); + suite('Customizations', function() { + suite('Types and Default Types', function() { + test('JS Constructor', function() { + var field = new Blockly.FieldVariable( + 'test', undefined, ['Type1'], 'Type1'); + chai.assert.deepEqual(field.variableTypes, ['Type1']); + chai.assert.equal(field.defaultType_, 'Type1'); + }); + test('JSON Definition', function() { + var field = Blockly.FieldVariable.fromJson({ + variable: 'test', + variableTypes: ['Type1'], + defaultType: 'Type1' + }); + chai.assert.deepEqual(field.variableTypes, ['Type1']); + chai.assert.equal(field.defaultType_, 'Type1'); + }); + test('JS Configuration - Simple', function() { + var field = new Blockly.FieldVariable( + 'test', undefined, undefined, undefined, { + variableTypes: ['Type1'], + defaultType: 'Type1' + }); + chai.assert.deepEqual(field.variableTypes, ['Type1']); + chai.assert.equal(field.defaultType_, 'Type1'); + }); + test('JS Configuration - Ignore', function() { + var field = new Blockly.FieldVariable( + 'test', undefined, ['Type2'], 'Type2', { + variableTypes: ['Type1'], + defaultType: 'Type1' + }); + chai.assert.deepEqual(field.variableTypes, ['Type1']); + chai.assert.equal(field.defaultType_, 'Type1'); + }); + }); + }); + suite('Get variable types', function() { + setup(function() { + this.workspace.createVariable('name1', 'type1'); + this.workspace.createVariable('name2', 'type2'); + }); + test('variableTypes is undefined', function() { + // Expect that since variableTypes is undefined, only type empty string + // will be returned (regardless of what types are available on the workspace). + var fieldVariable = new Blockly.FieldVariable('name1'); + var resultTypes = fieldVariable.getVariableTypes_(); + isEqualArrays(resultTypes, ['']); + }); + test('variableTypes is explicit', function() { + // Expect that since variableTypes is defined, it will be the return + // value, regardless of what types are available on the workspace. + var fieldVariable = new Blockly.FieldVariable( + 'name1', null, ['type1', 'type2'], 'type1'); + var resultTypes = fieldVariable.getVariableTypes_(); + isEqualArrays(resultTypes, ['type1', 'type2']); + assertEquals('Default type was wrong', 'type1', + fieldVariable.defaultType_); + }); + test('variableTypes is null', function() { + // Expect all variable types to be returned. + // The field does not need to be initialized to do this--it just needs + // a pointer to the workspace. + var fieldVariable = new Blockly.FieldVariable('name1'); + var mockBlock = getMockBlock(this.workspace); + fieldVariable.setSourceBlock(mockBlock); + fieldVariable.variableTypes = null; + + var resultTypes = fieldVariable.getVariableTypes_(); + // The empty string is always one of the options. + isEqualArrays(resultTypes, ['type1', 'type2', '']); + }); + test('variableTypes is the empty list', function() { + var fieldVariable = new Blockly.FieldVariable('name1'); + var mockBlock = getMockBlock(this.workspace); + fieldVariable.setSourceBlock(mockBlock); + fieldVariable.variableTypes = []; + + chai.assert.throws(function() { + fieldVariable.getVariableTypes_(); + }); + }); + }); + suite('Default types', function() { + test('Default type exists', function() { + var fieldVariable = new Blockly.FieldVariable(null, null, ['b'], 'b'); + assertEquals('The variable field\'s default type should be "b"', + 'b', fieldVariable.defaultType_); + }); + test('No default type', function() { + var fieldVariable = new Blockly.FieldVariable(null); + assertEquals('The variable field\'s default type should be the empty string', + '', fieldVariable.defaultType_); + assertNull('The variable field\'s allowed types should be null', + fieldVariable.variableTypes); + }); + test('Default type mismatch', function() { + // Invalid default type when creating a variable field. + chai.assert.throws(function() { + var _fieldVariable = new Blockly.FieldVariable(null, null, ['a'], 'b'); + }); + }); + test('Default type mismatch with empty array', function() { + // Invalid default type when creating a variable field. + chai.assert.throws(function() { + var _fieldVariable = new Blockly.FieldVariable(null, null, ['a']); + }); + }); + }); + suite('Renaming Variables', function() { + setup(function() { + this.workspace.createVariable('name1', null, 'id1'); + Blockly.defineBlocksWithJsonArray([{ + "type": "field_variable_test_block", + "message0": "%1", + "args0": [ + { + "type": "field_variable", + "name": "VAR", + "variable": "name1" + } + ], + }]); + this.variableBlock = new Blockly.Block(this.workspace, + 'field_variable_test_block'); + this.variableField = this.variableBlock.getField('VAR'); + }); + teardown(function() { + this.variableBlock.dispose(); + this.variableBlock = null; + this.variableField = null; + delete Blockly.Blocks['field_variable_test_block']; + }); + test('Rename & Keep Old ID', function() { + this.workspace.renameVariableById('id1', 'name2'); + chai.assert.equal(this.variableField.getText(), 'name2'); + chai.assert.equal(this.variableField.getValue(), 'id1'); + }); + test('Rename & Get New ID', function() { + this.workspace.createVariable('name2', null, 'id2'); + this.workspace.renameVariableById('id1', 'name2'); + chai.assert.equal(this.variableField.getText(), 'name2'); + chai.assert.equal(this.variableField.getValue(), 'id2'); + }); + }); +}); diff --git a/js/tests/mocha/gesture_test.js b/js/tests/mocha/gesture_test.js new file mode 100644 index 0000000..d3bcd1f --- /dev/null +++ b/js/tests/mocha/gesture_test.js @@ -0,0 +1,98 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Tests for gesture. + * @author marisaleung@google.com (Marisa Leung) + */ +'use strict'; + +suite('Gesture', function() { + + setup(function() { + this.workspace = new Blockly.Workspace(); + this.e = {}; + }); + + teardown(function() { + this.e = null; + this.workspace.dispose(); + }); + + test('Constructor', function() { + var gesture = new Blockly.Gesture(this.e, this.workspace); + assertEquals(gesture.mostRecentEvent_, this.e); + assertEquals(gesture.creatorWorkspace_, this.workspace); + }); + + test('Field click - Click in workspace', function() { + var block = new Blockly.Block(this.workspace); + var field = new Blockly.Field(); + field.setSourceBlock(block); + field.showEditor_ = function() {}; + var gesture = new Blockly.Gesture(this.e, this.workspace); + gesture.setStartField(field); + + var isFieldClick = gesture.isFieldClick_(); + assertEquals(isFieldClick, true); + }); + + function gestureIsFieldClick_InFlyoutHelper(flyout, expectedResult){ + // Assign workspace flyout + this.workspace.flyout_ = flyout; + // Create a Field inside of a Block + var block = new Blockly.Block(this.workspace); + var field = new Blockly.Field(); + field.setSourceBlock(block); + field.showEditor_ = function() {}; + // Create gesture from the flyout + var gesture = new Blockly.Gesture(this.e, this.workspace.flyout_); + // Populate gesture with click start information + gesture.setStartField(field); + gesture.setStartFlyout_(this.workspace.flyout_); + + var isFieldClick = gesture.isFieldClick_(); + assertEquals(isFieldClick, expectedResult); + } + + test('Field click - Auto close flyout', function() { + var flyout = new Blockly.VerticalFlyout({}); + flyout.autoClose = false; + gestureIsFieldClick_InFlyoutHelper.call(this, flyout, true); + }); + + test('Field click - Always open flyout', function() { + var flyout = new Blockly.VerticalFlyout({}); + flyout.autoClose = false; + gestureIsFieldClick_InFlyoutHelper.call(this, flyout, true); + }); + + test('Workspace click - Shift click enters accessibility mode', function() { + var event = { + shiftKey : true, + clientX : 10, + clientY : 10, + + }; + var ws = Blockly.inject('blocklyDiv', {}); + ws.keyboardAccessibilityMode = true; + var gesture = new Blockly.Gesture(event, ws); + gesture.doWorkspaceClick_(event); + var cursor = ws.getCursor(); + assertEquals(cursor.getCurNode().getType(), Blockly.ASTNode.types.WORKSPACE); + }); +}); diff --git a/js/tests/mocha/index.html b/js/tests/mocha/index.html new file mode 100644 index 0000000..f535ba2 --- /dev/null +++ b/js/tests/mocha/index.html @@ -0,0 +1,95 @@ + + + + + Mocha Tests for Blockly + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + diff --git a/js/tests/mocha/input_test.js b/js/tests/mocha/input_test.js new file mode 100644 index 0000000..e2d1815 --- /dev/null +++ b/js/tests/mocha/input_test.js @@ -0,0 +1,308 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +suite('Inputs', function() { + setup(function() { + Blockly.defineBlocksWithJsonArray([ + { + "type": "empty_block", + "message0": "", + "args0": [] + }, + ]); + + this.workspace = Blockly.inject('blocklyDiv'); + this.block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + ), this.workspace); + + this.renderStub = sinon.stub(this.block, 'render'); + this.bumpNeighboursStub = sinon.stub(this.block, 'bumpNeighbours'); + + this.dummy = this.block.appendDummyInput('DUMMY'); + this.value = this.block.appendValueInput('VALUE'); + this.statement = this.block.appendStatementInput('STATEMENT'); + + this.renderStub.resetHistory(); + this.bumpNeighboursStub.resetHistory(); + }); + teardown(function() { + this.renderStub.restore(); + this.bumpNeighboursStub.restore(); + + delete Blockly.Blocks['empty_block']; + this.workspace.dispose(); + }); + suite('Insert Field At', function() { + suite('Index Bounds', function() { + test('< 0', function() { + var field = new Blockly.FieldLabel('field'); + chai.assert.throws(function() { + this.dummy.insertFieldAt(-1, field); + }); + }); + test('> length', function() { + var field = new Blockly.FieldLabel('field'); + chai.assert.throws(function() { + this.dummy.insertFieldAt(1, field); + }); + }); + }); + suite('Values', function() { + // We're mostly just testing that it doesn't throw errors. + test('Field', function() { + var field = new Blockly.FieldLabel('field'); + this.dummy.insertFieldAt(0, field); + chai.assert.equal(this.dummy.fieldRow[0], field); + }); + test('String', function() { + this.dummy.insertFieldAt(0, 'field'); + chai.assert.instanceOf(this.dummy.fieldRow[0], Blockly.FieldLabel); + }); + test('Empty String', function() { + this.dummy.insertFieldAt(0, ''); + chai.assert.isEmpty(this.dummy.fieldRow); + }); + test('Empty String W/ Name', function() { + this.dummy.insertFieldAt(0, '', 'NAME'); + chai.assert.instanceOf(this.dummy.fieldRow[0], Blockly.FieldLabel); + }); + test('Null', function() { + this.dummy.insertFieldAt(0, null); + chai.assert.isEmpty(this.dummy.fieldRow); + }); + test('Undefined', function() { + this.dummy.insertFieldAt(0, undefined); + chai.assert.isEmpty(this.dummy.fieldRow); + }); + }); + suite('Prefixes and Suffixes', function() { + test('Prefix', function() { + var field = new Blockly.FieldLabel('field'); + var prefix = new Blockly.FieldLabel('prefix'); + field.prefixField = prefix; + + this.dummy.appendField(field); + chai.assert.deepEqual(this.dummy.fieldRow, [prefix, field]); + }); + test('Suffix', function() { + var field = new Blockly.FieldLabel('field'); + var suffix = new Blockly.FieldLabel('suffix'); + field.suffixField = suffix; + + this.dummy.appendField(field); + chai.assert.deepEqual(this.dummy.fieldRow, [field, suffix]); + }); + test('Prefix and Suffix', function() { + var field = new Blockly.FieldLabel('field'); + var prefix = new Blockly.FieldLabel('prefix'); + var suffix = new Blockly.FieldLabel('suffix'); + field.prefixField = prefix; + field.suffixField = suffix; + + this.dummy.appendField(field); + chai.assert.deepEqual(this.dummy.fieldRow, [prefix, field, suffix]); + }); + test('Dropdown - Prefix', function() { + var field = new Blockly.FieldDropdown( + [ + ['prefix option1', 'OPTION1'], + ['prefix option2', 'OPTION2'] + ] + ); + + this.dummy.appendField(field); + chai.assert.equal(this.dummy.fieldRow.length, 2); + }); + test('Dropdown - Suffix', function() { + var field = new Blockly.FieldDropdown( + [ + ['option1 suffix', 'OPTION1'], + ['option2 suffix', 'OPTION2'] + ] + ); + + this.dummy.appendField(field); + chai.assert.equal(this.dummy.fieldRow.length, 2); + }); + test('Dropdown - Prefix and Suffix', function() { + var field = new Blockly.FieldDropdown( + [ + ['prefix option1 suffix', 'OPTION1'], + ['prefix option2 suffix', 'OPTION2'] + ] + ); + + this.dummy.appendField(field); + chai.assert.equal(this.dummy.fieldRow.length, 3); + }); + }); + suite('Field Initialization', function() { + test('Rendered', function() { + var field = new Blockly.FieldLabel('field'); + var setBlockSpy = sinon.spy(field, 'setSourceBlock'); + var initSpy = sinon.spy(field, 'init'); + + this.dummy.insertFieldAt(0, field); + chai.assert(setBlockSpy.calledOnce); + chai.assert.equal(setBlockSpy.getCall(0).args[0], this.block); + chai.assert(initSpy.calledOnce); + console.log(this.renderStub.callCount); + chai.assert(this.renderStub.calledOnce); + chai.assert(this.bumpNeighboursStub.calledOnce); + + setBlockSpy.restore(); + initSpy.restore(); + }); + // TODO: InsertFieldAt does not properly handle initialization in + // headless mode. + test.skip('Headless', function() { + var field = new Blockly.FieldLabel('field'); + var setBlockSpy = sinon.spy(field, 'setSourceBlock'); + var initModelSpy = sinon.spy(field, 'initModel'); + + this.block.rendered = false; + + this.dummy.insertFieldAt(0, field); + chai.assert(setBlockSpy.calledOnce); + chai.assert.equal(setBlockSpy.getCall(0).args[0], this.block); + chai.assert(initModelSpy.calledOnce); + chai.assert(this.renderStub.notCalled); + chai.assert(this.bumpNeighboursStub.notCalled); + + setBlockSpy.restore(); + initModelSpy.restore(); + }); + }); + }); + suite('Remove Field', function() { + test('Field Not Found', function() { + chai.assert.throws(function() { + this.dummy.removeField('FIELD'); + }); + }); + test('Rendered', function() { + var field = new Blockly.FieldLabel('field'); + var disposeSpy = sinon.spy(field, 'dispose'); + this.dummy.appendField(field, 'FIELD'); + + this.renderStub.resetHistory(); + this.bumpNeighboursStub.resetHistory(); + + this.dummy.removeField('FIELD'); + chai.assert(disposeSpy.calledOnce); + chai.assert(this.renderStub.calledOnce); + chai.assert(this.bumpNeighboursStub.calledOnce); + }); + test('Headless', function() { + var field = new Blockly.FieldLabel('field'); + var disposeSpy = sinon.spy(field, 'dispose'); + this.dummy.appendField(field, 'FIELD'); + + this.renderStub.resetHistory(); + this.bumpNeighboursStub.resetHistory(); + + this.block.rendered = false; + + this.dummy.removeField('FIELD'); + chai.assert(disposeSpy.calledOnce); + chai.assert(this.renderStub.notCalled); + chai.assert(this.bumpNeighboursStub.notCalled); + }); + }); + suite('Field Ordering/Manipulation', function() { + setup(function() { + this.a = new Blockly.FieldLabel('a'); + this.b = new Blockly.FieldLabel('b'); + this.c = new Blockly.FieldLabel('c'); + }); + test('Append A, B, C', function() { + this.dummy.appendField(this.a, 'A'); + this.dummy.appendField(this.b, 'B'); + this.dummy.appendField(this.c, 'C'); + + chai.assert.deepEqual(this.dummy.fieldRow, [this.a, this.b, this.c]); + }); + test('Append B, C; Insert A at Start', function() { + this.dummy.appendField(this.b, 'B'); + this.dummy.appendField(this.c, 'C'); + this.dummy.insertFieldAt(0, this.a, 'A'); + + chai.assert.deepEqual(this.dummy.fieldRow, [this.a, this.b, this.c]); + }); + test('Append A, C; Insert B Between', function() { + this.dummy.appendField(this.a, 'A'); + this.dummy.appendField(this.c, 'C'); + this.dummy.insertFieldAt(1, this.b, 'B'); + + chai.assert.deepEqual(this.dummy.fieldRow, [this.a, this.b, this.c]); + }); + test('Append A, B; Insert C at End', function() { + this.dummy.appendField(this.a, 'A'); + this.dummy.appendField(this.b, 'B'); + this.dummy.insertFieldAt(2, this.c, 'C'); + + chai.assert.deepEqual(this.dummy.fieldRow, [this.a, this.b, this.c]); + }); + test('Append A, B, C; Remove A, B, C', function() { + this.dummy.appendField(this.a, 'A'); + this.dummy.appendField(this.b, 'B'); + this.dummy.appendField(this.c, 'C'); + + this.dummy.removeField('A'); + this.dummy.removeField('B'); + this.dummy.removeField('C'); + + chai.assert.isEmpty(this.dummy.fieldRow); + }); + test('Append A, B, C; Remove A', function() { + this.dummy.appendField(this.a, 'A'); + this.dummy.appendField(this.b, 'B'); + this.dummy.appendField(this.c, 'C'); + + this.dummy.removeField('A'); + + chai.assert.deepEqual(this.dummy.fieldRow, [this.b, this.c]); + }); + test('Append A, B, C; Remove B', function() { + this.dummy.appendField(this.a, 'A'); + this.dummy.appendField(this.b, 'B'); + this.dummy.appendField(this.c, 'C'); + + this.dummy.removeField('B'); + + chai.assert.deepEqual(this.dummy.fieldRow, [this.a, this.c]); + }); + test('Append A, B, C; Remove C', function() { + this.dummy.appendField(this.a, 'A'); + this.dummy.appendField(this.b, 'B'); + this.dummy.appendField(this.c, 'C'); + + this.dummy.removeField('C'); + + chai.assert.deepEqual(this.dummy.fieldRow, [this.a, this.b]); + }); + test('Append A, B; Remove A; Append C', function() { + this.dummy.appendField(this.a, 'A'); + this.dummy.appendField(this.b, 'B'); + this.dummy.removeField('A'); + this.dummy.appendField(this.c, 'C'); + + chai.assert.deepEqual(this.dummy.fieldRow, [this.b, this.c]); + }); + }); +}); diff --git a/js/tests/mocha/key_map_test.js b/js/tests/mocha/key_map_test.js new file mode 100644 index 0000000..4de0129 --- /dev/null +++ b/js/tests/mocha/key_map_test.js @@ -0,0 +1,104 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +suite('Key Map Tests', function() { + setup(function() { + Blockly.user.keyMap.setKeyMap(Blockly.user.keyMap.createDefaultKeyMap()); + }); + + test('Test adding a new action to key map', function() { + var newAction = new Blockly.Action('test_action', 'test', function(){ + return "test"; + }); + Blockly.user.keyMap.setActionForKey('65', newAction); + assertEquals(Blockly.user.keyMap.map_['65'].name, 'test_action'); + }); + + test('Test giving an old action a new key', function() { + Blockly.user.keyMap.setActionForKey(Blockly.utils.KeyCodes.F, + Blockly.navigation.ACTION_PREVIOUS); + assertEquals(Blockly.user.keyMap.map_[Blockly.utils.KeyCodes.W], undefined); + assertEquals(Blockly.user.keyMap.map_[Blockly.utils.KeyCodes.F], + Blockly.navigation.ACTION_PREVIOUS); + }); + + test('Test get key by action defined', function() { + var key = Blockly.user.keyMap.getKeyByAction(Blockly.navigation.ACTION_PREVIOUS); + assertEquals(key, Blockly.utils.KeyCodes.W); + }); + + test('Test get key by action undefined', function() { + var key = Blockly.user.keyMap.getKeyByAction(new Blockly.Action('something')); + assertEquals(key, undefined); + }); + + test('Test set key map', function() { + var testKeyMap = Blockly.user.keyMap.createDefaultKeyMap(); + testKeyMap['randomKey'] = new Blockly.Action('test','',null); + Blockly.user.keyMap.setKeyMap(testKeyMap); + assertEquals(Blockly.user.keyMap.map_['randomKey'].name, 'test'); + }); + + test('Test get key map returns a clone', function() { + var keyMap = Blockly.user.keyMap.getKeyMap(); + keyMap['randomKey'] = new Blockly.Action('test', '', null); + assertEquals(Blockly.user.keyMap.map_['randomKey'], undefined); + }); + + test('Test serialize key code with modifiers', function() { + var mockEvent = { + getModifierState: function(){ + return true; + }, + keyCode: 65 + }; + var serializedKey = Blockly.user.keyMap.serializeKeyEvent(mockEvent); + assertEquals(serializedKey, 'ShiftControlAltMeta65'); + }); + + test('Test serialize key code without modifiers', function() { + var mockEvent = { + getModifierState: function(){ + return false; + }, + keyCode: 65 + }; + var serializedKey = Blockly.user.keyMap.serializeKeyEvent(mockEvent); + assertEquals(serializedKey, '65'); + }); + + test('Test modifiers in reverse order', function() { + var testKey = Blockly.user.keyMap.createSerializedKey( + Blockly.utils.KeyCodes.K, [Blockly.user.keyMap.modifierKeys.CONTROL, + Blockly.user.keyMap.modifierKeys.SHIFT]); + Blockly.user.keyMap.setActionForKey(testKey, new Blockly.Action('test', '', null)); + var action = Blockly.user.keyMap.getActionByKeyCode('ShiftControl75'); + assertNotNull(action); + assertEquals(action.name, 'test'); + }); + + test('Test report invalid modifiers', function() { + var shouldThrow = function() { + Blockly.user.keyMap.createSerializedKey(Blockly.utils.KeyCodes.K, ['s', + Blockly.user.keyMap.modifierKeys.SHIFT]); + }; + chai.assert.throws(shouldThrow, Error, 's is not a valid modifier key.'); + }); + + + teardown(function() {}); +}); diff --git a/js/tests/mocha/metrics_test.js b/js/tests/mocha/metrics_test.js new file mode 100644 index 0000000..4869468 --- /dev/null +++ b/js/tests/mocha/metrics_test.js @@ -0,0 +1,117 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Metrics tests. + * @author samelh@google.com (Sam El-Husseini) + */ +'use strict'; + +suite('Metrics', function() { + function assertDimensionsMatch(toCheck, left, top, width, height) { + assertEquals('Top did not match.', top, toCheck.top); + assertEquals('Left did not match.', left, toCheck.left); + assertEquals('Width did not match.', width, toCheck.width); + assertEquals('Height did not match.', height, toCheck.height); + } + + // Make a mock workspace object with two properties: + // getBlocksBoundingBox and scale. + function makeMockWs(scale, x, y, width, height) { + return { + getBlocksBoundingBox: function() { + return { + top: y, + bottom: y + height, + left: x, + right: x + width + }; + }, + scale: scale + }; + } + + test('GetContentDimensionsExact - empty', function() { + var ws = makeMockWs(1, 0, 0, 0, 0); + var defaultZoom = Blockly.WorkspaceSvg.getContentDimensionsExact_(ws); + assertDimensionsMatch(defaultZoom, 0, 0, 0, 0); + }); + test('GetContentDimensionsExact - empty zoom in', function() { + var ws = makeMockWs(2, 0, 0, 0, 0); + var zoomIn = Blockly.WorkspaceSvg.getContentDimensionsExact_(ws); + assertDimensionsMatch(zoomIn, 0, 0, 0, 0); + }); + test('GetContentDimensionsExact - empty zoom out', function() { + var ws = makeMockWs(.5, 0, 0, 0, 0); + var zoomOut = Blockly.WorkspaceSvg.getContentDimensionsExact_(ws); + assertDimensionsMatch(zoomOut, 0, 0, 0, 0); + }); + test('GetContentDimensionsExact - non empty at origin', function() { + var ws = makeMockWs(1, 0, 0, 100, 100); + var defaultZoom = Blockly.WorkspaceSvg.getContentDimensionsExact_(ws); + // Pixel and ws units are the same at default zoom. + assertDimensionsMatch(defaultZoom, 0, 0, 100, 100); + }); + test('GetContentDimensionsExact - non empty at origin zoom in', function() { + var ws = makeMockWs(2, 0, 0, 100, 100); + var zoomIn = Blockly.WorkspaceSvg.getContentDimensionsExact_(ws); + // 1 ws unit = 2 pixels at this zoom level. + assertDimensionsMatch(zoomIn, 0, 0, 200, 200); + }); + test('GetContentDimensionsExact - non empty at origin zoom out', function() { + var ws = makeMockWs(.5, 0, 0, 100, 100); + var zoomOut = Blockly.WorkspaceSvg.getContentDimensionsExact_(ws); + // 1 ws unit = 0.5 pixels at this zoom level. + assertDimensionsMatch(zoomOut, 0, 0, 50, 50); + }); + test('GetContentDimensionsExact - non empty positive origin', function() { + var ws = makeMockWs(1, 10, 10, 100, 100); + var defaultZoom = Blockly.WorkspaceSvg.getContentDimensionsExact_(ws); + // Pixel and ws units are the same at default zoom. + assertDimensionsMatch(defaultZoom, 10, 10, 100, 100); + }); + test('GetContentDimensionsExact - non empty positive origin zoom in', function() { + var ws = makeMockWs(2, 10, 10, 100, 100); + var zoomIn = Blockly.WorkspaceSvg.getContentDimensionsExact_(ws); + // 1 ws unit = 2 pixels at this zoom level. + assertDimensionsMatch(zoomIn, 20, 20, 200, 200); + }); + test('GetContentDimensionsExact - non empty positive origin zoom out', function() { + var ws = makeMockWs(.5, 10, 10, 100, 100); + var zoomOut = Blockly.WorkspaceSvg.getContentDimensionsExact_(ws); + // 1 ws unit = 0.5 pixels at this zoom level. + assertDimensionsMatch(zoomOut, 5, 5, 50, 50); + }); + test('GetContentDimensionsExact - non empty negative origin', function() { + var ws = makeMockWs(1, -10, -10, 100, 100); + var defaultZoom = Blockly.WorkspaceSvg.getContentDimensionsExact_(ws); + // Pixel and ws units are the same at default zoom. + assertDimensionsMatch(defaultZoom, -10, -10, 100, 100); + }); + test('GetContentDimensionsExact - non empty negative origin zoom in', function() { + var ws = makeMockWs(2, -10, -10, 100, 100); + var zoomIn = Blockly.WorkspaceSvg.getContentDimensionsExact_(ws); + // 1 ws unit = 2 pixels at this zoom level. + assertDimensionsMatch(zoomIn, -20, -20, 200, 200); + }); + test('GetContentDimensionsExact - non empty negative origin zoom out', function() { + var ws = makeMockWs(.5, -10, -10, 100, 100); + var zoomOut = Blockly.WorkspaceSvg.getContentDimensionsExact_(ws); + // 1 ws unit = 0.5 pixels at this zoom level. + assertDimensionsMatch(zoomOut, -5, -5, 50, 50); + }); +}); diff --git a/js/tests/mocha/mocha.opts b/js/tests/mocha/mocha.opts new file mode 100644 index 0000000..b0986b1 --- /dev/null +++ b/js/tests/mocha/mocha.opts @@ -0,0 +1,3 @@ +--ui tdd +--file ../blockly_uncompressed.js +--reporter landing diff --git a/js/tests/mocha/names_test.js b/js/tests/mocha/names_test.js new file mode 100644 index 0000000..5ec208e --- /dev/null +++ b/js/tests/mocha/names_test.js @@ -0,0 +1,68 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Blockly names tests. + * @author samelh@google.com (Sam El-Husseini) + */ +'use strict'; + +suite('Names', function() { + + test('Safe name', function() { + var varDB = new Blockly.Names('window,door'); + assertEquals('SafeName empty.', 'unnamed', varDB.safeName_('')); + assertEquals('SafeName ok.', 'foobar', varDB.safeName_('foobar')); + assertEquals('SafeName number start.', 'my_9lives', + varDB.safeName_('9lives')); + assertEquals('SafeName number end.', 'lives9', varDB.safeName_('lives9')); + assertEquals('SafeName special chars.', '____', varDB.safeName_('!@#$')); + assertEquals('SafeName reserved.', 'door', varDB.safeName_('door')); + }); + + test('Get name', function() { + var varDB = new Blockly.Names('window,door'); + assertEquals('Name add #1.', 'Foo_bar', varDB.getName('Foo.bar', 'var')); + assertEquals('Name get #1.', 'Foo_bar', varDB.getName('Foo.bar', 'var')); + assertEquals('Name add #2.', 'Foo_bar2', varDB.getName('Foo bar', 'var')); + assertEquals('Name get #2.', 'Foo_bar2', varDB.getName('foo BAR', 'var')); + assertEquals('Name add #3.', 'door2', varDB.getName('door', 'var')); + assertEquals('Name add #4.', 'Foo_bar3', varDB.getName('Foo.bar', 'proc')); + assertEquals('Name get #1b.', 'Foo_bar', varDB.getName('Foo.bar', 'var')); + assertEquals('Name get #4.', 'Foo_bar3', varDB.getName('Foo.bar', 'proc')); + }); + + test('Get distinct name', function() { + var varDB = new Blockly.Names('window,door'); + assertEquals('Name distinct #1.', 'Foo_bar', + varDB.getDistinctName('Foo.bar', 'var')); + assertEquals('Name distinct #2.', 'Foo_bar2', + varDB.getDistinctName('Foo.bar', 'var')); + assertEquals('Name distinct #3.', 'Foo_bar3', + varDB.getDistinctName('Foo.bar', 'proc')); + varDB.reset(); + assertEquals('Name distinct #4.', 'Foo_bar', + varDB.getDistinctName('Foo.bar', 'var')); + }); + + test('name equals', function() { + assertTrue('Name equals #1.', Blockly.Names.equals('Foo.bar', 'Foo.bar')); + assertFalse('Name equals #2.', Blockly.Names.equals('Foo.bar', 'Foo_bar')); + assertTrue('Name equals #3.', Blockly.Names.equals('Foo.bar', 'FOO.BAR')); + }); + +}); diff --git a/js/tests/mocha/navigation_modify_test.js b/js/tests/mocha/navigation_modify_test.js new file mode 100644 index 0000000..18e146c --- /dev/null +++ b/js/tests/mocha/navigation_modify_test.js @@ -0,0 +1,423 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +suite('Insert/Modify', function() { + setup(function() { + var xmlText = '' + + '' + + '' + + '' + + '' + + '' + + '' + + ''; + defineStackBlock(); + defineRowBlock(); + defineStatementBlock(); + + var toolbox = document.getElementById('toolbox-connections'); + this.workspace = Blockly.inject('blocklyDiv', {toolbox: toolbox}); + Blockly.Xml.domToWorkspace(Blockly.Xml.textToDom(xmlText), this.workspace); + + this.stack_block_1 = this.workspace.getBlockById('stack_block_1'); + this.stack_block_2 = this.workspace.getBlockById('stack_block_2'); + this.row_block_1 = this.workspace.getBlockById('row_block_1'); + this.row_block_2 = this.workspace.getBlockById('row_block_2'); + this.statement_block_1 = this.workspace.getBlockById('statement_block_1'); + this.statement_block_2 = this.workspace.getBlockById('statement_block_2'); + + Blockly.navigation.enableKeyboardAccessibility(); + }); + + teardown(function() { + delete Blockly.Blocks['stack_block']; + delete Blockly.Blocks['row_block']; + delete Blockly.Blocks['statement_block']; + this.workspace.dispose(); + }); + + suite('Marked Connection', function() { + // TODO: Marked connection or cursor connection is already connected. + suite('Marker on next', function() { + setup(function() { + this.workspace.getMarker(Blockly.navigation.MARKER_NAME).setCurNode( + Blockly.ASTNode.createConnectionNode( + this.stack_block_1.nextConnection)); + }); + test('Cursor on workspace', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createWorkspaceNode(this.workspace, + new Blockly.utils.Coordinate(0, 0))); + chai.assert.isFalse(Blockly.navigation.modify_()); + }); + test('Cursor on compatible connection', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode( + this.stack_block_2.previousConnection)); + chai.assert.isTrue(Blockly.navigation.modify_()); + chai.assert.equal(this.stack_block_1.getNextBlock().id, 'stack_block_2'); + }); + test('Cursor on incompatible connection', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode( + this.stack_block_2.nextConnection)); + // Connect method will try to find a way to connect blocks with + // incompatible types. + chai.assert.isTrue(Blockly.navigation.modify_()); + chai.assert.equal(this.stack_block_1.getNextBlock(), this.stack_block_2); + }); + test('Cursor on really incompatible connection', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode( + this.row_block_1.outputConnection)); + chai.assert.isFalse(Blockly.navigation.modify_()); + chai.assert.isNull(this.stack_block_1.getNextBlock()); + }); + test('Cursor on block', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createBlockNode( + this.stack_block_2)); + chai.assert.isTrue(Blockly.navigation.modify_()); + chai.assert.equal(this.stack_block_1.getNextBlock().id, 'stack_block_2'); + }); + }); + + suite('Marker on previous', function() { + setup(function() { + this.workspace.getMarker(Blockly.navigation.MARKER_NAME).setCurNode( + Blockly.ASTNode.createConnectionNode( + this.stack_block_1.previousConnection)); + }); + test('Cursor on compatible connection', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode( + this.stack_block_2.nextConnection)); + chai.assert.isTrue(Blockly.navigation.modify_()); + chai.assert.equal(this.stack_block_1.getPreviousBlock().id, 'stack_block_2'); + }); + test('Cursor on incompatible connection', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode( + this.stack_block_2.previousConnection)); + chai.assert.isFalse(Blockly.navigation.modify_()); + chai.assert.isNull(this.stack_block_1.getPreviousBlock()); + }); + test('Cursor on really incompatible connection', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode( + this.row_block_1.outputConnection)); + chai.assert.isFalse(Blockly.navigation.modify_()); + chai.assert.isNull(this.stack_block_1.getNextBlock()); + }); + test('Cursor on block', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createBlockNode( + this.stack_block_2)); + chai.assert.isTrue(Blockly.navigation.modify_()); + chai.assert.equal(this.stack_block_1.getPreviousBlock().id, 'stack_block_2'); + }); + test('Cursor on incompatible block', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createBlockNode( + this.row_block_1)); + chai.assert.isFalse(Blockly.navigation.modify_()); + chai.assert.isNull(this.stack_block_1.getPreviousBlock()); + }); + }); + + suite('Marker on value input', function() { + setup(function() { + this.workspace.getMarker(Blockly.navigation.MARKER_NAME).setCurNode( + Blockly.ASTNode.createConnectionNode( + this.row_block_1.inputList[0].connection)); + }); + test('Cursor on compatible connection', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode( + this.row_block_2.outputConnection)); + chai.assert.isTrue(Blockly.navigation.modify_()); + chai.assert.equal(this.row_block_2.getParent().id, 'row_block_1'); + }); + test('Cursor on incompatible connection', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode( + this.row_block_2.inputList[0].connection)); + // Connect method will try to find a way to connect blocks with + // incompatible types. + chai.assert.isTrue(Blockly.navigation.modify_()); + chai.assert.equal(this.row_block_1.inputList[0].connection.targetBlock(), + this.row_block_2); + }); + test('Cursor on really incompatible connection', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode( + this.stack_block_1.previousConnection)); + chai.assert.isFalse(Blockly.navigation.modify_()); + }); + test('Cursor on block', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createBlockNode( + this.row_block_2)); + chai.assert.isTrue(Blockly.navigation.modify_()); + chai.assert.equal(this.row_block_2.getParent().id, 'row_block_1'); + }); + }); + + suite('Marked Statement input', function() { + setup(function() { + this.statement_block_1.inputList[0].connection.connect( + this.stack_block_1.previousConnection); + this.stack_block_1.nextConnection.connect(this.stack_block_2.previousConnection); + this.workspace.getMarker(Blockly.navigation.MARKER_NAME).setCurNode( + Blockly.ASTNode.createInputNode( + this.statement_block_1.inputList[0])); + }); + test('Cursor on block inside statement', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode( + this.stack_block_2.previousConnection)); + chai.assert.isTrue(Blockly.navigation.modify_()); + chai.assert.equal(this.stack_block_2.previousConnection.targetBlock(), + this.statement_block_1); + }); + test('Cursor on stack', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createStackNode( + this.statement_block_2)); + chai.assert.isTrue(Blockly.navigation.modify_()); + chai.assert.equal(this.statement_block_2.getParent().id, 'statement_block_1'); + }); + test('Cursor on incompatible type', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode( + this.row_block_1.outputConnection)); + chai.assert.isFalse(Blockly.navigation.modify_()); + chai.assert.equal(this.row_block_1.getParent(), null); + }); + + }); + + suite('Marker on output', function() { + setup(function() { + this.workspace.getMarker(Blockly.navigation.MARKER_NAME).setCurNode( + Blockly.ASTNode.createConnectionNode( + this.row_block_1.outputConnection)); + }); + test('Cursor on compatible connection', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode( + this.row_block_2.inputList[0].connection)); + chai.assert.isTrue(Blockly.navigation.modify_()); + chai.assert.equal(this.row_block_1.getParent().id, 'row_block_2'); + }); + test('Cursor on incompatible connection', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode( + this.row_block_2.outputConnection)); + chai.assert.isFalse(Blockly.navigation.modify_()); + }); + test('Cursor on really incompatible connection', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode( + this.stack_block_1.previousConnection)); + chai.assert.isFalse(Blockly.navigation.modify_()); + }); + test('Cursor on block', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createBlockNode( + this.row_block_2)); + chai.assert.isTrue(Blockly.navigation.modify_()); + chai.assert.equal(this.row_block_1.getParent().id, 'row_block_2'); + }); + }); + }); + + + suite('Marked Workspace', function() { + setup(function() { + this.workspace.getMarker(Blockly.navigation.MARKER_NAME).drawer_ = null; + this.workspace.getMarker(Blockly.navigation.MARKER_NAME).setCurNode( + Blockly.ASTNode.createWorkspaceNode( + this.workspace, new Blockly.utils.Coordinate(100, 200))); + }); + test('Cursor on row block', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createBlockNode( + this.row_block_1)); + chai.assert.isTrue(Blockly.navigation.modify_()); + var pos = this.row_block_1.getRelativeToSurfaceXY(); + chai.assert.equal(100, pos.x); + chai.assert.equal(200, pos.y); + }); + + test('Cursor on output connection', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode( + this.row_block_1.outputConnection)); + chai.assert.isTrue(Blockly.navigation.modify_()); + var pos = this.row_block_1.getRelativeToSurfaceXY(); + chai.assert.equal(100, pos.x); + chai.assert.equal(200, pos.y); + }); + + test('Cursor on previous connection', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode( + this.stack_block_1.previousConnection)); + chai.assert.isTrue(Blockly.navigation.modify_()); + var pos = this.stack_block_1.getRelativeToSurfaceXY(); + chai.assert.equal(100, pos.x); + chai.assert.equal(200, pos.y); + }); + + test('Cursor on input connection', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode( + this.row_block_1.inputList[0].connection)); + // Move the source block to the marked location on the workspace. + chai.assert.isTrue(Blockly.navigation.modify_()); + }); + + test('Cursor on next connection', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode( + this.stack_block_1.nextConnection)); + // Move the source block to the marked location on the workspace. + chai.assert.isTrue(Blockly.navigation.modify_()); + }); + + test('Cursor on child block (row)', function() { + this.row_block_1.inputList[0].connection.connect( + this.row_block_2.outputConnection); + + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createBlockNode( + this.row_block_2)); + + chai.assert.isTrue(Blockly.navigation.modify_()); + chai.assert.isNull(this.row_block_2.getParent()); + var pos = this.row_block_2.getRelativeToSurfaceXY(); + chai.assert.equal(100, pos.x); + chai.assert.equal(200, pos.y); + }); + + test('Cursor on child block (stack)', function() { + this.stack_block_1.nextConnection.connect( + this.stack_block_2.previousConnection); + + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createBlockNode( + this.stack_block_2)); + + chai.assert.isTrue(Blockly.navigation.modify_()); + chai.assert.isNull(this.stack_block_2.getParent()); + var pos = this.stack_block_2.getRelativeToSurfaceXY(); + chai.assert.equal(100, pos.x); + chai.assert.equal(200, pos.y); + }); + + test('Cursor on workspace', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createWorkspaceNode( + this.workspace, new Blockly.utils.Coordinate(100, 100))); + chai.assert.isFalse(Blockly.navigation.modify_()); + }); + }); + + suite('Marked Block', function() { + // TODO: Decide whether it ever makes sense to mark a block, and what to do + // if so. For now all of these attempted modifications will fail. + suite('Marked any block', function() { + // These tests are using a stack block, but do not depend on the type of + // the block. + setup(function() { + this.workspace.getMarker(Blockly.navigation.MARKER_NAME).setCurNode( + Blockly.ASTNode.createBlockNode( + this.stack_block_1)); + }); + test('Cursor on workspace', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createWorkspaceNode( + this.workspace, new Blockly.utils.Coordinate(100, 100))); + chai.assert.isFalse(Blockly.navigation.modify_()); + + }); + }); + suite('Marked stack block', function() { + setup(function() { + this.workspace.getMarker(Blockly.navigation.MARKER_NAME).setCurNode( + Blockly.ASTNode.createBlockNode( + this.stack_block_1)); + }); + test('Cursor on row block', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createBlockNode( + this.row_block_1)); + chai.assert.isFalse(Blockly.navigation.modify_()); + }); + test('Cursor on stack block', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createBlockNode( + this.stack_block_1)); + chai.assert.isFalse(Blockly.navigation.modify_()); + }); + test('Cursor on next connection', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode( + this.stack_block_2.nextConnection)); + chai.assert.isFalse(Blockly.navigation.modify_()); + }); + test('Cursor on previous connection', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode( + this.stack_block_2.previousConnection)); + chai.assert.isFalse(Blockly.navigation.modify_()); + }); + }); + suite('Marked row block', function() { + setup(function() { + this.workspace.getMarker(Blockly.navigation.MARKER_NAME).setCurNode( + Blockly.ASTNode.createBlockNode( + this.row_block_1)); + }); + test('Cursor on stack block', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createBlockNode( + this.stack_block_1)); + chai.assert.isFalse(Blockly.navigation.modify_()); + }); + test('Cursor on row block', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createBlockNode( + this.row_block_1)); + chai.assert.isFalse(Blockly.navigation.modify_()); + }); + test('Cursor on value input connection', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode( + this.row_block_2.inputList[0].connection)); + chai.assert.isFalse(Blockly.navigation.modify_()); + }); + test('Cursor on output connection', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode( + this.row_block_2.outputConnection)); + chai.assert.isFalse(Blockly.navigation.modify_()); + }); + }); + }); +}); diff --git a/js/tests/mocha/navigation_test.js b/js/tests/mocha/navigation_test.js new file mode 100644 index 0000000..9e04831 --- /dev/null +++ b/js/tests/mocha/navigation_test.js @@ -0,0 +1,759 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Navigation tests. + * @author aschmiedt@google.com (Abby Schmiedt) + */ +'use strict'; + + +suite('Navigation', function() { + function createNavigationWorkspace(enableKeyboardNav) { + var toolbox = document.getElementById('toolbox-categories'); + var workspace = Blockly.inject('blocklyDiv', {toolbox: toolbox}); + if (enableKeyboardNav) { + Blockly.navigation.enableKeyboardAccessibility(); + Blockly.navigation.currentState_ = Blockly.navigation.STATE_WS; + } + return workspace; + } + + // Test that toolbox key handlers call through to the right functions and + // transition correctly between toolbox, workspace, and flyout. + suite('Tests toolbox keys', function() { + setup(function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "basic_block", + "message0": "%1", + "args0": [ + { + "type": "field_input", + "name": "TEXT", + "text": "default" + } + ] + }]); + this.workspace = createNavigationWorkspace(true); + Blockly.navigation.focusToolbox_(); + this.mockEvent = { + getModifierState: function() { + return false; + } + }; + + this.firstCategory_ = this.workspace.getToolbox().tree_.firstChild_; + this.secondCategory_ = this.firstCategory_.getNextShownNode(); + }); + + teardown(function() { + delete Blockly.Blocks['basic_block']; + this.workspace.dispose(); + }); + + test('Next', function() { + this.mockEvent.keyCode = Blockly.utils.KeyCodes.S; + chai.assert.isTrue(Blockly.navigation.onKeyPress(this.mockEvent)); + chai.assert.equal(Blockly.navigation.currentState_, + Blockly.navigation.STATE_TOOLBOX); + chai.assert.equal(this.workspace.getToolbox().tree_.getSelectedItem(), + this.secondCategory_); + }); + + // Should be a no-op. + test('Next at end', function() { + this.workspace.getToolbox().tree_.getSelectedItem().selectNext(); + this.mockEvent.keyCode = Blockly.utils.KeyCodes.S; + // Go forward one so that we can go back one. + Blockly.navigation.onKeyPress(this.mockEvent); + var startCategory = this.workspace.getToolbox().tree_.getSelectedItem(); + chai.assert.isTrue(Blockly.navigation.onKeyPress(this.mockEvent)); + chai.assert.equal(Blockly.navigation.currentState_, + Blockly.navigation.STATE_TOOLBOX); + chai.assert.equal(this.workspace.getToolbox().tree_.getSelectedItem(), + startCategory); + }); + + test('Previous', function() { + // Go forward one so that we can go back one: + this.workspace.getToolbox().tree_.getSelectedItem().selectNext(); + this.mockEvent.keyCode = Blockly.utils.KeyCodes.W; + chai.assert.equal(this.workspace.getToolbox().tree_.getSelectedItem(), + this.secondCategory_); + chai.assert.isTrue(Blockly.navigation.onKeyPress(this.mockEvent)); + chai.assert.equal(Blockly.navigation.currentState_, + Blockly.navigation.STATE_TOOLBOX); + chai.assert.equal(this.workspace.getToolbox().tree_.getSelectedItem(), + this.firstCategory_); + }); + + // Should be a no-op. + test('Previous at start', function() { + var startCategory = this.workspace.getToolbox().tree_.getSelectedItem(); + this.mockEvent.keyCode = Blockly.utils.KeyCodes.W; + chai.assert.isTrue(Blockly.navigation.onKeyPress(this.mockEvent)); + chai.assert.equal(Blockly.navigation.currentState_, + Blockly.navigation.STATE_TOOLBOX); + chai.assert.equal(this.workspace.getToolbox().tree_.getSelectedItem(), + startCategory); + }); + + test('Out', function() { + this.mockEvent.keyCode = Blockly.utils.KeyCodes.A; + chai.assert.isTrue(Blockly.navigation.onKeyPress(this.mockEvent)); + // TODO (fenichel/aschmiedt): Decide whether out should go to the + // workspace. + chai.assert.equal(Blockly.navigation.currentState_, + Blockly.navigation.STATE_TOOLBOX); + }); + + test('Go to flyout', function() { + this.mockEvent.keyCode = Blockly.utils.KeyCodes.D; + chai.assert.isTrue(Blockly.navigation.onKeyPress(this.mockEvent)); + chai.assert.equal(Blockly.navigation.currentState_, + Blockly.navigation.STATE_FLYOUT); + var flyoutCursor = Blockly.navigation.getFlyoutCursor_(); + + chai.assert.equal(flyoutCursor.getCurNode().getLocation().getFieldValue("TEXT"), + "FirstCategory-FirstBlock"); + }); + + test('Focuses workspace from toolbox (e)', function() { + Blockly.navigation.currentState_ = Blockly.navigation.STATE_TOOLBOX; + this.mockEvent.keyCode = Blockly.utils.KeyCodes.E; + chai.assert.isTrue(Blockly.navigation.onKeyPress(this.mockEvent)); + chai.assert.equal(Blockly.navigation.currentState_, + Blockly.navigation.STATE_WS); + }); + test('Focuses workspace from toolbox (escape)', function() { + Blockly.navigation.currentState_ = Blockly.navigation.STATE_TOOLBOX; + this.mockEvent.keyCode = Blockly.utils.KeyCodes.E; + chai.assert.isTrue(Blockly.navigation.onKeyPress(this.mockEvent)); + chai.assert.equal(Blockly.navigation.currentState_, + Blockly.navigation.STATE_WS); + }); + // More tests: + // - nested categories + }); + + // Test that flyout key handlers call through to the right functions and + // transition correctly between toolbox, workspace, and flyout. + suite('Tests flyout keys', function() { + setup(function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "basic_block", + "message0": "%1", + "args0": [ + { + "type": "field_input", + "name": "TEXT", + "text": "default" + } + ] + }]); + this.workspace = createNavigationWorkspace(true); + Blockly.mainWorkspace = this.workspace; + Blockly.navigation.focusToolbox_(); + Blockly.navigation.focusFlyout_(); + this.mockEvent = { + getModifierState: function() { + return false; + } + }; + }); + + teardown(function() { + delete Blockly.Blocks['basic_block']; + this.workspace.dispose(); + }); + + // Should be a no-op + test('Previous at beginning', function() { + this.mockEvent.keyCode = Blockly.utils.KeyCodes.W; + chai.assert.isTrue(Blockly.navigation.onKeyPress(this.mockEvent)); + chai.assert.equal(Blockly.navigation.currentState_, + Blockly.navigation.STATE_FLYOUT); + chai.assert.equal(Blockly.navigation.getFlyoutCursor_().getCurNode().getLocation().getFieldValue("TEXT"), + "FirstCategory-FirstBlock"); + }); + + test('Previous', function() { + var flyoutBlocks = this.workspace.getFlyout().getWorkspace().getTopBlocks(); + Blockly.navigation.getFlyoutCursor_().setCurNode( + Blockly.ASTNode.createStackNode(flyoutBlocks[1])); + var flyoutBlock = Blockly.navigation.getFlyoutCursor_().getCurNode().getLocation(); + chai.assert.equal(flyoutBlock.getFieldValue("TEXT"), + "FirstCategory-SecondBlock"); + this.mockEvent.keyCode = Blockly.utils.KeyCodes.W; + chai.assert.isTrue(Blockly.navigation.onKeyPress(this.mockEvent)); + chai.assert.equal(Blockly.navigation.currentState_, + Blockly.navigation.STATE_FLYOUT); + flyoutBlock = Blockly.navigation.getFlyoutCursor_().getCurNode().getLocation(); + chai.assert.equal(flyoutBlock.getFieldValue("TEXT"), + "FirstCategory-FirstBlock"); + }); + + test('Next', function() { + this.mockEvent.keyCode = Blockly.utils.KeyCodes.S; + chai.assert.isTrue(Blockly.navigation.onKeyPress(this.mockEvent)); + chai.assert.equal(Blockly.navigation.currentState_, + Blockly.navigation.STATE_FLYOUT); + var flyoutBlock = Blockly.navigation.getFlyoutCursor_().getCurNode().getLocation(); + chai.assert.equal(flyoutBlock.getFieldValue("TEXT"), + "FirstCategory-SecondBlock"); + }); + + test('Out', function() { + this.mockEvent.keyCode = Blockly.utils.KeyCodes.A; + chai.assert.isTrue(Blockly.navigation.onKeyPress(this.mockEvent)); + chai.assert.equal(Blockly.navigation.currentState_, + Blockly.navigation.STATE_TOOLBOX); + }); + + test('MARK', function() { + this.mockEvent.keyCode = Blockly.utils.KeyCodes.ENTER; + chai.assert.isTrue(Blockly.navigation.onKeyPress(this.mockEvent)); + chai.assert.equal(Blockly.navigation.currentState_, + Blockly.navigation.STATE_WS); + chai.assert.equal(this.workspace.getTopBlocks().length, 1); + }); + + test('EXIT', function() { + this.mockEvent.keyCode = Blockly.utils.KeyCodes.ESC; + chai.assert.isTrue(Blockly.navigation.onKeyPress(this.mockEvent)); + chai.assert.equal(Blockly.navigation.currentState_, + Blockly.navigation.STATE_WS); + }); + }); + + // Test that workspace key handlers call through to the right functions and + // transition correctly between toolbox, workspace, and flyout. + suite('Tests workspace keys', function() { + setup(function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "basic_block", + "message0": "%1", + "args0": [ + { + "type": "field_input", + "name": "TEXT", + "text": "default" + } + ], + "previousStatement": null, + "nextStatement": null + }]); + this.workspace = createNavigationWorkspace(true); + this.basicBlock = this.workspace.newBlock('basic_block'); + this.firstCategory_ = this.workspace.getToolbox().tree_.firstChild_; + this.mockEvent = { + getModifierState: function() { + return false; + } + }; + }); + + teardown(function() { + delete Blockly.Blocks['basic_block']; + this.workspace.dispose(); + }); + + test('Previous', function() { + sinon.spy(this.workspace.getCursor(), 'prev'); + this.mockEvent.keyCode = Blockly.utils.KeyCodes.W; + chai.assert.isTrue(Blockly.navigation.onKeyPress(this.mockEvent)); + chai.assert.isTrue(this.workspace.getCursor().prev.calledOnce); + chai.assert.equal(Blockly.navigation.currentState_, + Blockly.navigation.STATE_WS); + this.workspace.getCursor().prev.restore(); + }); + + test('Next', function() { + var cursor = this.workspace.getCursor(); + sinon.spy(cursor, 'next'); + this.mockEvent.keyCode = Blockly.utils.KeyCodes.S; + chai.assert.isTrue(Blockly.navigation.onKeyPress(this.mockEvent)); + chai.assert.isTrue(cursor.next.calledOnce); + chai.assert.equal(Blockly.navigation.currentState_, + Blockly.navigation.STATE_WS); + cursor.next.restore(); + }); + + test('Out', function() { + var cursor = this.workspace.getCursor(); + sinon.spy(cursor, 'out'); + this.mockEvent.keyCode = Blockly.utils.KeyCodes.A; + chai.assert.isTrue(Blockly.navigation.onKeyPress(this.mockEvent)); + chai.assert.isTrue(cursor.out.calledOnce); + chai.assert.equal(Blockly.navigation.currentState_, + Blockly.navigation.STATE_WS); + cursor.out.restore(); + }); + + test('In', function() { + var cursor = this.workspace.getCursor(); + sinon.spy(cursor, 'in'); + this.mockEvent.keyCode = Blockly.utils.KeyCodes.D; + chai.assert.isTrue(Blockly.navigation.onKeyPress(this.mockEvent)); + chai.assert.isTrue(cursor.in.calledOnce); + chai.assert.equal(Blockly.navigation.currentState_, + Blockly.navigation.STATE_WS); + cursor.in.restore(); + }); + + test('Insert', function() { + sinon.spy(Blockly.navigation, 'modify_'); + this.mockEvent.keyCode = Blockly.utils.KeyCodes.I; + chai.assert.isTrue(Blockly.navigation.onKeyPress(this.mockEvent)); + chai.assert.isTrue(Blockly.navigation.modify_.calledOnce); + chai.assert.equal(Blockly.navigation.currentState_, + Blockly.navigation.STATE_WS); + Blockly.navigation.modify_.restore(); + }); + + test('Mark', function() { + this.workspace.getCursor().setCurNode( + Blockly.ASTNode.createConnectionNode(this.basicBlock.previousConnection)); + this.mockEvent.keyCode = Blockly.utils.KeyCodes.ENTER; + chai.assert.isTrue(Blockly.navigation.onKeyPress(this.mockEvent)); + var markedNode = this.workspace.getMarker(Blockly.navigation.MARKER_NAME).getCurNode(); + chai.assert.equal(markedNode.getLocation(), this.basicBlock.previousConnection); + chai.assert.equal(Blockly.navigation.currentState_, + Blockly.navigation.STATE_WS); + }); + + test('Toolbox', function() { + this.mockEvent.keyCode = Blockly.utils.KeyCodes.T; + chai.assert.isTrue(Blockly.navigation.onKeyPress(this.mockEvent)); + chai.assert.equal(this.workspace.getToolbox().tree_.getSelectedItem(), this.firstCategory_); + chai.assert.equal(Blockly.navigation.currentState_, + Blockly.navigation.STATE_TOOLBOX); + }); + }); + + suite('Test key press', function() { + setup(function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "basic_block", + "message0": "%1", + "args0": [ + { + "type": "field_dropdown", + "name": "OP", + "options": [ + ["%{BKY_MATH_ADDITION_SYMBOL}", "ADD"], + ["%{BKY_MATH_SUBTRACTION_SYMBOL}", "MINUS"], + ["%{BKY_MATH_MULTIPLICATION_SYMBOL}", "MULTIPLY"], + ["%{BKY_MATH_DIVISION_SYMBOL}", "DIVIDE"], + ["%{BKY_MATH_POWER_SYMBOL}", "POWER"] + ] + } + ] + }]); + this.workspace = createNavigationWorkspace(true); + this.workspace.getCursor().drawer_ = null; + this.basicBlock = this.workspace.newBlock('basic_block'); + Blockly.user.keyMap.setKeyMap(Blockly.user.keyMap.createDefaultKeyMap()); + Blockly.mainWorkspace = this.workspace; + Blockly.getMainWorkspace().keyboardAccessibilityMode = true; + Blockly.navigation.currentState_ = Blockly.navigation.STATE_WS; + + this.mockEvent = { + getModifierState: function() { + return false; + } + }; + }); + test('Action does not exist', function() { + var block = this.workspace.getTopBlocks()[0]; + var field = block.inputList[0].fieldRow[0]; + sinon.spy(field, 'onBlocklyAction'); + this.workspace.getCursor().setCurNode(Blockly.ASTNode.createFieldNode(field)); + this.mockEvent.keyCode = Blockly.utils.KeyCodes.N; + var isHandled = Blockly.navigation.onKeyPress(this.mockEvent); + chai.assert.isFalse(isHandled); + chai.assert.isFalse(field.onBlocklyAction.calledOnce); + + field.onBlocklyAction.restore(); + }); + + test('Action exists - field handles action', function() { + var block = this.workspace.getTopBlocks()[0]; + var field = block.inputList[0].fieldRow[0]; + + sinon.stub(field, 'onBlocklyAction').callsFake(function(){ + return true; + }); + this.workspace.getCursor().setCurNode(Blockly.ASTNode.createFieldNode(field)); + + var isHandled = Blockly.navigation.onBlocklyAction(Blockly.navigation.ACTION_OUT); + chai.assert.isTrue(isHandled); + chai.assert.isTrue(field.onBlocklyAction.calledOnce); + + field.onBlocklyAction.restore(); + }); + + test('Action exists - field does not handle action', function() { + var block = this.workspace.getTopBlocks()[0]; + var field = block.inputList[0].fieldRow[0]; + sinon.spy(field, 'onBlocklyAction'); + this.workspace.getCursor().setCurNode(Blockly.ASTNode.createFieldNode(field)); + + this.mockEvent.keyCode = Blockly.utils.KeyCodes.A; + var isHandled = Blockly.navigation.onBlocklyAction(Blockly.navigation.ACTION_OUT); + chai.assert.isTrue(isHandled); + chai.assert.isTrue(field.onBlocklyAction.calledOnce); + + field.onBlocklyAction.restore(); + }); + + test('Toggle Action Off', function() { + this.mockEvent.keyCode = 'ShiftControl75'; + sinon.spy(Blockly.navigation, 'onBlocklyAction'); + Blockly.getMainWorkspace().keyboardAccessibilityMode = true; + + var isHandled = Blockly.navigation.onKeyPress(this.mockEvent); + chai.assert.isTrue(isHandled); + chai.assert.isTrue(Blockly.navigation.onBlocklyAction.calledOnce); + chai.assert.isFalse(Blockly.getMainWorkspace().keyboardAccessibilityMode); + Blockly.navigation.onBlocklyAction.restore(); + }); + + test('Toggle Action On', function() { + this.mockEvent.keyCode = 'ShiftControl75'; + sinon.stub(Blockly.navigation, 'focusWorkspace_'); + Blockly.getMainWorkspace().keyboardAccessibilityMode = false; + + var isHandled = Blockly.navigation.onKeyPress(this.mockEvent); + chai.assert.isTrue(isHandled); + chai.assert.isTrue(Blockly.navigation.focusWorkspace_.calledOnce); + chai.assert.isTrue(Blockly.getMainWorkspace().keyboardAccessibilityMode); + Blockly.navigation.focusWorkspace_.restore(); + this.workspace.dispose(); + }); + + suite('Test key press in read only mode', function() { + setup(function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "field_block", + "message0": "%1 %2", + "args0": [ + { + "type": "field_dropdown", + "name": "NAME", + "options": [ + [ + "a", + "optionA" + ] + ] + }, + { + "type": "input_value", + "name": "NAME" + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": 230, + "tooltip": "", + "helpUrl": "" + }]); + this.workspace = Blockly.inject('blocklyDiv', {readOnly: true}); + + Blockly.mainWorkspace = this.workspace; + this.workspace.getCursor().drawer_ = null; + Blockly.getMainWorkspace().keyboardAccessibilityMode = true; + Blockly.navigation.currentState_ = Blockly.navigation.STATE_WS; + + this.fieldBlock1 = this.workspace.newBlock('field_block'); + this.mockEvent = { + getModifierState: function() { + return false; + } + }; + }); + + teardown(function() { + delete Blockly.Blocks['field_block']; + this.workspace.dispose(); + }); + + test('Perform valid action for read only', function() { + var astNode = Blockly.ASTNode.createBlockNode(this.fieldBlock1); + this.workspace.getCursor().setCurNode(astNode); + this.mockEvent.keyCode = Blockly.utils.KeyCodes.S; + chai.assert.isTrue(Blockly.navigation.onKeyPress(this.mockEvent)); + }); + + test('Perform invalid action for read only', function() { + var astNode = Blockly.ASTNode.createBlockNode(this.fieldBlock1); + this.workspace.getCursor().setCurNode(astNode); + this.mockEvent.keyCode = Blockly.utils.KeyCodes.I; + chai.assert.isFalse(Blockly.navigation.onKeyPress(this.mockEvent)); + }); + + test('Try to perform action on a field', function() { + var field = this.fieldBlock1.inputList[0].fieldRow[0]; + var astNode = Blockly.ASTNode.createFieldNode(field); + this.workspace.getCursor().setCurNode(astNode); + this.mockEvent.keyCode = Blockly.utils.KeyCodes.ENTER; + chai.assert.isFalse(Blockly.navigation.onKeyPress(this.mockEvent)); + }); + }); + }); + + suite('Insert Functions', function() { + setup(function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "basic_block", + "message0": "", + "previousStatement": null, + "nextStatement": null, + }]); + + this.workspace = createNavigationWorkspace(true); + + var basicBlock = this.workspace.newBlock('basic_block'); + var basicBlock2 = this.workspace.newBlock('basic_block'); + + this.basicBlock = basicBlock; + this.basicBlock2 = basicBlock2; + }); + + teardown(function() { + delete Blockly.Blocks['basic_block']; + this.workspace.dispose(); + }); + + test('Insert from flyout with a valid connection marked', function() { + var previousConnection = this.basicBlock.previousConnection; + var prevNode = Blockly.ASTNode.createConnectionNode(previousConnection); + this.workspace.getMarker(Blockly.navigation.MARKER_NAME).setCurNode(prevNode); + + Blockly.navigation.focusToolbox_(); + Blockly.navigation.focusFlyout_(); + Blockly.navigation.insertFromFlyout(); + + var insertedBlock = this.basicBlock.previousConnection.targetBlock(); + + chai.assert.isTrue(insertedBlock !== null); + chai.assert.equal(Blockly.navigation.currentState_, + Blockly.navigation.STATE_WS); + }); + + test('Insert Block from flyout without marking a connection', function() { + Blockly.navigation.focusToolbox_(); + Blockly.navigation.focusFlyout_(); + Blockly.navigation.insertFromFlyout(); + + var numBlocks = this.workspace.getTopBlocks().length; + + // Make sure the block was not connected to anything + chai.assert.isNull(this.basicBlock.previousConnection.targetConnection); + chai.assert.isNull(this.basicBlock.nextConnection.targetConnection); + + // Make sure that the block was added to the workspace + chai.assert.equal(numBlocks, 3); + chai.assert.equal(Blockly.navigation.currentState_, + Blockly.navigation.STATE_WS); + }); + + test('Connect two blocks that are on the workspace', function() { + var targetNode = Blockly.ASTNode.createConnectionNode(this.basicBlock.previousConnection); + this.workspace.getMarker(Blockly.navigation.MARKER_NAME).setCurNode(targetNode); + + var sourceNode = Blockly.ASTNode.createConnectionNode(this.basicBlock2.nextConnection); + this.workspace.getCursor().setCurNode(sourceNode); + + Blockly.navigation.modify_(); + var insertedBlock = this.basicBlock.previousConnection.targetBlock(); + + chai.assert.isNotNull(insertedBlock); + }); + }); + + suite('Connect Blocks', function() { + setup(function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "basic_block", + "message0": "", + "previousStatement": null, + "nextStatement": null, + }, + { + "type": "inline_block", + "message0": "%1 %2", + "args0": [ + { + "type": "input_value", + "name": "NAME" + }, + { + "type": "input_value", + "name": "NAME" + } + ], + "inputsInline": true, + "output": null, + "tooltip": "", + "helpUrl": "" + }]); + + this.workspace = createNavigationWorkspace(true); + + var basicBlock = this.workspace.newBlock('basic_block'); + var basicBlock2 = this.workspace.newBlock('basic_block'); + var basicBlock3 = this.workspace.newBlock('basic_block'); + var basicBlock4 = this.workspace.newBlock('basic_block'); + + var inlineBlock1 = this.workspace.newBlock('inline_block'); + var inlineBlock2 = this.workspace.newBlock('inline_block'); + + + this.basicBlock = basicBlock; + this.basicBlock2 = basicBlock2; + this.basicBlock3 = basicBlock3; + this.basicBlock4 = basicBlock4; + + this.inlineBlock1 = inlineBlock1; + this.inlineBlock2 = inlineBlock2; + + this.basicBlock.nextConnection.connect(this.basicBlock2.previousConnection); + + this.basicBlock3.nextConnection.connect(this.basicBlock4.previousConnection); + + this.inlineBlock1.inputList[0].connection.connect(this.inlineBlock2.outputConnection); + }); + + teardown(function() { + delete Blockly.Blocks['basic_block']; + this.workspace.dispose(); + }); + + test('Connect cursor on previous into stack', function() { + var markedLocation = this.basicBlock2.previousConnection; + var cursorLocation = this.basicBlock3.previousConnection; + + Blockly.navigation.connect_(cursorLocation, markedLocation); + + chai.assert.equal(this.basicBlock.nextConnection.targetBlock(), this.basicBlock3); + chai.assert.equal(this.basicBlock2.previousConnection.targetBlock(), this.basicBlock4); + }); + + test('Connect marker on previous into stack', function() { + var markedLocation = this.basicBlock3.previousConnection; + var cursorLocation = this.basicBlock2.previousConnection; + + Blockly.navigation.connect_(cursorLocation, markedLocation); + + chai.assert.equal(this.basicBlock.nextConnection.targetBlock(), this.basicBlock3); + chai.assert.equal(this.basicBlock2.previousConnection.targetBlock(), this.basicBlock4); + + }); + + test('Connect cursor on next into stack', function() { + var markedLocation = this.basicBlock2.previousConnection; + var cursorLocation = this.basicBlock4.nextConnection; + + Blockly.navigation.connect_(cursorLocation, markedLocation); + + chai.assert.equal(this.basicBlock.nextConnection.targetBlock(), this.basicBlock4); + chai.assert.equal(this.basicBlock3.nextConnection.targetConnection, null); + }); + + test('Connect cursor with parents', function() { + var markedLocation = this.basicBlock3.previousConnection; + var cursorLocation = this.basicBlock2.nextConnection; + + Blockly.navigation.connect_(cursorLocation, markedLocation); + + chai.assert.equal(this.basicBlock3.previousConnection.targetBlock(), this.basicBlock2); + }); + + test('Try to connect input that is descendant of output', function() { + var markedLocation = this.inlineBlock2.inputList[0].connection; + var cursorLocation = this.inlineBlock1.outputConnection; + + Blockly.navigation.connect_(cursorLocation, markedLocation); + + chai.assert.equal(this.inlineBlock2.outputConnection.targetBlock(), null); + chai.assert.equal(this.inlineBlock1.outputConnection.targetBlock(), this.inlineBlock2); + }); + }); + + + suite('Test cursor move on block delete', function() { + setup(function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "basic_block", + "message0": "", + "previousStatement": null, + "nextStatement": null, + }]); + this.workspace = createNavigationWorkspace(true); + this.basicBlockA = this.workspace.newBlock('basic_block'); + this.basicBlockB = this.workspace.newBlock('basic_block'); + }); + + teardown(function() { + delete Blockly.Blocks['basic_block']; + this.workspace.dispose(); + }); + + test('Delete block - has parent ', function() { + this.basicBlockA.nextConnection.connect(this.basicBlockB.previousConnection); + var astNode = Blockly.ASTNode.createBlockNode(this.basicBlockB); + // Set the cursor to be on the child block + this.workspace.getCursor().setCurNode(astNode); + // Remove the child block + this.basicBlockB.dispose(); + chai.assert.equal(this.workspace.getCursor().getCurNode().getType(), + Blockly.ASTNode.types.NEXT); + }); + + test('Delete block - no parent ', function() { + var astNode = Blockly.ASTNode.createBlockNode(this.basicBlockB); + this.workspace.getCursor().setCurNode(astNode); + this.basicBlockB.dispose(); + chai.assert.equal(this.workspace.getCursor().getCurNode().getType(), + Blockly.ASTNode.types.WORKSPACE); + }); + + test('Delete parent block', function() { + this.basicBlockA.nextConnection.connect(this.basicBlockB.previousConnection); + var astNode = Blockly.ASTNode.createBlockNode(this.basicBlockB); + // Set the cursor to be on the child block + this.workspace.getCursor().setCurNode(astNode); + // Remove the parent block + this.basicBlockA.dispose(); + chai.assert.equal(this.workspace.getCursor().getCurNode().getType(), + Blockly.ASTNode.types.WORKSPACE); + }); + + test('Delete top block in stack', function() { + this.basicBlockA.nextConnection.connect(this.basicBlockB.previousConnection); + var astNode = Blockly.ASTNode.createStackNode(this.basicBlockA); + // Set the cursor to be on the stack + this.workspace.getCursor().setCurNode(astNode); + // Remove the top block in the stack + this.basicBlockA.dispose(); + chai.assert.equal(this.workspace.getCursor().getCurNode().getType(), + Blockly.ASTNode.types.WORKSPACE); + }); + }); +}); diff --git a/js/tests/mocha/procedures_test.js b/js/tests/mocha/procedures_test.js new file mode 100644 index 0000000..3bbb5cf --- /dev/null +++ b/js/tests/mocha/procedures_test.js @@ -0,0 +1,556 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +goog.require('Blockly.Blocks.procedures'); +goog.require('Blockly.Msg'); + +suite('Procedures', function() { + setup(function() { + this.workspace = new Blockly.Workspace(); + + this.callForAllTypes = function(func, startName) { + var typesArray = [ + ['procedures_defnoreturn', 'procedures_callnoreturn'], + ['procedures_defreturn', 'procedures_callreturn'] + ]; + + for (var i = 0, types; (types = typesArray[i]); i++) { + var context = Object.create(null); + context.workspace = this.workspace; + context.defType = types[0]; + context.callType = types[1]; + + context.defBlock = new Blockly.Block(this.workspace, context.defType); + context.defBlock.setFieldValue(startName, 'NAME'); + context.callBlock = new Blockly.Block(this.workspace, context.callType); + context.callBlock.setFieldValue(startName, 'NAME'); + context.stub = sinon.stub( + context.defBlock.getField('NAME'), 'resizeEditor_'); + func.call(context); + context.defBlock.dispose(); + context.callBlock.dispose(); + context.stub.restore(); + } + }; + }); + teardown(function() { + this.workspace.dispose(); + }); + + suite('isNameUsed', function() { + test('No Blocks', function() { + chai.assert.isFalse( + Blockly.Procedures.isNameUsed('name1', this.workspace) + ); + }); + test('True', function() { + this.callForAllTypes(function() { + chai.assert.isTrue( + Blockly.Procedures.isNameUsed('name1', this.workspace) + ); + }, 'name1'); + }); + test('False', function() { + this.callForAllTypes(function() { + chai.assert.isFalse( + Blockly.Procedures.isNameUsed('name2', this.workspace) + ); + }, 'name1'); + }); + }); + suite('rename', function() { + test('Simple, Programmatic', function() { + this.callForAllTypes(function() { + this.defBlock.setFieldValue( + this.defBlock.getFieldValue('NAME') + '2', + 'NAME' + ); + chai.assert.equal(this.defBlock.getFieldValue('NAME'), 'start name2'); + chai.assert.equal(this.callBlock.getFieldValue('NAME'), 'start name2'); + }, 'start name'); + }); + test('Simple, Input', function() { + this.callForAllTypes(function() { + var defInput = this.defBlock.getField('NAME'); + defInput.htmlInput_ = Object.create(null); + defInput.htmlInput_.oldValue_ = 'start name'; + defInput.htmlInput_.untypedDefaultValue_ = 'start name'; + + defInput.htmlInput_.value = defInput.htmlInput_.oldValue_ + '2'; + defInput.onHtmlInputChange_(null); + chai.assert.equal(this.defBlock.getFieldValue('NAME'), 'start name2'); + chai.assert.equal(this.callBlock.getFieldValue('NAME'), 'start name2'); + }, 'start name'); + }); + test('lower -> CAPS', function() { + this.callForAllTypes(function() { + var defInput = this.defBlock.getField('NAME'); + defInput.htmlInput_ = Object.create(null); + defInput.htmlInput_.oldValue_ = 'start name'; + defInput.htmlInput_.untypedDefaultValue_ = 'start name'; + + defInput.htmlInput_.value = 'START NAME'; + defInput.onHtmlInputChange_(null); + chai.assert.equal(this.defBlock.getFieldValue('NAME'), 'START NAME'); + chai.assert.equal(this.callBlock.getFieldValue('NAME'), 'START NAME'); + }, 'start name'); + }); + test('CAPS -> lower', function() { + this.callForAllTypes(function() { + var defInput = this.defBlock.getField('NAME'); + defInput.htmlInput_ = Object.create(null); + defInput.htmlInput_.oldValue_ = 'START NAME'; + defInput.htmlInput_.untypedDefaultValue_ = 'START NAME'; + + defInput.htmlInput_.value = 'start name'; + defInput.onHtmlInputChange_(null); + chai.assert.equal(this.defBlock.getFieldValue('NAME'), 'start name'); + chai.assert.equal(this.callBlock.getFieldValue('NAME'), 'start name'); + }, 'START NAME'); + }); + test('Whitespace', function() { + this.callForAllTypes(function() { + var defInput = this.defBlock.getField('NAME'); + defInput.htmlInput_ = Object.create(null); + defInput.htmlInput_.oldValue_ = 'start name'; + defInput.htmlInput_.untypedDefaultValue_ = 'start name'; + + defInput.htmlInput_.value = defInput.htmlInput_.oldValue_ + ' '; + defInput.onHtmlInputChange_(null); + chai.assert.equal(this.defBlock.getFieldValue('NAME'), 'start name'); + chai.assert.equal(this.callBlock.getFieldValue('NAME'), 'start name'); + }, 'start name'); + }); + test('Whitespace then Text', function() { + this.callForAllTypes(function() { + var defInput = this.defBlock.getField('NAME'); + defInput.htmlInput_ = Object.create(null); + defInput.htmlInput_.oldValue_ = 'start name'; + defInput.htmlInput_.untypedDefaultValue_ = 'start name'; + + defInput.htmlInput_.value = defInput.htmlInput_.oldValue_ + ' '; + defInput.onHtmlInputChange_(null); + defInput.htmlInput_.value = defInput.htmlInput_.oldValue_ + '2'; + defInput.onHtmlInputChange_(null); + chai.assert.equal(this.defBlock.getFieldValue('NAME'), 'start name 2'); + chai.assert.equal(this.callBlock.getFieldValue('NAME'), 'start name 2'); + }, 'start name'); + }); + test('Set Empty', function() { + this.callForAllTypes(function() { + var defInput = this.defBlock.getField('NAME'); + defInput.htmlInput_ = Object.create(null); + defInput.htmlInput_.oldValue_ = 'start name'; + defInput.htmlInput_.untypedDefaultValue_ = 'start name'; + + defInput.htmlInput_.value = ''; + defInput.onHtmlInputChange_(null); + chai.assert.equal( + this.defBlock.getFieldValue('NAME'), + Blockly.Msg['UNNAMED_KEY']); + chai.assert.equal( + this.callBlock.getFieldValue('NAME'), + Blockly.Msg['UNNAMED_KEY']); + }, 'start name'); + }); + test('Set Empty, and Create New', function() { + this.callForAllTypes(function() { + var defInput = this.defBlock.getField('NAME'); + defInput.htmlInput_ = Object.create(null); + defInput.htmlInput_.oldValue_ = 'start name'; + defInput.htmlInput_.untypedDefaultValue_ = 'start name'; + + defInput.htmlInput_.value = ''; + defInput.onHtmlInputChange_(null); + var newDefBlock = new Blockly.Block(this.workspace, this.defType); + newDefBlock.setFieldValue('new name', 'NAME'); + chai.assert.equal( + this.defBlock.getFieldValue('NAME'), + Blockly.Msg['UNNAMED_KEY']); + chai.assert.equal( + this.callBlock.getFieldValue('NAME'), + Blockly.Msg['UNNAMED_KEY']); + + newDefBlock.dispose(); + }, 'start name'); + }); + }); + suite('getCallers', function() { + test('Simple', function() { + this.callForAllTypes(function() { + var callers = Blockly.Procedures.getCallers('name1', this.workspace); + chai.assert.equal(callers.length, 1); + chai.assert.equal(callers[0], this.callBlock); + }, 'name1'); + }); + test('Multiple Callers', function() { + this.callForAllTypes(function() { + var caller2 = new Blockly.Block(this.workspace, this.callType); + caller2.setFieldValue('name1', 'NAME'); + var caller3 = new Blockly.Block(this.workspace, this.callType); + caller3.setFieldValue('name1', 'NAME'); + + var callers = Blockly.Procedures.getCallers('name1', this.workspace); + chai.assert.equal(callers.length, 3); + chai.assert.equal(callers[0], this.callBlock); + chai.assert.equal(callers[1], caller2); + chai.assert.equal(callers[2], caller3); + + caller2.dispose(); + caller3.dispose(); + }, 'name1'); + }); + test('Multiple Procedures', function() { + this.callForAllTypes(function() { + var def2 = new Blockly.Block(this.workspace, this.defType); + def2.setFieldValue('name2', 'NAME'); + var caller2 = new Blockly.Block(this.workspace, this.callType); + caller2.setFieldValue('name2', 'NAME'); + + var callers = Blockly.Procedures.getCallers('name1', this.workspace); + chai.assert.equal(callers.length, 1); + chai.assert.equal(callers[0], this.callBlock); + + def2.dispose(); + caller2.dispose(); + }, 'name1'); + }); + // This can occur if you: + // 1) Create an uppercase definition and call block. + // 2) Delete both blocks. + // 3) Create a lowercase definition and call block. + // 4) Retrieve the uppercase call block from the trashcan. + // (And vise versa for creating lowercase blocks first) + // When converted to code all function names will be lowercase, so a + // caller should still be returned for a differently-cased procedure. + test('Call Different Case', function() { + this.callForAllTypes(function() { + this.callBlock.setFieldValue('NAME1', 'NAME'); + var callers = Blockly.Procedures.getCallers('name1', this.workspace); + chai.assert.equal(callers.length, 1); + chai.assert.equal(callers[0], this.callBlock); + }, 'name'); + }); + test('Multiple Workspaces', function() { + this.callForAllTypes(function() { + var workspace = new Blockly.Workspace(); + var def2 = new Blockly.Block(workspace, this.defType); + def2.setFieldValue('name', 'NAME'); + var caller2 = new Blockly.Block(workspace, this.callType); + caller2.setFieldValue('name', 'NAME'); + + var callers = Blockly.Procedures.getCallers('name', this.workspace); + chai.assert.equal(callers.length, 1); + chai.assert.equal(callers[0], this.callBlock); + + callers = Blockly.Procedures.getCallers('name', workspace); + chai.assert.equal(callers.length, 1); + chai.assert.equal(callers[0], caller2); + + def2.dispose(); + caller2.dispose(); + }, 'name'); + }); + }); + suite('getDefinition', function() { + test('Simple', function() { + this.callForAllTypes(function() { + var def = Blockly.Procedures.getDefinition('name1', this.workspace); + chai.assert.equal(def, this.defBlock); + }, 'name1'); + }); + test('Multiple Procedures', function() { + this.callForAllTypes(function() { + var def2 = new Blockly.Block(this.workspace, this.defType); + def2.setFieldValue('name2', 'NAME'); + var caller2 = new Blockly.Block(this.workspace, this.callType); + caller2.setFieldValue('name2', 'NAME'); + + var def = Blockly.Procedures.getDefinition('name1', this.workspace); + chai.assert.equal(def, this.defBlock); + + def2.dispose(); + caller2.dispose(); + }, 'name1'); + }); + test('Multiple Workspaces', function() { + this.callForAllTypes(function() { + var workspace = new Blockly.Workspace(); + var def2 = new Blockly.Block(workspace, this.defType); + def2.setFieldValue('name', 'NAME'); + var caller2 = new Blockly.Block(workspace, this.callType); + caller2.setFieldValue('name', 'NAME'); + + var def = Blockly.Procedures.getDefinition('name', this.workspace); + chai.assert.equal(def, this.defBlock); + + def = Blockly.Procedures.getDefinition('name', workspace); + chai.assert.equal(def, def2); + + def2.dispose(); + caller2.dispose(); + }, 'name'); + }); + }); + suite('Mutation', function() { + setup(function() { + this.findParentStub = sinon.stub(Blockly.Mutator, 'findParentWs') + .returns(this.workspace); + }); + teardown(function() { + this.findParentStub.restore(); + }); + suite('Composition', function() { + suite('Statements', function() { + function setStatementValue(mainWorkspace, defBlock, value) { + var mutatorWorkspace = new Blockly.Workspace( + new Blockly.Options({ + parentWorkspace: mainWorkspace + })); + defBlock.decompose(mutatorWorkspace); + var containerBlock = mutatorWorkspace.getTopBlocks()[0]; + var statementField = containerBlock.getField('STATEMENTS'); + statementField.setValue(value); + defBlock.compose(containerBlock); + } + test('Has Statements', function() { + var defBlock = new Blockly.Block(this.workspace, 'procedures_defreturn'); + setStatementValue(this.workspace, defBlock, true); + chai.assert.isTrue(defBlock.hasStatements_); + }); + test('Has No Statements', function() { + var defBlock = new Blockly.Block(this.workspace, 'procedures_defreturn'); + setStatementValue(this.workspace, defBlock, false); + chai.assert.isFalse(defBlock.hasStatements_); + }); + test('Saving Statements', function() { + var blockXml = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + '' + ); + var defBlock = Blockly.Xml.domToBlock(blockXml, this.workspace); + setStatementValue(this.workspace, defBlock, false); + chai.assert.isNull(defBlock.getInput('STACK')); + setStatementValue(this.workspace, defBlock, true); + chai.assert.isNotNull(defBlock.getInput('STACK')); + var statementBlocks = defBlock.getChildren(); + chai.assert.equal(statementBlocks.length, 1); + var block = statementBlocks[0]; + chai.assert.equal(block.type, 'procedures_ifreturn'); + chai.assert.equal(block.id, 'test'); + }); + }); + suite('Untyped Arguments', function() { + function createMutator(argArray) { + this.mutatorWorkspace = new Blockly.Workspace( + new Blockly.Options({ + parentWorkspace: this.workspace + })); + this.containerBlock = this.defBlock.decompose(this.mutatorWorkspace); + this.connection = this.containerBlock.getInput('STACK').connection; + for (var i = 0; i < argArray.length; i++) { + this.argBlock = new Blockly.Block( + this.mutatorWorkspace, 'procedures_mutatorarg'); + this.argBlock.setFieldValue(argArray[i], 'NAME'); + this.connection.connect(this.argBlock.previousConnection); + this.connection = this.argBlock.nextConnection; + } + this.defBlock.compose(this.containerBlock); + } + function assertArgs(argArray) { + chai.assert.equal(this.defBlock.arguments_.length, argArray.length); + for (var i = 0; i < argArray.length; i++) { + chai.assert.equal(this.defBlock.arguments_[i], argArray[i]); + } + chai.assert.equal(this.callBlock.arguments_.length, argArray.length); + for (var i = 0; i < argArray.length; i++) { + chai.assert.equal(this.callBlock.arguments_[i], argArray[i]); + } + } + function clearVariables() { + // TODO: Update this for typed vars. + var variables = this.workspace.getVariablesOfType(''); + var variableMap = this.workspace.getVariableMap(); + for (var i = 0, variable; (variable = variables[i]); i++) { + variableMap.deleteVariable(variable); + } + } + test('Simple Add Arg', function() { + this.callForAllTypes(function() { + var args = ['arg1']; + createMutator.call(this, args); + assertArgs.call(this, args); + clearVariables.call(this); + }, 'name'); + }); + test('Multiple Args', function() { + this.callForAllTypes(function() { + var args = ['arg1', 'arg2', 'arg3']; + createMutator.call(this, args); + assertArgs.call(this, args); + clearVariables.call(this); + }, 'name'); + }); + test('Simple Change Arg', function() { + this.callForAllTypes(function() { + createMutator.call(this, ['arg1']); + this.argBlock.setFieldValue('arg2', 'NAME'); + this.defBlock.compose(this.containerBlock); + assertArgs.call(this, ['arg2']); + clearVariables.call(this); + }, 'name'); + }); + test('lower -> CAPS', function() { + this.callForAllTypes(function() { + createMutator.call(this, ['arg']); + this.argBlock.setFieldValue('ARG', 'NAME'); + this.defBlock.compose(this.containerBlock); + assertArgs.call(this, ['ARG']); + clearVariables.call(this); + }, 'name'); + }); + test('CAPS -> lower', function() { + this.callForAllTypes(function() { + createMutator.call(this, ['ARG']); + this.argBlock.setFieldValue('arg', 'NAME'); + this.defBlock.compose(this.containerBlock); + assertArgs.call(this, ['arg']); + clearVariables.call(this); + }, 'name'); + }); + // Test case for #1958 + test('Set Arg Empty', function() { + this.callForAllTypes(function() { + var args = ['arg1']; + createMutator.call(this, args); + this.argBlock.setFieldValue('', 'NAME'); + this.defBlock.compose(this.containerBlock); + assertArgs.call(this, args); + clearVariables.call(this); + }, 'name'); + }); + test('Whitespace', function() { + this.callForAllTypes(function() { + var args = ['arg1']; + createMutator.call(this, args); + this.argBlock.setFieldValue(' ', 'NAME'); + this.defBlock.compose(this.containerBlock); + assertArgs.call(this, args); + clearVariables.call(this); + }, 'name'); + }); + test('Whitespace and Text', function() { + this.callForAllTypes(function() { + createMutator.call(this, ['arg1']); + this.argBlock.setFieldValue(' text ', 'NAME'); + this.defBlock.compose(this.containerBlock); + assertArgs.call(this, ['text']); + clearVariables.call(this); + }, 'name'); + }); + test('<>', function() { + this.callForAllTypes(function() { + var args = ['<>']; + createMutator.call(this, args); + assertArgs.call(this, args); + clearVariables.call(this); + }, 'name'); + }); + }); + }); + suite('Decomposition', function() { + suite('Statements', function() { + test('Has Statement Input', function() { + this.callForAllTypes(function() { + var mutatorWorkspace = new Blockly.Workspace( + new Blockly.Options({ + parentWorkspace: this.workspace + })); + this.defBlock.decompose(mutatorWorkspace); + var statementInput = mutatorWorkspace.getTopBlocks()[0] + .getInput('STATEMENT_INPUT'); + if (this.defType == 'procedures_defreturn') { + chai.assert.isNotNull(statementInput); + } else { + chai.assert.isNull(statementInput); + } + }, 'name'); + }); + test('Has Statements', function() { + var defBlock = new Blockly.Block(this.workspace, 'procedures_defreturn'); + defBlock.hasStatements_ = true; + var mutatorWorkspace = new Blockly.Workspace( + new Blockly.Options({ + parentWorkspace: this.workspace + })); + defBlock.decompose(mutatorWorkspace); + var statementValue = mutatorWorkspace.getTopBlocks()[0] + .getField('STATEMENTS').getValueBoolean(); + chai.assert.isTrue(statementValue); + }); + test('No Has Statements', function() { + var defBlock = new Blockly.Block(this.workspace, 'procedures_defreturn'); + defBlock.hasStatements_ = false; + var mutatorWorkspace = new Blockly.Workspace( + new Blockly.Options({ + parentWorkspace: this.workspace + })); + defBlock.decompose(mutatorWorkspace); + var statementValue = mutatorWorkspace.getTopBlocks()[0] + .getField('STATEMENTS').getValueBoolean(); + chai.assert.isFalse(statementValue); + }); + }); + suite('Untyped Arguments', function() { + function assertArguments(argumentsArray) { + this.defBlock.arguments_ = argumentsArray; + var mutatorWorkspace = new Blockly.Workspace( + new Blockly.Options({ + parentWorkspace: this.workspace + })); + this.defBlock.decompose(mutatorWorkspace); + var argBlocks = mutatorWorkspace.getBlocksByType('procedures_mutatorarg'); + chai.assert.equal(argBlocks.length, argumentsArray.length); + + for (var i = 0; i < argumentsArray.length; i++) { + var argString = argumentsArray[i]; + var argBlockValue = argBlocks[i].getFieldValue('NAME'); + chai.assert.equal(argBlockValue, argString); + } + } + test('Simple Single Arg', function() { + this.callForAllTypes(function() { + assertArguments.call(this, ['arg']); + }, 'name'); + }); + test('Multiple Args', function() { + this.callForAllTypes(function() { + assertArguments.call(this, ['arg1', 'arg2']); + }, 'name'); + }); + test('<>', function() { + this.callForAllTypes(function() { + assertArguments.call(this, ['<>']); + }, 'name'); + }); + }); + }); + }); +}); diff --git a/js/tests/mocha/run_mocha_tests_in_browser.js b/js/tests/mocha/run_mocha_tests_in_browser.js new file mode 100644 index 0000000..f7a2cb1 --- /dev/null +++ b/js/tests/mocha/run_mocha_tests_in_browser.js @@ -0,0 +1,84 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Node.js script to run Mocha tests in Chrome, via webdriver. + */ +var webdriverio = require('webdriverio'); + +module.exports = runMochaTestsInBrowser; + +/** + * Runs the Mocha tests in this directory in Chrome. It uses webdriverio to + * launch Chrome and load index.html. Outputs a summary of the test results + * to the console. + * @return 0 on success, 1 on failure. + */ +async function runMochaTestsInBrowser() { + var options = { + capabilities: { + browserName: 'chrome' + } + }; + // Run in headless mode on Travis. + if (process.env.TRAVIS_CI) { + options.capabilities['goog:chromeOptions'] = { + args: ['--headless', '--no-sandbox', '--disable-dev-shm-usage'] + }; + } + + var url = 'file://' + __dirname + '/index.html'; + console.log('Starting webdriverio...'); + const browser = await webdriverio.remote(options); + console.log('Initialized.\nLoading url: ' + url); + await browser.url(url); + + await browser.waitUntil(async () => { + var elem = await browser.$('#failureCount'); + var text = await elem.getAttribute('tests_failed'); + return text != 'unset'; + }, 7000); + + const elem = await browser.$('#failureCount'); + const numOfFailure = await elem.getAttribute('tests_failed'); + + console.log('============Blockly Mocha Test Summary================='); + console.log(numOfFailure); + console.log(numOfFailure + ' tests failed'); + console.log('============Blockly Mocha Test Summary================='); + if (parseInt(numOfFailure) !== 0) { + await browser.deleteSession(); + return 1; + } + await browser.deleteSession(); + return 0; +} + +if (require.main === module) { + runMochaTestsInBrowser().catch(e => { + console.error(e); + process.exit(1); + }).then(function(result) { + if (result) { + console.log('Mocha tests failed'); + process.exit(1); + } else { + console.log('Mocha tests passed'); + process.exit(0); + } + }); +} diff --git a/js/tests/mocha/test_helpers.js b/js/tests/mocha/test_helpers.js new file mode 100644 index 0000000..b65430e --- /dev/null +++ b/js/tests/mocha/test_helpers.js @@ -0,0 +1,194 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* exported assertEquals, assertNotEquals, assertArrayEquals, assertTrue, assertFalse, + assertNull, assertNotNull, assertNotNullNorUndefined, assert, + isEqualArrays, assertUndefined, assertNotUndefined, + defineRowBlock, defineStackBlock, defineStatementBlock */ +function _argumentsIncludeComments(expectedNumberOfNonCommentArgs, args) { + return args.length == expectedNumberOfNonCommentArgs + 1; +} + +function _commentArg(expectedNumberOfNonCommentArgs, args) { + if (_argumentsIncludeComments(expectedNumberOfNonCommentArgs, args)) { + return args[0]; + } + + return null; +} + +function _nonCommentArg(desiredNonCommentArgIndex, expectedNumberOfNonCommentArgs, args) { + return _argumentsIncludeComments(expectedNumberOfNonCommentArgs, args) ? + args[desiredNonCommentArgIndex] : + args[desiredNonCommentArgIndex - 1]; +} + +function _validateArguments(expectedNumberOfNonCommentArgs, args) { + if (!( args.length == expectedNumberOfNonCommentArgs || + (args.length == expectedNumberOfNonCommentArgs + 1 && (typeof(args[0]) == 'string') || args[0] == null))) { + throw Error('Incorrect arguments passed to assert function'); + } +} +/** + * Converts from JSUnit assertEquals to chai.assert.equal. + */ +function assertEquals() { + _validateArguments(2, arguments); + var var1 = _nonCommentArg(1, 2, arguments); + var var2 = _nonCommentArg(2, 2, arguments); + var comment = _commentArg(2, arguments); + chai.assert.equal(var1, var2, comment); +} + +/** + * Converts from JSUnit assertNotEquals to chai.assert.notEquals. + */ +function assertNotEquals() { + _validateArguments(2, arguments); + var var1 = _nonCommentArg(1, 2, arguments); + var var2 = _nonCommentArg(2, 2, arguments); + var comment = _commentArg(2, arguments); + chai.assert.notEqual(var1, var2, comment); +} + +/** + * Converts from JSUnit assertTrue to chai.assert.isTrue. + */ +function assertTrue() { + _validateArguments(1, arguments); + var commentArg = _commentArg(1, arguments); + var booleanValue = _nonCommentArg(1, 1, arguments); + if (typeof(booleanValue) != 'boolean') { + throw Error('Bad argument to assertTrue(boolean)'); + } + + chai.assert.isTrue(booleanValue, commentArg); +} + +/** + * Converts from JSUnit assertFalse to chai.assert.isNotTrue. + */ +function assertFalse() { + _validateArguments(1, arguments); + var commentArg = _commentArg(1, arguments); + var booleanValue = _nonCommentArg(1, 1, arguments); + + if (typeof(booleanValue) != 'boolean') { + throw Error('Bad argument to assertFalse(boolean)'); + } + + chai.assert.isNotTrue(booleanValue, commentArg); +} + +/** + * Converts from JSUnit assertNull to chai.assert.isNull. + */ +function assertNull() { + _validateArguments(1, arguments); + var commentArg = _commentArg(1, arguments); + var val = _nonCommentArg(1, 1, arguments); + chai.assert.isNull(val, commentArg); +} + +function assertNotNull() { + _validateArguments(1, arguments); + var commentArg = _commentArg(1, arguments); + var val = _nonCommentArg(1, 1, arguments); + chai.assert.isNotNull(val, commentArg); +} + +function assertNotNullNorUndefined() { + assertNotNull(arguments); +} + +function assert() { + chai.assert(arguments); +} + +/** + * Check that two arrays have the same content. + * @param {!Array.} array1 The first array. + * @param {!Array.} array2 The second array. + */ +function isEqualArrays(array1, array2) { + assertEquals(array1.length, array2.length); + for (var i = 0; i < array1.length; i++) { + assertEquals(array1[i], array2[i]); + } +} + +function assertUndefined() { + _validateArguments(1, arguments); + var commentArg = _commentArg(1, arguments); + var val = _nonCommentArg(1, 1, arguments); + chai.assert.isUndefined(val, commentArg); +} + +function assertNotUndefined() { + _validateArguments(1, arguments); + var commentArg = _commentArg(1, arguments); + var val = _nonCommentArg(1, 1, arguments); + chai.assert.isDefined(val, commentArg); +} + +function assertArrayEquals() { + _validateArguments(2, arguments); + var var1 = _nonCommentArg(1, 2, arguments); + var var2 = _nonCommentArg(2, 2, arguments); + isEqualArrays(var1, var2); +} + +function defineStackBlock() { + Blockly.defineBlocksWithJsonArray([{ + "type": "stack_block", + "message0": "", + "previousStatement": null, + "nextStatement": null + }]); +} + +function defineRowBlock() { + Blockly.defineBlocksWithJsonArray([{ + "type": "row_block", + "message0": "%1", + "args0": [ + { + "type": "input_value", + "name": "INPUT" + } + ], + "output": null + }]); +} + +function defineStatementBlock() { + Blockly.defineBlocksWithJsonArray([{ + "type": "statement_block", + "message0": "%1", + "args0": [ + { + "type": "input_statement", + "name": "NAME" + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": 230, + "tooltip": "", + "helpUrl": "" + }]); +} diff --git a/js/tests/mocha/theme_test.js b/js/tests/mocha/theme_test.js new file mode 100644 index 0000000..0676dbc --- /dev/null +++ b/js/tests/mocha/theme_test.js @@ -0,0 +1,283 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Blockly Theme tests. + * @author samelh@google.com (Sam El-Husseini) + */ +'use strict'; + +suite('Theme', function() { + + function defineThemeTestBlocks() { + Blockly.defineBlocksWithJsonArray([{ + "type": "stack_block", + "message0": "", + "previousStatement": null, + "nextStatement": null + }, + { + "type": "row_block", + "message0": "%1", + "args0": [ + { + "type": "input_value", + "name": "INPUT" + } + ], + "output": null + }]); + } + + function undefineThemeTestBlocks() { + delete Blockly.Blocks['stack_block']; + delete Blockly.Blocks['row_block']; + } + + + function createBlockStyles() { + return { + "styleOne": { + "colourPrimary": "#aaaaaa", + "colourSecondary": "#bbbbbb", + "colourTertiary": "#cccccc", + "hat": 'cap' + } + }; + } + + function createMultipleBlockStyles() { + return { + "styleOne": { + "colourPrimary": "#aaaaaa", + "colourSecondary": "#bbbbbb", + "colourTertiary": "#cccccc", + "hat": 'cap' + }, + "styleTwo": { + "colourPrimary": "#000000", + "colourSecondary": "#999999", + "colourTertiary": "#4d4d4d", + "hat": '' + } + }; + } + + function stringifyAndCompare(val1, val2) { + var stringVal1 = JSON.stringify(val1); + var stringVal2 = JSON.stringify(val2); + assertEquals(stringVal1, stringVal2); + } + + test('Set All BlockStyles', function() { + var theme = new Blockly.Theme('test', createBlockStyles()); + stringifyAndCompare(createBlockStyles(), theme.blockStyles); + var blockStyles = createMultipleBlockStyles(); + for (var key in blockStyles) { + theme.blockStyles[key] = blockStyles[key]; + } + stringifyAndCompare(createMultipleBlockStyles(), theme.blockStyles); + }); + + test('Get All BlockStyles', function() { + var theme = new Blockly.Theme('test', createMultipleBlockStyles()); + var allBlocks = theme.blockStyles; + stringifyAndCompare(createMultipleBlockStyles(), allBlocks); + }); + + test('Get BlockStyles', function() { + var theme = new Blockly.Theme('test', createBlockStyles()); + var blockStyle = theme.blockStyles['styleOne']; + + stringifyAndCompare(blockStyle, createBlockStyles().styleOne); + }); + + test('Set BlockStyle Update', function() { + var theme = new Blockly.Theme('test', createBlockStyles()); + var blockStyle = createBlockStyles(); + blockStyle.styleOne.colourPrimary = '#00ff00'; + + theme.blockStyles['styleOne'] = blockStyle.styleOne; + + stringifyAndCompare(theme.blockStyles, blockStyle); + }); + + test('Set BlockStyle Add', function() { + var theme = new Blockly.Theme('test', createBlockStyles()); + var blockStyle = createMultipleBlockStyles(); + + theme.blockStyles['styleTwo'] = blockStyle.styleTwo; + + stringifyAndCompare(theme.blockStyles, blockStyle); + }); + + test('Set Theme', function() { + defineThemeTestBlocks(); + var blockStyles = createBlockStyles(); + var workspace = new Blockly.WorkspaceSvg({}); + var blockA = workspace.newBlock('stack_block'); + + blockA.setStyle = function() {this.styleName_ = 'styleTwo';}; + var callCount = 1; + workspace.refreshToolboxSelection = function() { + return ++callCount; + }; + blockA.styleName_ = 'styleOne'; + + var stub = sinon.stub(Blockly, "getMainWorkspace").returns(workspace); + var hideStub = sinon.stub(Blockly, "hideChaff"); + + workspace.setTheme(blockStyles); + + // Checks that the theme was set correctly on Blockly namespace + stringifyAndCompare(workspace.getTheme(), blockStyles); + + // Checks that the setTheme function was called on the block + assertEquals(blockA.getStyleName(), 'styleTwo'); + + // check that the toolbox refreshed method was called + assertEquals(workspace.refreshToolboxSelection(), 3); + + assertEquals(Blockly.Events.FIRE_QUEUE_.pop().element, 'theme'); + + undefineThemeTestBlocks(); + + stub.restore(); + hideStub.restore(); + }); + + suite('Validate block styles', function() { + setup(function() { + this.constants = new Blockly.blockRendering.ConstantProvider(); + }); + + test('Null', function() { + var inputStyle = null; + var expectedOutput = { + "colourPrimary": "#000000", + "colourSecondary": "#999999", + "colourTertiary": "#4d4d4d", + "hat": '' + }; + stringifyAndCompare( + this.constants.validatedBlockStyle_(inputStyle), expectedOutput); + }); + + test('Empty', function() { + var inputStyle = {}; + var expectedOutput = { + "colourPrimary": "#000000", + "colourSecondary": "#999999", + "colourTertiary": "#4d4d4d", + "hat": '' + }; + stringifyAndCompare( + this.constants.validatedBlockStyle_(inputStyle), expectedOutput); + }); + + test('Incomplete hex', function() { + var inputStyle = { + "colourPrimary": "#012345" + }; + var expectedOutput = { + "colourPrimary": "#012345", + "colourSecondary": "#99a7b5", + "colourTertiary": "#4d657d", + "hat": '' + }; + stringifyAndCompare( + this.constants.validatedBlockStyle_(inputStyle), expectedOutput); + }); + + test('Complete hex', function() { + var inputStyle = { + "colourPrimary": "#aaaaaa", + "colourSecondary": "#bbbbbb", + "colourTertiary": "#cccccc", + "hat": 'cap' + }; + var expectedOutput = { + "colourPrimary": "#aaaaaa", + "colourSecondary": "#bbbbbb", + "colourTertiary": "#cccccc", + "hat": 'cap' + }; + stringifyAndCompare( + this.constants.validatedBlockStyle_(inputStyle), expectedOutput); + }); + + test('Complete hue', function() { + var inputStyle = { + "colourPrimary": "20", + "colourSecondary": "40", + "colourTertiary": "60", + }; + var expectedOutput = { + "colourPrimary": "#a5745b", + "colourSecondary": "#a58c5b", + "colourTertiary": "#a5a55b", + "hat": '' + }; + stringifyAndCompare( + this.constants.validatedBlockStyle_(inputStyle), expectedOutput); + }); + + test('Incomplete hue', function() { + var inputStyle = { + "colourPrimary": "20", + }; + var expectedOutput = { + "colourPrimary": "#a5745b", + "colourSecondary": "#dbc7bd", + "colourTertiary": "#c09e8c", + "hat": '' + }; + stringifyAndCompare( + this.constants.validatedBlockStyle_(inputStyle), expectedOutput); + }); + + test('Complete css colour name', function() { + var inputStyle = { + "colourPrimary": "red", + "colourSecondary": "white", + "colourTertiary": "blue" + }; + var expectedOutput = { + "colourPrimary": "#ff0000", + "colourSecondary": "#ffffff", + "colourTertiary": "#0000ff", + "hat": '' + }; + stringifyAndCompare( + this.constants.validatedBlockStyle_(inputStyle), expectedOutput); + }); + + test('Incomplete css colour name', function() { + var inputStyle = { + "colourPrimary": "black", + }; + var expectedOutput = { + "colourPrimary": "#000000", + "colourSecondary": "#999999", + "colourTertiary": "#4d4d4d", + "hat": '' + }; + stringifyAndCompare( + this.constants.validatedBlockStyle_(inputStyle), expectedOutput); + }); + }); +}); diff --git a/js/tests/mocha/trashcan_test.js b/js/tests/mocha/trashcan_test.js new file mode 100644 index 0000000..7e0a0fd --- /dev/null +++ b/js/tests/mocha/trashcan_test.js @@ -0,0 +1,311 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +suite("Trashcan", function() { + var workspace = { + addChangeListener: function(func) { + this.listener = func; + }, + triggerListener: function(event) { + this.listener(event); + }, + options: { + maxTrashcanContents: Infinity + } + }; + var themeManager = new Blockly.ThemeManager(workspace, Blockly.Themes.Classic); + workspace.getThemeManager = function() { + return themeManager; + }; + function sendDeleteEvent(xmlString) { + var xml = Blockly.Xml.textToDom( + '' + + xmlString + ''); + xml = xml.children[0]; + var event = { + type: Blockly.Events.BLOCK_DELETE, + oldXml: xml + }; + workspace.triggerListener(event); + } + + setup(function() { + this.trashcan = new Blockly.Trashcan(workspace); + this.setLidStub = sinon.stub(this.trashcan, 'setLidAngle_'); + }); + teardown(function() { + this.setLidStub.restore(); + this.trashcan = null; + }); + + suite("Events", function() { + test("Delete", function() { + sendDeleteEvent(''); + chai.assert.equal(this.trashcan.contents_.length, 1); + }); + test("Non-Delete", function() { + var event = { + type: 'dummy_type' + }; + workspace.triggerListener(event); + chai.assert.equal(this.trashcan.contents_.length, 0); + }); + test("Non-Delete w/ oldXml", function() { + var xml = Blockly.Xml.textToDom( + '' + + ' ' + + '' + ); + xml = xml.children[0]; + var event = { + type: 'dummy_type', + oldXml: xml + }; + workspace.triggerListener(event); + chai.assert.equal(this.trashcan.contents_.length, 0); + }); + test("Shadow Delete", function() { + sendDeleteEvent(''); + chai.assert.equal(this.trashcan.contents_.length, 0); + }); + }); + suite("Unique Contents", function() { + test("Simple", function() { + sendDeleteEvent(''); + sendDeleteEvent(''); + chai.assert.equal(this.trashcan.contents_.length, 1); + }); + test("Different Coords", function() { + sendDeleteEvent(''); + sendDeleteEvent(''); + chai.assert.equal(this.trashcan.contents_.length, 1); + }); + test("Different IDs", function() { + sendDeleteEvent(''); + sendDeleteEvent(''); + chai.assert.equal(this.trashcan.contents_.length, 1); + }); + test("No Disabled - Disabled True", function() { + sendDeleteEvent(''); + sendDeleteEvent(''); + // Disabled tags get removed because disabled blocks aren't allowed to + // be dragged from flyouts. See #2239 and #3243. + chai.assert.equal(this.trashcan.contents_.length, 1); + }); + test("No Editable - Editable False", function() { + sendDeleteEvent(''); + sendDeleteEvent(''); + chai.assert.equal(this.trashcan.contents_.length, 2); + }); + test("No Movable - Movable False", function() { + sendDeleteEvent(''); + sendDeleteEvent(''); + chai.assert.equal(this.trashcan.contents_.length, 2); + }); + test("Different Field Values", function() { + sendDeleteEvent( + '' + + ' dummy_value1' + + '' + ); + sendDeleteEvent( + '' + + ' dummy_value2' + + '' + ); + chai.assert.equal(this.trashcan.contents_.length, 2); + }); + test("No Values - Values", function() { + sendDeleteEvent(''); + sendDeleteEvent( + '' + + ' ' + + ' ' + + ' ' + + '' + ); + chai.assert.equal(this.trashcan.contents_.length, 2); + }); + test("Different Value Blocks", function() { + sendDeleteEvent( + '' + + ' ' + + ' ' + + ' ' + + '' + ); + sendDeleteEvent( + '' + + ' ' + + ' ' + + ' ' + + '' + ); + chai.assert.equal(this.trashcan.contents_.length, 2); + }); + test("No Statements - Statements", function() { + sendDeleteEvent(''); + sendDeleteEvent( + '' + + ' ' + + ' ' + + ' ' + + '' + ); + chai.assert.equal(this.trashcan.contents_.length, 2); + }); + test("Different Statement Blocks", function() { + sendDeleteEvent( + '' + + ' ' + + ' ' + + ' ' + + '' + ); + sendDeleteEvent( + '' + + ' ' + + ' ' + + ' ' + + '' + ); + chai.assert.equal(this.trashcan.contents_.length, 2); + }); + test("No Next - Next", function() { + sendDeleteEvent(''); + sendDeleteEvent( + '' + + ' ' + + ' ' + + ' ' + + '' + ); + chai.assert.equal(this.trashcan.contents_.length, 2); + }); + test("Different Next Blocks", function() { + sendDeleteEvent( + '' + + ' ' + + ' ' + + ' ' + + '' + ); + sendDeleteEvent( + '' + + ' ' + + ' ' + + ' ' + + '' + ); + chai.assert.equal(this.trashcan.contents_.length, 2); + }); + test("No Comment - Comment", function() { + sendDeleteEvent(''); + sendDeleteEvent( + '' + + ' comment_text' + + '' + ); + chai.assert.equal(this.trashcan.contents_.length, 2); + }); + test("Different Comment Text", function() { + sendDeleteEvent( + '' + + ' comment_text1' + + '' + ); + sendDeleteEvent( + '' + + ' comment_text2' + + '' + ); + chai.assert.equal(this.trashcan.contents_.length, 2); + }); + test("Different Comment Size", function() { + sendDeleteEvent( + '' + + ' comment_text' + + '' + ); + sendDeleteEvent( + '' + + ' comment_text' + + '' + ); + // h & w tags are removed b/c the blocks appear the same. + chai.assert.equal(this.trashcan.contents_.length, 1); + }); + test("Different Comment Pinned", function() { + sendDeleteEvent( + '' + + ' comment_text' + + '' + ); + sendDeleteEvent( + '' + + ' comment_text' + + '' + ); + // pinned tags are removed b/c the blocks appear the same. + chai.assert.equal(this.trashcan.contents_.length, 1); + }); + test("No Mutator - Mutator", function() { + sendDeleteEvent(''); + sendDeleteEvent( + '' + + ' ' + + '' + ); + chai.assert.equal(this.trashcan.contents_.length, 2); + }); + test("Different Mutator", function() { + sendDeleteEvent( + '' + + ' ' + + '' + ); + sendDeleteEvent( + '' + + ' ' + + '' + ); + chai.assert.equal(this.trashcan.contents_.length, 2); + }); + }); + suite("Max Contents", function() { + test("Max 0", function() { + workspace.options.maxTrashcanContents = 0; + sendDeleteEvent( + '' + ); + chai.assert.equal(this.trashcan.contents_.length, 0); + workspace.options.maxTrashcanContents = Infinity; + }); + test("Last In First Out", function() { + workspace.options.maxTrashcanContents = 1; + sendDeleteEvent(''); + sendDeleteEvent(''); + chai.assert.equal(this.trashcan.contents_.length, 1); + chai.assert.equal( + Blockly.Xml.textToDom(this.trashcan.contents_[0]) + .getAttribute('type'), + 'dummy_type2' + ); + workspace.options.maxTrashcanContents = Infinity; + }); + }); +}); diff --git a/js/tests/mocha/utils_test.js b/js/tests/mocha/utils_test.js new file mode 100644 index 0000000..eb22c28 --- /dev/null +++ b/js/tests/mocha/utils_test.js @@ -0,0 +1,107 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +suite('Utils', function() { + test('genUid', function() { + var uuids = {}; + chai.assert.equal([1,2,3].indexOf(4), -1); + for (var i = 0; i < 1000; i++) { + var uuid = Blockly.utils.genUid(); + chai.assert.isFalse(uuid in uuids, 'UUID different: ' + uuid); + uuids[uuid] = true; + } + }); + + suite('DOM', function() { + test('addClass', function() { + var p = document.createElement('p'); + Blockly.utils.dom.addClass(p, 'one'); + assertEquals('Adding "one"', 'one', p.className); + Blockly.utils.dom.addClass(p, 'one'); + assertEquals('Adding duplicate "one"', 'one', p.className); + Blockly.utils.dom.addClass(p, 'two'); + assertEquals('Adding "two"', 'one two', p.className); + Blockly.utils.dom.addClass(p, 'two'); + assertEquals('Adding duplicate "two"', 'one two', p.className); + Blockly.utils.dom.addClass(p, 'three'); + assertEquals('Adding "three"', 'one two three', p.className); + }); + + test('hasClass', function() { + var p = document.createElement('p'); + p.className = ' one three two three '; + assertTrue('Has "one"', Blockly.utils.dom.hasClass(p, 'one')); + assertTrue('Has "two"', Blockly.utils.dom.hasClass(p, 'two')); + assertTrue('Has "three"', Blockly.utils.dom.hasClass(p, 'three')); + assertFalse('Has no "four"', Blockly.utils.dom.hasClass(p, 'four')); + assertFalse('Has no "t"', Blockly.utils.dom.hasClass(p, 't')); + }); + + test('removeClass', function() { + var p = document.createElement('p'); + p.className = ' one three two three '; + Blockly.utils.dom.removeClass(p, 'two'); + assertEquals('Removing "two"', 'one three three', p.className); + Blockly.utils.dom.removeClass(p, 'four'); + assertEquals('Removing "four"', 'one three three', p.className); + Blockly.utils.dom.removeClass(p, 'three'); + assertEquals('Removing "three"', 'one', p.className); + Blockly.utils.dom.removeClass(p, 'ne'); + assertEquals('Removing "ne"', 'one', p.className); + Blockly.utils.dom.removeClass(p, 'one'); + assertEquals('Removing "one"', '', p.className); + Blockly.utils.dom.removeClass(p, 'zero'); + assertEquals('Removing "zero"', '', p.className); + }); + }); + + suite('String', function() { + test('shortest string length', function() { + var len = Blockly.utils.string.shortestStringLength('one,two,three,four,five'.split(',')); + assertEquals('Length of "one"', 3, len); + len = Blockly.utils.string.shortestStringLength('one,two,three,four,five,'.split(',')); + assertEquals('Length of ""', 0, len); + len = Blockly.utils.string.shortestStringLength(['Hello World']); + assertEquals('List of one', 11, len); + len = Blockly.utils.string.shortestStringLength([]); + assertEquals('Empty list', 0, len); + }); + + test('comment word prefix', function() { + var len = Blockly.utils.string.commonWordPrefix('one,two,three,four,five'.split(',')); + assertEquals('No prefix', 0, len); + len = Blockly.utils.string.commonWordPrefix('Xone,Xtwo,Xthree,Xfour,Xfive'.split(',')); + assertEquals('No word prefix', 0, len); + len = Blockly.utils.string.commonWordPrefix('abc de,abc de,abc de,abc de'.split(',')); + assertEquals('Full equality', 6, len); + len = Blockly.utils.string.commonWordPrefix('abc deX,abc deY'.split(',')); + assertEquals('One word prefix', 4, len); + len = Blockly.utils.string.commonWordPrefix('abc de,abc deY'.split(',')); + assertEquals('Overflow no', 4, len); + len = Blockly.utils.string.commonWordPrefix('abc de,abc de Y'.split(',')); + assertEquals('Overflow yes', 6, len); + len = Blockly.utils.string.commonWordPrefix(['Hello World']); + assertEquals('List of one', 11, len); + len = Blockly.utils.string.commonWordPrefix([]); + assertEquals('Empty list', 0, len); + len = Blockly.utils.string.commonWordPrefix('turn left,turn right'.split(',')); + assertEquals('No prefix due to &nbsp;', 0, len); + len = Blockly.utils.string.commonWordPrefix('turn\u00A0left,turn\u00A0right'.split(',')); + assertEquals('No prefix due to \\u00A0', 0, len); + }); + }); +}); diff --git a/js/tests/mocha/xml_procedures_test.js b/js/tests/mocha/xml_procedures_test.js new file mode 100644 index 0000000..fefa72a --- /dev/null +++ b/js/tests/mocha/xml_procedures_test.js @@ -0,0 +1,312 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +goog.require('Blockly.Blocks.procedures'); +goog.require('Blockly.Msg'); + +suite('Procedures XML', function() { + suite('Deserialization', function() { + setup(function() { + this.workspace = new Blockly.Workspace(); + + this.callForAllTypes = function(func) { + var typesArray = [ + ['procedures_defnoreturn', 'procedures_callnoreturn'], + ['procedures_defreturn', 'procedures_callreturn'] + ]; + + for (var i = 0, types; (types = typesArray[i]); i++) { + var context = Object.create(null); + context.workspace = this.workspace; + context.defType = types[0]; + context.callType = types[1]; + + func.call(context); + + this.workspace.clear(); + } + }; + }); + teardown(function() { + this.workspace.dispose(); + }); + + suite('Definition Blocks', function() { + test('Minimal', function() { + this.callForAllTypes(function() { + var xml = Blockly.Xml.textToDom( + '' + ); + var block = Blockly.Xml.domToBlock(xml, this.workspace); + + // TODO: Is this how you want this to work? or do you want it to + // be 'unnamed'? + chai.assert.equal(block.getFieldValue('NAME'), ''); + chai.assert.isArray(block.arguments_); + chai.assert.isEmpty(block.arguments_); + chai.assert.isArray(block.argumentVarModels_); + chai.assert.isEmpty(block.argumentVarModels_); + chai.assert.isNotNull(block.getInput('STACK')); + }); + }); + // This is like what's in the toolbox. + test('Common', function() { + this.callForAllTypes(function() { + var xml = Blockly.Xml.textToDom( + '' + + ' do something' + + '' + ); + var block = Blockly.Xml.domToBlock(xml, this.workspace); + + chai.assert.equal( + block.getFieldValue('NAME'), + 'do something'); + chai.assert.isArray(block.arguments_); + chai.assert.isEmpty(block.arguments_); + chai.assert.isArray(block.argumentVarModels_); + chai.assert.isEmpty(block.argumentVarModels_); + chai.assert.isNotNull(block.getInput('STACK')); + }); + }); + test('Arg Vars Pre-Created', function() { + this.callForAllTypes(function() { + this.workspace.createVariable('x', '', 'arg'); + var xml = Blockly.Xml.textToDom( + '' + + ' do something' + + ' ' + + ' ' + + ' ' + + '' + ); + var block = Blockly.Xml.domToBlock(xml, this.workspace); + + chai.assert.equal( + block.getFieldValue('NAME'), + 'do something'); + chai.assert.deepEqual(block.arguments_, ['x']); + chai.assert.deepEqual(block.argumentVarModels_, + [this.workspace.getVariableById('arg')]); + chai.assert.isNotNull(block.getInput('STACK')); + }); + }); + test('Arg Vars Not Created', function() { + this.callForAllTypes(function() { + var xml = Blockly.Xml.textToDom( + '' + + ' do something' + + ' ' + + ' ' + + ' ' + + '' + ); + var block = Blockly.Xml.domToBlock(xml, this.workspace); + + chai.assert.equal( + block.getFieldValue('NAME'), + 'do something'); + chai.assert.deepEqual(block.arguments_, ['x']); + chai.assert.deepEqual(block.argumentVarModels_, + [this.workspace.getVariableById('arg')]); + chai.assert.isNotNull(block.getInput('STACK')); + }); + }); + // TODO: I don't know a lot about typing vars, and even less out it in + // this context. Is allowing typed vars to be args the correct behavior? + test('Arg Vars Pre-Created Typed', function() { + this.callForAllTypes(function() { + this.workspace.createVariable('x', 'type', 'arg'); + var xml = Blockly.Xml.textToDom( + '' + + ' do something' + + ' ' + + ' ' + + ' ' + + '' + ); + var block = Blockly.Xml.domToBlock(xml, this.workspace); + + chai.assert.equal( + block.getFieldValue('NAME'), + 'do something'); + chai.assert.deepEqual(block.arguments_, ['x']); + chai.assert.deepEqual(block.argumentVarModels_, + [this.workspace.getVariableById('arg')]); + chai.assert.isNotNull(block.getInput('STACK')); + }); + }); + test('Statements False', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' do something' + + ' ' + + '' + ); + var block = Blockly.Xml.domToBlock(xml, this.workspace); + + chai.assert.equal( + block.getFieldValue('NAME'), + 'do something'); + chai.assert.isArray(block.arguments_); + chai.assert.isEmpty(block.arguments_); + chai.assert.isArray(block.argumentVarModels_); + chai.assert.isEmpty(block.argumentVarModels_); + chai.assert.isNull(block.getInput('STACK')); + }); + test('Statements True', function() { + var xml = Blockly.Xml.textToDom( + '' + + ' do something' + + ' ' + + '' + ); + var block = Blockly.Xml.domToBlock(xml, this.workspace); + + chai.assert.equal( + block.getFieldValue('NAME'), + 'do something'); + chai.assert.isArray(block.arguments_); + chai.assert.isEmpty(block.arguments_); + chai.assert.isArray(block.argumentVarModels_); + chai.assert.isEmpty(block.argumentVarModels_); + chai.assert.isNotNull(block.getInput('STACK')); + }); + }); + suite('Call Blocks', function() { + test('Caller W/ Def', function() { + this.callForAllTypes(function() { + Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' do something' + + '' + ), this.workspace); + var callerXML = Blockly.Xml.textToDom( + '' + + ' ' + + '' + ); + var block = Blockly.Xml.domToBlock(callerXML, this.workspace); + + chai.assert.equal( + block.getFieldValue('NAME'), + 'do something'); + chai.assert.isArray(block.arguments_); + chai.assert.isEmpty(block.arguments_); + // TODO: argumentVarModels_ is undefined for call_return, but + // defined for call_noreturn. Make it defined for both. + /* chai.assert.isArray(block.argumentVarModels_); + chai.assert.isEmpty(block.argumentVarModels_); */ + }); + }); + // TODO: I couldn't get this test (of creating a definition) to work + // b/c of the events delay. + test.skip('Caller No Def', function() { + this.callForAllTypes(function() { + var callerXML = Blockly.Xml.textToDom( + '' + + ' ' + + '' + ); + var block = Blockly.Xml.domToBlock(callerXML, this.workspace); + + chai.assert.equal( + block.getFieldValue('NAME'), + 'do something'); + chai.assert.isArray(block.arguments_); + chai.assert.isEmpty(block.arguments_); + // TODO: argumentVarModels_ is undefined for call_return, but + // defined for call_noreturn. Make it defined for both. + /* chai.assert.isArray(block.argumentVarModels_); + chai.assert.isEmpty(block.argumentVarModels_); */ + chai.assert.equal(this.workspace.getAllBlocks(false).count, 2); + }); + }); + test('Caller W/ Params', function() { + this.callForAllTypes(function() { + Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' do something' + + ' ' + + ' ' + + ' ' + + '' + ), this.workspace); + var callerXML = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + '' + ); + var block = Blockly.Xml.domToBlock(callerXML, this.workspace); + + chai.assert.equal( + block.getFieldValue('NAME'), + 'do something'); + chai.assert.deepEqual(block.arguments_, ['x']); + chai.assert.deepEqual(block.argumentVarModels_, + [this.workspace.getVariableById('arg')]); + }); + }); + // TODO: How do you want it to behave in this situation? + test.skip('Caller W/out Params', function() { + this.callForAllTypes(function() { + Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' do something' + + ' ' + + ' ' + + ' ' + + '' + ), this.workspace); + var callerXML = Blockly.Xml.textToDom( + '' + + ' ' + + '' + ); + // TODO: Remove this when you fix this test. + // eslint-disable-next-line no-unused-vars + var block = Blockly.Xml.domToBlock(callerXML, this.workspace); + }); + }); + // TODO: How do you want it to behave in this situation? + test.skip('Caller W/ Bad Params', function() { + this.callForAllTypes(function() { + Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' do something' + + ' ' + + ' ' + + ' ' + + '' + ), this.workspace); + var callerXML = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ' ' + + '' + ); + // TODO: Remove this when you fix this test. + // eslint-disable-next-line no-unused-vars + var block = Blockly.Xml.domToBlock(callerXML, this.workspace); + }); + }); + }); + }); +}); diff --git a/js/tests/mocha/xml_test.js b/js/tests/mocha/xml_test.js new file mode 100644 index 0000000..4d37a28 --- /dev/null +++ b/js/tests/mocha/xml_test.js @@ -0,0 +1,716 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +suite('XML', function() { + var assertSimpleField = function(fieldDom, name, text) { + assertEquals(text, fieldDom.textContent); + assertEquals(name, fieldDom.getAttribute('name')); + }; + var assertNonSerializingField = function(fieldDom) { + assertEquals(undefined, fieldDom.childNodes[0]); + }; + var assertVariableField = function(fieldDom, name, type, id, text) { + assertEquals(name, fieldDom.getAttribute('name')); + assertEquals(type, fieldDom.getAttribute('variabletype')); + assertEquals(id, fieldDom.getAttribute('id')); + assertEquals(text, fieldDom.textContent); + }; + setup(function() { + Blockly.defineBlocksWithJsonArray([ + { + "type": "empty_block", + "message0": "", + "args0": [] + }, + ]); + }); + teardown(function() { + delete Blockly.Blocks['empty_block']; + }); + suite('Serialization', function() { + setup(function() { + this.workspace = new Blockly.Workspace(); + }); + teardown(function() { + this.workspace.dispose(); + }); + suite('Fields', function() { + test('Angle', function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "field_angle_test_block", + "message0": "%1", + "args0": [ + { + "type": "field_angle", + "name": "ANGLE", + "angle": 90 + } + ], + }]); + var block = new Blockly.Block(this.workspace, + 'field_angle_test_block'); + var resultFieldDom = Blockly.Xml.blockToDom(block).childNodes[0]; + assertSimpleField(resultFieldDom, 'ANGLE', '90'); + delete Blockly.Blocks['field_angle_test_block']; + }); + test('Checkbox', function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "field_checkbox_test_block", + "message0": "%1", + "args0": [ + { + "type": "field_checkbox", + "name": "CHECKBOX", + "checked": true + } + ], + }]); + var block = new Blockly.Block(this.workspace, + 'field_checkbox_test_block'); + var resultFieldDom = Blockly.Xml.blockToDom(block).childNodes[0]; + assertSimpleField(resultFieldDom, 'CHECKBOX', 'TRUE'); + delete Blockly.Blocks['field_checkbox_test_block']; + }); + test('Colour', function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "field_colour_test_block", + "message0": "%1", + "args0": [ + { + "type": "field_colour", + "name": "COLOUR", + "colour": '#000099' + } + ], + }]); + var block = new Blockly.Block(this.workspace, + 'field_colour_test_block'); + var resultFieldDom = Blockly.Xml.blockToDom(block).childNodes[0]; + assertSimpleField(resultFieldDom, 'COLOUR', '#000099'); + delete Blockly.Blocks['field_colour_test_block']; + }); + /* If you want to run date tests add the date picker here: + * https://github.com/google/blockly/blob/master/core/blockly.js#L41 + * before unskipping. + */ + test.skip('Date', function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "field_date_test_block", + "message0": "%1", + "args0": [ + { + "type": "field_date", + "name": "DATE", + "date": "2020-02-20" + } + ], + }]); + var block = new Blockly.Block(this.workspace, + 'field_date_test_block'); + var resultFieldDom = Blockly.Xml.blockToDom(block).childNodes[0]; + assertSimpleField(resultFieldDom, 'DATE', '2020-02-20'); + delete Blockly.Blocks['field_date_test_block']; + }); + test('Dropdown', function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "field_dropdown_test_block", + "message0": "%1", + "args0": [ + { + "type": "field_dropdown", + "name": "DROPDOWN", + "options": [ + [ + "a", + "A" + ], + [ + "b", + "B" + ], + [ + "c", + "C" + ] + ] + } + ], + }]); + var block = new Blockly.Block(this.workspace, + 'field_dropdown_test_block'); + var resultFieldDom = Blockly.Xml.blockToDom(block).childNodes[0]; + assertSimpleField(resultFieldDom, 'DROPDOWN', 'A'); + delete Blockly.Blocks['field_dropdown_test_block']; + }); + test('Image', function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "field_image_test_block", + "message0": "%1", + "args0": [ + { + "type": "field_image", + "name": "IMAGE", + "src": "https://blockly-demo.appspot.com/static/tests/media/a.png", + "width": 32, + "height": 32, + "alt": "A" + } + ], + }]); + var block = new Blockly.Block(this.workspace, + 'field_image_test_block'); + var resultFieldDom = Blockly.Xml.blockToDom(block); + assertNonSerializingField(resultFieldDom); + delete Blockly.Blocks['field_image_test_block']; + }); + test('Label', function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "field_label_test_block", + "message0": "%1", + "args0": [ + { + "type": "field_label", + "name": "LABEL", + "text": "default" + } + ], + }]); + var block = new Blockly.Block(this.workspace, + 'field_label_test_block'); + var resultFieldDom = Blockly.Xml.blockToDom(block); + assertNonSerializingField(resultFieldDom); + delete Blockly.Blocks['field_label_test_block']; + }); + test('Label Serializable', function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "field_label_serializable_test_block", + "message0": "%1", + "args0": [ + { + "type": "field_label_serializable", + "name": "LABEL", + "text": "default" + } + ], + }]); + var block = new Blockly.Block(this.workspace, + 'field_label_serializable_test_block'); + var resultFieldDom = Blockly.Xml.blockToDom(block).childNodes[0]; + assertSimpleField(resultFieldDom, 'LABEL', 'default'); + delete Blockly.Blocks['field_label_serializable_test_block']; + }); + test('Number', function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "field_number_test_block", + "message0": "%1", + "args0": [ + { + "type": "field_number", + "name": "NUMBER", + "value": 97 + } + ], + }]); + var block = new Blockly.Block(this.workspace, + 'field_number_test_block'); + var resultFieldDom = Blockly.Xml.blockToDom(block).childNodes[0]; + assertSimpleField(resultFieldDom, 'NUMBER', '97'); + delete Blockly.Blocks['field_number_test_block']; + }); + test('Text Input', function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "field_text_input_test_block", + "message0": "%1", + "args0": [ + { + "type": "field_input", + "name": "TEXT", + "text": "default" + } + ], + }]); + var block = new Blockly.Block(this.workspace, + 'field_text_input_test_block'); + var resultFieldDom = Blockly.Xml.blockToDom(block).childNodes[0]; + assertSimpleField(resultFieldDom, 'TEXT', 'default'); + }); + suite('Variable Fields', function() { + setup(function() { + Blockly.defineBlocksWithJsonArray([{ + 'type': 'field_variable_test_block', + 'message0': '%1', + 'args0': [ + { + 'type': 'field_variable', + 'name': 'VAR', + 'variable': 'item' + } + ] + }]); + }); + teardown(function() { + delete Blockly.Blocks['field_variable_test_block']; + }); + test('Variable Trivial', function() { + this.workspace.createVariable('name1', '', 'id1'); + var block = new Blockly.Block(this.workspace, + 'field_variable_test_block'); + block.inputList[0].fieldRow[0].setValue('id1'); + var resultFieldDom = Blockly.Xml.blockToDom(block).childNodes[0]; + assertVariableField(resultFieldDom, 'VAR', null, 'id1', 'name1'); + }); + test('Variable Typed', function() { + this.workspace.createVariable('name1', 'string', 'id1'); + var block = new Blockly.Block(this.workspace, + 'field_variable_test_block'); + block.inputList[0].fieldRow[0].setValue('id1'); + var resultFieldDom = Blockly.Xml.blockToDom(block).childNodes[0]; + assertVariableField(resultFieldDom, 'VAR', 'string', 'id1', 'name1'); + }); + test('Variable Default Case', function() { + var cacheGenUid = Blockly.utils.genUid; + Blockly.utils.genUid = function() { + return '1'; + }; + + try { + this.workspace.createVariable('name1'); + + Blockly.Events.disable(); + var block = new Blockly.Block(this.workspace, + 'field_variable_test_block'); + block.inputList[0].fieldRow[0].setValue('1'); + Blockly.Events.enable(); + + var resultFieldDom = Blockly.Xml.blockToDom(block).childNodes[0]; + // Expect type is null and ID is '1' since we don't specify type and ID. + assertVariableField(resultFieldDom, 'VAR', null, '1', 'name1'); + } finally { + Blockly.utils.genUid = cacheGenUid; + } + }); + }); + }); + suite('Comments', function() { + suite('Headless', function() { + setup(function() { + this.block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + ), this.workspace); + }); + test('Text', function() { + this.block.setCommentText('test text'); + var xml = Blockly.Xml.blockToDom(this.block); + var commentXml = xml.firstChild; + chai.assert.equal(commentXml.tagName, 'comment'); + chai.assert.equal(commentXml.innerHTML, 'test text'); + }); + test('No Text', function() { + var xml = Blockly.Xml.blockToDom(this.block); + chai.assert.isNull(xml.firstChild); + }); + test('Empty Text', function() { + this.block.setCommentText(''); + var xml = Blockly.Xml.blockToDom(this.block); + chai.assert.isNull(xml.firstChild); + }); + }); + suite('Rendered', function() { + setup(function() { + // Let the parent teardown dispose of it. + this.workspace = Blockly.inject('blocklyDiv', {comments: true}); + this.block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + ), this.workspace); + }); + test('Text', function() { + this.block.setCommentText('test text'); + var xml = Blockly.Xml.blockToDom(this.block); + var commentXml = xml.firstChild; + chai.assert.equal(commentXml.tagName, 'comment'); + chai.assert.equal(commentXml.innerHTML, 'test text'); + }); + test('No Text', function() { + var xml = Blockly.Xml.blockToDom(this.block); + chai.assert.isNull(xml.firstChild); + }); + test('Empty Text', function() { + this.block.setCommentText(''); + var xml = Blockly.Xml.blockToDom(this.block); + chai.assert.isNull(xml.firstChild); + }); + test('Size', function() { + this.block.setCommentText('test text'); + this.block.getCommentIcon().setBubbleSize(100, 200); + var xml = Blockly.Xml.blockToDom(this.block); + var commentXml = xml.firstChild; + chai.assert.equal(commentXml.tagName, 'comment'); + chai.assert.equal(commentXml.getAttribute('w'), 100); + chai.assert.equal(commentXml.getAttribute('h'), 200); + }); + test('Pinned True', function() { + this.block.setCommentText('test text'); + this.block.getCommentIcon().setVisible(true); + var xml = Blockly.Xml.blockToDom(this.block); + var commentXml = xml.firstChild; + chai.assert.equal(commentXml.tagName, 'comment'); + chai.assert.equal(commentXml.getAttribute('pinned'), 'true'); + }); + test('Pinned False', function() { + this.block.setCommentText('test text'); + var xml = Blockly.Xml.blockToDom(this.block); + var commentXml = xml.firstChild; + chai.assert.equal(commentXml.tagName, 'comment'); + chai.assert.equal(commentXml.getAttribute('pinned'), 'false'); + }); + }); + }); + }); + suite('Deserialization', function() { + setup(function() { + this.workspace = new Blockly.Workspace(); + }); + teardown(function() { + this.workspace.dispose(); + }); + suite('Dynamic Category Blocks', function() { + test('Untyped Variables', function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "variables_get", + "message0": "%1", + "args0": [ + { + "type": "field_variable", + "name": "VAR", + } + ] + }, + { + "type": "variables_set", + "message0": "%1 %2", + "args0": [ + { + "type": "field_variable", + "name": "VAR" + }, + { + "type": "input_value", + "name": "VALUE" + } + ] + }, + { + "type": "math_change", + "message0": "%1 %2", + "args0": [ + { + "type": "field_variable", + "name": "VAR", + }, + { + "type": "input_value", + "name": "DELTA", + "check": "Number" + } + ] + }, + { + "type": "math_number", + "message0": "%1", + "args0": [{ + "type": "field_number", + "name": "NUM", + "value": 0 + }], + "output": "Number" + }]); + + this.workspace.createVariable('name1', '', 'id1'); + var blocksArray = Blockly.Variables.flyoutCategoryBlocks(this.workspace); + try { + for (var i = 0, xml; (xml = blocksArray[i]); i++) { + Blockly.Xml.domToBlock(xml, this.workspace); + } + } finally { + delete Blockly.Blocks['variables_get']; + delete Blockly.Blocks['variables_set']; + delete Blockly.Blocks['math_change']; + delete Blockly.Blocks['math_number']; + } + }); + test('Typed Variables', function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "variables_get", + "message0": "%1", + "args0": [ + { + "type": "field_variable", + "name": "VAR", + } + ] + }, + { + "type": "variables_set", + "message0": "%1 %2", + "args0": [ + { + "type": "field_variable", + "name": "VAR" + }, + { + "type": "input_value", + "name": "VALUE" + } + ] + }, + { + "type": "math_change", + "message0": "%1 %2", + "args0": [ + { + "type": "field_variable", + "name": "VAR", + }, + { + "type": "input_value", + "name": "DELTA", + "check": "Number" + } + ] + }, + { + "type": "math_number", + "message0": "%1", + "args0": [{ + "type": "field_number", + "name": "NUM", + "value": 0 + }], + "output": "Number" + }]); + + this.workspace.createVariable('name1', 'String', 'id1'); + this.workspace.createVariable('name2', 'Number', 'id2'); + this.workspace.createVariable('name3', 'Colour', 'id3'); + var blocksArray = Blockly.VariablesDynamic + .flyoutCategoryBlocks(this.workspace); + try { + for (var i = 0, xml; (xml = blocksArray[i]); i++) { + Blockly.Xml.domToBlock(xml, this.workspace); + } + } finally { + delete Blockly.Blocks['variables_get']; + delete Blockly.Blocks['variables_set']; + delete Blockly.Blocks['math_change']; + delete Blockly.Blocks['math_number']; + } + }); + }); + suite('Comments', function() { + suite('Headless', function() { + test('Text', function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' test text' + + '' + ), this.workspace); + chai.assert.equal(block.getCommentText(), 'test text'); + }); + test('No Text', function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + '' + ), this.workspace); + chai.assert.equal(block.getCommentText(), ''); + }); + test('Size', function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' test text' + + '' + ), this.workspace); + chai.assert.deepEqual(block.commentModel.size, + {width: 100, height: 200}); + }); + test('Pinned True', function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' test text' + + '' + ), this.workspace); + chai.assert.isTrue(block.commentModel.pinned); + }); + test('Pinned False', function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' test text' + + '' + ), this.workspace); + chai.assert.isFalse(block.commentModel.pinned); + }); + test('Pinned Undefined', function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' test text' + + '' + ), this.workspace); + chai.assert.isFalse(block.commentModel.pinned); + }); + }); + suite('Rendered', function() { + setup(function() { + // Let the parent teardown dispose of it. + this.workspace = Blockly.inject('blocklyDiv', {comments: true}); + }); + test('Text', function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' test text' + + '' + ), this.workspace); + chai.assert.equal(block.getCommentText(), 'test text'); + chai.assert.isNotNull(block.getCommentIcon()); + }); + test('No Text', function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' ' + + '' + ), this.workspace); + chai.assert.equal(block.getCommentText(), ''); + chai.assert.isNotNull(block.getCommentIcon()); + }); + test('Size', function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' test text' + + '' + ), this.workspace); + chai.assert.deepEqual(block.commentModel.size, + {width: 100, height: 200}); + chai.assert.isNotNull(block.getCommentIcon()); + chai.assert.deepEqual(block.getCommentIcon().getBubbleSize(), + {width: 100, height: 200}); + }); + suite('Pinned', function() { + setup(function() { + this.clock = sinon.useFakeTimers(); + }); + teardown(function() { + this.clock.restore(); + }); + test('Pinned True', function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' test text' + + '' + ), this.workspace); + this.clock.tick(1); + chai.assert.isTrue(block.commentModel.pinned); + chai.assert.isNotNull(block.getCommentIcon()); + chai.assert.isTrue(block.getCommentIcon().isVisible()); + }); + test('Pinned False', function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' test text' + + '' + ), this.workspace); + this.clock.tick(1); + chai.assert.isFalse(block.commentModel.pinned); + chai.assert.isNotNull(block.getCommentIcon()); + chai.assert.isFalse(block.getCommentIcon().isVisible()); + }); + test('Pinned Undefined', function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + + ' test text' + + '' + ), this.workspace); + this.clock.tick(1); + chai.assert.isFalse(block.commentModel.pinned); + chai.assert.isNotNull(block.getCommentIcon()); + chai.assert.isFalse(block.getCommentIcon().isVisible()); + }); + }); + }); + }); + }); + suite('Round Tripping', function() { + setup(function() { + var options = { + comments: true + }; + this.renderedWorkspace = Blockly.inject('blocklyDiv', options); + this.headlessWorkspace = + new Blockly.Workspace(new Blockly.Options(options)); + }); + teardown(function() { + this.renderedWorkspace.dispose(); + this.headlessWorkspace.dispose(); + }); + suite('Rendered -> XML -> Headless -> XML', function() { + setup(function() { + this.assertRoundTrip = function() { + var renderedXml = Blockly.Xml.workspaceToDom(this.renderedWorkspace); + Blockly.Xml.domToWorkspace(renderedXml, this.headlessWorkspace); + var headlessXml = Blockly.Xml.workspaceToDom(this.headlessWorkspace); + + var renderedText = Blockly.Xml.domToText(renderedXml); + var headlessText = Blockly.Xml.domToText(headlessXml); + + chai.assert.equal(headlessText, renderedText); + }; + }); + test('Comment', function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + ), this.renderedWorkspace); + block.setCommentText('test text'); + block.getCommentIcon().setBubbleSize(100, 100); + block.getCommentIcon().setVisible(true); + + this.assertRoundTrip(); + }); + }); + suite('Headless -> XML -> Rendered -> XML', function() { + setup(function() { + this.assertRoundTrip = function() { + var headlessXml = Blockly.Xml.workspaceToDom(this.headlessWorkspace); + Blockly.Xml.domToWorkspace(headlessXml, this.renderedWorkspace); + var renderedXml = Blockly.Xml.workspaceToDom(this.renderedWorkspace); + + var renderedText = Blockly.Xml.domToText(renderedXml); + var headlessText = Blockly.Xml.domToText(headlessXml); + + chai.assert.equal(renderedText, headlessText); + }; + }); + test('Comment', function() { + var block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + ), this.headlessWorkspace); + block.setCommentText('test text'); + block.commentModel.size = new Blockly.utils.Size(100, 100); + block.commentModel.pinned = true; + + this.assertRoundTrip(); + }); + }); + }); +}); diff --git a/js/tests/multi_playground.html b/js/tests/multi_playground.html new file mode 100644 index 0000000..f9d2686 --- /dev/null +++ b/js/tests/multi_playground.html @@ -0,0 +1,477 @@ + + + + +Multi-toolbox Playground + + + + + + + + + + + + + + + +

    Blockly Multi Playground

    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    LTR, Vertical, StartRTL, Vertical, Start
    LTR, Vertical, EndRTL, Vertical, End
    LTR, Horizontal, StartRTL, Horizontal, Start
    LTR, Horizontal, EndRTL, Horizontal, End
    + + + + + + diff --git a/js/tests/node/.eslintrc.json b/js/tests/node/.eslintrc.json new file mode 100644 index 0000000..5021561 --- /dev/null +++ b/js/tests/node/.eslintrc.json @@ -0,0 +1,14 @@ +{ + "parserOptions": { + "ecmaVersion": 6 + }, + "env": { + "browser": false, + "mocha": true + }, + "globals": { + "console": true, + "require": true + }, + "extends": "../../.eslintrc.json" +} diff --git a/js/tests/node/mocha.opts b/js/tests/node/mocha.opts new file mode 100644 index 0000000..240bd16 --- /dev/null +++ b/js/tests/node/mocha.opts @@ -0,0 +1,3 @@ +# mocha.opts +--ui tdd +--reporter landing diff --git a/js/tests/node/run_node_test.js b/js/tests/node/run_node_test.js new file mode 100644 index 0000000..2c38903 --- /dev/null +++ b/js/tests/node/run_node_test.js @@ -0,0 +1,68 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Mocha tests that test Blockly in Node. + */ + +var assert = require('chai').assert; +var Blockly = require('../../dist/'); + +var xmlText = '\n' + +' \n' + +' \n' + +' \n' + +' Hello from Blockly!\n' + +' \n' + +' \n' + +' \n' + +''; + +suite('Test Node.js', function() { + test('Import XML', function() { + var xml = Blockly.Xml.textToDom(xmlText); + + // Create workspace and import the XML + var workspace = new Blockly.Workspace(); + Blockly.Xml.domToWorkspace(xml, workspace); + }); + test('Roundtrip XML', function() { + var xml = Blockly.Xml.textToDom(xmlText); + + var workspace = new Blockly.Workspace(); + Blockly.Xml.domToWorkspace(xml, workspace); + + var headlessXml = Blockly.Xml.workspaceToDom(workspace, true); + var headlessText = Blockly.Xml.domToPrettyText(headlessXml); + + assert.equal(headlessText, xmlText, 'equal'); + }); + test('Generate Code', function() { + var xml = Blockly.Xml.textToDom(xmlText); + + // Create workspace and import the XML + var workspace = new Blockly.Workspace(); + Blockly.Xml.domToWorkspace(xml, workspace); + + // Convert code + var code = Blockly.JavaScript.workspaceToCode(workspace); + + // Check output + assert.equal('window.alert(\'Hello from Blockly!\');', code.trim(), 'equal'); + }); +}); + diff --git a/js/tests/playground.html b/js/tests/playground.html new file mode 100644 index 0000000..3523caa --- /dev/null +++ b/js/tests/playground.html @@ -0,0 +1,1719 @@ + + + + +Blockly Playground + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

    Blockly Playground

    + +

    Show + - Hide

    + +
    + + + + +
    + +

    + +   + +
    + +   + +   + +   + +   + +
    + +

    + +

    + Stress test:   + + +

    +
      +
    • + + +
    • +
    • + + +
        +
      • +
      • + + +
      • +
      + + + + + + + + + + + + + + + + + diff --git a/js/tests/playgrounds/iframe.html b/js/tests/playgrounds/iframe.html new file mode 100644 index 0000000..9c57fbf --- /dev/null +++ b/js/tests/playgrounds/iframe.html @@ -0,0 +1,39 @@ + + + + +Blockly <iframe> Playground + + + + +

      Outer Frame

      + + +
      + +
      + +
      +
      +
      +

      Zelos Rendering

      + +
      +
      +

      PXT-Blockly Rendering

      + +
      +
      +
      + + + + + + \ No newline at end of file diff --git a/js/tests/rendering/zelos/pxtblockly.html b/js/tests/rendering/zelos/pxtblockly.html new file mode 100644 index 0000000..d3aa9df --- /dev/null +++ b/js/tests/rendering/zelos/pxtblockly.html @@ -0,0 +1,66 @@ + + + + + + + + + + +
      + + + + \ No newline at end of file diff --git a/js/tests/rendering/zelos/pxtblockly/index.html b/js/tests/rendering/zelos/pxtblockly/index.html new file mode 100644 index 0000000..6a53da0 --- /dev/null +++ b/js/tests/rendering/zelos/pxtblockly/index.html @@ -0,0 +1,166 @@ + + + + + + + + + + + + Scratch-Blocks + +
      +
      +
      +

      Zelos Rendering

      +
      +
      +

      PXT-Blockly Rendering

      +
      +
      +
      +
      + +
      +
      + +
      +
      +
      +
      +
      +

      Zelos Rendering

      + +
      +
      +

      PXT-Blockly Rendering

      + +
      +
      +
      +
      + + + + + \ No newline at end of file diff --git a/js/tests/rendering/zelos/pxtblockly/pxtblockly.html b/js/tests/rendering/zelos/pxtblockly/pxtblockly.html new file mode 100644 index 0000000..8ee2e95 --- /dev/null +++ b/js/tests/rendering/zelos/pxtblockly/pxtblockly.html @@ -0,0 +1,68 @@ + + + + + + + + + + +
      + + + + \ No newline at end of file diff --git a/js/tests/rendering/zelos/pxtblockly/zelos.html b/js/tests/rendering/zelos/pxtblockly/zelos.html new file mode 100644 index 0000000..6d00f75 --- /dev/null +++ b/js/tests/rendering/zelos/pxtblockly/zelos.html @@ -0,0 +1,102 @@ + + + + + + + + + + + + +
      + + + + \ No newline at end of file diff --git a/js/tests/rendering/zelos/scratchblocks/index.html b/js/tests/rendering/zelos/scratchblocks/index.html new file mode 100644 index 0000000..9814d5e --- /dev/null +++ b/js/tests/rendering/zelos/scratchblocks/index.html @@ -0,0 +1,166 @@ + + + + + + + + + + + PXT-Blockly + +
      +
      +
      +

      Zelos Rendering

      +
      +
      +

      Scratch-Blocks Rendering

      +
      +
      +
      +
      + +
      +
      + +
      +
      +
      +
      +
      +

      Zelos Rendering

      + +
      +
      +

      Scratch-Blocks Rendering

      + +
      +
      +
      +
      + + + + + \ No newline at end of file diff --git a/js/tests/rendering/zelos/scratchblocks/scratchblocks.html b/js/tests/rendering/zelos/scratchblocks/scratchblocks.html new file mode 100644 index 0000000..8011230 --- /dev/null +++ b/js/tests/rendering/zelos/scratchblocks/scratchblocks.html @@ -0,0 +1,70 @@ + + + + + + + + + + +
      + + + + \ No newline at end of file diff --git a/js/tests/rendering/zelos/scratchblocks/zelos.html b/js/tests/rendering/zelos/scratchblocks/zelos.html new file mode 100644 index 0000000..3cc6810 --- /dev/null +++ b/js/tests/rendering/zelos/scratchblocks/zelos.html @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + +
      + + + + \ No newline at end of file diff --git a/js/tests/rendering/zelos/zelos.html b/js/tests/rendering/zelos/zelos.html new file mode 100644 index 0000000..af239c8 --- /dev/null +++ b/js/tests/rendering/zelos/zelos.html @@ -0,0 +1,102 @@ + + + + + + + + + + + + +
      + + + + \ No newline at end of file diff --git a/js/tests/run_all_tests.sh b/js/tests/run_all_tests.sh new file mode 100644 index 0000000..dffd9d1 --- /dev/null +++ b/js/tests/run_all_tests.sh @@ -0,0 +1,89 @@ +#!/bin/bash + +if [ ! -z $TRAVIS ]; then echo "Executing run_all_tests.sh from $(pwd)"; fi + +# ANSI colors +BOLD_GREEN='\033[1;32m' +BOLD_RED='\033[1;31m' +ANSI_RESET='\033[0m' + +travis_fold () { + local startOrEnd=$1 # Either "start" or "end" + local id=$2 # The fold id. No spaces. + + if [ ! -z $TRAVIS ]; then + echo "travis_fold:$startOrEnd:$id" + fi +} + +# Find the Blockly project root if pwd is the root +# or if pwd is the directory containing this script. +if [ -f ./run_all_tests.js ]; then + BLOCKLY_ROOT=".." +elif [ -f tests/run_all_tests.sh ]; then + BLOCKLY_ROOT="." +else + echo -e "${BOLD_RED}ERROR: Cannot determine BLOCKLY_ROOT${ANSI_RESET}" 1>&2; + exit 1 +fi +pushd $BLOCKLY_ROOT +echo "pwd: $(pwd)" + +FAILURE_COUNT=0 + +run_test_command () { + local test_id=$1 # The id to use for folds and similar. No spaces. + local command=$2 # The command to run. + + echo "=======================================" + echo "== $test_id" + travis_fold start $test_id + $command + local test_result=$? + travis_fold end $test_id + if [ $test_result -eq 0 ]; then + echo -e "${BOLD_GREEN}SUCCESS:${ANSI_RESET} ${test_id}" + else + echo -e "${BOLD_RED}FAILED:${ANSI_RESET} ${test_id}" + FAILURE_COUNT=$((FAILURE_COUNT+1)) + fi +} + +# Lint the codebase. +run_test_command "eslint" "eslint ." + +# Run JSUnit tests inside a browser. +run_test_command "jsunit" "node tests/jsunit/run_jsunit_tests_in_browser.js" + +# Run Mocha tests inside a browser. +run_test_command "mocha" "node tests/mocha/run_mocha_tests_in_browser.js" + +# Run Node tests. +run_test_command "node" "./node_modules/.bin/mocha tests/node --opts tests/node/mocha.opts" + +# Run generator tests inside a browser and check the results. +run_test_command "generators" "tests/scripts/run_generators.sh" + +# Run the closure compiler ensuring there are no errors. +run_test_command "compile" "npm run build:debug" + +# Generate TypeScript typings and ensure there are no errors. +run_test_command "typings" "tests/scripts/compile_typings.sh" + +# Check the sizes of built files for unexpected growth. +run_test_command "metadata" "tests/scripts/check_metadata.sh" + +# # Attempt advanced compilation of a Blockly app. +# run_test_command "advanced_compile" "tests/compile/compile.sh" + + +# End of tests. +popd +echo "=======================================" +if [ "$FAILURE_COUNT" -eq "0" ]; then + echo -e "${BOLD_GREEN}All tests passed.${ANSI_RESET}" + exit 0 +else + echo -e "${BOLD_RED}Failures in ${FAILURE_COUNT} test groups.${ANSI_RESET}" + exit 1 +fi diff --git a/js/tests/screenshot/diff-reporter.js b/js/tests/screenshot/diff-reporter.js new file mode 100644 index 0000000..b8abced --- /dev/null +++ b/js/tests/screenshot/diff-reporter.js @@ -0,0 +1,161 @@ +// diff-reporter.js + +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Reporter that prints results to the console with the same + * format as the spec reporter, but also saves a test_output.js file with a + * variable that just wraps a json object, for use in diff_viewer.html. + */ +var mocha = require('mocha'); +var fs = require("fs"); +module.exports = DiffReporter; + + +function DiffReporter(runner) { + mocha.reporters.Base.call(this, runner); + var passes = 0; + var failures = 0; + + // Values for the JSON output. + var json_tests = []; + + // From the spec reporter. + var self = this; + var indents = 0; + var n = 0; + var colours = { + pass: 32, + fail: 31, + 'bright pass': 92, + 'bright fail': 91, + 'bright yellow': 93, + pending: 36, + suite: 0, + 'error title': 0, + 'error message': 31, + 'error stack': 90, + checkmark: 32, + fast: 90, + medium: 33, + slow: 31, + green: 32, + light: 90, + 'diff gutter': 90, + 'diff added': 32, + 'diff removed': 31 + }; + + var symbols = { + ok: '✓', + err: '✖', + dot: '․', + comma: ',', + bang: '!' + }; + + /** + * colour `str` with the given `type`, + * allowing colours to be disabled, + * as well as user-defined colour + * schemes. + * + * @private + * @param {string} type + * @param {string} str + * @return {string} + */ + var colour = function(type, str) { + if (!colours) { + return String(str); + } + return '\u001b[' + colours[type] + 'm' + str + '\u001b[0m'; + }; + + function indent() { + return Array(indents).join(' '); + } + + // Indent/unindent correctly. + runner.on('start', function() { + console.log(); + }); + runner.on('suite', function(suite) { + ++indents; + console.log(colour('suite', '%s%s'), indent(), suite.title); + }); + runner.on('suite end', function() { + --indents; + if (indents === 1) { + console.log(); + } + }); + runner.on('pass', function(test) { + passes++; + json_tests.push(test); + var logStr = + indent() + + colour('checkmark', ' ' + symbols.ok) + + colour('pass', ' ' + test.title); + console.log(logStr); + }); + + runner.on('fail', function(test, err) { + failures++; + json_tests.push(test); + // Print test information the way the spec reporter would. + console.log(indent() + colour('fail', ' %d) %s'), ++n, test.title); + }); + + runner.on('end', function() { + console.log('\n%d/%d tests passed\n', passes, passes + failures); + var jsonObj = { + passes: passes, + failures: failures, + total: passes + failures, + tests: json_tests.map(clean) + } + runner.testResults = jsonObj; + + let json = JSON.stringify(jsonObj, null, 2) + let jsonOutput = writeJSON(json, 'test_output') + }); + + + function clean(test) { + return { + title: test.title, + fullTitle: test.fullTitle(), + state: test.state + }; + } + + function writeJSON(data, filename){ + let output_dir = `${process.cwd()}/tests/screenshot/outputs` + let output= `${output_dir}/${filename}` + + if (!fs.existsSync(output_dir)){ + fs.mkdirSync(output_dir); + } + fs.writeFileSync(output + '.json', data) + + fs.writeFileSync(output + '.js', 'var results = ' + data); + return output + } +} +mocha.utils.inherits(DiffReporter, mocha.reporters.Spec); diff --git a/js/tests/screenshot/diff_screenshots.js b/js/tests/screenshot/diff_screenshots.js new file mode 100644 index 0000000..512f34a --- /dev/null +++ b/js/tests/screenshot/diff_screenshots.js @@ -0,0 +1,83 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Mocha tests that diff images and save the diffs as artifacts. + */ + +var chai = require('chai'); +var fs = require('fs'), + PNG = require('pngjs').PNG, + pixelmatch = require('pixelmatch'); + +var old_dir = 'tests/screenshot/outputs/old/'; +var new_dir = 'tests/screenshot/outputs/new/'; +var diff_dir = 'tests/screenshot/outputs/diff/'; +var test_list_location ='tests/screenshot/test_cases/test_cases.json'; + +if (!fs.existsSync(diff_dir)){ + fs.mkdirSync(diff_dir); +} + +function getTestList() { + var file = fs.readFileSync(test_list_location); + var json = JSON.parse(file); + var testSpecArr = json.tests; + var testList = []; + for (var i = 0, testSpec; testSpec = testSpecArr[i]; i++) { + if (!testSpec.skip) { + testList.push(testSpec.title); + } + } + return testList; +} + +var test_list = getTestList(); + +suite('Rendering', function() { + /** + * - Load the old and new files as PNGs + * - Diff the files + * - Assert that the files are the same + * - Save the visual diff to a file. + */ + function diffScreenshots(name) { + + var file1 = fs.readFileSync(old_dir + name + '.png'); + var img1 = PNG.sync.read(file1); + + var file2 = fs.readFileSync(new_dir + name + '.png'); + var img2 = PNG.sync.read(file2); + + var diff = new PNG({width: img1.width, height: img1.height}); + + var mismatch_num = pixelmatch( + img1.data, + img2.data, + diff.data, + img1.width, + img1.height, {threshold: 0.1}); + diff.pack().pipe(fs.createWriteStream(diff_dir + name + '.png')); + chai.assert.equal(mismatch_num, 0); + } + + test_list.forEach(function(testName) { + test(testName, function() { + diffScreenshots(testName); + }) + }); +}); diff --git a/js/tests/screenshot/diff_viewer.html b/js/tests/screenshot/diff_viewer.html new file mode 100644 index 0000000..2c907c8 --- /dev/null +++ b/js/tests/screenshot/diff_viewer.html @@ -0,0 +1,129 @@ + + + + + +Diff Viewer + + + + + + +
      + + + + + + + + + + diff --git a/js/tests/screenshot/gen_screenshots.js b/js/tests/screenshot/gen_screenshots.js new file mode 100644 index 0000000..fc938ea --- /dev/null +++ b/js/tests/screenshot/gen_screenshots.js @@ -0,0 +1,189 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Node.js script to generate screenshots in Chrome, via webdriver. + */ +var webdriverio = require('webdriverio'); +var fs = require('fs'); + +module.exports = genScreenshots; + +var isCollapsed = false; +var filterText = ''; +var isInsertionMarker = false; +var isRtl = false; +var inlineInputs = false; +var externalInputs = false; + +function processArgs() { + var args = process.argv; + for (var i = 0; i < args.length; i++) { + var arg = args[i]; + if (arg === '--collapsed') { + isCollapsed = true; + } else if (arg === '--name') { + filterText = args[i + 1]; + } else if (arg === '--insertionMarker') { + isInsertionMarker = true; + } else if (arg === '--rtl') { + isRtl = true; + } else if (arg === '--inlineInputs') { + inlineInputs = true + } else if (arg === '--externalInputs') { + externalInputs = true + } + } +} + +function checkAndCreateDir(dirname) { + if (!fs.existsSync(dirname)){ + fs.mkdirSync(dirname); + } +}; + +/** + * Opens two different webdriverio browsers. One uses the hosted version of + * blockly_compressed.js; the other uses the local blockly_uncompressed.js. + * + * Each playground is a minimal Blockly instance. This loads the same XML in + * both playgrounds and saves a screenshot of each. + */ +async function genScreenshots() { + var output_url = 'tests/screenshot/outputs' + processArgs(); + checkAndCreateDir(output_url) + checkAndCreateDir(output_url + '/old'); + checkAndCreateDir(output_url + '/new'); + + var url_prefix = 'file://' + __dirname + '/playground'; + var browser_new = await buildBrowser(url_prefix + '_new.html', isRtl); + var browser_old = await buildBrowser(url_prefix + '_old.html', isRtl); + var test_list = getTestList(); + for (var i = 0, testName; testName = test_list[i]; i++) { + await genSingleScreenshot(browser_new, 'new', testName, isCollapsed, isInsertionMarker, inlineInputs, externalInputs); + if (!fs.existsSync(output_url + '/old/' + testName)) { + await genSingleScreenshot(browser_old, 'old', testName, isCollapsed, isInsertionMarker, inlineInputs, externalInputs); + } + } + + await cleanUp(browser_new, browser_old); + return 0; +} + +function getTestList() { + var file = fs.readFileSync('tests/screenshot/test_cases/test_cases.json'); + var json = JSON.parse(file); + var testSpecArr = json.tests; + var testList = []; + for (var i = 0, testSpec; testSpec = testSpecArr[i]; i++) { + if (!testSpec.skip && testSpec.title.includes(filterText)) { + testList.push(testSpec.title); + } + } + return testList; +} + +async function cleanUp(browser_new, browser_old) { + await browser_new.deleteSession(); + await browser_old.deleteSession(); +} + +async function buildBrowser(url, isRtl) { + var options = { + capabilities: { + browserName: 'chrome' + }, + logLevel: 'warn' + }; + // Run in headless mode on Travis. + if (process.env.TRAVIS_CI) { + options.capabilities['goog:chromeOptions'] = { + args: ['--headless', '--no-sandbox', '--disable-dev-shm-usage'] + }; + } + console.log('Starting webdriverio...'); + const browser = await webdriverio.remote(options); + var injectBlockly = function(isRtl) { + workspace = Blockly.inject('blocklyDiv', + { + comments: true, + collapse: true, + disable: true, + + horizontalLayout: false, + maxBlocks: Infinity, + maxInstances: {'test_basic_limit_instances': 3}, + media: '../../media/', + oneBasedIndex: true, + readOnly: false, + rtl: isRtl, + move: { + scrollbars: false, + drag: true, + wheel: false, + }, + toolboxPosition: 'start', + zoom: + { + controls: false, + wheel: true, + startScale: 2.0, + maxScale: 4, + minScale: 0.25, + scaleSpeed: 1.1 + } + }); + } + + await browser.setWindowSize(500, 500); + console.log('Initialized.\nLoading url: ' + url); + await browser.url(url); + await browser.execute(injectBlockly, isRtl); + return browser; +} + +async function genSingleScreenshot(browser, dir, test_name, isCollapsed, isInsertionMarker, inlineInputs, externalInputs) { + var prefix = './tests/screenshot/'; + var xml_url = prefix + 'test_cases/' + test_name; + var xml = fs.readFileSync(xml_url, 'utf8'); + + var loadXmlFn = function(xml_text, isCollapsed, isInsertionMarker, inlineInputs, externalInputs) { + workspace.clear(); + var xml = Blockly.Xml.textToDom(xml_text); + Blockly.Xml.domToWorkspace(xml, workspace); + if (isCollapsed || isInsertionMarker || inlineInputs || externalInputs) { + var blocks = workspace.getAllBlocks(false); + for (var i = 0, block; block = blocks[i]; i++) { + block.setCollapsed(isCollapsed); + block.setInsertionMarker(isInsertionMarker); + if (inlineInputs) { + block.setInputsInline(true); + } else if (externalInputs) { + block.setInputsInline(false); + } + } + } + }; + await browser.execute(loadXmlFn, xml, isCollapsed, isInsertionMarker, inlineInputs, externalInputs); + await browser.saveScreenshot(prefix + '/outputs/' + dir + '/' + test_name + '.png'); +} + + +if (require.main === module) { + genScreenshots(); +} diff --git a/js/tests/screenshot/img_viewer.html b/js/tests/screenshot/img_viewer.html new file mode 100644 index 0000000..366fdb2 --- /dev/null +++ b/js/tests/screenshot/img_viewer.html @@ -0,0 +1,76 @@ + + + + + + Image comparison + + + + + + + + +

      +
      + + diff --git a/js/tests/screenshot/playground_new.html b/js/tests/screenshot/playground_new.html new file mode 100644 index 0000000..f6a4bdc --- /dev/null +++ b/js/tests/screenshot/playground_new.html @@ -0,0 +1,105 @@ + + + + + +Blockly Playground: New rendering + + + + + + + + + + + + + + + + + +
      + + diff --git a/js/tests/screenshot/playground_old.html b/js/tests/screenshot/playground_old.html new file mode 100644 index 0000000..131cc11 --- /dev/null +++ b/js/tests/screenshot/playground_old.html @@ -0,0 +1,66 @@ + + + + + +Blockly Playground: Old rendering + + + + + + + + + + + + + + + + + +
      + + diff --git a/js/tests/screenshot/run_differ.py b/js/tests/screenshot/run_differ.py new file mode 100644 index 0000000..efc6999 --- /dev/null +++ b/js/tests/screenshot/run_differ.py @@ -0,0 +1,121 @@ +#!/usr/bin/python2.7 +# +# Copyright 2019 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Usage: +# run_differ.py with no parameters runs all screenshot tests with blocks in rtl +# and not collapsed. +# --name runs all tests that contain the given name. If not given, +# runs all tests specified in test_cases.json. +# --collapsed runs all tests with the blocks collapsed. If not given, blocks are +# expanded. +# --insertionMarker runs all tests with the blocks set as insertion markers. If +# not given then will default to normal blocks. +# --inlineInputs runs all tests with the blocks set to have inline inputs. If +# not given then the blocks will be in their default state. +# --externalInputs runs all tests with the with all blocks set to have external +# inputs. If not given then the blocks will be in their default state. +# + +import os, errno, platform, shutil, sys + +NAME_ARG = "--name" +COLLAPSE_ARG = "--collapsed" +RTL_ARG = "--rtl" +INSERTION_ARG = "--insertionMarker" +INLINE_INPUTS_ARG = "--inlineInputs" +EXTERNAL_INPUTS_ARG = "--externalInputs" + +ARG_VALS = [COLLAPSE_ARG, RTL_ARG, INSERTION_ARG, INLINE_INPUTS_ARG, EXTERNAL_INPUTS_ARG] + +# Generates the screenshots according to the given parameters, diffs the +# screenshots and then displays them. +def main(): + cleanup() + check_arguments() + filter_text = find_argument_value(NAME_ARG) + argument_string = create_arg_string() + gen_screenshots(filter_text, argument_string) + diff_screenshots(filter_text) + display_screenshots() + +# Cleans up any files left over from running the script previously. +def cleanup(): + remove_dir("tests/screenshot/outputs/new") + remove_dir("tests/screenshot/outputs/diff") + remove_file("tests/screenshot/outputs/test_output.js") + remove_file("tests/screenshot/outputs/test_output.json") + +# If the --name is given find the name of the test case. +def find_argument_value(argument_name): + args = sys.argv + for i in range(len(args)): + if args[i] == argument_name: + if i + 1 < len(args): + return args[i+1] + else: + print ("Must supply a name after name arg") + sys.exit() + return "" + +# Prints an error and exits if the arguments given aren't allowed. +def check_arguments(): + if (INLINE_INPUTS_ARG in sys.argv) and (EXTERNAL_INPUTS_ARG in sys.argv): + print ("Can not have both --inlineInputs and --externalInputs") + sys.exit() + +# Create a string with all arguments. +def create_arg_string(): + arg_string = "" + for arg in sys.argv: + arg_string = arg_string + " " + arg + return arg_string + +# Generates a set of old and new screenshots according to the given parameters. +def gen_screenshots(filter_text, argument_string): + os.system("node tests/screenshot/gen_screenshots.js " + argument_string) + +# Diffs the old and new screenshots that were created in gen_screenshots. +def diff_screenshots(filter_text): + if filter_text != "": + os.system("./node_modules/.bin/mocha tests/screenshot/diff_screenshots.js --ui tdd --reporter ./tests/screenshot/diff-reporter.js" + " --fgrep " + filter_text) + else: + os.system("./node_modules/.bin/mocha tests/screenshot/diff_screenshots.js --ui tdd --reporter ./tests/screenshot/diff-reporter.js") + +# Displays the old screenshots, new screenshots, and the diff of them. +def display_screenshots(): + if (platform.system() == "Linux"): + os.system("xdg-open tests/screenshot/diff_viewer.html") + elif (platform.system() == 'Darwin'): + os.system("open tests/screenshot/diff_viewer.html") + +# Removes a file and catches the error if the file does not exist. +def remove_file(filename): + try: + os.remove(filename) + except (OSError) as e: + if e.errno != errno.ENOENT: + raise + +# Removes a directory and catches the error if the directory does not exist. +def remove_dir(dir_name): + try: + shutil.rmtree(dir_name) + except (OSError) as e: + if e.errno != errno.ENOENT: + raise + +if __name__ == "__main__": + main() diff --git a/js/tests/screenshot/test_cases/colour_blend b/js/tests/screenshot/test_cases/colour_blend new file mode 100644 index 0000000..872c881 --- /dev/null +++ b/js/tests/screenshot/test_cases/colour_blend @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/colour_picker b/js/tests/screenshot/test_cases/colour_picker new file mode 100644 index 0000000..bd24b9a --- /dev/null +++ b/js/tests/screenshot/test_cases/colour_picker @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/colour_random b/js/tests/screenshot/test_cases/colour_random new file mode 100644 index 0000000..ce294d9 --- /dev/null +++ b/js/tests/screenshot/test_cases/colour_random @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/colour_rgb b/js/tests/screenshot/test_cases/colour_rgb new file mode 100644 index 0000000..29b3ded --- /dev/null +++ b/js/tests/screenshot/test_cases/colour_rgb @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/controls_flow_statements b/js/tests/screenshot/test_cases/controls_flow_statements new file mode 100644 index 0000000..efe9883 --- /dev/null +++ b/js/tests/screenshot/test_cases/controls_flow_statements @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/controls_for b/js/tests/screenshot/test_cases/controls_for new file mode 100644 index 0000000..3604aeb --- /dev/null +++ b/js/tests/screenshot/test_cases/controls_for @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/controls_forEach b/js/tests/screenshot/test_cases/controls_forEach new file mode 100644 index 0000000..24dc917 --- /dev/null +++ b/js/tests/screenshot/test_cases/controls_forEach @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/controls_if b/js/tests/screenshot/test_cases/controls_if new file mode 100644 index 0000000..83e3747 --- /dev/null +++ b/js/tests/screenshot/test_cases/controls_if @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/controls_if_else b/js/tests/screenshot/test_cases/controls_if_else new file mode 100644 index 0000000..9044338 --- /dev/null +++ b/js/tests/screenshot/test_cases/controls_if_else @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/controls_if_elseif b/js/tests/screenshot/test_cases/controls_if_elseif new file mode 100644 index 0000000..d6988f2 --- /dev/null +++ b/js/tests/screenshot/test_cases/controls_if_elseif @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/controls_if_if b/js/tests/screenshot/test_cases/controls_if_if new file mode 100644 index 0000000..c297774 --- /dev/null +++ b/js/tests/screenshot/test_cases/controls_if_if @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/controls_ifelse b/js/tests/screenshot/test_cases/controls_ifelse new file mode 100644 index 0000000..a648344 --- /dev/null +++ b/js/tests/screenshot/test_cases/controls_ifelse @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/controls_repeat b/js/tests/screenshot/test_cases/controls_repeat new file mode 100644 index 0000000..c918fb7 --- /dev/null +++ b/js/tests/screenshot/test_cases/controls_repeat @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/controls_repeat_ext b/js/tests/screenshot/test_cases/controls_repeat_ext new file mode 100644 index 0000000..c0b57c8 --- /dev/null +++ b/js/tests/screenshot/test_cases/controls_repeat_ext @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/controls_whileUntil b/js/tests/screenshot/test_cases/controls_whileUntil new file mode 100644 index 0000000..0e34235 --- /dev/null +++ b/js/tests/screenshot/test_cases/controls_whileUntil @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/lists_create_empty b/js/tests/screenshot/test_cases/lists_create_empty new file mode 100644 index 0000000..fc6dcac --- /dev/null +++ b/js/tests/screenshot/test_cases/lists_create_empty @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/lists_create_with b/js/tests/screenshot/test_cases/lists_create_with new file mode 100644 index 0000000..7e3cb96 --- /dev/null +++ b/js/tests/screenshot/test_cases/lists_create_with @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/lists_create_with_container b/js/tests/screenshot/test_cases/lists_create_with_container new file mode 100644 index 0000000..b886158 --- /dev/null +++ b/js/tests/screenshot/test_cases/lists_create_with_container @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/lists_create_with_item b/js/tests/screenshot/test_cases/lists_create_with_item new file mode 100644 index 0000000..c92762f --- /dev/null +++ b/js/tests/screenshot/test_cases/lists_create_with_item @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/lists_getIndex b/js/tests/screenshot/test_cases/lists_getIndex new file mode 100644 index 0000000..d069e04 --- /dev/null +++ b/js/tests/screenshot/test_cases/lists_getIndex @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/lists_getSublist b/js/tests/screenshot/test_cases/lists_getSublist new file mode 100644 index 0000000..f967bc9 --- /dev/null +++ b/js/tests/screenshot/test_cases/lists_getSublist @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/lists_indexOf b/js/tests/screenshot/test_cases/lists_indexOf new file mode 100644 index 0000000..1d3f16f --- /dev/null +++ b/js/tests/screenshot/test_cases/lists_indexOf @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/lists_isEmpty b/js/tests/screenshot/test_cases/lists_isEmpty new file mode 100644 index 0000000..fabbd96 --- /dev/null +++ b/js/tests/screenshot/test_cases/lists_isEmpty @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/lists_length b/js/tests/screenshot/test_cases/lists_length new file mode 100644 index 0000000..4c6aa2b --- /dev/null +++ b/js/tests/screenshot/test_cases/lists_length @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/lists_repeat b/js/tests/screenshot/test_cases/lists_repeat new file mode 100644 index 0000000..20db6be --- /dev/null +++ b/js/tests/screenshot/test_cases/lists_repeat @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/lists_reverse b/js/tests/screenshot/test_cases/lists_reverse new file mode 100644 index 0000000..6269dc2 --- /dev/null +++ b/js/tests/screenshot/test_cases/lists_reverse @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/lists_setIndex b/js/tests/screenshot/test_cases/lists_setIndex new file mode 100644 index 0000000..e50b687 --- /dev/null +++ b/js/tests/screenshot/test_cases/lists_setIndex @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/lists_sort b/js/tests/screenshot/test_cases/lists_sort new file mode 100644 index 0000000..98dd4bd --- /dev/null +++ b/js/tests/screenshot/test_cases/lists_sort @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/lists_split b/js/tests/screenshot/test_cases/lists_split new file mode 100644 index 0000000..d1a5c9f --- /dev/null +++ b/js/tests/screenshot/test_cases/lists_split @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/logic_boolean b/js/tests/screenshot/test_cases/logic_boolean new file mode 100644 index 0000000..d10c00f --- /dev/null +++ b/js/tests/screenshot/test_cases/logic_boolean @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/logic_compare b/js/tests/screenshot/test_cases/logic_compare new file mode 100644 index 0000000..014b9a9 --- /dev/null +++ b/js/tests/screenshot/test_cases/logic_compare @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/logic_negate b/js/tests/screenshot/test_cases/logic_negate new file mode 100644 index 0000000..648885c --- /dev/null +++ b/js/tests/screenshot/test_cases/logic_negate @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/logic_null b/js/tests/screenshot/test_cases/logic_null new file mode 100644 index 0000000..ffc322a --- /dev/null +++ b/js/tests/screenshot/test_cases/logic_null @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/logic_operation b/js/tests/screenshot/test_cases/logic_operation new file mode 100644 index 0000000..b02967d --- /dev/null +++ b/js/tests/screenshot/test_cases/logic_operation @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/logic_ternary b/js/tests/screenshot/test_cases/logic_ternary new file mode 100644 index 0000000..84f47e0 --- /dev/null +++ b/js/tests/screenshot/test_cases/logic_ternary @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/math_addition b/js/tests/screenshot/test_cases/math_addition new file mode 100644 index 0000000..0637ea1 --- /dev/null +++ b/js/tests/screenshot/test_cases/math_addition @@ -0,0 +1,15 @@ + + + ADD + + + 1 + + + + + 1 + + + + diff --git a/js/tests/screenshot/test_cases/math_arithmetic b/js/tests/screenshot/test_cases/math_arithmetic new file mode 100644 index 0000000..8317277 --- /dev/null +++ b/js/tests/screenshot/test_cases/math_arithmetic @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/math_atan2 b/js/tests/screenshot/test_cases/math_atan2 new file mode 100644 index 0000000..6d53e2b --- /dev/null +++ b/js/tests/screenshot/test_cases/math_atan2 @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/math_change b/js/tests/screenshot/test_cases/math_change new file mode 100644 index 0000000..90894f9 --- /dev/null +++ b/js/tests/screenshot/test_cases/math_change @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/math_constant b/js/tests/screenshot/test_cases/math_constant new file mode 100644 index 0000000..67a5687 --- /dev/null +++ b/js/tests/screenshot/test_cases/math_constant @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/math_constrain b/js/tests/screenshot/test_cases/math_constrain new file mode 100644 index 0000000..f98273b --- /dev/null +++ b/js/tests/screenshot/test_cases/math_constrain @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/math_modulo b/js/tests/screenshot/test_cases/math_modulo new file mode 100644 index 0000000..cbd1c5e --- /dev/null +++ b/js/tests/screenshot/test_cases/math_modulo @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/math_number b/js/tests/screenshot/test_cases/math_number new file mode 100644 index 0000000..6eb9a86 --- /dev/null +++ b/js/tests/screenshot/test_cases/math_number @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/math_number_property b/js/tests/screenshot/test_cases/math_number_property new file mode 100644 index 0000000..dea4718 --- /dev/null +++ b/js/tests/screenshot/test_cases/math_number_property @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/math_on_list b/js/tests/screenshot/test_cases/math_on_list new file mode 100644 index 0000000..ecdb664 --- /dev/null +++ b/js/tests/screenshot/test_cases/math_on_list @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/math_random_float b/js/tests/screenshot/test_cases/math_random_float new file mode 100644 index 0000000..f2ea40d --- /dev/null +++ b/js/tests/screenshot/test_cases/math_random_float @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/math_random_int b/js/tests/screenshot/test_cases/math_random_int new file mode 100644 index 0000000..d655f9b --- /dev/null +++ b/js/tests/screenshot/test_cases/math_random_int @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/math_round b/js/tests/screenshot/test_cases/math_round new file mode 100644 index 0000000..2811cc1 --- /dev/null +++ b/js/tests/screenshot/test_cases/math_round @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/math_single b/js/tests/screenshot/test_cases/math_single new file mode 100644 index 0000000..a9a4fba --- /dev/null +++ b/js/tests/screenshot/test_cases/math_single @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/math_subtraction b/js/tests/screenshot/test_cases/math_subtraction new file mode 100644 index 0000000..81d331d --- /dev/null +++ b/js/tests/screenshot/test_cases/math_subtraction @@ -0,0 +1,15 @@ + + + MINUS + + + 3 + + + + + 4 + + + + diff --git a/js/tests/screenshot/test_cases/math_trig b/js/tests/screenshot/test_cases/math_trig new file mode 100644 index 0000000..4be7fd3 --- /dev/null +++ b/js/tests/screenshot/test_cases/math_trig @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/multi_block_1 b/js/tests/screenshot/test_cases/multi_block_1 new file mode 100644 index 0000000..c094a75 --- /dev/null +++ b/js/tests/screenshot/test_cases/multi_block_1 @@ -0,0 +1,74 @@ + + + item + + + + + + + EQ + + + + + TRUE + + + + + + + EQ + + + MULTIPLY + + + -1 + + + + + 42 + + + + + + + + + + + + + 900 + + + + + + + item + + + f00 + + + + + item + + + bar + + + + + + + + + + diff --git a/js/tests/screenshot/test_cases/multi_block_logic b/js/tests/screenshot/test_cases/multi_block_logic new file mode 100644 index 0000000..89579f6 --- /dev/null +++ b/js/tests/screenshot/test_cases/multi_block_logic @@ -0,0 +1,34 @@ + + + EQ + + + + + TRUE + + + + + + + EQ + + + MULTIPLY + + + -1 + + + + + 42 + + + + + + + + diff --git a/js/tests/screenshot/test_cases/multi_colour_with_external b/js/tests/screenshot/test_cases/multi_colour_with_external new file mode 100644 index 0000000..58e2024 --- /dev/null +++ b/js/tests/screenshot/test_cases/multi_colour_with_external @@ -0,0 +1,44 @@ + + + + + 100 + + + + + 64 + + + + + 10 + + + + + + + 50 + + + + + 0 + + + ADD + + + 1 + + + + + 1 + + + + + + diff --git a/js/tests/screenshot/test_cases/multi_colour_with_internal b/js/tests/screenshot/test_cases/multi_colour_with_internal new file mode 100644 index 0000000..040128d --- /dev/null +++ b/js/tests/screenshot/test_cases/multi_colour_with_internal @@ -0,0 +1,44 @@ + + + + + 100 + + + + + 64 + + + + + 10 + + + + + + + 50 + + + + + 0 + + + ADD + + + 1 + + + + + 1 + + + + + + diff --git a/js/tests/screenshot/test_cases/multi_stack b/js/tests/screenshot/test_cases/multi_stack new file mode 100644 index 0000000..a56d786 --- /dev/null +++ b/js/tests/screenshot/test_cases/multi_stack @@ -0,0 +1,53 @@ + + + item + + + item + + + one + + + + + item + + + two + + + + + item + + + three + + + + + item + + + four + + + + + item + + + five + + + + + + + + + + + + diff --git a/js/tests/screenshot/test_cases/not_true b/js/tests/screenshot/test_cases/not_true new file mode 100644 index 0000000..b895595 --- /dev/null +++ b/js/tests/screenshot/test_cases/not_true @@ -0,0 +1,9 @@ + + + + + TRUE + + + + diff --git a/js/tests/screenshot/test_cases/procedures_callnoreturn b/js/tests/screenshot/test_cases/procedures_callnoreturn new file mode 100644 index 0000000..4e4939e --- /dev/null +++ b/js/tests/screenshot/test_cases/procedures_callnoreturn @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/procedures_callreturn b/js/tests/screenshot/test_cases/procedures_callreturn new file mode 100644 index 0000000..f0ae0a1 --- /dev/null +++ b/js/tests/screenshot/test_cases/procedures_callreturn @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/procedures_defnoreturn b/js/tests/screenshot/test_cases/procedures_defnoreturn new file mode 100644 index 0000000..4bdfa70 --- /dev/null +++ b/js/tests/screenshot/test_cases/procedures_defnoreturn @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/procedures_defreturn b/js/tests/screenshot/test_cases/procedures_defreturn new file mode 100644 index 0000000..7b73e32 --- /dev/null +++ b/js/tests/screenshot/test_cases/procedures_defreturn @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/procedures_ifreturn b/js/tests/screenshot/test_cases/procedures_ifreturn new file mode 100644 index 0000000..a2a6623 --- /dev/null +++ b/js/tests/screenshot/test_cases/procedures_ifreturn @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/procedures_mutatorarg b/js/tests/screenshot/test_cases/procedures_mutatorarg new file mode 100644 index 0000000..9925255 --- /dev/null +++ b/js/tests/screenshot/test_cases/procedures_mutatorarg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/procedures_mutatorcontainer b/js/tests/screenshot/test_cases/procedures_mutatorcontainer new file mode 100644 index 0000000..9600d20 --- /dev/null +++ b/js/tests/screenshot/test_cases/procedures_mutatorcontainer @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_basic_empty b/js/tests/screenshot/test_cases/test_basic_empty new file mode 100644 index 0000000..166f799 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_basic_empty @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_basic_empty_with_mutator b/js/tests/screenshot/test_cases/test_basic_empty_with_mutator new file mode 100644 index 0000000..4b8293f --- /dev/null +++ b/js/tests/screenshot/test_cases/test_basic_empty_with_mutator @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_basic_limit_instances b/js/tests/screenshot/test_cases/test_basic_limit_instances new file mode 100644 index 0000000..498ae99 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_basic_limit_instances @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_basic_value_to_stack b/js/tests/screenshot/test_cases/test_basic_value_to_stack new file mode 100644 index 0000000..56dd4ff --- /dev/null +++ b/js/tests/screenshot/test_cases/test_basic_value_to_stack @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_basic_value_to_statement b/js/tests/screenshot/test_cases/test_basic_value_to_statement new file mode 100644 index 0000000..ac133d1 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_basic_value_to_statement @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_cases.json b/js/tests/screenshot/test_cases/test_cases.json new file mode 100644 index 0000000..904cca6 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_cases.json @@ -0,0 +1,480 @@ +{ + "tests": [ + { + "title": "logic_boolean", + "skip": false + }, + { + "title": "controls_if", + "skip": false + }, + { + "title": "controls_ifelse", + "skip": false + }, + { + "title": "logic_compare", + "skip": false + }, + { + "title": "logic_operation", + "skip": false + }, + { + "title": "logic_negate", + "skip": false + }, + { + "title": "logic_null", + "skip": false + }, + { + "title": "logic_ternary", + "skip": false + }, + { + "title": "controls_if_if", + "skip": false + }, + { + "title": "controls_if_elseif", + "skip": false + }, + { + "title": "controls_if_else", + "skip": false + }, + { + "title": "controls_repeat_ext", + "skip": false + }, + { + "title": "controls_repeat", + "skip": false + }, + { + "title": "controls_whileUntil", + "skip": false + }, + { + "title": "controls_for", + "skip": false + }, + { + "title": "controls_forEach", + "skip": false + }, + { + "title": "controls_flow_statements", + "skip": false + }, + { + "title": "math_number", + "skip": false + }, + { + "title": "math_arithmetic", + "skip": false + }, + { + "title": "math_single", + "skip": false + }, + { + "title": "math_trig", + "skip": false + }, + { + "title": "math_constant", + "skip": false + }, + { + "title": "math_number_property", + "skip": false + }, + { + "title": "math_change", + "skip": false + }, + { + "title": "math_round", + "skip": false + }, + { + "title": "math_on_list", + "skip": false + }, + { + "title": "math_modulo", + "skip": false + }, + { + "title": "math_constrain", + "skip": false + }, + { + "title": "math_random_int", + "skip": false + }, + { + "title": "math_random_float", + "skip": false + }, + { + "title": "math_atan2", + "skip": false + }, + { + "title": "text_join", + "skip": false + }, + { + "title": "text_create_join_container", + "skip": false + }, + { + "title": "text_create_join_item", + "skip": false + }, + { + "title": "text_append", + "skip": false + }, + { + "title": "text_length", + "skip": false + }, + { + "title": "text_isEmpty", + "skip": false + }, + { + "title": "text_indexOf", + "skip": false + }, + { + "title": "text_charAt", + "skip": false + }, + { + "title": "text_getSubstring", + "skip": false + }, + { + "title": "text_changeCase", + "skip": false + }, + { + "title": "text_trim", + "skip": false + }, + { + "title": "text_print", + "skip": false + }, + { + "title": "text_prompt_ext", + "skip": false + }, + { + "title": "text_prompt", + "skip": false + }, + { + "title": "text_count", + "skip": false + }, + { + "title": "text_replace", + "skip": false + }, + { + "title": "text_reverse", + "skip": false + }, + { + "title": "lists_create_empty", + "skip": false + }, + { + "title": "lists_repeat", + "skip": false + }, + { + "title": "lists_reverse", + "skip": false + }, + { + "title": "lists_isEmpty", + "skip": false + }, + { + "title": "lists_length", + "skip": false + }, + { + "title": "lists_create_with", + "skip": false + }, + { + "title": "lists_create_with_container", + "skip": false + }, + { + "title": "lists_create_with_item", + "skip": false + }, + { + "title": "lists_indexOf", + "skip": false + }, + { + "title": "lists_getIndex", + "skip": false + }, + { + "title": "lists_setIndex", + "skip": false + }, + { + "title": "lists_getSublist", + "skip": false + }, + { + "title": "lists_sort", + "skip": false + }, + { + "title": "lists_split", + "skip": false + }, + { + "title": "colour_picker", + "skip": false + }, + { + "title": "colour_random", + "skip": false + }, + { + "title": "colour_rgb", + "skip": false + }, + { + "title": "colour_blend", + "skip": false + }, + { + "title": "variables_get", + "skip": false + }, + { + "title": "variables_set", + "skip": false + }, + { + "title": "variables_get_dynamic", + "skip": false + }, + { + "title": "variables_set_dynamic", + "skip": false + }, + { + "title": "procedures_defnoreturn", + "skip": true + }, + { + "title": "procedures_defreturn", + "skip": true + }, + { + "title": "procedures_mutatorcontainer", + "skip": true + }, + { + "title": "procedures_mutatorarg", + "skip": true + }, + { + "title": "procedures_callnoreturn", + "skip": true + }, + { + "title": "procedures_callreturn", + "skip": true + }, + { + "title": "procedures_ifreturn", + "skip": true + }, + { + "title": "test_basic_empty", + "skip": false + }, + { + "title": "test_basic_value_to_stack", + "skip": false + }, + { + "title": "test_basic_value_to_statement", + "skip": false + }, + { + "title": "test_basic_limit_instances", + "skip": false + }, + { + "title": "test_dropdowns_long", + "skip": false + }, + { + "title": "test_dropdowns_images", + "skip": false + }, + { + "title": "test_dropdowns_images_and_text", + "skip": false + }, + { + "title": "test_fields_angle", + "skip": false + }, + { + "title": "test_fields_date", + "skip": false + }, + { + "title": "test_fields_text_input", + "skip": false + }, + { + "title": "test_fields_checkbox", + "skip": false + }, + { + "title": "test_fields_colour", + "skip": false + }, + { + "title": "test_fields_variable", + "skip": false + }, + { + "title": "test_fields_label_serializable", + "skip": false + }, + { + "title": "test_numbers_float", + "skip": false + }, + { + "title": "test_numbers_whole", + "skip": false + }, + { + "title": "test_numbers_hundredths", + "skip": false + }, + { + "title": "test_numbers_halves", + "skip": false + }, + { + "title": "test_numbers_three_halves", + "skip": false + }, + { + "title": "test_numbers_whole_bounded", + "skip": false + }, + { + "title": "test_images_datauri", + "skip": false + }, + { + "title": "test_images_small", + "skip": false + }, + { + "title": "test_images_large", + "skip": false + }, + { + "title": "test_images_fliprtl", + "skip": false + }, + { + "title": "test_images_missing", + "skip": false + }, + { + "title": "test_images_many_icons", + "skip": false + }, + { + "title": "test_style_hat", + "skip": false + }, + { + "title": "test_style_hex1", + "skip": false + }, + { + "title": "test_style_hex2", + "skip": false + }, + { + "title": "test_style_hex3", + "skip": false + }, + { + "title": "test_style_no_colour", + "skip": false + }, + { + "title": "test_style_hex4", + "skip": false + }, + { + "title": "test_style_hex5", + "skip": false + }, + { + "title": "test_style_emoji", + "skip": false + }, + { + "title": "test_basic_empty_with_mutator", + "skip": false + }, + { + "title": "test_dropdowns_dynamic", + "skip": false + }, + { + "title": "multi_block_1", + "skip": false + }, + { + "title": "multi_block_logic", + "skip": false + }, + { + "title": "multi_colour_with_external", + "skip": false + }, + { + "title": "multi_colour_with_internal", + "skip": false + }, + { + "title": "not_true", + "skip": false + }, + { + "title": "multi_stack", + "skip": false + } + ] +} diff --git a/js/tests/screenshot/test_cases/test_dropdowns_dynamic b/js/tests/screenshot/test_cases/test_dropdowns_dynamic new file mode 100644 index 0000000..3c40077 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_dropdowns_dynamic @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_dropdowns_images b/js/tests/screenshot/test_cases/test_dropdowns_images new file mode 100644 index 0000000..496dcf9 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_dropdowns_images @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_dropdowns_images_and_text b/js/tests/screenshot/test_cases/test_dropdowns_images_and_text new file mode 100644 index 0000000..1edeac8 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_dropdowns_images_and_text @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_dropdowns_long b/js/tests/screenshot/test_cases/test_dropdowns_long new file mode 100644 index 0000000..914c762 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_dropdowns_long @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_fields_angle b/js/tests/screenshot/test_cases/test_fields_angle new file mode 100644 index 0000000..772d6d9 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_fields_angle @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_fields_checkbox b/js/tests/screenshot/test_cases/test_fields_checkbox new file mode 100644 index 0000000..5b440ec --- /dev/null +++ b/js/tests/screenshot/test_cases/test_fields_checkbox @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_fields_colour b/js/tests/screenshot/test_cases/test_fields_colour new file mode 100644 index 0000000..72cb5c0 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_fields_colour @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_fields_date b/js/tests/screenshot/test_cases/test_fields_date new file mode 100644 index 0000000..26f0065 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_fields_date @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_fields_label_serializable b/js/tests/screenshot/test_cases/test_fields_label_serializable new file mode 100644 index 0000000..14e08f1 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_fields_label_serializable @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_fields_text_input b/js/tests/screenshot/test_cases/test_fields_text_input new file mode 100644 index 0000000..6aeb443 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_fields_text_input @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_fields_variable b/js/tests/screenshot/test_cases/test_fields_variable new file mode 100644 index 0000000..9a1bd43 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_fields_variable @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_images_datauri b/js/tests/screenshot/test_cases/test_images_datauri new file mode 100644 index 0000000..8dc9b00 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_images_datauri @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_images_fliprtl b/js/tests/screenshot/test_cases/test_images_fliprtl new file mode 100644 index 0000000..e666629 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_images_fliprtl @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_images_large b/js/tests/screenshot/test_cases/test_images_large new file mode 100644 index 0000000..43da934 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_images_large @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_images_many_icons b/js/tests/screenshot/test_cases/test_images_many_icons new file mode 100644 index 0000000..9369bd1 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_images_many_icons @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_images_missing b/js/tests/screenshot/test_cases/test_images_missing new file mode 100644 index 0000000..c194b5d --- /dev/null +++ b/js/tests/screenshot/test_cases/test_images_missing @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_images_small b/js/tests/screenshot/test_cases/test_images_small new file mode 100644 index 0000000..e96d5bb --- /dev/null +++ b/js/tests/screenshot/test_cases/test_images_small @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_numbers_float b/js/tests/screenshot/test_cases/test_numbers_float new file mode 100644 index 0000000..65bbb59 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_numbers_float @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_numbers_halves b/js/tests/screenshot/test_cases/test_numbers_halves new file mode 100644 index 0000000..f531b0f --- /dev/null +++ b/js/tests/screenshot/test_cases/test_numbers_halves @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_numbers_hundredths b/js/tests/screenshot/test_cases/test_numbers_hundredths new file mode 100644 index 0000000..d006348 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_numbers_hundredths @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_numbers_three_halves b/js/tests/screenshot/test_cases/test_numbers_three_halves new file mode 100644 index 0000000..e5bc698 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_numbers_three_halves @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_numbers_whole b/js/tests/screenshot/test_cases/test_numbers_whole new file mode 100644 index 0000000..156d6a1 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_numbers_whole @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_numbers_whole_bounded b/js/tests/screenshot/test_cases/test_numbers_whole_bounded new file mode 100644 index 0000000..bc59763 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_numbers_whole_bounded @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_style_emoji b/js/tests/screenshot/test_cases/test_style_emoji new file mode 100644 index 0000000..3e04b91 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_style_emoji @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_style_hat b/js/tests/screenshot/test_cases/test_style_hat new file mode 100644 index 0000000..f001416 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_style_hat @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_style_hex1 b/js/tests/screenshot/test_cases/test_style_hex1 new file mode 100644 index 0000000..0283825 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_style_hex1 @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_style_hex2 b/js/tests/screenshot/test_cases/test_style_hex2 new file mode 100644 index 0000000..2a1e8e0 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_style_hex2 @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_style_hex3 b/js/tests/screenshot/test_cases/test_style_hex3 new file mode 100644 index 0000000..71164a4 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_style_hex3 @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_style_hex4 b/js/tests/screenshot/test_cases/test_style_hex4 new file mode 100644 index 0000000..3f5033f --- /dev/null +++ b/js/tests/screenshot/test_cases/test_style_hex4 @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_style_hex5 b/js/tests/screenshot/test_cases/test_style_hex5 new file mode 100644 index 0000000..707b7a9 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_style_hex5 @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/test_style_no_colour b/js/tests/screenshot/test_cases/test_style_no_colour new file mode 100644 index 0000000..21d5500 --- /dev/null +++ b/js/tests/screenshot/test_cases/test_style_no_colour @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/text_append b/js/tests/screenshot/test_cases/text_append new file mode 100644 index 0000000..99644ab --- /dev/null +++ b/js/tests/screenshot/test_cases/text_append @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/text_changeCase b/js/tests/screenshot/test_cases/text_changeCase new file mode 100644 index 0000000..0f3f457 --- /dev/null +++ b/js/tests/screenshot/test_cases/text_changeCase @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/text_charAt b/js/tests/screenshot/test_cases/text_charAt new file mode 100644 index 0000000..dbe1dee --- /dev/null +++ b/js/tests/screenshot/test_cases/text_charAt @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/text_count b/js/tests/screenshot/test_cases/text_count new file mode 100644 index 0000000..8544220 --- /dev/null +++ b/js/tests/screenshot/test_cases/text_count @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/text_create_join_container b/js/tests/screenshot/test_cases/text_create_join_container new file mode 100644 index 0000000..4758b19 --- /dev/null +++ b/js/tests/screenshot/test_cases/text_create_join_container @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/text_create_join_item b/js/tests/screenshot/test_cases/text_create_join_item new file mode 100644 index 0000000..23d853e --- /dev/null +++ b/js/tests/screenshot/test_cases/text_create_join_item @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/text_getSubstring b/js/tests/screenshot/test_cases/text_getSubstring new file mode 100644 index 0000000..20f7cff --- /dev/null +++ b/js/tests/screenshot/test_cases/text_getSubstring @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/text_indexOf b/js/tests/screenshot/test_cases/text_indexOf new file mode 100644 index 0000000..d41f4c1 --- /dev/null +++ b/js/tests/screenshot/test_cases/text_indexOf @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/text_isEmpty b/js/tests/screenshot/test_cases/text_isEmpty new file mode 100644 index 0000000..7b23edb --- /dev/null +++ b/js/tests/screenshot/test_cases/text_isEmpty @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/text_join b/js/tests/screenshot/test_cases/text_join new file mode 100644 index 0000000..46e7b47 --- /dev/null +++ b/js/tests/screenshot/test_cases/text_join @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/text_length b/js/tests/screenshot/test_cases/text_length new file mode 100644 index 0000000..d178d3b --- /dev/null +++ b/js/tests/screenshot/test_cases/text_length @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/text_print b/js/tests/screenshot/test_cases/text_print new file mode 100644 index 0000000..6d3923d --- /dev/null +++ b/js/tests/screenshot/test_cases/text_print @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/text_prompt b/js/tests/screenshot/test_cases/text_prompt new file mode 100644 index 0000000..0ec801e --- /dev/null +++ b/js/tests/screenshot/test_cases/text_prompt @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/text_prompt_ext b/js/tests/screenshot/test_cases/text_prompt_ext new file mode 100644 index 0000000..dabe58a --- /dev/null +++ b/js/tests/screenshot/test_cases/text_prompt_ext @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/text_replace b/js/tests/screenshot/test_cases/text_replace new file mode 100644 index 0000000..a344192 --- /dev/null +++ b/js/tests/screenshot/test_cases/text_replace @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/text_reverse b/js/tests/screenshot/test_cases/text_reverse new file mode 100644 index 0000000..61f53eb --- /dev/null +++ b/js/tests/screenshot/test_cases/text_reverse @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/text_trim b/js/tests/screenshot/test_cases/text_trim new file mode 100644 index 0000000..b37f367 --- /dev/null +++ b/js/tests/screenshot/test_cases/text_trim @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/variables_get b/js/tests/screenshot/test_cases/variables_get new file mode 100644 index 0000000..2599d1e --- /dev/null +++ b/js/tests/screenshot/test_cases/variables_get @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/variables_get_dynamic b/js/tests/screenshot/test_cases/variables_get_dynamic new file mode 100644 index 0000000..5a9a398 --- /dev/null +++ b/js/tests/screenshot/test_cases/variables_get_dynamic @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/variables_set b/js/tests/screenshot/test_cases/variables_set new file mode 100644 index 0000000..23bcf40 --- /dev/null +++ b/js/tests/screenshot/test_cases/variables_set @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/screenshot/test_cases/variables_set_dynamic b/js/tests/screenshot/test_cases/variables_set_dynamic new file mode 100644 index 0000000..9d68c5f --- /dev/null +++ b/js/tests/screenshot/test_cases/variables_set_dynamic @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/js/tests/scripts/check_metadata.sh b/js/tests/scripts/check_metadata.sh new file mode 100644 index 0000000..9b36c44 --- /dev/null +++ b/js/tests/scripts/check_metadata.sh @@ -0,0 +1,57 @@ +#!/bin/bash + +# Checks the size of generated files and verifies they aren't growing +# unreasonably. + +# These values should be updated with each release +# Size of blockly_compressed.js +blockly_size_expected=573000 # 813K in July 2019 release +# Size of blocks_compressed.js +blocks_size_expected=76500 # 75K in July 2019 release +# Size of blockly_compressed.js.gz +blockly_gz_size_expected=123000 # 180K in July 2019 release +# Size of blocks_compressed.js.gz +blocks_gz_size_expected=15200 # 14.5K in July 2019 release + +# ANSI colors +BOLD_GREEN='\033[1;32m' +BOLD_RED='\033[1;31m' +ANSI_RESET='\033[0m' + +# Build the compressed files for core and blocks +echo "Building files" +npm install +gulp build-compressed +gulp build-blocks + +# GZip them for additional size comparisons +echo "Zipping the compressed files" +gzip -c blockly_compressed.js > blockly_compressed.js.gz +gzip -c blocks_compressed.js > blocks_compressed.js.gz + +# Check the sizes of the files + +has_failed=0 + +compare_size() { + local name=$1 + local expected=$2 + local compare=$(echo "$expected * 1.1 / 1" | bc) + + local size=$(wc -c <"$name") + + if (( $size > $compare)) + then + echo -e "${BOLD_RED}Failed: Size of $name has grown more than 10%. $size vs $expected ${ANSI_RESET}" >&2 + has_failed=1 + else + echo -e "${BOLD_GREEN}Size of $name at $size compared to previous $expected.${ANSI_RESET}" + fi +} + +compare_size "blockly_compressed.js" $blockly_size_expected +compare_size "blocks_compressed.js" $blocks_size_expected +compare_size "blockly_compressed.js.gz" $blockly_gz_size_expected +compare_size "blocks_compressed.js.gz" $blocks_gz_size_expected + +exit $has_failed diff --git a/js/tests/scripts/compile_typings.sh b/js/tests/scripts/compile_typings.sh new file mode 100644 index 0000000..ee16beb --- /dev/null +++ b/js/tests/scripts/compile_typings.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +# ANSI colors +BOLD_GREEN='\033[1;32m' +BOLD_RED='\033[1;31m' +ANSI_RESET='\033[0m' + +# Download TypeScript to obtain the compiler. +echo "Downloading TypeScript" +npm install typescript + +# Generate Blockly typings. +echo "Generating Blockly typings" +npm run typings + +# Use the TypeScript compiler to compile the generated typings. +echo "Compiling typings" +cd typings +../node_modules/.bin/tsc blockly.d.ts + + +if [ $? -eq 0 ] +then + echo -e "${BOLD_GREEN}TypeScript typings compiled successfully.${ANSI_RESET}" + exit 0 +else + echo -e "${BOLD_RED}Failed to compile TypeScript typings.${ANSI_RESET}" >&2 + exit 1 +fi diff --git a/js/tests/scripts/run_generators.sh b/js/tests/scripts/run_generators.sh new file mode 100644 index 0000000..9d556ac --- /dev/null +++ b/js/tests/scripts/run_generators.sh @@ -0,0 +1,57 @@ +#!/bin/bash + +# ANSI colors +BOLD_GREEN='\033[1;32m' +BOLD_RED='\033[1;31m' +ANSI_RESET='\033[0m' +SUCCESS_PREFIX="${BOLD_GREEN}SUCCESS:${ANSI_RESET}" +FAILURE_PREFIX="${BOLD_RED}FAILED:${ANSI_RESET}" + +TMP_DIR="tests/generators/tmp/" +GOLDEN_DIR="tests/generators/golden/" + +FAILURE_COUNT=0 +check_result() { + local suffix=$1 # One of: js, py, dart, lua, php + local tmp_filename="${TMP_DIR}generated.$suffix" + + if [ -f $tmp_filename ]; then + local golden_filename="${GOLDEN_DIR}generated.$suffix" + if [ -f $golden_filename ]; then + if cmp --silent $tmp_filename $golden_filename; then + echo -e "$SUCCESS_PREFIX $suffix: $tmp_filename matches $golden_filename" + else + echo -e "$FAILURE_PREFIX $suffix: $tmp_filename does not match $golden_filename" + FAILURE_COUNT=$((FAILURE_COUNT+1)) + fi + else + echo "File $golden_filename not found!" + FAILURE_COUNT=$((FAILURE_COUNT+1)) + fi + else + echo "File $tmp_filename not found!" + FAILURE_COUNT=$((FAILURE_COUNT+1)) + fi +} + + +mkdir $TMP_DIR + +node tests/generators/run_generators_in_browser.js +generator_suffixes=( "js" "py" "dart" "lua" "php" ) +for i in "${generator_suffixes[@]}" +do + check_result "$i" +done + + +# Clean up. +rm -r $TMP_DIR + +if [ "$FAILURE_COUNT" -eq "0" ]; then + echo -e "${BOLD_GREEN}All generator tests passed.${ANSI_RESET}" + exit 0 +else + echo -e "${BOLD_RED}Failures in ${FAILURE_COUNT} generator tests.${ANSI_RESET}" + exit 1 +fi diff --git a/js/tests/scripts/selenium-config.js b/js/tests/scripts/selenium-config.js new file mode 100644 index 0000000..3e48808 --- /dev/null +++ b/js/tests/scripts/selenium-config.js @@ -0,0 +1,27 @@ +/* eslint-disable */ + +module.exports = { + // check for more recent versions of selenium here: + // https://selenium-release.storage.googleapis.com/index.html + version: '3.9.1', + baseURL: 'https://selenium-release.storage.googleapis.com', + drivers: { + chrome: { + // check for more recent versions of chrome driver here: + // https://chromedriver.storage.googleapis.com/index.html + version: '79.0.3945.36', + arch: process.arch, + baseURL: 'https://chromedriver.storage.googleapis.com' + }, + firefox: { + // check for more recent versions of chrome driver here: + // https://chromedriver.storage.googleapis.com/index.html + version: '0.21.0', + arch: process.arch, + baseURL: 'https://github.com/mozilla/geckodriver/releases/download' + }, + }, + requestOpts: { // see https://github.com/request/request#requestoptions-callback + timeout: 10000 + }, +}; diff --git a/js/tests/scripts/setup_linux_env.sh b/js/tests/scripts/setup_linux_env.sh new file mode 100644 index 0000000..6e21e87 --- /dev/null +++ b/js/tests/scripts/setup_linux_env.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +if [ "${TRAVIS_OS_NAME}" == "linux" ] + then + export CHROME_BIN="/usr/bin/google-chrome" + sh -e /etc/init.d/xvfb start & + npm run test:prepare > /dev/null & +fi diff --git a/js/tests/scripts/setup_osx_env.sh b/js/tests/scripts/setup_osx_env.sh new file mode 100644 index 0000000..5a70922 --- /dev/null +++ b/js/tests/scripts/setup_osx_env.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +if [ "${TRAVIS_OS_NAME}" == "osx" ] + then + brew cask install google-chrome + sudo Xvfb :99 -ac -screen 0 1024x768x8 & + export CHROME_BIN="/Applications/Google Chrome.app" + npm run test:prepare > /dev/null & +fi diff --git a/js/tests/workspace_svg/event_svg_test.js b/js/tests/workspace_svg/event_svg_test.js new file mode 100644 index 0000000..46d48f9 --- /dev/null +++ b/js/tests/workspace_svg/event_svg_test.js @@ -0,0 +1,85 @@ +/** + * @license + * Copyright 2018 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + + +function eventSvg_setUpMockBlocks() { + // TODO: Replace with defineGetVarBlock(); + Blockly.defineBlocksWithJsonArray([{ + 'type': 'field_variable_test_block', + 'message0': '%1', + 'args0': [ + { + 'type': 'field_variable', + 'name': 'VAR', + 'variable': 'item' + } + ], + }, + { + 'type': 'simple_test_block', + 'message0': 'simple test block', + 'output': null + }, + { + 'type': 'test_val_in', + 'message0': 'test in %1', + 'args0': [ + { + 'type': 'input_value', + 'name': 'NAME' + } + ] + }]); +} + +function eventSvg_tearDownMockBlocks() { + delete Blockly.Blocks['field_variable_test_block']; + delete Blockly.Blocks['simple_test_block']; + delete Blockly.Blocks['test_val_in']; +} + +function eventSvg_createWorkspaceWithToolbox() { + var toolbox = document.getElementById('toolbox-categories'); + return Blockly.inject('blocklyDiv', {toolbox: toolbox}); +} + +function eventSvg_createNewBlock(workspace, type) { + var block = workspace.newBlock(type); + block.initSvg(); + return block; +} + +function test_blockDelete_svgDispose() { + eventSvg_setUpMockBlocks(); + var workspace = eventSvg_createWorkspaceWithToolbox(); + Blockly.Events.fire = temporary_fireEvent; + temporary_fireEvent.firedEvents_ = []; + try { + var block = eventSvg_createNewBlock(workspace); + block.setCommentText('test comment'); + var event = new Blockly.Events.BlockDelete(block); + workspace.clearUndo(); + block.dispose(); + var firedEvents = workspace.undoStack_; + assertEquals('Delete event created by dispose matches constructed delete event', + Blockly.Xml.domToText(event.oldXml), Blockly.Xml.domToText(firedEvents[0].oldXml)); + } finally { + eventSvg_tearDownMockBlocks(); + workspace.dispose(); + } +} \ No newline at end of file diff --git a/js/tests/workspace_svg/index.html b/js/tests/workspace_svg/index.html new file mode 100644 index 0000000..9443c68 --- /dev/null +++ b/js/tests/workspace_svg/index.html @@ -0,0 +1,421 @@ + + + + +Blockly Workspace SVG testing + + + + + + + + + + + + + + + + +
      + +

      Blockly Workspace testing

      + + + + + + + + + + + + + + + + + + diff --git a/js/tests/workspace_svg/procedure_svg_test.js b/js/tests/workspace_svg/procedure_svg_test.js new file mode 100644 index 0000000..1c27245 --- /dev/null +++ b/js/tests/workspace_svg/procedure_svg_test.js @@ -0,0 +1,367 @@ +/** + * @license + * Copyright 2018 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + +var savedFireFunc = Blockly.Events.fire; +var workspace; + +function procedureSvgTest_setup() { + Blockly.Events.fire = temporary_fireEvent; + temporary_fireEvent.firedEvents_ = []; + workspace = procedureSvgTest_createWorkspaceWithToolbox(); +} + +function procedureSvgTest_teardown() { + Blockly.Events.fire = savedFireFunc; + workspace.dispose(); +} + +function procedureSvgTest_createWorkspaceWithToolbox() { + var toolbox = document.getElementById('toolbox-categories'); + return Blockly.inject('blocklyDiv', {toolbox: toolbox}); +} + +function test_procedureReturnSetDisabledUpdatesCallers() { + procedureSvgTest_setup(); + try { + var dom = Blockly.Xml.textToDom( + '' + + '' + + 'bar' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + ''); + + + Blockly.Xml.appendDomToWorkspace(dom, workspace); + var barDef = workspace.getBlockById('bar-def'); + var barCalls = [workspace.getBlockById('bar-c1'), workspace.getBlockById('bar-c2')]; + + workspace.clearUndo(); + Blockly.Events.setGroup('g1'); + barDef.setEnabled(false); + Blockly.Events.setGroup(false); + + assertTrue('Callers are disabled when their definition is disabled.', + barCalls[0].disabled && barCalls[1].disabled); + + var firedEvents = workspace.undoStack_; + assertEquals('An event was fired for the definition and each caller.', + 3, firedEvents.length); + assertTrue('Disable events are in the same group.', + 'g1' == firedEvents[0].group + && 'g1' == firedEvents[1].group + && 'g1' == firedEvents[2].group); + + workspace.clearUndo(); + Blockly.Events.setGroup('g2'); + barDef.setEnabled(true); + Blockly.Events.setGroup(false); + + assertTrue('Callers are enabled when their definition is enabled.', + !barCalls[0].disabled && !barCalls[1].disabled); + + assertEquals('An event was fired for the definition and each caller.', + 3, firedEvents.length); + assertTrue('Enable events are in the same group.', + 'g2' == firedEvents[0].group + && 'g2' == firedEvents[1].group + && 'g2' == firedEvents[2].group); + + + } finally { + procedureSvgTest_teardown(); + } +} + + +function test_procedureReturnEnablingRemembersOldCallerState() { + procedureSvgTest_setup(); + try { + var dom = Blockly.Xml.textToDom( + '' + + '' + + 'bar' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + ''); + + + Blockly.Xml.appendDomToWorkspace(dom, workspace); + var barDef = workspace.getBlockById('bar-def'); + var barCalls = [workspace.getBlockById('bar-c1'), workspace.getBlockById('bar-c2')]; + + barCalls[0].setEnabled(false); + workspace.clearUndo(); + Blockly.Events.setGroup('g1'); + barDef.setEnabled(false); + Blockly.Events.setGroup(false); + + assertTrue('Callers are disabled when their definition is disabled.', + barCalls[0].disabled && barCalls[1].disabled); + + var firedEvents = workspace.undoStack_; + assertEquals('An event was fired for the definition and the enabled caller.', + 2, firedEvents.length); + assertTrue('Disable events are in the same group.', + 'g1' == firedEvents[0].group + && 'g1' == firedEvents[1].group); + + workspace.clearUndo(); + Blockly.Events.setGroup('g2'); + barDef.setEnabled(true); + Blockly.Events.setGroup(false); + + + assertTrue('Callers return to their previous state when the definition is enabled.', + barCalls[0].disabled && !barCalls[1].disabled); + + assertEquals('An event was fired for the definition and the enabled caller.', + 2, firedEvents.length); + assertTrue('Disable events are in the same group.', + 'g2' == firedEvents[0].group + && 'g2' == firedEvents[1].group); + + } finally { + procedureSvgTest_teardown(); + } +} + +function test_procedureNoReturnSetDisabledUpdatesCallers() { + procedureSvgTest_setup(); + try { + var dom = Blockly.Xml.textToDom( + '' + + '' + + 'bar' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + ''); + + + Blockly.Xml.appendDomToWorkspace(dom, workspace); + var barDef = workspace.getBlockById('bar-def'); + var barCalls = [workspace.getBlockById('bar-c1'), workspace.getBlockById('bar-c2')]; + + workspace.clearUndo(); + Blockly.Events.setGroup('g1'); + barDef.setEnabled(false); + Blockly.Events.setGroup(false); + + assertTrue('Callers are disabled when their definition is disabled.', + barCalls[0].disabled && barCalls[1].disabled); + + var firedEvents = workspace.undoStack_; + assertEquals('An event was fired for the definition and each caller.', + 3, firedEvents.length); + assertTrue('Disable events are in the same group.', + 'g1' == firedEvents[0].group + && 'g1' == firedEvents[1].group + && 'g1' == firedEvents[2].group); + + workspace.clearUndo(); + Blockly.Events.setGroup('g2'); + barDef.setEnabled(true); + Blockly.Events.setGroup(false); + + assertTrue('Callers are enabled when their definition is enabled.', + !barCalls[0].disabled && !barCalls[1].disabled); + + assertEquals('An event was fired for the definition and each caller.', + 3, firedEvents.length); + assertTrue('Enable events are in the same group.', + 'g2' == firedEvents[0].group + && 'g2' == firedEvents[1].group + && 'g2' == firedEvents[2].group); + + + } finally { + procedureSvgTest_teardown(); + } +} + + +function test_procedureNoReturnEnablingRemembersOldCallerState() { + procedureSvgTest_setup(); + try { + var dom = Blockly.Xml.textToDom( + '' + + '' + + 'bar' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + ''); + + + Blockly.Xml.appendDomToWorkspace(dom, workspace); + var barDef = workspace.getBlockById('bar-def'); + var barCalls = [workspace.getBlockById('bar-c1'), workspace.getBlockById('bar-c2')]; + + barCalls[0].setEnabled(false); + workspace.clearUndo(); + Blockly.Events.setGroup('g1'); + barDef.setEnabled(false); + Blockly.Events.setGroup(false); + + assertTrue('Callers are disabled when their definition is disabled.', + barCalls[0].disabled && barCalls[1].disabled); + + var firedEvents = workspace.undoStack_; + assertEquals('An event was fired for the definition and the enabled caller.', + 2, firedEvents.length); + assertTrue('Disable events are in the same group.', + 'g1' == firedEvents[0].group + && 'g1' == firedEvents[1].group); + + workspace.clearUndo(); + Blockly.Events.setGroup('g2'); + barDef.setEnabled(true); + Blockly.Events.setGroup(false); + + + assertTrue('Callers return to their previous state when the definition is enabled.', + barCalls[0].disabled && !barCalls[1].disabled); + + assertEquals('An event was fired for the definition and the enabled caller.', + 2, firedEvents.length); + assertTrue('Disable events are in the same group.', + 'g2' == firedEvents[0].group + && 'g2' == firedEvents[1].group); + + } finally { + procedureSvgTest_teardown(); + } +} + +/** +* This is a somewhat large test as it's checking interactions between +* three procedure definitions. +*/ +function test_procedureEnableDisableInteractions() { + procedureSvgTest_setup(); + try { + var dom = Blockly.Xml.textToDom( + '' + + '' + + 'bar' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + 'foo' + + '' + + '' + + 'baz' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + ''); + Blockly.Events.disable(); + Blockly.Xml.appendDomToWorkspace(dom, workspace); + Blockly.Events.enable(); + + var barDef = workspace.getBlockById('bar-def'); + var fooDef = workspace.getBlockById('foo-def'); + var bazDef = workspace.getBlockById('baz-def'); + + var barCalls = [workspace.getBlockById('bar-c1'), workspace.getBlockById('bar-c2')]; + var fooCalls = [workspace.getBlockById('foo-c1'), workspace.getBlockById('foo-c2')]; + var bazCall = workspace.getBlockById('baz-c1'); + + barDef.setEnabled(false); + + assertTrue('Callers are disabled when their definition is disabled.', + barCalls[0].disabled && barCalls[1].disabled); + assertTrue('Callers in definitions are disabled by inheritance.', + !fooCalls[0].disabled && fooCalls[0].getInheritedDisabled()); + + fooDef.setEnabled(false); + + assertTrue('Callers are disabled when their definition is disabled', + fooCalls[0].disabled && fooCalls[1].disabled); + + barDef.setEnabled(true); + + assertTrue('Callers are reenabled with their definition', + !barCalls[0].disabled && !barCalls[0].disabled); + + assertTrue('Nested disabled callers remain disabled, not by inheritance.', + fooCalls[0].disabled && !fooCalls[0].getInheritedDisabled()); + + bazDef.setEnabled(false); + + assertTrue('Caller is disabled with its definition', + bazCall.disabled); + + assertTrue('Caller in the return is disabled by inheritance.', + !barCalls[1].disabled && barCalls[1].getInheritedDisabled()); + + barDef.setEnabled(false); + assertTrue('Callers are disabled when their definition is disabled.', + barCalls[0].disabled && barCalls[1].disabled); + + bazDef.setEnabled(true); + + assertTrue('Caller in the return remains disabled, not by inheritance.', + barCalls[1].disabled && !barCalls[1].getInheritedDisabled()); + + } finally { + procedureSvgTest_teardown(); + } + +} diff --git a/js/tests/workspace_svg/workspace_svg_test.js b/js/tests/workspace_svg/workspace_svg_test.js new file mode 100644 index 0000000..56eccb6 --- /dev/null +++ b/js/tests/workspace_svg/workspace_svg_test.js @@ -0,0 +1,167 @@ +/** + * @license + * Copyright 2017 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + +function helper_setUpMockBlocks() { + // TODO: Replace with defineGetVarBlock(); + Blockly.defineBlocksWithJsonArray([{ + 'type': 'field_variable_test_block', + 'message0': '%1', + 'args0': [ + { + 'type': 'field_variable', + 'name': 'VAR', + 'variable': 'item' + } + ], + }, + { + 'type': 'simple_test_block', + 'message0': 'simple test block', + 'output': null + }, + { + 'type': 'test_val_in', + 'message0': 'test in %1', + 'args0': [ + { + 'type': 'input_value', + 'name': 'NAME' + } + ] + }]); +} + +function helper_tearDownMockBlocks() { + delete Blockly.Blocks['field_variable_test_block']; + delete Blockly.Blocks['simple_test_block']; + delete Blockly.Blocks['test_val_in']; +} + +function helper_createWorkspaceWithToolbox() { + var toolbox = document.getElementById('toolbox-categories'); + return Blockly.inject('blocklyDiv', {toolbox: toolbox}); +} + +function helper_createNewBlock(workspace, type) { + var block = workspace.newBlock(type); + block.initSvg(); + return block; +} + +function test_createWorkspace() { + var workspace = helper_createWorkspaceWithToolbox(); + workspace.dispose(); +} + +function test_emptyWorkspace() { + var workspace = helper_createWorkspaceWithToolbox(); + try { + assertEquals('Empty workspace (1).', 0, workspace.getTopBlocks(true).length); + assertEquals('Empty workspace (2).', 0, workspace.getTopBlocks(false).length); + assertEquals('Empty workspace (3).', 0, workspace.getAllBlocks(false).length); + workspace.clear(); + assertEquals('Empty workspace (4).', 0, workspace.getTopBlocks(true).length); + assertEquals('Empty workspace (5).', 0, workspace.getTopBlocks(false).length); + assertEquals('Empty workspace (6).', 0, workspace.getAllBlocks(false).length); + } finally { + workspace.dispose(); + } +} + +function test_flatWorkspace() { + var workspace = helper_createWorkspaceWithToolbox(); + var blockA, blockB; + try { + blockA = helper_createNewBlock(workspace, ''); + assertEquals('One block workspace (1).', 1, workspace.getTopBlocks(true).length); + assertEquals('One block workspace (2).', 1, workspace.getTopBlocks(false).length); + assertEquals('One block workspace (3).', 1, workspace.getAllBlocks(false).length); + blockB = helper_createNewBlock(workspace, ''); + assertEquals('Two block workspace (1).', 2, workspace.getTopBlocks(true).length); + assertEquals('Two block workspace (2).', 2, workspace.getTopBlocks(false).length); + assertEquals('Two block workspace (3).', 2, workspace.getAllBlocks(false).length); + try { + blockA.dispose(); + } catch (e) { + fail('Failed to delete blockA ' + e); + } + + assertEquals('One block workspace (4).', 1, workspace.getTopBlocks(true).length); + assertEquals('One block workspace (5).', 1, workspace.getTopBlocks(false).length); + assertEquals('One block workspace (6).', 1, workspace.getAllBlocks(false).length); + workspace.clear(); + assertEquals('Cleared workspace (1).', 0, workspace.getTopBlocks(true).length); + assertEquals('Cleared workspace (2).', 0, workspace.getTopBlocks(false).length); + assertEquals('Cleared workspace (3).', 0, workspace.getAllBlocks(false).length); + } finally { + blockB && blockB.dispose(); + blockA && blockA.dispose(); + workspace.dispose(); + } +} + +/** Tests the alignment of appendDomToWorkspace with WorkspaceSvg. */ +function test_appendDomToWorkspace() { + var workspace = helper_createWorkspaceWithToolbox(); + try { + var dom = Blockly.Xml.textToDom( + '' + + ' ' + + ' ' + + ''); + Blockly.Xml.appendDomToWorkspace(dom, workspace); + assertEquals('Block count', 1, workspace.getAllBlocks(false).length); + Blockly.Xml.appendDomToWorkspace(dom, workspace); + assertEquals('Block count', 2, workspace.getAllBlocks(false).length); + var blocks = workspace.getAllBlocks(false); + assertEquals('Block 1 position x',21,blocks[0].getRelativeToSurfaceXY().x); + assertEquals('Block 1 position y',23,blocks[0].getRelativeToSurfaceXY().y); + assertEquals('Block 2 position x',21,blocks[1].getRelativeToSurfaceXY().x); + assertEquals('Block 2 position y',23 + blocks[0].getHeightWidth().height + Blockly.BlockSvg.SEP_SPACE_Y,blocks[1].getRelativeToSurfaceXY().y); + } finally { + workspace.dispose(); + } +} + +function test_svgDisposeWithShadow() { + helper_setUpMockBlocks(); + var workspace = helper_createWorkspaceWithToolbox(); + var blockNew; + try { + var dom = Blockly.Xml.textToDom( + '' + + '' + + '' + + '' + + '' + + '' + + ''); + + Blockly.Xml.appendDomToWorkspace(dom, workspace); + assertEquals('Block count', 2, workspace.getAllBlocks(false).length); + var inputConnection = workspace.getTopBlocks()[0].getInput('NAME').connection; + + blockNew = helper_createNewBlock(workspace, 'simple_test_block'); + inputConnection.connect(blockNew.outputConnection); + + } finally { + workspace.dispose(); + blockNew && blockNew.dispose(); + helper_tearDownMockBlocks(); + } +} diff --git a/js/tests/xml/README.txt b/js/tests/xml/README.txt new file mode 100644 index 0000000..8fe34d8 --- /dev/null +++ b/js/tests/xml/README.txt @@ -0,0 +1,11 @@ +This directory contains the schema for validating Blockly XML files: +* blockly.xsd + +Also included are three sample XML files: +* workspace.xml - XML for a complicated workspace. +* toolbox.xml - XML for a complicated toolbox with categories and separators. +* invalid.xml - XML that violates the DTD. + +Testing can be performed using an online tool: +https://www.corefiling.com/opensource/schemaValidate/ +http://www.utilities-online.info/xsdvalidation/ diff --git a/js/tests/xml/blockly.xsd b/js/tests/xml/blockly.xsd new file mode 100644 index 0000000..67562c4 --- /dev/null +++ b/js/tests/xml/blockly.xsd @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/js/tests/xml/invalid.xml b/js/tests/xml/invalid.xml new file mode 100644 index 0000000..5debaaf --- /dev/null +++ b/js/tests/xml/invalid.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/js/tests/xml/toolbox.xml b/js/tests/xml/toolbox.xml new file mode 100644 index 0000000..63474ec --- /dev/null +++ b/js/tests/xml/toolbox.xml @@ -0,0 +1,311 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 10 + + + + + + i + + + 1 + + + + + 10 + + + + + 1 + + + + + + + + + 123 + + + + + + + + + + + + + 1 + + + + + 100 + + + + + + + 1 + + + + + 100 + + + + + + + + + + + + + 5 + + + + + + + + + + + + + + + + + + + + + + randomize + + + x + + + 1 + + + + + + + list + + + + + + + 1 + + + + + y + + + + + 1 + + + + + + + list + + + + + + + + + temp + + + + GET + FROM_START + + + y + + + + + list + + + + + + + + + y + + + + + list + + + + + + GET + FROM_START + + + x + + + + + list + + + + + + + + + x + + + + + list + + + + + temp + + + + + + + + + + + + + + + + + + + 'Twas brillig, and the slithy toves + + + + + + + Did gyre and gimble in the wabe: + + + + + + + All mimsy were the borogroves, + + + + + + + And the mome raths outgrabe. + + + + + + + + + + + + + "Beware the Jabberwock, my son! + + + + + + + The jaws that bite, the claws that catch! + + + + + + + Beware the Jubjub bird, and shun + + + + + + + The frumious Bandersnatch!" + + + + + + + + + + + + diff --git a/js/tests/xml/workspace.xml b/js/tests/xml/workspace.xml new file mode 100644 index 0000000..19ae997 --- /dev/null +++ b/js/tests/xml/workspace.xml @@ -0,0 +1,114 @@ + + + x + i + text + + This is a workspace comment. + This is a new line on the workspace comment. + + + + + + + bar + Describe this function... + + + + + + LT + + + + FIRST + FROM_START + + + text + + + + + + + + + + + + + + + + + + + + + <html> + + + + + + + i + + + 1 + + + + + + + + + + foo + This function does... + +...nothing! + + + + + + + TRUE + + + + + + + 100 + + + + + 50 + + + + + 0 + + + + + + + + + + + + + + + + diff --git a/js/theme_scripts/blockStyles_example.json b/js/theme_scripts/blockStyles_example.json new file mode 100644 index 0000000..e58191c --- /dev/null +++ b/js/theme_scripts/blockStyles_example.json @@ -0,0 +1,11 @@ +{ + "colour":"#A5745B", + "lists":"260", + "logic":"210", + "loops":"120", + "math":"230", + "procedure":"290", + "text":"160", + "variables":"310", + "variables_dynamic":"310" +} diff --git a/js/theme_scripts/create_blockStyles.py b/js/theme_scripts/create_blockStyles.py new file mode 100644 index 0000000..d1f88a4 --- /dev/null +++ b/js/theme_scripts/create_blockStyles.py @@ -0,0 +1,181 @@ +# !/usr/bin/env python +# Converts a single colour to primary, secondary and tertiary colours. +# Primary Colour - The colour given +# Secondary Colour - Lightens the primary colour by .8 +# Tertiary Colour - Darkens the primary colour by .2 +# +# Copyright 2012 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# Usage: create_blockStyles.py +# +# fileName - Name of the file holding the map of style names to colours. +# Refer to blockStyles_example.json for an example input. +# +# Input: A json file with the keys being style names and the values +# being either a hue (number) or a hex value (string). +# Ex: {"styleName": 10, "styleName2": "#FFFFFF"} +# +# Output: A json file with the keys being style names and the values being an +# object holding primary, secondary, and tertiary colours in hex format. +# {"styleName": +# {"colourPrimary":"hexVal", +# "colourSecondary":"hexVal", +# "colourTertiary":"hexVal" +# } +# } + +import math +import json +import sys + +HSV_SATURATION = .45 +BRIGHTNESS_VAL = .65 * 255 +LIGHT_FACTOR = .8 +DARK_FACTOR = .2 + +#Change HSV (Hue Saturation Value) to RGB +#This is adapted to python from the js version found here: +#https://blockly-demo.appspot.com/closure-library/closure/goog/colour/color.js +def hsvToRgb(h, s, brightness): + red = 0 + green = 0 + blue = 0 + if (s == 0): + red = brightness + green = brightness + blue = brightness + else: + sextant = math.floor(h / 60) + remainder = (float(h) / float(60)) - sextant + val1 = brightness * (1 - s) + val2 = brightness * (1 - (s * remainder)) + val3 = brightness * (1 - (s * (1 - remainder))) + if sextant == 1: + red = val2 + green = brightness + blue = val1 + elif sextant == 2: + red = val1 + green = brightness + blue = val3 + elif sextant == 3: + red = val1 + green = val2 + blue = brightness + elif sextant == 4: + red = val3 + green = val1 + blue = brightness + elif sextant == 5: + red = brightness + green = val1 + blue = val2 + elif sextant == 0: + red = brightness + green = val3 + blue = val1 + return [math.floor(red), math.floor(green), math.floor(blue)] + + +#Blend two rgb colours with the factor being the weight given to the first colour +#This is adapted to python from the js version found here: +#https://blockly-demo.appspot.com/closure-library/closure/goog/colour/color.js +def blend(rgb1, rgb2, factor): + factor = max(min(factor, 1), 0) + return [ + round(rgb2[0] + factor * (rgb1[0] - rgb2[0])), + round(rgb2[1] + factor * (rgb1[1] - rgb2[1])), + round(rgb2[2] + factor * (rgb1[2] - rgb2[2])) + ] + + +#Lightens a given rgb colour +#This is adapted to python from the js version found here: +#https://blockly-demo.appspot.com/closure-library/closure/goog/colour/color.js +def lighten(rgb, factor): + white = [255, 255, 255] + return blend(white, rgb, factor) + + +#Darkens a given rgb colour +#This is adapted to python from the js version found here: +#https://blockly-demo.appspot.com/closure-library/closure/goog/colour/color.js +def darken(rgb, factor): + black = [0, 0, 0]; + return blend(black, rgb, factor) + + +#Converts rgb to hex +def rgbToHex(rgb): + #Add checks in here to make sure valid numbers + return '#%02x%02x%02x' % (rgb[0], rgb[1], rgb[2]) + + +#Calculates the primary, secondary and tertiary colours for the block style +def findOtherColours(rgb): + colourPrimary = rgbToHex(rgb) + colourSecondary = rgbToHex(lighten(rgb, LIGHT_FACTOR)) + colourTertiary = rgbToHex(darken(rgb, DARK_FACTOR)) + return { + "colourPrimary": colourPrimary, + "colourSecondary": colourSecondary, + "colourTertiary": colourTertiary + } + +# Converts a hex colour to rgb colour format +def hexToRgb(hexColour): + r = int(hexColour[1:3], 16) + g = int(hexColour[3:5], 16) + b = int(hexColour[5:7], 16) + return [r, g, b] + +# Converts either a hue or hex colour to rgb colour format +def findRgbVal(colour): + try: + hue = int(colour) + rgb = hsvToRgb(hue, HSV_SATURATION, BRIGHTNESS_VAL) + except (TypeError, ValueError): + hexColour = colour + rgb = hexToRgb(hexColour) + return rgb + +# Get info on the input file +def getFileInfo(): + if (len(sys.argv) < 2): + print("Please provide a filename") + sys.exit() + fileName = sys.argv[1] + try: + jsonFile = open(fileName).read() + except IOError as err: + print('Could not find that file name') + sys.exit() + return (jsonFile, fileName) + +# Creates a map with the keys being the style names and the values being an object +# holding colourPrimary, colourSecondary, colourTertiary +def createColourMap(): + (jsonFile, fileName) = getFileInfo() + jsonData = json.loads(jsonFile) + colourObj = {} + for key in jsonData.keys(): + rgbVal = findRgbVal(jsonData[key]) + colourObj[key] = findOtherColours(rgbVal) + f= open("new_" + fileName,"w+") + f.write(json.dumps(colourObj, indent=2, sort_keys=True)) + f.close() + +createColourMap() diff --git a/js/typings/README.md b/js/typings/README.md new file mode 100644 index 0000000..df9268c --- /dev/null +++ b/js/typings/README.md @@ -0,0 +1,13 @@ +# blockly.d.ts + +This ``blockly.d.ts`` file describes the TypeScript type definitions for Blockly. +If you consume Blockly through ``npm``, this file is already included in the ``npm`` package. +Otherwise, you can include a copy of this file with your sources and reference it through a [Triple-Slash directive](https://www.typescriptlang.org/docs/handbook/triple-slash-directives.html). + + +## Generating a new version + +To generate a new version of the Typings file, from the Blockly root directory run ``npm run typings``. +You will need to run ``npm install`` for this to work. + +Note: In order to check for errors in the typings file, run ``tsc`` in the ``typings/`` directory. diff --git a/js/typings/blockly.d.ts b/js/typings/blockly.d.ts new file mode 100644 index 0000000..da6ebfd --- /dev/null +++ b/js/typings/blockly.d.ts @@ -0,0 +1,18472 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Type definitions for Blockly. + * @author samelh@google.com (Sam El-Husseini) + */ + +export = Blockly; + +declare module Blockly { + + interface BlocklyOptions { + toolbox?: HTMLElement | string; + readOnly?: boolean; + trashcan?: boolean; + maxTrashcanContents?: number; + collapse?: boolean; + comments?: boolean; + disable?: boolean; + sounds?: boolean; + rtl?: boolean; + horizontalLayout?: boolean; + toolboxPosition?: string; + css?: boolean; + oneBasedIndex?: boolean; + media?: string; + theme?: Blockly.Theme | BlocklyThemeOptions; + move?: { + scrollbars?: boolean; + drag?: boolean; + wheel?: boolean; + }; + grid?: { + spacing?: number; + colour?: string; + length?: number; + snap?: boolean; + }; + zoom?: { + controls?: boolean; + wheel?: boolean; + startScale?: number; + maxScale?: number; + minScale?: number; + scaleSpeed?: number; + }; + } + + interface BlocklyThemeOptions { + blockStyles?: {[blocks: string]: Blockly.Theme.BlockStyle;}; + categoryStyles?: {[category: string]: Blockly.Theme.CategoryStyle;}; + componentStyles?: {[component: string]: any;}; + } + + interface Metrics { + absoluteLeft: number; + absoluteTop: number; + contentHeight: number; + contentLeft: number; + contentTop: number; + contentWidth: number; + viewHeight: number; + viewLeft: number; + viewTop: number; + viewWidth: number; + } + + /** + * Set the Blockly locale. + * Note: this method is only available in the npm release of Blockly. + * @param {!Object} msg An object of Blockly message strings in the desired + * language. + */ + function setLocale(msg: {[key: string]: string;}): void; +} + + +declare module Blockly { + + class Block extends Block__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Block__Class { + + /** + * Class for one block. + * Not normally called directly, workspace.newBlock() is preferred. + * @param {!Blockly.Workspace} workspace The block's workspace. + * @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 + * create a new ID. + * @constructor + * @throws When block is not valid or block name is not allowed. + */ + constructor(workspace: Blockly.Workspace, prototypeName: string, opt_id?: string); + + /** @type {string} */ + id: string; + + /** @type {Blockly.Connection} */ + outputConnection: Blockly.Connection; + + /** @type {Blockly.Connection} */ + nextConnection: Blockly.Connection; + + /** @type {Blockly.Connection} */ + previousConnection: Blockly.Connection; + + /** @type {!Array.} */ + inputList: Blockly.Input[]; + + /** @type {boolean|undefined} */ + inputsInline: boolean|any /*undefined*/; + + /** @type {string|!Function} */ + tooltip: string|Function; + + /** @type {boolean} */ + contextMenu: boolean; + + /** + * @type {Blockly.Block} + * @protected + */ + parentBlock_: Blockly.Block; + + /** + * @type {!Array.} + * @protected + */ + childBlocks_: Blockly.Block[]; + + /** + * @type {boolean} + * @protected + */ + collapsed_: boolean; + + /** + * @type {?number} + * @protected + */ + outputShape_: number; + + /** + * A string representing the comment attached to this block. + * @type {string|Blockly.Comment} + * @deprecated August 2019. Use getCommentText instead. + */ + comment: string|Blockly.Comment; + + /** + * A model of the comment attached to this block. + * @type {!Blockly.Block.CommentModel} + * @package + */ + commentModel: Blockly.Block.CommentModel; + + /** @type {!Blockly.Workspace} */ + workspace: Blockly.Workspace; + + /** @type {boolean} */ + isInFlyout: boolean; + + /** @type {boolean} */ + isInMutator: boolean; + + /** @type {boolean} */ + RTL: boolean; + + /** + * True if this block is an insertion marker. + * @type {boolean} + * @protected + */ + isInsertionMarker_: boolean; + + /** + * Name of the type of hat. + * @type {string|undefined} + */ + hat: string|any /*undefined*/; + + /** @type {string} */ + type: string; + + /** @type {boolean|undefined} */ + inputsInlineDefault: boolean|any /*undefined*/; + + /** + * Optional text data that round-trips between blocks and XML. + * Has no effect. May be used by 3rd parties for meta information. + * @type {?string} + */ + data: string; + + /** + * Has this block been disposed of? + * @type {boolean} + * @package + */ + disposed: boolean; + + /** + * Colour of the block in '#RRGGBB' format. + * @type {string} + * @protected + */ + colour_: string; + + /** + * Name of the block style. + * @type {?string} + * @protected + */ + styleName_: string; + + /** + * An optional method called during initialization. + * @type {?function()} + */ + init: { (): any /*missing*/ }; + + /** + * An optional callback method to use whenever the block's parent workspace + * changes. This is usually only called from the constructor, the block type + * initializer function, or an extension initializer function. + * @type {?function(Blockly.Events.Abstract)} + */ + onchange: { (_0: Blockly.Events.Abstract): any /*missing*/ }; + + /** + * An optional serialization method for defining how to serialize the + * mutation state. This must be coupled with defining `domToMutation`. + * @type {?function(...):!Element} + */ + mutationToDom: any /*missing*/; + + /** + * An optional deserialization method for defining how to deserialize the + * mutation state. This must be coupled with defining `mutationToDom`. + * @type {?function(!Element)} + */ + domToMutation: { (_0: Element): any /*missing*/ }; + + /** + * An optional property for suppressing adding STATEMENT_PREFIX and + * STATEMENT_SUFFIX to generated code. + * @type {?boolean} + */ + suppressPrefixSuffix: boolean; + + /** + * An optional property for declaring developer variables. Return a list of + * variable names for use by generators. Developer variables are never shown to + * the user, but are declared as global variables in the generated code. + * @type {?function():!Array.} + */ + getDeveloperVariables: { (): string[] }; + + /** + * 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. + * @suppress {checkTypes} + */ + dispose(healStack: boolean): void; + + /** + * Call initModel on all fields on the block. + * May be called more than once. + * Either initModel or initSvg must be called after creating a block and before + * the first interaction with it. Interactions include UI actions + * (e.g. clicking and dragging) and firing events (e.g. create, delete, and + * change). + * @public + */ + initModel(): void; + + /** + * 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=} opt_healStack Disconnect child statement and reconnect + * stack. Defaults to false. + */ + unplug(opt_healStack?: boolean): void; + + /** + * Returns all connections originating from this block. + * @param {boolean} _all If true, return all connections even hidden ones. + * @return {!Array.} Array of connections. + * @package + */ + getConnections_(_all: boolean): Blockly.Connection[]; + + /** + * 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. + * @package + */ + lastConnectionInStack(): Blockly.Connection; + + /** + * Bump unconnected blocks out of alignment. Two blocks which aren't actually + * connected should not coincidentally line up on screen. + */ + bumpNeighbours(): void; + + /** + * Return the parent block or null if this block is at the top level. + * @return {Blockly.Block} The block that holds the current block. + */ + getParent(): Blockly.Block; + + /** + * 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. + */ + getInputWithBlock(block: Blockly.Block): Blockly.Input; + + /** + * 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 + * statement, whereas the surrounding block is an if statement, while loop, etc. + * @return {Blockly.Block} The block that surrounds the current block. + */ + getSurroundParent(): Blockly.Block; + + /** + * Return the next statement block directly connected to this block. + * @return {Blockly.Block} The next statement block or null. + */ + getNextBlock(): Blockly.Block; + + /** + * Return the previous statement block directly connected to this block. + * @return {Blockly.Block} The previous statement block or null. + */ + getPreviousBlock(): Blockly.Block; + + /** + * 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. + * @package + */ + getFirstStatementConnection(): Blockly.Connection; + + /** + * Return the top-most block in this block's tree. + * This will return itself if this block is at the top level. + * @return {!Blockly.Block} The root block. + */ + getRootBlock(): Blockly.Block; + + /** + * Walk up from the given block up through the stack of blocks to find + * the top block of the sub stack. If we are nested in a statement input only + * find the top-most nested block. Do not go all the way to the root block. + * @return {!Blockly.Block} The top block in a stack. + * @package + */ + getTopStackBlock(): Blockly.Block; + + /** + * Find all the blocks that are directly nested inside this one. + * Includes value and statement inputs, as well as any following statement. + * Excludes any connection on an output tab or any preceding statement. + * Blocks are optionally sorted by position; top to bottom. + * @param {boolean} ordered Sort the list if true. + * @return {!Array.} Array of blocks. + */ + getChildren(ordered: boolean): Blockly.Block[]; + + /** + * Set parent of this block to be a new block or null. + * @param {Blockly.Block} newParent New parent block. + */ + setParent(newParent: Blockly.Block): void; + + /** + * Find all the blocks that are directly or indirectly nested inside this one. + * Includes this block in the list. + * Includes value and statement inputs, as well as any following statements. + * Excludes any connection on an output tab or any preceding statements. + * Blocks are optionally sorted by position; top to bottom. + * @param {boolean} ordered Sort the list if true. + * @return {!Array.} Flattened array of blocks. + */ + getDescendants(ordered: boolean): Blockly.Block[]; + + /** + * Get whether this block is deletable or not. + * @return {boolean} True if deletable. + */ + isDeletable(): boolean; + + /** + * Set whether this block is deletable or not. + * @param {boolean} deletable True if deletable. + */ + setDeletable(deletable: boolean): void; + + /** + * Get whether this block is movable or not. + * @return {boolean} True if movable. + */ + isMovable(): boolean; + + /** + * Set whether this block is movable or not. + * @param {boolean} movable True if movable. + */ + setMovable(movable: boolean): void; + + /** + * Get whether is block is duplicatable or not. If duplicating this block and + * descendants will put this block over the workspace's capacity this block is + * not duplicatable. If duplicating this block and descendants will put any + * type over their maxInstances this block is not duplicatable. + * @return {boolean} True if duplicatable. + */ + isDuplicatable(): boolean; + + /** + * Get whether this block is a shadow block or not. + * @return {boolean} True if a shadow. + */ + isShadow(): boolean; + + /** + * Set whether this block is a shadow block or not. + * @param {boolean} shadow True if a shadow. + */ + setShadow(shadow: boolean): void; + + /** + * Get whether this block is an insertion marker block or not. + * @return {boolean} True if an insertion marker. + * @package + */ + isInsertionMarker(): boolean; + + /** + * Set whether this block is an insertion marker block or not. + * Once set this cannot be unset. + * @param {boolean} insertionMarker True if an insertion marker. + * @package + */ + setInsertionMarker(insertionMarker: boolean): void; + + /** + * Get whether this block is editable or not. + * @return {boolean} True if editable. + */ + isEditable(): boolean; + + /** + * Set whether this block is editable or not. + * @param {boolean} editable True if editable. + */ + setEditable(editable: boolean): void; + + /** + * Returns if this block has been disposed of / deleted. + * @return {boolean} True if this block has been disposed of / deleted. + */ + isDisposed(): boolean; + + /** + * 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. + * @package + */ + getMatchingConnection(otherBlock: Blockly.Block, conn: Blockly.Connection): Blockly.Connection; + + /** + * Set the URL of this block's help page. + * @param {string|Function} url URL string for block help, or function that + * returns a URL. Null for no help. + */ + setHelpUrl(url: string|Function): void; + + /** + * Change the tooltip text for a block. + * @param {string|!Function} newTip Text for tooltip or a parent element to + * link to for its tooltip. May be a function that returns a string. + */ + setTooltip(newTip: string|Function): void; + + /** + * Get the colour of a block. + * @return {string} #RRGGBB string. + */ + getColour(): string; + + /** + * Get the name of the block style. + * @return {?string} Name of the block style. + */ + getStyleName(): string; + + /** + * Get the HSV hue value of a block. Null if hue not set. + * @return {?number} Hue value (0-360). + */ + getHue(): number; + + /** + * Change the colour of a block. + * @param {number|string} colour HSV hue value (0 to 360), #RRGGBB string, + * or a message reference string pointing to one of those two values. + */ + setColour(colour: number|string): void; + + /** + * Set the style and colour values of a block. + * @param {string} blockStyleName Name of the block style + */ + setStyle(blockStyleName: string): void; + + /** + * Sets a callback function to use whenever the block's parent workspace + * changes, replacing any prior onchange handler. This is usually only called + * from the constructor, the block type initializer function, or an extension + * initializer function. + * @param {function(Blockly.Events.Abstract)} onchangeFn The callback to call + * when the block's workspace changes. + * @throws {Error} if onchangeFn is not falsey or a function. + */ + setOnChange(onchangeFn: { (_0: Blockly.Events.Abstract): any /*missing*/ }): void; + + /** + * Returns the named field from a block. + * @param {string} name The name of the field. + * @return {Blockly.Field} Named field, or null if field does not exist. + */ + getField(name: string): Blockly.Field; + + /** + * Return all variables referenced by this block. + * @return {!Array.} List of variable names. + * @package + */ + getVars(): string[]; + + /** + * Return all variables referenced by this block. + * @return {!Array.} List of variable models. + * @package + */ + getVarModels(): Blockly.VariableModel[]; + + /** + * Notification that a variable is renaming but keeping the same ID. If the + * variable is in use on this block, rerender to show the new name. + * @param {!Blockly.VariableModel} variable The variable being renamed. + * @package + */ + updateVarName(variable: Blockly.VariableModel): void; + + /** + * Notification that a variable is renaming. + * If the ID matches one of this block's variables, rename it. + * @param {string} oldId ID of variable to rename. + * @param {string} newId ID of new variable. May be the same as oldId, but with + * an updated name. + */ + renameVarById(oldId: string, newId: string): void; + + /** + * Returns the language-neutral value from the field of a block. + * @param {string} name The name of the field. + * @return {*} Value from the field or null if field does not exist. + */ + getFieldValue(name: string): any; + + /** + * 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. + */ + setFieldValue(newValue: string, name: string): void; + + /** + * 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)=} opt_check Statement type or + * list of statement types. Null/undefined if any type could be connected. + */ + setPreviousStatement(newBoolean: boolean, opt_check?: string|string[]|any /*null*/): void; + + /** + * 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)=} opt_check Statement type or + * list of statement types. Null/undefined if any type could be connected. + */ + setNextStatement(newBoolean: boolean, opt_check?: string|string[]|any /*null*/): void; + + /** + * Set whether this block returns a value. + * @param {boolean} newBoolean True if there is an output. + * @param {(string|Array.|null)=} opt_check Returned type or list + * of returned types. Null or undefined if any type could be returned + * (e.g. variable get). + */ + setOutput(newBoolean: boolean, opt_check?: string|string[]|any /*null*/): void; + + /** + * Set whether value inputs are arranged horizontally or vertically. + * @param {boolean} newBoolean True if inputs are horizontal. + */ + setInputsInline(newBoolean: boolean): void; + + /** + * Get whether value inputs are arranged horizontally or vertically. + * @return {boolean} True if inputs are horizontal. + */ + getInputsInline(): boolean; + + /** + * Set the block's output shape. + * @param {?number} outputShape Value representing an output shape. + */ + setOutputShape(outputShape: number): void; + + /** + * Get the block's output shape. + * @return {?number} Value representing output shape if one exists. + */ + getOutputShape(): number; + + /** + * Set whether the block is disabled or not. + * @param {boolean} disabled True if disabled. + * @deprecated May 2019 + */ + setDisabled(disabled: boolean): void; + + /** + * Get whether this block is enabled or not. + * @return {boolean} True if enabled. + */ + isEnabled(): boolean; + + /** + * Set whether the block is enabled or not. + * @param {boolean} enabled True if enabled. + */ + setEnabled(enabled: boolean): void; + + /** + * Get whether the block is disabled or not due to parents. + * The block's own disabled property is not considered. + * @return {boolean} True if disabled. + */ + getInheritedDisabled(): boolean; + + /** + * Get whether the block is collapsed or not. + * @return {boolean} True if collapsed. + */ + isCollapsed(): boolean; + + /** + * Set whether the block is collapsed or not. + * @param {boolean} collapsed True if collapsed. + */ + setCollapsed(collapsed: boolean): void; + + /** + * Create a human-readable text representation of this block and any children. + * @param {number=} opt_maxLength Truncate the string to this length. + * @param {string=} opt_emptyToken The placeholder string used to denote an + * empty field. If not specified, '?' is used. + * @return {string} Text of block. + */ + toString(opt_maxLength?: number, opt_emptyToken?: string): string; + + /** + * Shortcut for appending a value input row. + * @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. + */ + appendValueInput(name: string): Blockly.Input; + + /** + * Shortcut for appending a statement input row. + * @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. + */ + appendStatementInput(name: string): Blockly.Input; + + /** + * Shortcut for appending a dummy input row. + * @param {string=} opt_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. + */ + appendDummyInput(opt_name?: string): Blockly.Input; + + /** + * Initialize this block using a cross-platform, internationalization-friendly + * JSON description. + * @param {!Object} json Structured data describing the block. + */ + jsonInit(json: Object): void; + + /** + * Add key/values from mixinObj to this block object. By default, this method + * will check that the keys in mixinObj will not overwrite existing values in + * the block, including prototype values. This provides some insurance against + * mixin / extension incompatibilities with future block features. This check + * can be disabled by passing true as the second argument. + * @param {!Object} mixinObj The key/values pairs to add to this block object. + * @param {boolean=} opt_disableCheck Option flag to disable overwrite checks. + */ + mixin(mixinObj: Object, opt_disableCheck?: boolean): void; + + /** + * 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. + * @protected + */ + appendInput_(type: number, name: string): Blockly.Input; + + /** + * Move a named input to a different location on this block. + * @param {string} name The name of the input to move. + * @param {?string} refName Name of input that should be after the moved input, + * or null to be the input at the end. + */ + moveInputBefore(name: string, refName: string): void; + + /** + * 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. + */ + moveNumberedInputBefore(inputIndex: number, refIndex: number): void; + + /** + * 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 {Error} if the input is not present and opt_quiet is not true. + */ + removeInput(name: string, opt_quiet?: boolean): void; + + /** + * Fetches the named input object. + * @param {string} name The name of the input. + * @return {Blockly.Input} The input object, or null if input does not exist. + */ + getInput(name: string): Blockly.Input; + + /** + * Fetches the block attached to the named input. + * @param {string} name The name of the input. + * @return {Blockly.Block} The attached value block, or null if the input is + * either disconnected or if the input does not exist. + */ + getInputTargetBlock(name: string): Blockly.Block; + + /** + * Returns the comment on this block (or null if there is no comment). + * @return {?string} Block's comment. + */ + getCommentText(): string; + + /** + * Set this block's comment text. + * @param {?string} text The text, or null to delete. + */ + setCommentText(text: string): void; + + /** + * Set this block's warning text. + * @param {?string} _text The text, or null to delete. + * @param {string=} _opt_id An optional ID for the warning text to be able to + * maintain multiple warnings. + */ + setWarningText(_text: string, _opt_id?: string): void; + + /** + * Give this block a mutator dialog. + * @param {Blockly.Mutator} _mutator A mutator dialog instance or null to + * remove. + */ + setMutator(_mutator: Blockly.Mutator): void; + + /** + * Return the coordinates of the top-left corner of this block relative to the + * drawing surface's origin (0,0), in workspace units. + * @return {!Blockly.utils.Coordinate} Object with .x and .y properties. + */ + getRelativeToSurfaceXY(): Blockly.utils.Coordinate; + + /** + * Move a block by a relative offset. + * @param {number} dx Horizontal offset, in workspace units. + * @param {number} dy Vertical offset, in workspace units. + */ + moveBy(dx: number, dy: number): void; + + /** + * 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. + * @protected + */ + makeConnection_(type: number): Blockly.Connection; + + /** + * Recursively checks whether all statement and value inputs are filled with + * blocks. Also checks all following statement blocks in this stack. + * @param {boolean=} opt_shadowBlocksAreFilled An optional argument controlling + * whether shadow blocks are counted as filled. Defaults to true. + * @return {boolean} True if all inputs are filled, false otherwise. + */ + allInputsFilled(opt_shadowBlocksAreFilled?: boolean): boolean; + + /** + * This method returns a string describing this Block in developer terms (type + * name and ID; English only). + * + * Intended to on be used in console logs and errors. If you need a string that + * uses the user's native language (including block text, field values, and + * child blocks), use [toString()]{@link Blockly.Block#toString}. + * @return {string} The description. + */ + toDevString(): string; + } + +} + +declare module Blockly.Block { + + /** + * @typedef {{ + * text:?string, + * pinned:boolean, + * size:Blockly.utils.Size + * }} + */ + interface CommentModel { + text: string; + pinned: boolean; + size: Blockly.utils.Size + } +} + + +declare module Blockly.blockAnimations { + + /** + * Play some UI effects (sound, animation) when disposing of a block. + * @param {!Blockly.BlockSvg} block The block being disposed of. + * @package + */ + function disposeUiEffect(block: Blockly.BlockSvg): void; + + /** + * Play some UI effects (sound, ripple) after a connection has been established. + * @param {!Blockly.BlockSvg} block The block being connected. + * @package + */ + function connectionUiEffect(block: Blockly.BlockSvg): void; + + /** + * Play some UI effects (sound, animation) when disconnecting a block. + * @param {!Blockly.BlockSvg} block The block being disconnected. + * @package + */ + function disconnectUiEffect(block: Blockly.BlockSvg): void; + + /** + * Stop the disconnect UI animation immediately. + * @package + */ + function disconnectUiStop(): void; +} + + +declare module Blockly { + + class BlockDragSurfaceSvg extends BlockDragSurfaceSvg__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class BlockDragSurfaceSvg__Class { + + /** + * Class for a drag surface for the currently dragged block. This is a separate + * SVG that contains only the currently moving block, or nothing. + * @param {!Element} container Containing element. + * @constructor + */ + constructor(container: Element); + + /** + * Create the drag surface and inject it into the container. + */ + createDom(): void; + + /** + * Set the SVG blocks on the drag surface's group and show the surface. + * Only one block group should be on the drag surface at a time. + * @param {!SVGElement} blocks Block or group of blocks to place on the drag + * surface. + */ + setBlocksAndShow(blocks: SVGElement): void; + + /** + * Translate and scale the entire drag surface group to the given position, to + * keep in sync with the workspace. + * @param {number} x X translation in workspace coordinates. + * @param {number} y Y translation in workspace coordinates. + * @param {number} scale Scale of the group. + */ + translateAndScaleGroup(x: number, y: number, scale: number): void; + + /** + * 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. + */ + translateSurface(x: number, y: number): void; + + /** + * Reports the surface translation in scaled workspace coordinates. + * Use this when finishing a drag to return blocks to the correct position. + * @return {!Blockly.utils.Coordinate} Current translation of the surface. + */ + getSurfaceTranslation(): Blockly.utils.Coordinate; + + /** + * Provide a reference to the drag group (primarily for + * BlockSvg.getRelativeToSurfaceXY). + * @return {SVGElement} Drag surface group element. + */ + getGroup(): SVGElement; + + /** + * Get the current blocks on the drag surface, if any (primarily + * for BlockSvg.getRelativeToSurfaceXY). + * @return {Element} Drag surface block DOM element, or undefined if no blocks + * exist. + */ + getCurrentBlock(): Element; + + /** + * Clear the group and hide the surface; move the blocks off onto the provided + * element. + * If the block is being deleted it doesn't need to go back to the original + * surface, since it would be removed immediately during dispose. + * @param {Element=} opt_newSurface Surface the dragging blocks should be moved + * to, or null if the blocks should be removed from this surface without + * being moved to a different surface. + */ + clearAndHide(opt_newSurface?: Element): void; + } + +} + + +declare module Blockly { + + class BlockDragger extends BlockDragger__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class BlockDragger__Class { + + /** + * Class for a block dragger. It moves blocks around the workspace when they + * are being dragged by a mouse or touch. + * @param {!Blockly.BlockSvg} block The block to drag. + * @param {!Blockly.WorkspaceSvg} workspace The workspace to drag on. + * @constructor + */ + constructor(block: Blockly.BlockSvg, workspace: Blockly.WorkspaceSvg); + + /** + * Sever all links from this object. + * @package + */ + dispose(): void; + + /** + * Start dragging a block. This includes moving it to the drag surface. + * @param {!Blockly.utils.Coordinate} currentDragDeltaXY How far the pointer has + * moved from the position at mouse down, in pixel units. + * @param {boolean} healStack Whether or not to heal the stack after + * disconnecting. + * @package + */ + startBlockDrag(currentDragDeltaXY: Blockly.utils.Coordinate, healStack: boolean): void; + + /** + * Execute a step of block dragging, based on the given event. Update the + * display accordingly. + * @param {!Event} e The most recent move event. + * @param {!Blockly.utils.Coordinate} currentDragDeltaXY How far the pointer has + * moved from the position at the start of the drag, in pixel units. + * @package + */ + dragBlock(e: Event, currentDragDeltaXY: Blockly.utils.Coordinate): void; + + /** + * Finish a block drag and put the block back on the workspace. + * @param {!Event} e The mouseup/touchend event. + * @param {!Blockly.utils.Coordinate} currentDragDeltaXY How far the pointer has + * moved from the position at the start of the drag, in pixel units. + * @package + */ + endBlockDrag(e: Event, currentDragDeltaXY: Blockly.utils.Coordinate): void; + + /** + * Get a list of the insertion markers that currently exist. Drags have 0, 1, + * or 2 insertion markers. + * @return {!Array.} A possibly empty list of insertion + * marker blocks. + * @package + */ + getInsertionMarkers(): Blockly.BlockSvg[]; + } + +} + + +declare module Blockly.Events { + + class BlockBase extends BlockBase__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class BlockBase__Class extends Blockly.Events.Abstract__Class { + + /** + * Abstract class for a block event. + * @param {Blockly.Block} block The block this event corresponds to. + * @extends {Blockly.Events.Abstract} + * @constructor + */ + constructor(block: Blockly.Block); + + /** + * The block id for the block this event pertains to + * @type {string} + */ + blockId: string; + + /** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ + toJson(): Object; + + /** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ + fromJson(json: Object): void; + } + + + class Change extends Change__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Change__Class extends Blockly.Events.BlockBase__Class { + + /** + * 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 {*} oldValue Previous value of element. + * @param {*} newValue New value of element. + * @extends {Blockly.Events.BlockBase} + * @constructor + */ + constructor(block: Blockly.Block, element: string, name: string, oldValue: any, newValue: any); + + /** + * Type of this event. + * @type {string} + */ + type: string; + + /** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ + toJson(): Object; + + /** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ + fromJson(json: Object): void; + + /** + * Does this event record any change of state? + * @return {boolean} False if something changed. + */ + isNull(): boolean; + + /** + * Run a change event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ + run(forward: boolean): void; + } + + + class BlockChange extends BlockChange__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class BlockChange__Class extends Blockly.Events.BlockBase__Class { + + /** + * 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 {*} oldValue Previous value of element. + * @param {*} newValue New value of element. + * @extends {Blockly.Events.BlockBase} + * @constructor + */ + constructor(block: Blockly.Block, element: string, name: string, oldValue: any, newValue: any); + } + + + class Create extends Create__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Create__Class extends Blockly.Events.BlockBase__Class { + + /** + * Class for a block creation event. + * @param {Blockly.Block} block The created block. Null for a blank event. + * @extends {Blockly.Events.BlockBase} + * @constructor + */ + constructor(block: Blockly.Block); + + /** + * Type of this event. + * @type {string} + */ + type: string; + + /** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ + toJson(): Object; + + /** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ + fromJson(json: Object): void; + + /** + * Run a creation event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ + run(forward: boolean): void; + } + + + class BlockCreate extends BlockCreate__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class BlockCreate__Class extends Blockly.Events.BlockBase__Class { + + /** + * Class for a block creation event. + * @param {Blockly.Block} block The created block. Null for a blank event. + * @extends {Blockly.Events.BlockBase} + * @constructor + */ + constructor(block: Blockly.Block); + } + + + class Delete extends Delete__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Delete__Class extends Blockly.Events.BlockBase__Class { + + /** + * Class for a block deletion event. + * @param {Blockly.Block} block The deleted block. Null for a blank event. + * @extends {Blockly.Events.BlockBase} + * @constructor + */ + constructor(block: Blockly.Block); + + /** + * Type of this event. + * @type {string} + */ + type: string; + + /** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ + toJson(): Object; + + /** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ + fromJson(json: Object): void; + + /** + * Run a deletion event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ + run(forward: boolean): void; + } + + + class BlockDelete extends BlockDelete__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class BlockDelete__Class extends Blockly.Events.BlockBase__Class { + + /** + * Class for a block deletion event. + * @param {Blockly.Block} block The deleted block. Null for a blank event. + * @extends {Blockly.Events.BlockBase} + * @constructor + */ + constructor(block: Blockly.Block); + } + + + class Move extends Move__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Move__Class extends Blockly.Events.BlockBase__Class { + + /** + * 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.BlockBase} + * @constructor + */ + constructor(block: Blockly.Block); + + /** + * Type of this event. + * @type {string} + */ + type: string; + + /** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ + toJson(): Object; + + /** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ + fromJson(json: Object): void; + + /** + * Record the block's new location. Called after the move. + */ + recordNew(): void; + + /** + * Does this event record any change of state? + * @return {boolean} False if something changed. + */ + isNull(): boolean; + + /** + * Run a move event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ + run(forward: boolean): void; + } + + + class BlockMove extends BlockMove__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class BlockMove__Class extends Blockly.Events.BlockBase__Class { + + /** + * 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.BlockBase} + * @constructor + */ + constructor(block: Blockly.Block); + } + +} + + +declare module Blockly { + + class BlockSvg extends BlockSvg__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class BlockSvg__Class extends Blockly.Block__Class { + + /** + * Class for a block's SVG representation. + * Not normally called directly, workspace.newBlock() is preferred. + * @param {!Blockly.WorkspaceSvg} workspace The block's workspace. + * @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 + * create a new ID. + * @extends {Blockly.Block} + * @constructor + */ + constructor(workspace: Blockly.WorkspaceSvg, prototypeName: string, opt_id?: string); + + /** + * A block style object. + * @type {!Blockly.Theme.BlockStyle} + */ + style: Blockly.Theme.BlockStyle; + + /** + * The renderer's path object. + * @type {Blockly.blockRendering.IPathObject} + * @package + */ + pathObject: Blockly.blockRendering.IPathObject; + + /** @type {boolean} */ + rendered: boolean; + + /** @type {!Blockly.WorkspaceSvg} */ + workspace: Blockly.WorkspaceSvg; + + /** @type {Blockly.RenderedConnection} */ + outputConnection: Blockly.RenderedConnection; + + /** @type {Blockly.RenderedConnection} */ + nextConnection: Blockly.RenderedConnection; + + /** @type {Blockly.RenderedConnection} */ + previousConnection: Blockly.RenderedConnection; + + /** + * Height of this block, not including any statement blocks above or below. + * Height is in workspace units. + */ + height: any /*missing*/; + + /** + * Width of this block, including any connected value blocks. + * Width is in workspace units. + */ + width: any /*missing*/; + + /** + * An optional method called when a mutator dialog is first opened. + * This function must create and initialize a top-level block for the mutator + * dialog, and return it. This function should also populate this top-level + * block with any sub-blocks which are appropriate. This method must also be + * coupled with defining a `compose` method for the default mutation dialog + * button and UI to appear. + * @type {?function(Blockly.WorkspaceSvg):!Blockly.BlockSvg} + */ + decompose: { (_0: Blockly.WorkspaceSvg): Blockly.BlockSvg }; + + /** + * An optional method called when a mutator dialog saves its content. + * This function is called to modify the original block according to new + * settings. This method must also be coupled with defining a `decompose` + * method for the default mutation dialog button and UI to appear. + * @type {?function(!Blockly.BlockSvg)} + */ + compose: { (_0: Blockly.BlockSvg): any /*missing*/ }; + + /** + * An optional method for defining custom block context menu items. + * @type {?function(!Array.)} + */ + customContextMenu: { (_0: Object[]): any /*missing*/ }; + + /** + * An property used internally to reference the block's rendering debugger. + * @type {?Blockly.blockRendering.Debug} + * @package + */ + renderingDebugger: Blockly.blockRendering.Debug; + + /** + * Create and initialize the SVG representation of the block. + * May be called more than once. + */ + initSvg(): void; + + /** + * Select this block. Highlight it visually. + */ + select(): void; + + /** + * Unselect this block. Remove its highlighting. + */ + unselect(): void; + + /** + * Block's mutator icon (if any). + * @type {Blockly.Mutator} + */ + mutator: Blockly.Mutator; + + /** + * Block's comment icon (if any). + * @type {Blockly.Comment} + * @deprecated August 2019. Use getCommentIcon instead. + */ + comment: Blockly.Comment; + + /** + * Block's warning icon (if any). + * @type {Blockly.Warning} + */ + warning: Blockly.Warning; + + /** + * Returns a list of mutator, comment, and warning icons. + * @return {!Array} List of icons. + */ + getIcons(): any[]; + + /** + * Return the coordinates of the top-left corner of this block relative to the + * drawing surface's origin (0,0), in workspace units. + * If the block is on the workspace, (0, 0) is the origin of the workspace + * coordinate system. + * This does not change with workspace scale. + * @return {!Blockly.utils.Coordinate} Object with .x and .y properties in + * workspace coordinates. + */ + getRelativeToSurfaceXY(): Blockly.utils.Coordinate; + + /** + * Move a block by a relative offset. + * @param {number} dx Horizontal offset in workspace units. + * @param {number} dy Vertical offset in workspace units. + */ + moveBy(dx: number, dy: number): void; + + /** + * Transforms a block by setting the translation on the transform attribute + * of the block's SVG. + * @param {number} x The x coordinate of the translation in workspace units. + * @param {number} y The y coordinate of the translation in workspace units. + */ + translate(x: number, y: number): void; + + /** + * Move this block to its workspace's drag surface, accounting for positioning. + * Generally should be called at the same time as setDragging_(true). + * Does nothing if useDragSurface_ is false. + * @package + */ + moveToDragSurface(): void; + + /** + * Move a block to a position. + * @param {Blockly.utils.Coordinate} xy The position to move to in workspace units. + */ + moveTo(xy: Blockly.utils.Coordinate): void; + + /** + * Move this block back to the workspace block canvas. + * Generally should be called at the same time as setDragging_(false). + * Does nothing if useDragSurface_ is false. + * @param {!Blockly.utils.Coordinate} newXY The position the block should take on + * on the workspace canvas, in workspace coordinates. + * @package + */ + moveOffDragSurface(newXY: Blockly.utils.Coordinate): void; + + /** + * Move this block during a drag, taking into account whether we are using a + * drag surface to translate blocks. + * This block must be a top-level block. + * @param {!Blockly.utils.Coordinate} newLoc The location to translate to, in + * workspace coordinates. + * @package + */ + moveDuringDrag(newLoc: Blockly.utils.Coordinate): void; + + /** + * Snap this block to the nearest grid point. + */ + snapToGrid(): void; + + /** + * Returns the coordinates of a bounding box describing the dimensions of this + * block and any blocks stacked below it. + * Coordinate system: workspace coordinates. + * @return {!Blockly.utils.Rect} Object with coordinates of the bounding box. + */ + getBoundingRectangle(): Blockly.utils.Rect; + + /** + * Notify every input on this block to mark its fields as dirty. + * A dirty field is a field that needs to be re-rendererd. + */ + markDirty(): void; + + /** + * Set whether the block is collapsed or not. + * @param {boolean} collapsed True if collapsed. + */ + setCollapsed(collapsed: boolean): void; + + /** + * Open the next (or previous) FieldTextInput. + * @param {!Blockly.Field} start Current field. + * @param {boolean} forward If true go forward, otherwise backward. + */ + tab(start: Blockly.Field, forward: boolean): void; + + /** + * Load the block's help page in a new window. + * @package + */ + showHelp(): void; + + /** + * Generate the context menu for this block. + * @protected + * @return {Array.} Context menu options + */ + generateContextMenu(): Object[]; + + /** + * Show the context menu for this block. + * @param {!Event} e Mouse event. + * @package + */ + showContextMenu(e: Event): void; + + /** + * Move the connections for this block and all blocks attached under it. + * Also update any attached bubbles. + * @param {number} dx Horizontal offset from current location, in workspace + * units. + * @param {number} dy Vertical offset from current location, in workspace + * units. + * @package + */ + moveConnections(dx: number, dy: number): void; + + /** + * Recursively adds or removes the dragging class to this node and its children. + * @param {boolean} adding True if adding, false if removing. + * @package + */ + setDragging(adding: boolean): void; + + /** + * Set whether this block is movable or not. + * @param {boolean} movable True if movable. + */ + setMovable(movable: boolean): void; + + /** + * Set whether this block is editable or not. + * @param {boolean} editable True if editable. + */ + setEditable(editable: boolean): void; + + /** + * Set whether this block is a shadow block or not. + * @param {boolean} shadow True if a shadow. + */ + setShadow(shadow: boolean): void; + + /** + * Set whether this block is an insertion marker block or not. + * Once set this cannot be unset. + * @param {boolean} insertionMarker True if an insertion marker. + * @package + */ + setInsertionMarker(insertionMarker: boolean): void; + + /** + * Return the root node of the SVG or null if none exists. + * @return {!SVGElement} The root SVG node (probably a group). + */ + getSvgRoot(): SVGElement; + + /** + * 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. + * @suppress {checkTypes} + */ + dispose(healStack?: boolean, animate?: boolean): void; + + /** + * Change the colour of a block. + * @package + */ + applyColour(): void; + + /** + * Enable or disable a block. + */ + updateDisabled(): void; + + /** + * Get the comment icon attached to this block, or null if the block has no + * comment. + * @return {Blockly.Comment} The comment icon attached to this block, or null. + */ + getCommentIcon(): Blockly.Comment; + + /** + * Set this block's comment text. + * @param {?string} text The text, or null to delete. + */ + setCommentText(text: string): void; + + /** + * Set this block's warning text. + * @param {?string} text The text, or null to delete. + * @param {string=} opt_id An optional ID for the warning text to be able to + * maintain multiple warnings. + */ + setWarningText(text: string, opt_id?: string): void; + + /** + * Give this block a mutator dialog. + * @param {Blockly.Mutator} mutator A mutator dialog instance or null to remove. + */ + setMutator(mutator: Blockly.Mutator): void; + + /** + * Set whether the block is disabled or not. + * @param {boolean} disabled True if disabled. + * @deprecated May 2019 + */ + setDisabled(disabled: boolean): void; + + /** + * Set whether the block is enabled or not. + * @param {boolean} enabled True if enabled. + */ + setEnabled(enabled: boolean): void; + + /** + * Set whether the block is highlighted or not. Block highlighting is + * often used to visually mark blocks currently being executed. + * @param {boolean} highlighted True if highlighted. + */ + setHighlighted(highlighted: boolean): void; + + /** + * Select this block. Highlight it visually. + */ + addSelect(): void; + + /** + * Unselect this block. Remove its highlighting. + */ + removeSelect(): void; + + /** + * Update the cursor over this block by adding or removing a class. + * @param {boolean} enable True if the delete cursor should be shown, false + * otherwise. + * @package + */ + setDeleteStyle(enable: boolean): void; + + /** + * Get the colour of a block. + * @return {string} #RRGGBB string. + */ + getColour(): string; + + /** + * Change the colour of a block. + * @param {number|string} colour HSV hue value, or #RRGGBB string. + */ + setColour(colour: number|string): void; + + /** + * Set the style and colour values of a block. + * @param {string} blockStyleName Name of the block style + * @throws {Error} if the block style does not exist. + */ + setStyle(blockStyleName: string): void; + + /** + * Move this block to the front of the visible workspace. + * tags do not respect z-index so SVG renders them in the + * order that they are in the DOM. By placing this block first within the + * block group's , it will render on top of any other blocks. + * @package + */ + bringToFront(): void; + + /** + * 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)=} opt_check Statement type or + * list of statement types. Null/undefined if any type could be connected. + */ + setPreviousStatement(newBoolean: boolean, opt_check?: string|string[]|any /*null*/): void; + + /** + * 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)=} opt_check Statement type or + * list of statement types. Null/undefined if any type could be connected. + */ + setNextStatement(newBoolean: boolean, opt_check?: string|string[]|any /*null*/): void; + + /** + * Set whether this block returns a value. + * @param {boolean} newBoolean True if there is an output. + * @param {(string|Array.|null)=} opt_check Returned type or list + * of returned types. Null or undefined if any type could be returned + * (e.g. variable get). + */ + setOutput(newBoolean: boolean, opt_check?: string|string[]|any /*null*/): void; + + /** + * Set whether value inputs are arranged horizontally or vertically. + * @param {boolean} newBoolean True if inputs are horizontal. + */ + setInputsInline(newBoolean: boolean): void; + + /** + * 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 {Error} if the input is not present and + * opt_quiet is not true. + */ + removeInput(name: string, opt_quiet?: boolean): void; + + /** + * 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. + */ + moveNumberedInputBefore(inputIndex: number, refIndex: number): void; + + /** + * Sets whether this block's connections are tracked in the database or not. + * + * Used by the deserializer to be more efficient. Setting a connection's + * tracked_ value to false keeps it from adding itself to the db when it + * gets its first moveTo call, saving expensive ops for later. + * @param {boolean} track If true, start tracking. If false, stop tracking. + * @package + */ + setConnectionTracking(track: boolean): void; + + /** + * 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. + * @package + */ + getConnections_(all: boolean): Blockly.RenderedConnection[]; + + /** + * 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. + * @protected + */ + makeConnection_(type: number): Blockly.RenderedConnection; + + /** + * Bump unconnected blocks out of alignment. Two blocks which aren't actually + * connected should not coincidentally line up on screen. + */ + bumpNeighbours(): void; + + /** + * Schedule snapping to grid and bumping neighbours to occur after a brief + * delay. + * @package + */ + scheduleSnapAndBump(): void; + + /** + * Position a block so that it doesn't move the target block when connected. + * The block to position is usually either the first block in a dragged stack or + * an insertion marker. + * @param {!Blockly.RenderedConnection} sourceConnection The connection on the + * moving block's stack. + * @param {!Blockly.RenderedConnection} targetConnection The connection that + * should stay stationary as this block is positioned. + * @package + */ + positionNearConnection(sourceConnection: Blockly.RenderedConnection, targetConnection: Blockly.RenderedConnection): void; + + /** + * 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. + */ + render(opt_bubble?: boolean): void; + + /** + * Add the cursor svg to this block's svg group. + * @param {SVGElement} cursorSvg The svg root of the cursor to be added to the + * block svg group. + * @package + */ + setCursorSvg(cursorSvg: SVGElement): void; + + /** + * Add the marker svg to this block's svg group. + * @param {SVGElement} markerSvg The svg root of the marker to be added to the + * block svg group. + * @package + */ + setMarkerSvg(markerSvg: SVGElement): void; + + /** + * 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 in workspace units. + * @package + */ + getHeightWidth(): { height: number; width: number }; + + /** + * Visual effect to show that if the dragging block is dropped, this block will + * be replaced. If a shadow block, it will disappear. Otherwise it will bump. + * @param {boolean} add True if highlighting should be added. + * @package + */ + highlightForReplacement(add: boolean): void; + + /** + * Visual effect to show that if the dragging block is dropped it will connect + * to this input. + * @param {Blockly.Connection} conn The connection on the input to highlight. + * @param {boolean} add True if highlighting should be added. + * @package + */ + highlightShapeForInput(conn: Blockly.Connection, add: boolean): void; + } + +} + +declare module Blockly.BlockSvg { + + /** + * Constant for identifying rows that are to be rendered inline. + * Don't collide with Blockly.INPUT_VALUE and friends. + * @const + */ + var INLINE: any /*missing*/; + + /** + * ID to give the "collapsed warnings" warning. Allows us to remove the + * "collapsed warnings" warning without removing any warnings that belong to + * the block. + * @type {string} + * @const + */ + var COLLAPSED_WARNING_ID: string; +} + + +declare module Blockly { + + /** + * Blockly core version. + * This constant is overridden by the build script (build.py) to the value of the version + * in package.json. This is done during the gen_core build step. + * For local builds, you can pass --define='Blockly.VERSION=X.Y.Z' to the compiler + * to override this constant. + * @define {string} + */ + var VERSION: any /*missing*/; + + /** + * The main workspace most recently used. + * Set by Blockly.WorkspaceSvg.prototype.markFocused + * @type {Blockly.Workspace} + */ + var mainWorkspace: Blockly.Workspace; + + /** + * Currently selected block. + * @type {Blockly.Block} + */ + var selected: Blockly.Block; + + /** + * All of the connections on blocks that are currently being dragged. + * @type {!Array.} + * @package + */ + var draggingConnections: Blockly.Connection[]; + + /** + * Blockly opaque event data used to unbind events when using + * `Blockly.bindEvent_` and `Blockly.bindEventWithChecks_`. + * @typedef {!Array.} + */ + interface EventData extends Array { } + + /** + * Returns the dimensions of the specified SVG image. + * @param {!SVGElement} svg SVG image. + * @return {!Object} Contains width and height properties. + */ + function svgSize(svg: SVGElement): Object; + + /** + * Size the workspace when the contents change. This also updates + * scrollbars accordingly. + * @param {!Blockly.WorkspaceSvg} workspace The workspace to resize. + */ + function resizeSvgContents(workspace: Blockly.WorkspaceSvg): void; + + /** + * Size the SVG image to completely fill its container. Call this when the view + * actually changes sizes (e.g. on a window resize/device orientation change). + * See Blockly.resizeSvgContents to resize the workspace when the contents + * change (e.g. when a block is added or removed). + * Record the height/width of the SVG image. + * @param {!Blockly.WorkspaceSvg} workspace Any workspace in the SVG. + */ + function svgResize(workspace: Blockly.WorkspaceSvg): void; + + /** + * Handle a key-down on SVG drawing surface. Does nothing if the main workspace + * is not visible. + * @param {!Event} e Key down event. + * @package + */ + function onKeyDown(e: Event): void; + + /** + * Duplicate this block and its children, or a workspace comment. + * @param {!Blockly.Block | !Blockly.WorkspaceComment} toDuplicate Block or + * Workspace Comment to be copied. + * @package + */ + function duplicate(toDuplicate: Blockly.Block|Blockly.WorkspaceComment): void; + + /** + * Close tooltips, context menus, dropdown selections, etc. + * @param {boolean=} opt_allowToolbox If true, don't close the toolbox. + */ + function hideChaff(opt_allowToolbox?: boolean): void; + + /** + * Returns the main workspace. Returns the last used main workspace (based on + * focus). Try not to use this function, particularly if there are multiple + * Blockly instances on a page. + * @return {!Blockly.Workspace} The main workspace. + */ + function getMainWorkspace(): Blockly.Workspace; + + /** + * Wrapper to window.alert() that app developers may override to + * provide alternatives to the modal browser window. + * @param {string} message The message to display to the user. + * @param {function()=} opt_callback The callback when the alert is dismissed. + */ + function alert(message: string, opt_callback?: { (): any /*missing*/ }): void; + + /** + * Wrapper to window.confirm() that app developers may override to + * provide alternatives to the modal browser window. + * @param {string} message The message to display to the user. + * @param {!function(boolean)} callback The callback for handling user response. + */ + function confirm(message: string, callback: { (_0: boolean): any /*missing*/ }): void; + + /** + * Wrapper to window.prompt() that app developers may override to provide + * alternatives to the modal browser window. Built-in browser prompts are + * often used for better text input experience on mobile device. We strongly + * recommend testing mobile when overriding this. + * @param {string} message The message to display to the user. + * @param {string} defaultValue The value to initialize the prompt with. + * @param {!function(?string)} callback The callback for handling user response. + */ + function prompt(message: string, defaultValue: string, callback: { (_0: string): any /*missing*/ }): void; + + /** + * Define blocks from an array of JSON block definitions, as might be generated + * by the Blockly Developer Tools. + * @param {!Array.} jsonArray An array of JSON block definitions. + */ + function defineBlocksWithJsonArray(jsonArray: Object[]): void; + + /** + * Bind an event to a function call. When calling the function, verifies that + * it belongs to the touch stream that is currently being processed, and splits + * multitouch events into multiple events as needed. + * @param {!EventTarget} 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. + * @param {boolean=} opt_noCaptureIdentifier True if triggering on this event + * should not block execution of other event handlers on this touch or + * other simultaneous touches. False by default. + * @param {boolean=} opt_noPreventDefault True if triggering on this event + * should prevent the default handler. False by default. If + * opt_noPreventDefault is provided, opt_noCaptureIdentifier must also be + * provided. + * @return {!Blockly.EventData} Opaque data that can be passed to unbindEvent_. + */ + function bindEventWithChecks_(node: EventTarget, name: string, thisObject: Object, func: Function, opt_noCaptureIdentifier?: boolean, opt_noPreventDefault?: boolean): Blockly.EventData; + + /** + * Bind an event to a function call. Handles multitouch events by using the + * coordinates of the first changed touch, and doesn't do any safety checks for + * simultaneous event processing. In most cases prefer is to use + * `Blockly.bindEventWithChecks_`. + * @param {!EventTarget} 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. + * @return {!Blockly.EventData} Opaque data that can be passed to unbindEvent_. + */ + function bindEvent_(node: EventTarget, name: string, thisObject: Object, func: Function): Blockly.EventData; + + /** + * Unbind one or more events event from a function call. + * @param {!Array.} bindData Opaque data from bindEvent_. + * This list is emptied during the course of calling this function. + * @return {!Function} The function call. + */ + function unbindEvent_(bindData: any[][]): Function; + + /** + * Is the given string a number (includes negative and decimals). + * @param {string} str Input string. + * @return {boolean} True if number, false otherwise. + */ + function isNumber(str: string): boolean; + + /** + * 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'. + */ + function hueToHex(hue: number): string; + + /** + * Checks old colour constants are not overwritten by the host application. + * If a constant is overwritten, it prints a console warning directing the + * developer to use the equivalent Msg constant. + * @package + */ + function checkBlockColourConstants(): void; +} + + +declare module Blockly { + + /** + * A mapping of block type names to block prototype objects. + * @type {!Object.} + */ + var Blocks: { [key: string]: Object }; +} + + +declare module Blockly { + + class Bubble extends Bubble__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Bubble__Class { + + /** + * Class for UI bubble. + * @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 {!Blockly.utils.Coordinate} 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 + */ + constructor(workspace: Blockly.WorkspaceSvg, content: Element, shape: Element, anchorXY: Blockly.utils.Coordinate, bubbleWidth: number, bubbleHeight: number); + + /** + * Describes whether this bubble has been disposed of (nodes and event + * listeners removed from the page) or not. + * @type {boolean} + * @package + */ + disposed: boolean; + + /** + * Return the root node of the bubble's SVG group. + * @return {SVGElement} The root SVG node of the bubble's group. + */ + getSvgRoot(): SVGElement; + + /** + * Expose the block's ID on the bubble's top-level SVG group. + * @param {string} id ID of block. + */ + setSvgId(id: string): void; + + /** + * Show the context menu for this bubble. + * @param {!Event} _e Mouse event. + * @package + */ + showContextMenu(_e: Event): void; + + /** + * Get whether this bubble is deletable or not. + * @return {boolean} True if deletable. + * @package + */ + isDeletable(): boolean; + + /** + * Register a function as a callback event for when the bubble is resized. + * @param {!Function} callback The function to call on resize. + */ + registerResizeEvent(callback: Function): void; + + /** + * Register a function as a callback event for when the bubble is moved. + * @param {!Function} callback The function to call on move. + */ + registerMoveEvent(callback: Function): void; + + /** + * Move this bubble to the top of the stack. + * @return {boolean} Whether or not the bubble has been moved. + * @package + */ + promote(): boolean; + + /** + * Notification that the anchor has moved. + * Update the arrow and bubble accordingly. + * @param {!Blockly.utils.Coordinate} xy Absolute location. + */ + setAnchorLocation(xy: Blockly.utils.Coordinate): void; + + /** + * Move the bubble group to the specified location in workspace coordinates. + * @param {number} x The x position to move to. + * @param {number} y The y position to move to. + * @package + */ + moveTo(x: number, y: number): void; + + /** + * Triggers a move callback if one exists at the end of a drag. + * @param {boolean} adding True if adding, false if removing. + * @package + */ + setDragging(adding: boolean): void; + + /** + * Get the dimensions of this bubble. + * @return {!Blockly.utils.Size} The height and width of the bubble. + */ + getBubbleSize(): Blockly.utils.Size; + + /** + * Size this bubble. + * @param {number} width Width of the bubble. + * @param {number} height Height of the bubble. + */ + setBubbleSize(width: number, height: number): void; + + /** + * Change the colour of a bubble. + * @param {string} hexColour Hex code of colour. + */ + setColour(hexColour: string): void; + + /** + * Dispose of this bubble. + */ + dispose(): void; + + /** + * Move this bubble during a drag, taking into account whether or not there is + * a drag surface. + * @param {Blockly.BlockDragSurfaceSvg} dragSurface The surface that carries + * rendered items during a drag, or null if no drag surface is in use. + * @param {!Blockly.utils.Coordinate} newLoc The location to translate to, in + * workspace coordinates. + * @package + */ + moveDuringDrag(dragSurface: Blockly.BlockDragSurfaceSvg, newLoc: Blockly.utils.Coordinate): void; + + /** + * Return the coordinates of the top-left corner of this bubble's body relative + * to the drawing surface's origin (0,0), in workspace units. + * @return {!Blockly.utils.Coordinate} Object with .x and .y properties. + */ + getRelativeToSurfaceXY(): Blockly.utils.Coordinate; + + /** + * Set whether auto-layout of this bubble is enabled. The first time a bubble + * is shown it positions itself to not cover any blocks. Once a user has + * dragged it to reposition, it renders where the user put it. + * @param {boolean} enable True if auto-layout should be enabled, false + * otherwise. + * @package + */ + setAutoLayout(enable: boolean): void; + } + +} + +declare module Blockly.Bubble { + + /** + * Width of the border around the bubble. + */ + var BORDER_WIDTH: any /*missing*/; + + /** + * Determines the thickness of the base of the arrow in relation to the size + * of the bubble. Higher numbers result in thinner arrows. + */ + var ARROW_THICKNESS: any /*missing*/; + + /** + * The number of degrees that the arrow bends counter-clockwise. + */ + var ARROW_ANGLE: any /*missing*/; + + /** + * The sharpness of the arrow's bend. Higher numbers result in smoother arrows. + */ + var ARROW_BEND: any /*missing*/; + + /** + * Distance between arrow point and anchor point. + */ + var ANCHOR_RADIUS: any /*missing*/; +} + + +declare module Blockly { + + class BubbleDragger extends BubbleDragger__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class BubbleDragger__Class { + + /** + * Class for a bubble dragger. It moves things on the bubble canvas around the + * workspace when they are being dragged by a mouse or touch. These can be + * block comments, mutators, warnings, or workspace comments. + * @param {!Blockly.Bubble|!Blockly.WorkspaceCommentSvg} bubble The item on the + * bubble canvas to drag. + * @param {!Blockly.WorkspaceSvg} workspace The workspace to drag on. + * @constructor + */ + constructor(bubble: Blockly.Bubble|Blockly.WorkspaceCommentSvg, workspace: Blockly.WorkspaceSvg); + + /** + * Sever all links from this object. + * @package + * @suppress {checkTypes} + */ + dispose(): void; + + /** + * Start dragging a bubble. This includes moving it to the drag surface. + * @package + */ + startBubbleDrag(): void; + + /** + * Execute a step of bubble dragging, based on the given event. Update the + * display accordingly. + * @param {!Event} e The most recent move event. + * @param {!Blockly.utils.Coordinate} currentDragDeltaXY How far the pointer has + * moved from the position at the start of the drag, in pixel units. + * @package + */ + dragBubble(e: Event, currentDragDeltaXY: Blockly.utils.Coordinate): void; + + /** + * Finish a bubble drag and put the bubble back on the workspace. + * @param {!Event} e The mouseup/touchend event. + * @param {!Blockly.utils.Coordinate} currentDragDeltaXY How far the pointer has + * moved from the position at the start of the drag, in pixel units. + * @package + */ + endBubbleDrag(e: Event, currentDragDeltaXY: Blockly.utils.Coordinate): void; + } + +} + + +declare module Blockly { + + class Comment extends Comment__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Comment__Class extends Blockly.Icon__Class { + + /** + * Class for a comment. + * @param {!Blockly.Block} block The block associated with this comment. + * @extends {Blockly.Icon} + * @constructor + */ + constructor(block: Blockly.Block); + + /** + * Show or hide the comment bubble. + * @param {boolean} visible True if the bubble should be visible. + */ + setVisible(visible: boolean): void; + + /** + * Get the dimensions of this comment's bubble. + * @return {Blockly.utils.Size} Object with width and height properties. + */ + getBubbleSize(): Blockly.utils.Size; + + /** + * Size this comment's bubble. + * @param {number} width Width of the bubble. + * @param {number} height Height of the bubble. + */ + setBubbleSize(width: number, height: number): void; + + /** + * Returns this comment's text. + * @return {string} Comment text. + * @deprecated August 2019 Use block.getCommentText() instead. + */ + getText(): string; + + /** + * Set this comment's text. + * + * If you want to receive a comment change event, then this should not be called + * directly. Instead call block.setCommentText(); + * @param {string} text Comment text. + * @deprecated August 2019 Use block.setCommentText() instead. + */ + setText(text: string): void; + + /** + * Update the comment's view to match the model. + * @package + */ + updateText(): void; + + /** + * Dispose of this comment. + * + * If you want to receive a comment "delete" event (newValue: null), then this + * should not be called directly. Instead call block.setCommentText(null); + */ + dispose(): void; + } + +} + + +declare module Blockly { + + class Connection extends Connection__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Connection__Class { + + /** + * Class for a connection between blocks. + * @param {!Blockly.Block} source The block establishing this connection. + * @param {number} type The type of the connection. + * @constructor + */ + constructor(source: Blockly.Block, type: number); + + /** + * @type {!Blockly.Block} + * @protected + */ + sourceBlock_: Blockly.Block; + + /** @type {number} */ + type: number; + + /** + * Connection this connection connects to. Null if not connected. + * @type {Blockly.Connection} + */ + targetConnection: Blockly.Connection; + + /** + * Has this connection been disposed of? + * @type {boolean} + * @package + */ + disposed: boolean; + + /** + * Horizontal location of this connection. + * @type {number} + * @package + */ + x: number; + + /** + * Vertical location of this connection. + * @type {number} + * @package + */ + y: number; + + /** + * Connect two connections together. This is the connection on the superior + * block. + * @param {!Blockly.Connection} childConnection Connection on inferior block. + * @protected + */ + connect_(childConnection: Blockly.Connection): void; + + /** + * Dispose of this connection and deal with connected blocks. + * @package + */ + dispose(): void; + + /** + * Get the source block for this connection. + * @return {!Blockly.Block} The source block. + */ + getSourceBlock(): Blockly.Block; + + /** + * Does the connection belong to a superior block (higher in the source stack)? + * @return {boolean} True if connection faces down or right. + */ + isSuperior(): boolean; + + /** + * Is the connection connected? + * @return {boolean} True if connection is connected to another connection. + */ + isConnected(): boolean; + + /** + * 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. + * @package + */ + canConnectWithReason(target: Blockly.Connection): number; + + /** + * 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. + * @package + */ + checkConnection(target: Blockly.Connection): void; + + /** + * Check if the two connections can be dragged to connect to each other. + * @param {!Blockly.Connection} candidate A nearby connection to check. + * @return {boolean} True if the connection is allowed, false otherwise. + */ + isConnectionAllowed(candidate: Blockly.Connection): boolean; + + /** + * Behavior after a connection attempt fails. + * @param {!Blockly.Connection} _otherConnection Connection that this connection + * failed to connect to. + * @package + */ + onFailedConnect(_otherConnection: Blockly.Connection): void; + + /** + * Connect this connection to another connection. + * @param {!Blockly.Connection} otherConnection Connection to connect to. + */ + connect(otherConnection: Blockly.Connection): void; + + /** + * Disconnect this connection. + */ + disconnect(): void; + + /** + * Disconnect two blocks that are connected by this connection. + * @param {!Blockly.Block} parentBlock The superior block. + * @param {!Blockly.Block} childBlock The inferior block. + * @protected + */ + disconnectInternal_(parentBlock: Blockly.Block, childBlock: Blockly.Block): void; + + /** + * Respawn the shadow block if there was one connected to the this connection. + * @protected + */ + respawnShadow_(): void; + + /** + * Returns the block that this connection connects to. + * @return {Blockly.Block} The connected block or null if none is connected. + */ + targetBlock(): Blockly.Block; + + /** + * Is this connection compatible with another connection with respect to the + * value type system. E.g. square_root("Hello") is not compatible. + * @param {!Blockly.Connection} otherConnection Connection to compare against. + * @return {boolean} True if the connections share a type. + */ + checkType(otherConnection: Blockly.Connection): boolean; + + /** + * Function to be called when this connection's compatible types have changed. + * @protected + */ + onCheckChanged_(): void; + + /** + * Change a connection's compatibility. + * @param {?(string|!Array)} check Compatible value type or list of + * value types. Null if all types are compatible. + * @return {!Blockly.Connection} The connection being modified + * (to allow chaining). + */ + setCheck(check: string|string[]): Blockly.Connection; + + /** + * Get a connection's compatibility. + * @return {Array} List of compatible value types. + * Null if all types are compatible. + * @public + */ + getCheck(): any[]; + + /** + * Change a connection's shadow block. + * @param {Element} shadow DOM representation of a block or null. + */ + setShadowDom(shadow: Element): void; + + /** + * Return a connection's shadow block. + * @return {Element} Shadow DOM representation of a block or null. + */ + getShadowDom(): Element; + + /** + * Find all nearby compatible connections to this connection. + * Type checking does not apply, since this function is used for bumping. + * + * Headless configurations (the default) do not have neighboring connection, + * and always return an empty list (the default). + * {@link Blockly.RenderedConnection} overrides this behavior with a list + * computed from the rendered positioning. + * @param {number} _maxLimit The maximum radius to another connection. + * @return {!Array.} List of connections. + * @package + */ + neighbours(_maxLimit: number): Blockly.Connection[]; + + /** + * Get the parent input of a connection. + * @return {Blockly.Input} The input that the connection belongs to or null if + * no parent exists. + * @package + */ + getParentInput(): Blockly.Input; + + /** + * This method returns a string describing this Connection in developer terms + * (English only). Intended to on be used in console logs and errors. + * @return {string} The description. + */ + toString(): string; + } + +} + +declare module Blockly.Connection { + + /** + * Constants for checking whether two connections are compatible. + */ + var CAN_CONNECT: any /*missing*/; + + /** + * 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. + * @package + */ + function lastConnectionInRow(startBlock: Blockly.Block, orphanBlock: Blockly.Block): Blockly.Connection; +} + + +declare module Blockly { + + class ConnectionDB extends ConnectionDB__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class ConnectionDB__Class { + + /** + * 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 + */ + constructor(); + + /** + * Add a connection to the database. Should not already exist in the database. + * @param {!Blockly.RenderedConnection} connection The connection to be added. + * @param {number} yPos The y position used to decide where to insert the + * connection. + * @package + */ + addConnection(connection: Blockly.RenderedConnection, yPos: number): void; + + /** + * Remove a connection from the database. Must already exist in DB. + * @param {!Blockly.RenderedConnection} connection The connection to be removed. + * @param {number} yPos The y position used to find the index of the connection. + * @throws {Error} If the connection cannot be found in the database. + */ + removeConnection(connection: Blockly.RenderedConnection, yPos: number): void; + + /** + * Find all nearby connections to the given connection. + * Type checking does not apply, since this function is used for bumping. + * @param {!Blockly.RenderedConnection} connection The connection whose + * neighbours should be returned. + * @param {number} maxRadius The maximum radius to another connection. + * @return {!Array.} List of connections. + */ + getNeighbours(connection: Blockly.RenderedConnection, maxRadius: number): Blockly.RenderedConnection[]; + + /** + * Find the closest compatible connection to this connection. + * @param {!Blockly.RenderedConnection} conn The connection searching for a compatible + * mate. + * @param {number} maxRadius The maximum radius to another connection. + * @param {!Blockly.utils.Coordinate} dxy Offset between this connection's + * location in the database and the current location (as a result of + * dragging). + * @return {!{connection: Blockly.RenderedConnection, radius: number}} + * Contains two properties: 'connection' which is either another + * connection or null, and 'radius' which is the distance. + */ + searchForClosest(conn: Blockly.RenderedConnection, maxRadius: number, dxy: Blockly.utils.Coordinate): { connection: Blockly.RenderedConnection; radius: number }; + } + +} + +declare module Blockly.ConnectionDB { + + /** + * Initialize a set of connection DBs for a workspace. + * @return {!Array.} Array of databases. + */ + function init(): Blockly.ConnectionDB[]; +} + + +declare module Blockly { + + /** + * The multiplier for scroll wheel deltas using the line delta mode. + * @type {number} + */ + var LINE_MODE_MULTIPLIER: number; + + /** + * The multiplier for scroll wheel deltas using the page delta mode. + * @type {number} + */ + var PAGE_MODE_MULTIPLIER: number; + + /** + * Number of pixels the mouse must move before a drag starts. + */ + var DRAG_RADIUS: any /*missing*/; + + /** + * Number of pixels the mouse must move before a drag/scroll starts from the + * flyout. Because the drag-intention is determined when this is reached, it is + * larger than Blockly.DRAG_RADIUS so that the drag-direction is clearer. + */ + var FLYOUT_DRAG_RADIUS: any /*missing*/; + + /** + * Maximum misalignment between connections for them to snap together. + */ + var SNAP_RADIUS: any /*missing*/; + + /** + * Maximum misalignment between connections for them to snap together, + * when a connection is already highlighted. + */ + var CONNECTING_SNAP_RADIUS: any /*missing*/; + + /** + * 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. + */ + var CURRENT_CONNECTION_PREFERENCE: any /*missing*/; + + /** + * The main colour of insertion markers, in hex. The block is rendered a + * transparent grey by changing the fill opacity in CSS. + */ + var INSERTION_MARKER_COLOUR: any /*missing*/; + + /** + * Delay in ms between trigger and bumping unconnected block out of alignment. + */ + var BUMP_DELAY: any /*missing*/; + + /** + * Maximum randomness in workspace units for bumping a block. + */ + var BUMP_RANDOMNESS: any /*missing*/; + + /** + * Number of characters to truncate a collapsed block to. + */ + var COLLAPSE_CHARS: any /*missing*/; + + /** + * Length in ms for a touch to become a long press. + */ + var LONGPRESS: any /*missing*/; + + /** + * Prevent a sound from playing if another sound preceded it within this many + * milliseconds. + */ + var SOUND_LIMIT: any /*missing*/; + + /** + * When dragging a block out of a stack, split the stack in two (true), or drag + * out the block healing the stack (false). + */ + var DRAG_STACK: any /*missing*/; + + /** + * The richness of block colours, regardless of the hue. + * Must be in the range of 0 (inclusive) to 1 (exclusive). + */ + var HSV_SATURATION: any /*missing*/; + + /** + * The intensity of block colours, regardless of the hue. + * Must be in the range of 0 (inclusive) to 1 (exclusive). + */ + var HSV_VALUE: any /*missing*/; + + /** + * Sprited icons and images. + */ + var SPRITE: any /*missing*/; + + /** + * ENUM for a right-facing value input. E.g. 'set item to' or 'return'. + * @const + */ + var INPUT_VALUE: any /*missing*/; + + /** + * ENUM for a left-facing value output. E.g. 'random fraction'. + * @const + */ + var OUTPUT_VALUE: any /*missing*/; + + /** + * ENUM for a down-facing block stack. E.g. 'if-do' or 'else'. + * @const + */ + var NEXT_STATEMENT: any /*missing*/; + + /** + * ENUM for an up-facing block stack. E.g. 'break out of loop'. + * @const + */ + var PREVIOUS_STATEMENT: any /*missing*/; + + /** + * ENUM for an dummy input. Used to add field(s) with no input. + * @const + */ + var DUMMY_INPUT: any /*missing*/; + + /** + * ENUM for left alignment. + * @const + */ + var ALIGN_LEFT: any /*missing*/; + + /** + * ENUM for centre alignment. + * @const + */ + var ALIGN_CENTRE: any /*missing*/; + + /** + * ENUM for right alignment. + * @const + */ + var ALIGN_RIGHT: any /*missing*/; + + /** + * ENUM for no drag operation. + * @const + */ + var DRAG_NONE: any /*missing*/; + + /** + * ENUM for inside the sticky DRAG_RADIUS. + * @const + */ + var DRAG_STICKY: any /*missing*/; + + /** + * ENUM for inside the non-sticky DRAG_RADIUS, for differentiating between + * clicks and drags. + * @const + */ + var DRAG_BEGIN: any /*missing*/; + + /** + * ENUM for freely draggable (outside the DRAG_RADIUS, if one applies). + * @const + */ + var DRAG_FREE: any /*missing*/; + + /** + * Lookup table for determining the opposite type of a connection. + * @const + */ + var OPPOSITE_TYPE: any /*missing*/; + + /** + * ENUM for toolbox and flyout at top of screen. + * @const + */ + var TOOLBOX_AT_TOP: any /*missing*/; + + /** + * ENUM for toolbox and flyout at bottom of screen. + * @const + */ + var TOOLBOX_AT_BOTTOM: any /*missing*/; + + /** + * ENUM for toolbox and flyout at left of screen. + * @const + */ + var TOOLBOX_AT_LEFT: any /*missing*/; + + /** + * ENUM for toolbox and flyout at right of screen. + * @const + */ + var TOOLBOX_AT_RIGHT: any /*missing*/; + + /** + * ENUM representing that an event is not in any delete areas. + * Null for backwards compatibility reasons. + * @const + */ + var DELETE_AREA_NONE: any /*missing*/; + + /** + * ENUM representing that an event is in the delete area of the trash can. + * @const + */ + var DELETE_AREA_TRASH: any /*missing*/; + + /** + * ENUM representing that an event is in the delete area of the toolbox or + * flyout. + * @const + */ + var DELETE_AREA_TOOLBOX: any /*missing*/; + + /** + * String for use in the "custom" attribute of a category in toolbox XML. + * This string indicates that the category should be dynamically populated with + * variable blocks. + * @const {string} + */ + var VARIABLE_CATEGORY_NAME: any /*missing*/; + + /** + * String for use in the "custom" attribute of a category in toolbox XML. + * This string indicates that the category should be dynamically populated with + * variable blocks. + * @const {string} + */ + var VARIABLE_DYNAMIC_CATEGORY_NAME: any /*missing*/; + + /** + * String for use in the "custom" attribute of a category in toolbox XML. + * This string indicates that the category should be dynamically populated with + * procedure blocks. + * @const {string} + */ + var PROCEDURE_CATEGORY_NAME: any /*missing*/; + + /** + * String for use in the dropdown created in field_variable. + * This string indicates that this option in the dropdown is 'Rename + * variable...' and if selected, should trigger the prompt to rename a variable. + * @const {string} + */ + var RENAME_VARIABLE_ID: any /*missing*/; + + /** + * String for use in the dropdown created in field_variable. + * This string indicates that this option in the dropdown is 'Delete the "%1" + * variable' and if selected, should trigger the prompt to delete a variable. + * @const {string} + */ + var DELETE_VARIABLE_ID: any /*missing*/; +} + + +declare module Blockly.ContextMenu { + + /** + * Which block is the context menu attached to? + * @type {Blockly.Block} + */ + var currentBlock: Blockly.Block; + + /** + * Construct the menu based on the list of options and show the menu. + * @param {!Event} e Mouse event. + * @param {!Array.} options Array of menu options. + * @param {boolean} rtl True if RTL, false if LTR. + */ + function show(e: Event, options: Object[], rtl: boolean): void; + + /** + * Hide the context menu. + */ + function hide(): void; + + /** + * Create a callback function that creates and configures a block, + * then places the new block next to the original. + * @param {!Blockly.Block} block Original block. + * @param {!Element} xml XML representation of new block. + * @return {!Function} Function that creates a block. + */ + function callbackFactory(block: Blockly.Block, xml: Element): Function; + + /** + * Make a context menu option for deleting the current block. + * @param {!Blockly.BlockSvg} block The block where the right-click originated. + * @return {!Object} A menu option, containing text, enabled, and a callback. + * @package + */ + function blockDeleteOption(block: Blockly.BlockSvg): Object; + + /** + * Make a context menu option for showing help for the current block. + * @param {!Blockly.BlockSvg} block The block where the right-click originated. + * @return {!Object} A menu option, containing text, enabled, and a callback. + * @package + */ + function blockHelpOption(block: Blockly.BlockSvg): Object; + + /** + * Make a context menu option for duplicating the current block. + * @param {!Blockly.BlockSvg} block The block where the right-click originated. + * @return {!Object} A menu option, containing text, enabled, and a callback. + * @package + */ + function blockDuplicateOption(block: Blockly.BlockSvg): Object; + + /** + * Make a context menu option for adding or removing comments on the current + * block. + * @param {!Blockly.BlockSvg} block The block where the right-click originated. + * @return {!Object} A menu option, containing text, enabled, and a callback. + * @package + */ + function blockCommentOption(block: Blockly.BlockSvg): Object; + + /** + * Make a context menu option for deleting the current workspace comment. + * @param {!Blockly.WorkspaceCommentSvg} comment The workspace comment where the + * right-click originated. + * @return {!Object} A menu option, containing text, enabled, and a callback. + * @package + */ + function commentDeleteOption(comment: Blockly.WorkspaceCommentSvg): Object; + + /** + * Make a context menu option for duplicating the current workspace comment. + * @param {!Blockly.WorkspaceCommentSvg} comment The workspace comment where the + * right-click originated. + * @return {!Object} A menu option, containing text, enabled, and a callback. + * @package + */ + function commentDuplicateOption(comment: Blockly.WorkspaceCommentSvg): Object; + + /** + * Make a context menu option for adding a comment on the workspace. + * @param {!Blockly.WorkspaceSvg} ws The workspace where the right-click + * originated. + * @param {!Event} e The right-click mouse event. + * @return {!Object} A menu option, containing text, enabled, and a callback. + * @package + * @suppress {strictModuleDepCheck,checkTypes} Suppress checks while workspace + * comments are not bundled in. + */ + function workspaceCommentOption(ws: Blockly.WorkspaceSvg, e: Event): Object; +} + + +declare module Blockly.Css { + + /** + * Add some CSS to the blob that will be injected later. Allows optional + * components such as fields and the toolbox to store separate CSS. + * The provided array of CSS will be destroyed by this function. + * @param {!Array.} cssArray Array of CSS strings. + */ + function register(cssArray: string[]): void; + + /** + * Inject the CSS into the DOM. This is preferable over using a regular CSS + * file since: + * a) It loads synchronously and doesn't force a redraw later. + * b) It speeds up loading by not blocking on a separate HTTP transfer. + * c) The CSS content may be made dynamic depending on init options. + * @param {boolean} hasCss If false, don't inject CSS + * (providing CSS becomes the document's responsibility). + * @param {string} pathToMedia Path from page to the Blockly media directory. + */ + function inject(hasCss: boolean, pathToMedia: string): void; + + /** + * Set the cursor to be displayed when over something draggable. + * See See https://github.com/google/blockly/issues/981 for context. + * @param {*} _cursor Enum. + * @deprecated April 2017. + */ + function setCursor(_cursor: any): void; + + /** + * Array making up the CSS content for Blockly. + */ + var CONTENT: any /*missing*/; +} + + +declare module Blockly { + + class DropDownDiv extends DropDownDiv__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class DropDownDiv__Class { + + /** + * Class for drop-down div. + * @constructor + * @package + */ + constructor(); + } + +} + +declare module Blockly.DropDownDiv { + + /** + * Arrow size in px. Should match the value in CSS + * (need to position pre-render). + * @type {number} + * @const + */ + var ARROW_SIZE: number; + + /** + * Drop-down border size in px. Should match the value in CSS (need to position + * the arrow). + * @type {number} + * @const + */ + var BORDER_SIZE: number; + + /** + * Amount the arrow must be kept away from the edges of the main drop-down div, + * in px. + * @type {number} + * @const + */ + var ARROW_HORIZONTAL_PADDING: number; + + /** + * Amount drop-downs should be padded away from the source, in px. + * @type {number} + * @const + */ + var PADDING_Y: number; + + /** + * Length of animations in seconds. + * @type {number} + * @const + */ + var ANIMATION_TIME: number; + + /** + * Create and insert the DOM element for this div. + * @package + */ + function createDom(): void; + + /** + * Set an element to maintain bounds within. Drop-downs will appear + * within the box of this element if possible. + * @param {Element} boundsElement Element to bind drop-down to. + */ + function setBoundsElement(boundsElement: Element): void; + + /** + * Provide the div for inserting content into the drop-down. + * @return {Element} Div to populate with content + */ + function getContentDiv(): Element; + + /** + * Clear the content of the drop-down. + */ + function clearContent(): void; + + /** + * Set the colour for the drop-down. + * @param {string} backgroundColour Any CSS colour for the background. + * @param {string} borderColour Any CSS colour for the border. + */ + function setColour(backgroundColour: string, borderColour: string): void; + + /** + * Shortcut to show and place the drop-down with positioning determined + * by a particular block. The primary position will be below the block, + * and the secondary position above the block. Drop-down will be + * constrained to the block's workspace. + * @param {!Blockly.Field} field The field showing the drop-down. + * @param {!Blockly.Block} block Block to position the drop-down around. + * @param {Function=} opt_onHide Optional callback for when the drop-down is + * hidden. + * @param {number=} opt_secondaryYOffset Optional Y offset for above-block + * positioning. + * @return {boolean} True if the menu rendered below block; false if above. + */ + function showPositionedByBlock(field: Blockly.Field, block: Blockly.Block, opt_onHide?: Function, opt_secondaryYOffset?: number): boolean; + + /** + * Shortcut to show and place the drop-down with positioning determined + * by a particular field. The primary position will be below the field, + * and the secondary position above the field. Drop-down will be + * constrained to the block's workspace. + * @param {!Blockly.Field} field The field to position the dropdown against. + * @param {Function=} opt_onHide Optional callback for when the drop-down is + * hidden. + * @param {number=} opt_secondaryYOffset Optional Y offset for above-block + * positioning. + * @return {boolean} True if the menu rendered below block; false if above. + */ + function showPositionedByField(field: Blockly.Field, opt_onHide?: Function, opt_secondaryYOffset?: number): boolean; + + /** + * 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 {boolean} rtl Right-to-left (true) or left-to-right (false). + * @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. + * @package + */ + function show(owner: Object, rtl: boolean, primaryX: number, primaryY: number, secondaryX: number, secondaryY: number, opt_onHide?: Function): boolean; + + /** + * Get the x positions for the left side of the DropDownDiv and the arrow, + * accounting for the bounds of the workspace. + * @param {number} sourceX Desired origin point x, in absolute px. + * @param {number} boundsLeft The left edge of the bounding element, in + * absolute px. + * @param {number} boundsRight The right edge of the bounding element, in + * absolute px. + * @param {number} divWidth The width of the div in px. + * @return {{divX: number, arrowX: number}} An object containing metrics for + * the x positions of the left side of the DropDownDiv and the arrow. + * @package + */ + function getPositionX(sourceX: number, boundsLeft: number, boundsRight: number, divWidth: number): { divX: number; arrowX: number }; + + /** + * Is the container visible? + * @return {boolean} True if visible. + */ + function isVisible(): boolean; + + /** + * 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. + * @param {boolean=} opt_withoutAnimation True if we should hide the dropdown + * without animating. + * @return {boolean} True if hidden. + */ + function hideIfOwner(owner: Object, opt_withoutAnimation?: boolean): boolean; + + /** + * Hide the menu, triggering animation. + */ + function hide(): void; + + /** + * Hide the menu, without animation. + */ + function hideWithoutAnimation(): void; + + /** + * Repositions the dropdownDiv on window resize. If it doesn't know how to + * calculate the new position, it will just hide it instead. + * @package + */ + function repositionForWindowResize(): void; +} + + +declare module Blockly.Events { + + /** + * Sets whether the next event should be added to the undo stack. + * @type {boolean} + */ + var recordUndo: boolean; + + /** + * Name of event that creates a block. Will be deprecated for BLOCK_CREATE. + * @const + */ + var CREATE: any /*missing*/; + + /** + * Name of event that creates a block. + * @const + */ + var BLOCK_CREATE: any /*missing*/; + + /** + * Name of event that deletes a block. Will be deprecated for BLOCK_DELETE. + * @const + */ + var DELETE: any /*missing*/; + + /** + * Name of event that deletes a block. + * @const + */ + var BLOCK_DELETE: any /*missing*/; + + /** + * Name of event that changes a block. Will be deprecated for BLOCK_CHANGE. + * @const + */ + var CHANGE: any /*missing*/; + + /** + * Name of event that changes a block. + * @const + */ + var BLOCK_CHANGE: any /*missing*/; + + /** + * Name of event that moves a block. Will be deprecated for BLOCK_MOVE. + * @const + */ + var MOVE: any /*missing*/; + + /** + * Name of event that moves a block. + * @const + */ + var BLOCK_MOVE: any /*missing*/; + + /** + * Name of event that creates a variable. + * @const + */ + var VAR_CREATE: any /*missing*/; + + /** + * Name of event that deletes a variable. + * @const + */ + var VAR_DELETE: any /*missing*/; + + /** + * Name of event that renames a variable. + * @const + */ + var VAR_RENAME: any /*missing*/; + + /** + * Name of event that records a UI change. + * @const + */ + var UI: any /*missing*/; + + /** + * Name of event that creates a comment. + * @const + */ + var COMMENT_CREATE: any /*missing*/; + + /** + * Name of event that deletes a comment. + * @const + */ + var COMMENT_DELETE: any /*missing*/; + + /** + * Name of event that changes a comment. + * @const + */ + var COMMENT_CHANGE: any /*missing*/; + + /** + * Name of event that moves a comment. + * @const + */ + var COMMENT_MOVE: any /*missing*/; + + /** + * Name of event that records a workspace load. + */ + var FINISHED_LOADING: any /*missing*/; + + /** + * List of events that cause objects to be bumped back into the visible + * portion of the workspace (only used for non-movable workspaces). + * + * Not to be confused with bumping so that disconnected connections to do + * not appear connected. + * @const + */ + var BUMP_EVENTS: any /*missing*/; + + /** + * Create a custom event and fire it. + * @param {!Blockly.Events.Abstract} event Custom data for event. + */ + function fire(event: Blockly.Events.Abstract): void; + + /** + * 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. + */ + function filter(queueIn: Blockly.Events.Abstract[], forward: boolean): Blockly.Events.Abstract[]; + + /** + * Modify pending undo events so that when they are fired they don't land + * in the undo stack. Called by Blockly.Workspace.clearUndo. + */ + function clearPendingUndo(): void; + + /** + * Stop sending events. Every call to this function MUST also call enable. + */ + function disable(): void; + + /** + * Start sending events. Unless events were already disabled when the + * corresponding call to disable was made. + */ + function enable(): void; + + /** + * Returns whether events may be fired or not. + * @return {boolean} True if enabled. + */ + function isEnabled(): boolean; + + /** + * Current group. + * @return {string} ID string. + */ + function getGroup(): string; + + /** + * Start or stop a group. + * @param {boolean|string} state True to start new group, false to end group. + * String to set group explicitly. + */ + function setGroup(state: boolean|string): void; + + /** + * 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. + * @package + */ + function getDescendantIds(block: Blockly.Block): string[]; + + /** + * 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. + */ + function fromJson(json: Object, workspace: Blockly.Workspace): Blockly.Events.Abstract; + + /** + * Enable/disable a block depending on whether it is properly connected. + * Use this on applications where all blocks should be connected to a top block. + * Recommend setting the 'disable' option to 'false' in the config so that + * users don't try to re-enable disabled orphan blocks. + * @param {!Blockly.Events.Abstract} event Custom data for event. + */ + function disableOrphans(event: Blockly.Events.Abstract): void; +} + + +declare module Blockly.Events { + + class Abstract extends Abstract__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Abstract__Class { + + /** + * Abstract class for an event. + * @constructor + */ + constructor(); + + /** + * The workspace identifier for this event. + * @type {string|undefined} + */ + workspaceId: string|any /*undefined*/; + + /** + * The event group id for the group this event belongs to. Groups define + * events that should be treated as an single action from the user's + * perspective, and should be undone together. + * @type {string} + */ + group: string; + + /** + * Sets whether the event should be added to the undo stack. + * @type {boolean} + */ + recordUndo: boolean; + + /** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ + toJson(): Object; + + /** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ + fromJson(json: Object): void; + + /** + * Does this event record any change of state? + * @return {boolean} True if null, false if something changed. + */ + isNull(): boolean; + + /** + * Run an event. + * @param {boolean} _forward True if run forward, false if run backward (undo). + */ + run(_forward: boolean): void; + + /** + * Get workspace the event belongs to. + * @return {!Blockly.Workspace} The workspace the event belongs to. + * @throws {Error} if workspace is null. + * @protected + */ + getEventWorkspace_(): Blockly.Workspace; + } + +} + + +declare module Blockly.Extensions { + + /** + * Registers a new extension function. Extensions are functions that help + * initialize blocks, usually adding dynamic behavior such as onchange + * handlers and mutators. These are applied using Block.applyExtension(), or + * the JSON "extensions" array attribute. + * @param {string} name The name of this extension. + * @param {Function} initFn The function to initialize an extended block. + * @throws {Error} if the extension name is empty, the extension is already + * registered, or extensionFn is not a function. + */ + function register(name: string, initFn: Function): void; + + /** + * Registers a new extension function that adds all key/value of mixinObj. + * @param {string} name The name of this extension. + * @param {!Object} mixinObj The values to mix in. + * @throws {Error} if the extension name is empty or the extension is already + * registered. + */ + function registerMixin(name: string, mixinObj: Object): void; + + /** + * Registers a new extension function that adds a mutator to the block. + * At register time this performs some basic sanity checks on the mutator. + * The wrapper may also add a mutator dialog to the block, if both compose and + * decompose are defined on the mixin. + * @param {string} name The name of this mutator extension. + * @param {!Object} mixinObj The values to mix in. + * @param {(function())=} opt_helperFn An optional function to apply after + * mixing in the object. + * @param {!Array.=} opt_blockList A list of blocks to appear in the + * flyout of the mutator dialog. + * @throws {Error} if the mutation is invalid or can't be applied to the block. + */ + function registerMutator(name: string, mixinObj: Object, opt_helperFn?: { (): any /*missing*/ }, opt_blockList?: string[]): void; + + /** + * Unregisters the extension registered with the given name. + * @param {string} name The name of the extension to unregister. + */ + function unregister(name: string): void; + + /** + * Applies an extension method to a block. This should only be called during + * block construction. + * @param {string} name The name of the extension. + * @param {!Blockly.Block} block The block to apply the named extension to. + * @param {boolean} isMutator True if this extension defines a mutator. + * @throws {Error} if the extension is not found. + */ + function apply(name: string, block: Blockly.Block, isMutator: boolean): void; + + /** + * Builds an extension function that will map a dropdown value to a tooltip + * string. + * + * This method includes multiple checks to ensure tooltips, dropdown options, + * and message references are aligned. This aims to catch errors as early as + * possible, without requiring developers to manually test tooltips under each + * option. After the page is loaded, each tooltip text string will be checked + * for matching message keys in the internationalized string table. Deferring + * this until the page is loaded decouples loading dependencies. Later, upon + * loading the first block of any given type, the extension will validate every + * dropdown option has a matching tooltip in the lookupTable. Errors are + * reported as warnings in the console, and are never fatal. + * @param {string} dropdownName The name of the field whose value is the key + * to the lookup table. + * @param {!Object.} lookupTable The table of field values to + * tooltip text. + * @return {Function} The extension function. + */ + function buildTooltipForDropdown(dropdownName: string, lookupTable: { [key: string]: string }): Function; + + /** + * Builds an extension function that will install a dynamic tooltip. The + * tooltip message should include the string '%1' and that string will be + * replaced with the text of the named field. + * @param {string} msgTemplate The template form to of the message text, with + * %1 placeholder. + * @param {string} fieldName The field with the replacement text. + * @return {Function} The extension function. + */ + function buildTooltipWithFieldText(msgTemplate: string, fieldName: string): Function; +} + + +declare module Blockly { + + class Field extends Field__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Field__Class { + + /** + * Abstract class for an editable field. + * @param {*} value The initial value of the field. + * @param {?Function=} opt_validator A function that is called to validate + * changes to the field's value. Takes in a value & returns a validated + * value, or null to abort the change. + * @param {Object=} opt_config A map of options used to configure the field. See + * the individual field's documentation for a list of properties this + * parameter supports. + * @constructor + */ + constructor(value: any, opt_validator?: Function, opt_config?: Object); + + /** + * A generic value possessed by the field. + * Should generally be non-null, only null when the field is created. + * @type {*} + * @protected + */ + value_: any; + + /** + * Validation function called when user edits an editable field. + * @type {Function} + * @protected + */ + validator_: Function; + + /** + * The size of the area rendered by the field. + * @type {!Blockly.utils.Size} + * @protected + */ + size_: Blockly.utils.Size; + + /** + * The rendered field's SVG group element. + * @type {SVGGElement} + * @protected + */ + fieldGroup_: SVGGElement; + + /** + * The rendered field's SVG border element. + * @type {SVGRectElement} + * @protected + */ + borderRect_: SVGRectElement; + + /** + * The rendered field's SVG text element. + * @type {SVGTextElement} + * @protected + */ + textElement_: SVGTextElement; + + /** + * The rendered field's text content element. + * @type {Text} + * @protected + */ + textContent_: Text; + + /** + * Constants associated with the source block's renderer. + * @type {Blockly.blockRendering.ConstantProvider} + * @protected + */ + constants_: Blockly.blockRendering.ConstantProvider; + + /** + * Name of field. Unique within each block. + * Static labels are usually unnamed. + * @type {string|undefined} + */ + name: string|any /*undefined*/; + + /** + * Has this field been disposed of? + * @type {boolean} + * @package + */ + disposed: boolean; + + /** + * Maximum characters of text to display before adding an ellipsis. + * @type {number} + */ + maxDisplayLength: number; + + /** + * Block this field is attached to. Starts as null, then set in init. + * @type {Blockly.Block} + * @protected + */ + sourceBlock_: Blockly.Block; + + /** + * Does this block need to be re-rendered? + * @type {boolean} + * @protected + */ + isDirty_: boolean; + + /** + * Is the field visible, or hidden due to the block being collapsed? + * @type {boolean} + * @protected + */ + visible_: boolean; + + /** + * The element the click handler is bound to. + * @type {Element} + * @protected + */ + clickTarget_: Element; + + /** + * A developer hook to override the returned text of this field. + * Override if the text representation of the value of this field + * is not just a string cast of its value. + * Return null to resort to a string cast. + * @return {?string} Current text. Return null to resort to a string cast. + * @protected + */ + getText_(): string; + + /** + * An optional method that can be defined to show an editor when the field is + * clicked. Blockly will automatically set the field as clickable if this + * method is defined. + * @param {Event=} opt_e Optional mouse event that triggered the field to open, + * or undefined if triggered programatically. + * @return {void} + * @protected + */ + showEditor_(opt_e?: Event): void; + + /** + * Editable fields usually show some sort of UI indicating they are editable. + * They will also be saved by the XML renderer. + * @type {boolean} + */ + EDITABLE: boolean; + + /** + * Serializable fields are saved by the XML renderer, non-serializable fields + * are not. Editable fields should also be serializable. This is not the + * case by default so that SERIALIZABLE is backwards compatible. + * @type {boolean} + */ + SERIALIZABLE: boolean; + + /** + * Process the configuration map passed to the field. + * @param {!Object} config A map of options used to configure the field. See + * the individual field's documentation for a list of properties this + * parameter supports. + * @protected + */ + configure_(config: Object): void; + + /** + * Attach this field to a block. + * @param {!Blockly.Block} block The block containing this field. + */ + setSourceBlock(block: Blockly.Block): void; + + /** + * Get the block this field is attached to. + * @return {Blockly.Block} The block containing this field. + */ + getSourceBlock(): Blockly.Block; + + /** + * Initialize everything to render this field. Override + * methods initModel and initView rather than this method. + * @package + */ + init(): void; + + /** + * Create the block UI for this field. + * @package + */ + initView(): void; + + /** + * Initializes the model of the field after it has been installed on a block. + * No-op by default. + * @package + */ + initModel(): void; + + /** + * Create a field border rect element. Not to be overridden by subclasses. + * Instead modify the result of the function inside initView, or create a + * separate function to call. + * @protected + */ + createBorderRect_(): void; + + /** + * Create a field text element. Not to be overridden by subclasses. Instead + * modify the result of the function inside initView, or create a separate + * function to call. + * @protected + */ + createTextElement_(): void; + + /** + * Bind events to the field. Can be overridden by subclasses if they need to do + * custom input handling. + * @protected + */ + bindEvents_(): void; + + /** + * Sets the field's value based on the given XML element. Should only be + * called by Blockly.Xml. + * @param {!Element} fieldElement The element containing info about the + * field's state. + * @package + */ + fromXml(fieldElement: Element): void; + + /** + * Serializes this field's value to XML. Should only be called by Blockly.Xml. + * @param {!Element} fieldElement The element to populate with info about the + * field's state. + * @return {!Element} The element containing info about the field's state. + * @package + */ + toXml(fieldElement: Element): Element; + + /** + * Dispose of all DOM objects and events belonging to this editable field. + * @package + */ + dispose(): void; + + /** + * Add or remove the UI indicating if this field is editable or not. + */ + updateEditable(): void; + + /** + * Check whether this field defines the showEditor_ function. + * @return {boolean} Whether this field is clickable. + */ + isClickable(): boolean; + + /** + * Check whether this field is currently editable. Some fields are never + * EDITABLE (e.g. text labels). Other fields may be EDITABLE but may exist on + * non-editable blocks. + * @return {boolean} Whether this field is editable and on an editable block + */ + isCurrentlyEditable(): boolean; + + /** + * Check whether this field should be serialized by the XML renderer. + * Handles the logic for backwards compatibility and incongruous states. + * @return {boolean} Whether this field should be serialized or not. + */ + isSerializable(): boolean; + + /** + * Gets whether this editable field is visible or not. + * @return {boolean} True if visible. + */ + isVisible(): boolean; + + /** + * Sets whether this editable field is visible or not. Should only be called + * by input.setVisible. + * @param {boolean} visible True if visible. + * @package + */ + setVisible(visible: boolean): void; + + /** + * Sets a new validation function for editable fields, or clears a previously + * set validator. + * + * The validator function takes in the new field value, and returns + * validated value. The validated value could be the input value, a modified + * version of the input value, or null to abort the change. + * + * If the function does not return anything (or returns undefined) the new + * value is accepted as valid. This is to allow for fields using the + * validated function as a field-level change event notification. + * + * @param {Function} handler The validator function + * or null to clear a previous validator. + */ + setValidator(handler: Function): void; + + /** + * Gets the validation function for editable fields, or null if not set. + * @return {Function} Validation function, or null. + */ + getValidator(): Function; + + /** + * Validates a change. Does nothing. Subclasses may override this. + * @param {string} text The user's text. + * @return {string} No change needed. + * @deprecated May 2019. Override doClassValidation and other relevant 'do' + * functions instead. + */ + classValidator(text: string): string; + + /** + * Calls the validation function for this field, as well as all the validation + * function for the field's class and its parents. + * @param {string} text Proposed text. + * @return {?string} Revised text, or null if invalid. + * @deprecated May 2019. setValue now contains all relevant logic. + */ + callValidator(text: string): string; + + /** + * Gets the group element for this editable field. + * Used for measuring the size and for positioning. + * @return {!SVGGElement} The group element. + */ + getSvgRoot(): SVGGElement; + + /** + * Updates the field to match the colour/style of the block. Should only be + * called by BlockSvg.applyColour(). + * @package + */ + applyColour(): void; + + /** + * Used by getSize() to move/resize any DOM elements, and get the new size. + * + * All rendering that has an effect on the size/shape of the block should be + * done here, and should be triggered by getSize(). + * @protected + */ + render_(): void; + + /** + * Show an editor when the field is clicked only if the field is clickable. + * @param {Event=} opt_e Optional mouse event that triggered the field to open, + * or undefined if triggered programatically. + * @package + */ + showEditor(opt_e?: Event): void; + + /** + * Updates the width of the field. Redirects to updateSize_(). + * @deprecated May 2019 Use Blockly.Field.updateSize_() to force an update + * to the size of the field, or Blockly.utils.dom.getTextWidth() to + * check the size of the field. + */ + updateWidth(): void; + + /** + * Updates the size of the field based on the text. + * @protected + */ + updateSize_(): void; + + /** + * Returns the height and width of the field. + * + * This should *in general* be the only place render_ gets called from. + * @return {!Blockly.utils.Size} Height and width. + */ + getSize(): Blockly.utils.Size; + + /** + * Returns the bounding box of the rendered field, accounting for workspace + * scaling. + * @return {!Object} An object with top, bottom, left, and right in pixels + * relative to the top left corner of the page (window coordinates). + * @package + */ + getScaledBBox(): Object; + + /** + * Get the text from this field to display on the block. May differ from + * ``getText`` due to ellipsis, and other formatting. + * @return {string} Text to display. + * @protected + */ + getDisplayText_(): string; + + /** + * Get the text from this field. + * @return {string} Current text. + */ + getText(): string; + + /** + * Set the text in this field. Trigger a rerender of the source block. + * @param {*} _newText New text. + * @deprecated 2019 setText should not be used directly. Use setValue instead. + */ + setText(_newText: any): void; + + /** + * Force a rerender of the block that this field is installed on, which will + * rerender this field and adjust for any sizing changes. + * Other fields on the same block will not rerender, because their sizes have + * already been recorded. + * @package + */ + markDirty(): void; + + /** + * Force a rerender of the block that this field is installed on, which will + * rerender this field and adjust for any sizing changes. + * Other fields on the same block will not rerender, because their sizes have + * already been recorded. + * @package + */ + forceRerender(): void; + + /** + * Used to change the value of the field. Handles validation and events. + * Subclasses should override doClassValidation_ and doValueUpdate_ rather + * than this method. + * @param {*} newValue New value. + */ + setValue(newValue: any): void; + + /** + * Get the current value of the field. + * @return {*} Current value. + */ + getValue(): any; + + /** + * Used to validate a value. Returns input by default. Can be overridden by + * subclasses, see FieldDropdown. + * @param {*=} opt_newValue The value to be validated. + * @return {*} The validated value, same as input by default. + * @protected + * @suppress {deprecated} Suppress deprecated this.classValidator call. + */ + doClassValidation_(opt_newValue?: any): any; + + /** + * Used to update the value of a field. Can be overridden by subclasses to do + * custom storage of values/updating of external things. + * @param {*} newValue The value to be saved. + * @protected + */ + doValueUpdate_(newValue: any): void; + + /** + * Used to notify the field an invalid value was input. Can be overidden by + * subclasses, see FieldTextInput. + * No-op by default. + * @param {*} _invalidValue The input value that was determined to be invalid. + * @protected + */ + doValueInvalid_(_invalidValue: any): void; + + /** + * Handle a mouse down event on a field. + * @param {!Event} e Mouse down event. + * @protected + */ + onMouseDown_(e: Event): void; + + /** + * Change the tooltip text for this field. + * @param {string|Function|!SVGElement} newTip Text for tooltip or a parent + * element to link to for its tooltip. + */ + setTooltip(newTip: string|Function|SVGElement): void; + + /** + * The element to bind the click handler to. If not set explicitly, defaults + * to the SVG root of the field. When this element is + * clicked on an editable field, the editor will open. + * @return {!Element} Element to bind click handler to. + * @protected + */ + getClickTarget_(): Element; + + /** + * 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 {!Blockly.utils.Coordinate} Object with .x and .y properties. + * @protected + */ + getAbsoluteXY_(): Blockly.utils.Coordinate; + + /** + * Whether this field references any Blockly variables. If true it may need to + * be handled differently during serialization and deserialization. Subclasses + * may override this. + * @return {boolean} True if this field has any variable references. + * @package + */ + referencesVariables(): boolean; + + /** + * Search through the list of inputs and their fields in order to find the + * parent input of a field. + * @return {Blockly.Input} The input that the field belongs to. + * @package + */ + getParentInput(): Blockly.Input; + + /** + * Returns whether or not we should flip the field in RTL. + * @return {boolean} True if we should flip in RTL. + */ + getFlipRtl(): boolean; + + /** + * Returns whether or not the field is tab navigable. + * @return {boolean} True if the field is tab navigable. + */ + isTabNavigable(): boolean; + + /** + * Handles the given action. + * This is only triggered when keyboard accessibility mode is enabled. + * @param {!Blockly.Action} _action The action to be handled. + * @return {boolean} True if the field handled the action, false otherwise. + * @package + */ + onBlocklyAction(_action: Blockly.Action): boolean; + + /** + * Add the cursor svg to this fields svg group. + * @param {SVGElement} cursorSvg The svg root of the cursor to be added to the + * field group. + * @package + */ + setCursorSvg(cursorSvg: SVGElement): void; + + /** + * Add the marker svg to this fields svg group. + * @param {SVGElement} markerSvg The svg root of the marker to be added to the + * field group. + * @package + */ + setMarkerSvg(markerSvg: SVGElement): void; + } + +} + +declare module Blockly.Field { + + /** + * Non-breaking space. + * @const + */ + var NBSP: any /*missing*/; +} + + +declare module Blockly { + + class FieldAngle extends FieldAngle__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class FieldAngle__Class extends Blockly.FieldTextInput__Class { + + /** + * Class for an editable angle field. + * @param {string|number=} opt_value The initial value of the field. Should cast + * to a number. Defaults to 0. + * @param {Function=} opt_validator A function that is called to validate + * changes to the field's value. Takes in a number & returns a + * validated number, or null to abort the change. + * @param {Object=} opt_config A map of options used to configure the field. + * See the [field creation documentation]{@link https://developers.google.com/blockly/guides/create-custom-blocks/fields/built-in-fields/angle#creation} + * for a list of properties this parameter supports. + * @extends {Blockly.FieldTextInput} + * @constructor + */ + constructor(opt_value?: string|number, opt_validator?: Function, opt_config?: Object); + + /** + * The angle picker's gauge path depending on the value. + * @type {SVGElement} + */ + gauge_: SVGElement; + + /** + * The angle picker's line drawn representing the value's angle. + * @type {SVGElement} + */ + line_: SVGElement; + + /** + * Serializable fields are saved by the XML renderer, non-serializable fields + * are not. Editable fields should also be serializable. + * @type {boolean} + */ + SERIALIZABLE: boolean; + + /** + * Create the block UI for this field. + * @package + */ + initView(): void; + + /** + * Set the angle to match the mouse's position. + * @param {!Event} e Mouse move event. + * @protected + */ + onMouseMove_(e: Event): void; + } + +} + +declare module Blockly.FieldAngle { + + /** + * Construct a FieldAngle from a JSON arg object. + * @param {!Object} options A JSON object with options (angle). + * @return {!Blockly.FieldAngle} The new field instance. + * @package + * @nocollapse + */ + function fromJson(options: Object): Blockly.FieldAngle; + + /** + * The default amount to round angles to when using a mouse or keyboard nav + * input. Must be a positive integer to support keyboard navigation. + * @const {number} + */ + var ROUND: any /*missing*/; + + /** + * Half the width of protractor image. + * @const {number} + */ + var HALF: any /*missing*/; + + /** + * Default property describing which direction makes an angle field's value + * increase. Angle increases clockwise (true) or counterclockwise (false). + * @const {boolean} + */ + var CLOCKWISE: any /*missing*/; + + /** + * The default offset of 0 degrees (and all angles). Always offsets in the + * counterclockwise direction, regardless of the field's clockwise property. + * Usually either 0 (0 = right) or 90 (0 = up). + * @const {number} + */ + var OFFSET: any /*missing*/; + + /** + * The default maximum angle to allow before wrapping. + * Usually either 360 (for 0 to 359.9) or 180 (for -179.9 to 180). + * @const {number} + */ + var WRAP: any /*missing*/; + + /** + * Radius of protractor circle. Slightly smaller than protractor size since + * otherwise SVG crops off half the border at the edges. + * @const {number} + */ + var RADIUS: any /*missing*/; +} + + +declare module Blockly { + + class FieldCheckbox extends FieldCheckbox__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class FieldCheckbox__Class extends Blockly.Field__Class { + + /** + * Class for a checkbox field. + * @param {string|boolean=} opt_value The initial value of the field. Should + * either be 'TRUE', 'FALSE' or a boolean. Defaults to 'FALSE'. + * @param {Function=} opt_validator A function that is called to validate + * changes to the field's value. Takes in a value ('TRUE' or 'FALSE') & + * returns a validated value ('TRUE' or 'FALSE'), or null to abort the + * change. + * @param {Object=} opt_config A map of options used to configure the field. + * See the [field creation documentation]{@link https://developers.google.com/blockly/guides/create-custom-blocks/fields/built-in-fields/checkbox#creation} + * for a list of properties this parameter supports. + * @extends {Blockly.Field} + * @constructor + */ + constructor(opt_value?: string|boolean, opt_validator?: Function, opt_config?: Object); + + /** + * Serializable fields are saved by the XML renderer, non-serializable fields + * are not. Editable fields should also be serializable. + * @type {boolean} + */ + SERIALIZABLE: boolean; + + /** + * Mouse cursor style when over the hotspot that initiates editability. + */ + CURSOR: any /*missing*/; + + /** + * Used to tell if the field needs to be rendered the next time the block is + * rendered. Checkbox fields are statically sized, and only need to be + * rendered at initialization. + * @type {boolean} + * @protected + */ + isDirty_: boolean; + + /** + * Create the block UI for this checkbox. + * @package + */ + initView(): void; + + /** + * Set the character used for the check mark. + * @param {?string} character The character to use for the check mark, or + * null to use the default. + */ + setCheckCharacter(character: string): void; + + /** + * Toggle the state of the checkbox on click. + * @protected + */ + showEditor_(): void; + + /** + * Ensure that the input value is valid ('TRUE' or 'FALSE'). + * @param {*=} opt_newValue The input value. + * @return {?string} A valid value ('TRUE' or 'FALSE), or null if invalid. + * @protected + */ + doClassValidation_(opt_newValue?: any): string; + + /** + * Update the value of the field, and update the checkElement. + * @param {*} newValue The value to be saved. The default validator guarantees + * that this is a either 'TRUE' or 'FALSE'. + * @protected + */ + doValueUpdate_(newValue: any): void; + + /** + * Get the value of this field, either 'TRUE' or 'FALSE'. + * @return {string} The value of this field. + */ + getValue(): string; + + /** + * Get the boolean value of this field. + * @return {boolean} The boolean value of this field. + */ + getValueBoolean(): boolean; + + /** + * Get the text of this field. Used when the block is collapsed. + * @return {string} Text representing the value of this field + * ('true' or 'false'). + */ + getText(): string; + } + +} + +declare module Blockly.FieldCheckbox { + + /** + * Construct a FieldCheckbox from a JSON arg object. + * @param {!Object} options A JSON object with options (checked). + * @return {!Blockly.FieldCheckbox} The new field instance. + * @package + * @nocollapse + */ + function fromJson(options: Object): Blockly.FieldCheckbox; + + /** + * Default character for the checkmark. + * @type {string} + * @const + */ + var CHECK_CHAR: string; +} + + +declare module Blockly { + + class FieldColour extends FieldColour__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class FieldColour__Class extends Blockly.Field__Class { + + /** + * Class for a colour input field. + * @param {string=} opt_value The initial value of the field. Should be in + * '#rrggbb' format. Defaults to the first value in the default colour array. + * @param {Function=} opt_validator A function that is called to validate + * changes to the field's value. Takes in a colour string & returns a + * validated colour string ('#rrggbb' format), or null to abort the change. + * @param {Object=} opt_config A map of options used to configure the field. + * See the [field creation documentation]{@link https://developers.google.com/blockly/guides/create-custom-blocks/fields/built-in-fields/colour} + * for a list of properties this parameter supports. + * @extends {Blockly.Field} + * @constructor + */ + constructor(opt_value?: string, opt_validator?: Function, opt_config?: Object); + + /** + * Serializable fields are saved by the XML renderer, non-serializable fields + * are not. Editable fields should also be serializable. + * @type {boolean} + */ + SERIALIZABLE: boolean; + + /** + * Mouse cursor style when over the hotspot that initiates the editor. + */ + CURSOR: any /*missing*/; + + /** + * Used to tell if the field needs to be rendered the next time the block is + * rendered. Colour fields are statically sized, and only need to be + * rendered at initialization. + * @type {boolean} + * @protected + */ + isDirty_: boolean; + + /** + * Create the block UI for this colour field. + * @package + */ + initView(): void; + + /** + * Ensure that the input value is a valid colour. + * @param {*=} opt_newValue The input value. + * @return {?string} A valid colour, or null if invalid. + * @protected + */ + doClassValidation_(opt_newValue?: any): string; + + /** + * Update the value of this colour field, and update the displayed colour. + * @param {*} newValue The value to be saved. The default validator guarantees + * that this is a colour in '#rrggbb' format. + * @protected + */ + doValueUpdate_(newValue: any): void; + + /** + * Get the text for this field. Used when the block is collapsed. + * @return {string} Text representing the value of this field. + */ + getText(): string; + + /** + * Set a custom colour grid for this field. + * @param {Array.} colours Array of colours for this block, + * or null to use default (Blockly.FieldColour.COLOURS). + * @param {Array.=} opt_titles Optional array of colour tooltips, + * or null to use default (Blockly.FieldColour.TITLES). + * @return {!Blockly.FieldColour} Returns itself (for method chaining). + */ + setColours(colours: string[], opt_titles?: string[]): Blockly.FieldColour; + + /** + * Set a custom grid size for this field. + * @param {number} columns Number of columns for this block, + * or 0 to use default (Blockly.FieldColour.COLUMNS). + * @return {!Blockly.FieldColour} Returns itself (for method chaining). + */ + setColumns(columns: number): Blockly.FieldColour; + + /** + * Handles the given action. + * This is only triggered when keyboard accessibility mode is enabled. + * @param {!Blockly.Action} action The action to be handled. + * @return {boolean} True if the field handled the action, false otherwise. + * @package + */ + onBlocklyAction(action: Blockly.Action): boolean; + } + +} + +declare module Blockly.FieldColour { + + /** + * Construct a FieldColour from a JSON arg object. + * @param {!Object} options A JSON object with options (colour). + * @return {!Blockly.FieldColour} The new field instance. + * @package + * @nocollapse + */ + function fromJson(options: Object): Blockly.FieldColour; + + /** + * An array of colour strings for the palette. + * Copied from goog.ui.ColorPicker.SIMPLE_GRID_COLORS + * All colour pickers use this unless overridden with setColours. + * @type {!Array.} + */ + var COLOURS: string[]; + + /** + * An array of tooltip strings for the palette. If not the same length as + * COLOURS, the colour's hex code will be used for any missing titles. + * All colour pickers use this unless overridden with setColours. + * @type {!Array.} + */ + var TITLES: string[]; + + /** + * Number of columns in the palette. + * All colour pickers use this unless overridden with setColumns. + */ + var COLUMNS: any /*missing*/; +} + + +declare module Blockly { + + class FieldDate extends FieldDate__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class FieldDate__Class extends Blockly.Field__Class { + + /** + * Class for a date input field. + * @param {string=} opt_value The initial value of the field. Should be in + * 'YYYY-MM-DD' format. Defaults to the current date. + * @param {Function=} opt_validator A function that is called to validate + * changes to the field's value. Takes in a date string & returns a + * validated date string ('YYYY-MM-DD' format), or null to abort the change. + * @extends {Blockly.Field} + * @constructor + */ + constructor(opt_value?: string, opt_validator?: Function); + + /** + * Serializable fields are saved by the XML renderer, non-serializable fields + * are not. Editable fields should also be serializable. + * @type {boolean} + */ + SERIALIZABLE: boolean; + + /** + * Mouse cursor style when over the hotspot that initiates the editor. + */ + CURSOR: any /*missing*/; + + /** + * Ensure that the input value is a valid date. + * @param {*=} opt_newValue The input value. + * @return {?string} A valid date, or null if invalid. + * @protected + */ + doClassValidation_(opt_newValue?: any): string; + + /** + * Render the field. If the picker is shown make sure it has the current + * date selected. + * @protected + */ + render_(): void; + + /** + * Updates the field's colours to match those of the block. + * @package + */ + applyColour(): void; + } + +} + +declare module Blockly.FieldDate { + + /** + * Construct a FieldDate from a JSON arg object. + * @param {!Object} options A JSON object with options (date). + * @return {!Blockly.FieldDate} The new field instance. + * @package + * @nocollapse + */ + function fromJson(options: Object): Blockly.FieldDate; +} + +declare module goog { + + /** + * Back up original getMsg function. + * @type {!Function} + */ + var getMsgOrig: Function; + + /** + * Gets a localized message. + * Overrides the default Closure function to check for a Blockly.Msg first. + * Used infrequently, only known case is TODAY button in date picker. + * @param {string} str Translatable string, places holders in the form {$foo}. + * @param {Object.=} opt_values Maps place holder name to value. + * @return {string} Message with placeholders filled. + * @suppress {duplicate} + */ + function getMsg(str: string, opt_values?: { [key: string]: string }): string; +} + +declare module goog.getMsg { + + /** + * Mapping of Closure messages to Blockly.Msg names. + */ + var blocklyMsgMap: any /*missing*/; +} + + +declare module Blockly { + + class FieldDropdown extends FieldDropdown__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class FieldDropdown__Class extends Blockly.Field__Class { + + /** + * Class for an editable dropdown field. + * @param {(!Array.|!Function)} menuGenerator A non-empty array of + * options for a dropdown list, or a function which generates these options. + * @param {Function=} opt_validator A function that is called to validate + * changes to the field's value. Takes in a language-neutral dropdown + * option & returns a validated language-neutral dropdown option, or null to + * abort the change. + * @param {Object=} opt_config A map of options used to configure the field. + * See the [field creation documentation]{@link https://developers.google.com/blockly/guides/create-custom-blocks/fields/built-in-fields/dropdown#creation} + * for a list of properties this parameter supports. + * @extends {Blockly.Field} + * @constructor + * @throws {TypeError} If `menuGenerator` options are incorrectly structured. + */ + constructor(menuGenerator: any[][]|Function, opt_validator?: Function, opt_config?: Object); + + /** + * An array of options for a dropdown list, + * or a function which generates these options. + * @type {(!Array.| + * !function(this:Blockly.FieldDropdown): !Array.)} + * @protected + */ + menuGenerator_: any[][]|{ (): any[][] }; + + /** + * Serializable fields are saved by the XML renderer, non-serializable fields + * are not. Editable fields should also be serializable. + * @type {boolean} + */ + SERIALIZABLE: boolean; + + /** + * Mouse cursor style when over the hotspot that initiates the editor. + */ + CURSOR: any /*missing*/; + + /** + * Create the block UI for this dropdown. + * @package + */ + initView(): void; + + /** + * Whether or not the dropdown should add a border rect. + * @return {boolean} True if the dropdown field should add a border rect. + * @protected + */ + shouldAddBorderRect_(): boolean; + + /** + * Create a tspan based arrow. + * @protected + */ + createTextArrow_(): void; + + /** + * Create an SVG based arrow. + * @protected + */ + createSVGArrow_(): void; + + /** + * Handle the selection of an item in the dropdown menu. + * @param {!Blockly.Menu} menu The Menu component clicked. + * @param {!Blockly.MenuItem} menuItem The MenuItem selected within menu. + * @protected + */ + onItemSelected_(menu: Blockly.Menu, menuItem: Blockly.MenuItem): void; + + /** + * @return {boolean} True if the option list is generated by a function. + * Otherwise false. + */ + isOptionListDynamic(): boolean; + + /** + * Return a list of the options for this dropdown. + * @param {boolean=} opt_useCache For dynamic options, whether or not to use the + * cached options or to re-generate them. + * @return {!Array.} A non-empty array of option tuples: + * (human-readable text or image, language-neutral name). + * @throws {TypeError} If generated options are incorrectly structured. + */ + getOptions(opt_useCache?: boolean): any[][]; + + /** + * Ensure that the input value is a valid language-neutral option. + * @param {*=} opt_newValue The input value. + * @return {?string} A valid language-neutral option, or null if invalid. + * @protected + */ + doClassValidation_(opt_newValue?: any): string; + + /** + * Update the value of this dropdown field. + * @param {*} newValue The value to be saved. The default validator guarantees + * that this is one of the valid dropdown options. + * @protected + */ + doValueUpdate_(newValue: any): void; + + /** + * Updates the dropdown arrow to match the colour/style of the block. + * @package + */ + applyColour(): void; + + /** + * Handles the given action. + * This is only triggered when keyboard accessibility mode is enabled. + * @param {!Blockly.Action} action The action to be handled. + * @return {boolean} True if the field handled the action, false otherwise. + * @package + */ + onBlocklyAction(action: Blockly.Action): boolean; + } + +} + +declare module Blockly.FieldDropdown { + + /** + * Dropdown image properties. + * @typedef {{ + * src:string, + * alt:string, + * width:number, + * height:number + * }} + */ + interface ImageProperties { + src: string; + alt: string; + width: number; + height: number + } + + /** + * Construct a FieldDropdown from a JSON arg object. + * @param {!Object} options A JSON object with options (options). + * @return {!Blockly.FieldDropdown} The new field instance. + * @package + * @nocollapse + */ + function fromJson(options: Object): Blockly.FieldDropdown; + + /** + * Horizontal distance that a checkmark overhangs the dropdown. + */ + var CHECKMARK_OVERHANG: any /*missing*/; + + /** + * Maximum height of the dropdown menu, as a percentage of the viewport height. + */ + var MAX_MENU_HEIGHT_VH: any /*missing*/; + + /** + * Android can't (in 2014) display "▾", so use "▼" instead. + */ + var ARROW_CHAR: any /*missing*/; + + /** + * Use the calculated prefix and suffix lengths to trim all of the options in + * the given array. + * @param {!Array.} options Array of option tuples: + * (human-readable text or image, language-neutral name). + * @param {number} prefixLength The length of the common prefix. + * @param {number} suffixLength The length of the common suffix + * @return {!Array.} A new array with all of the option text trimmed. + */ + function applyTrim_(options: any[][], prefixLength: number, suffixLength: number): any[][]; +} + + +declare module Blockly { + + class FieldImage extends FieldImage__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class FieldImage__Class extends Blockly.Field__Class { + + /** + * Class for an image on a block. + * @param {string} src The URL of the image. Defaults to an empty string. + * @param {!(string|number)} width Width of the image. + * @param {!(string|number)} height Height of the image. + * @param {string=} opt_alt Optional alt text for when block is collapsed. + * @param {function(!Blockly.FieldImage)=} opt_onClick Optional function to be + * called when the image is clicked. If opt_onClick is defined, opt_alt must + * also be defined. + * @param {boolean=} opt_flipRtl Whether to flip the icon in RTL. + * @param {Object=} opt_config A map of options used to configure the field. + * See the [field creation documentation]{@link https://developers.google.com/blockly/guides/create-custom-blocks/fields/built-in-fields/image#creation} + * for a list of properties this parameter supports. + * @extends {Blockly.Field} + * @constructor + */ + constructor(src: string, width: string|number, height: string|number, opt_alt?: string, opt_onClick?: { (_0: Blockly.FieldImage): any /*missing*/ }, opt_flipRtl?: boolean, opt_config?: Object); + + /** + * Editable fields usually show some sort of UI indicating they are + * editable. This field should not. + * @type {boolean} + */ + EDITABLE: boolean; + + /** + * Used to tell if the field needs to be rendered the next time the block is + * rendered. Image fields are statically sized, and only need to be + * rendered at initialization. + * @type {boolean} + * @protected + */ + isDirty_: boolean; + + /** + * Create the block UI for this image. + * @package + */ + initView(): void; + + /** + * Ensure that the input value (the source URL) is a string. + * @param {*=} opt_newValue The input value. + * @return {?string} A string, or null if invalid. + * @protected + */ + doClassValidation_(opt_newValue?: any): string; + + /** + * Update the value of this image field, and update the displayed image. + * @param {*} newValue The value to be saved. The default validator guarantees + * that this is a string. + * @protected + */ + doValueUpdate_(newValue: any): void; + + /** + * Set the alt text of this image. + * @param {?string} alt New alt text. + * @public + */ + setAlt(alt: string): void; + + /** + * If field click is called, and click handler defined, + * call the handler. + * @protected + */ + showEditor_(): void; + + /** + * Set the function that is called when this image is clicked. + * @param {?function(!Blockly.FieldImage)} func The function that is called + * when the image is clicked, or null to remove. + */ + setOnClickHandler(func: { (_0: Blockly.FieldImage): any /*missing*/ }): void; + } + +} + +declare module Blockly.FieldImage { + + /** + * Construct a FieldImage from a JSON arg object, + * dereferencing any string table references. + * @param {!Object} options A JSON object with options (src, width, height, + * alt, and flipRtl). + * @return {!Blockly.FieldImage} The new field instance. + * @package + * @nocollapse + */ + function fromJson(options: Object): Blockly.FieldImage; +} + + +declare module Blockly { + + class FieldLabel extends FieldLabel__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class FieldLabel__Class extends Blockly.Field__Class { + + /** + * Class for a non-editable, non-serializable text field. + * @param {string=} opt_value The initial value of the field. Should cast to a + * string. Defaults to an empty string if null or undefined. + * @param {string=} opt_class Optional CSS class for the field's text. + * @param {Object=} opt_config A map of options used to configure the field. + * See the [field creation documentation]{@link https://developers.google.com/blockly/guides/create-custom-blocks/fields/built-in-fields/label#creation} + * for a list of properties this parameter supports. + * @extends {Blockly.Field} + * @constructor + */ + constructor(opt_value?: string, opt_class?: string, opt_config?: Object); + + /** + * Editable fields usually show some sort of UI indicating they are + * editable. This field should not. + * @type {boolean} + */ + EDITABLE: boolean; + + /** + * Create block UI for this label. + * @package + */ + initView(): void; + + /** + * Ensure that the input value casts to a valid string. + * @param {*=} opt_newValue The input value. + * @return {?string} A valid string, or null if invalid. + * @protected + */ + doClassValidation_(opt_newValue?: any): string; + + /** + * Set the css class applied to the field's textElement_. + * @param {?string} cssClass The new css class name, or null to remove. + */ + setClass(cssClass: string): void; + } + +} + +declare module Blockly.FieldLabel { + + /** + * Construct a FieldLabel from a JSON arg object, + * dereferencing any string table references. + * @param {!Object} options A JSON object with options (text, and class). + * @return {!Blockly.FieldLabel} The new field instance. + * @package + * @nocollapse + */ + function fromJson(options: Object): Blockly.FieldLabel; +} + + +declare module Blockly { + + class FieldLabelSerializable extends FieldLabelSerializable__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class FieldLabelSerializable__Class extends Blockly.FieldLabel__Class { + + /** + * Class for a non-editable, serializable text field. + * @param {*} opt_value The initial value of the field. Should cast to a + * string. Defaults to an empty string if null or undefined. + * @param {string=} opt_class Optional CSS class for the field's text. + * @param {Object=} opt_config A map of options used to configure the field. + * See the [field creation documentation]{@link https://developers.google.com/blockly/guides/create-custom-blocks/fields/built-in-fields/label-serializable#creation} + * for a list of properties this parameter supports. + * @extends {Blockly.FieldLabel} + * @constructor + * + */ + constructor(opt_value: any, opt_class?: string, opt_config?: Object); + + /** + * Editable fields usually show some sort of UI indicating they are + * editable. This field should not. + * @type {boolean} + */ + EDITABLE: boolean; + + /** + * Serializable fields are saved by the XML renderer, non-serializable fields + * are not. This field should be serialized, but only edited programmatically. + * @type {boolean} + */ + SERIALIZABLE: boolean; + } + +} + +declare module Blockly.FieldLabelSerializable { + + /** + * Construct a FieldLabelSerializable from a JSON arg object, + * dereferencing any string table references. + * @param {!Object} options A JSON object with options (text, and class). + * @return {!Blockly.FieldLabelSerializable} The new field instance. + * @package + * @nocollapse + */ + function fromJson(options: Object): Blockly.FieldLabelSerializable; +} + + +declare module Blockly { + + class FieldMultilineInput extends FieldMultilineInput__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class FieldMultilineInput__Class extends Blockly.FieldTextInput__Class { + + /** + * Class for an editable text area field. + * @param {string=} opt_value The initial content of the field. Should cast to a + * string. Defaults to an empty string if null or undefined. + * @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. + * @param {Object=} opt_config A map of options used to configure the field. + * See the [field creation documentation]{@link https://developers.google.com/blockly/guides/create-custom-blocks/fields/built-in-fields/text-input#creation} + * for a list of properties this parameter supports. + * @extends {Blockly.FieldTextInput} + * @constructor + */ + constructor(opt_value?: string, opt_validator?: Function, opt_config?: Object); + + /** + * The SVG group element that will contain a text element for each text row + * when initialized. + * @type {SVGGElement} + */ + textGroup_: SVGGElement; + + /** + * Create the block UI for this field. + * @package + */ + initView(): void; + + /** + * Updates the text of the textElement. + * @protected + */ + render_(): void; + + /** + * Updates the size of the field based on the text. + * @protected + */ + updateSize_(): void; + + /** + * Resize the editor to fit the text. + * @protected + */ + resizeEditor_(): void; + + /** + * Create the text input editor widget. + * @return {!HTMLTextAreaElement} The newly created text input editor. + * @protected + */ + widgetCreate_(): HTMLTextAreaElement; + + /** + * Handle key down to the editor. Override the text input definition of this + * so as to not close the editor when enter is typed in. + * @param {!Event} e Keyboard event. + * @protected + */ + onHtmlInputKeyDown_(e: Event): void; + } + +} + +declare module Blockly.FieldMultilineInput { + + /** + * The default height of a single line of text. + * @type {number} + * @const + */ + var LINE_HEIGHT: number; + + /** + * Construct a FieldMultilineInput from a JSON arg object, + * dereferencing any string table references. + * @param {!Object} options A JSON object with options (text, and spellcheck). + * @return {!Blockly.FieldMultilineInput} The new field instance. + * @package + * @nocollapse + */ + function fromJson(options: Object): Blockly.FieldMultilineInput; +} + + +declare module Blockly { + + class FieldNumber extends FieldNumber__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class FieldNumber__Class extends Blockly.FieldTextInput__Class { + + /** + * Class for an editable number field. + * @param {string|number=} opt_value The initial value of the field. Should cast + * to a number. Defaults to 0. + * @param {?(string|number)=} opt_min Minimum value. + * @param {?(string|number)=} opt_max Maximum value. + * @param {?(string|number)=} opt_precision Precision for value. + * @param {?Function=} opt_validator A function that is called to validate + * changes to the field's value. Takes in a number & returns a validated + * number, or null to abort the change. + * @param {Object=} opt_config A map of options used to configure the field. + * See the [field creation documentation]{@link https://developers.google.com/blockly/guides/create-custom-blocks/fields/built-in-fields/number#creation} + * for a list of properties this parameter supports. + * @extends {Blockly.FieldTextInput} + * @constructor + */ + constructor(opt_value?: string|number, opt_min?: string|number, opt_max?: string|number, opt_precision?: string|number, opt_validator?: Function, opt_config?: Object); + + /** + * The minimum value this number field can contain. + * @type {number} + * @protected + */ + min_: number; + + /** + * The maximum value this number field can contain. + * @type {number} + * @protected + */ + max_: number; + + /** + * The multiple to which this fields value is rounded. + * @type {number} + * @protected + */ + precision_: number; + + /** + * Serializable fields are saved by the XML renderer, non-serializable fields + * are not. Editable fields should also be serializable. + * @type {boolean} + */ + SERIALIZABLE: boolean; + + /** + * Set the maximum, minimum and precision constraints on this field. + * Any of these properties may be undefined or NaN to be disabled. + * Setting precision (usually a power of 10) enforces a minimum step between + * values. That is, the user's value will rounded to the closest multiple of + * precision. The least significant digit place is inferred from the precision. + * Integers values can be enforces by choosing an integer precision. + * @param {?(number|string|undefined)} min Minimum value. + * @param {?(number|string|undefined)} max Maximum value. + * @param {?(number|string|undefined)} precision Precision for value. + */ + setConstraints(min: number|string|any /*undefined*/, max: number|string|any /*undefined*/, precision: number|string|any /*undefined*/): void; + + /** + * Sets the minimum value this field can contain. Updates the value to reflect. + * @param {?(number|string|undefined)} min Minimum value. + */ + setMin(min: number|string|any /*undefined*/): void; + + /** + * Returns the current minimum value this field can contain. Default is + * -Infinity. + * @return {number} The current minimum value this field can contain. + */ + getMin(): number; + + /** + * Sets the maximum value this field can contain. Updates the value to reflect. + * @param {?(number|string|undefined)} max Maximum value. + */ + setMax(max: number|string|any /*undefined*/): void; + + /** + * Returns the current maximum value this field can contain. Default is + * Infinity. + * @return {number} The current maximum value this field can contain. + */ + getMax(): number; + + /** + * Sets the precision of this field's value, i.e. the number to which the + * value is rounded. Updates the field to reflect. + * @param {?(number|string|undefined)} precision The number to which the + * field's value is rounded. + */ + setPrecision(precision: number|string|any /*undefined*/): void; + + /** + * Returns the current precision of this field. The precision being the + * number to which the field's value is rounded. A precision of 0 means that + * the value is not rounded. + * @return {number} The number to which this field's value is rounded. + */ + getPrecision(): number; + } + +} + +declare module Blockly.FieldNumber { + + /** + * Construct a FieldNumber from a JSON arg object. + * @param {!Object} options A JSON object with options (value, min, max, and + * precision). + * @return {!Blockly.FieldNumber} The new field instance. + * @package + * @nocollapse + */ + function fromJson(options: Object): Blockly.FieldNumber; +} + + +declare module Blockly.fieldRegistry { + + /** + * Registers a field type. + * Blockly.fieldRegistry.fromJson uses this registry to + * find the appropriate field type. + * @param {string} type The field type name as used in the JSON definition. + * @param {!{fromJson: Function}} fieldClass The field class containing a + * fromJson function that can construct an instance of the field. + * @throws {Error} if the type name is empty, the field is already + * registered, or the fieldClass is not an object containing a fromJson + * function. + */ + function register(type: string, fieldClass: { fromJson: Function }): void; + + /** + * Unregisters the field registered with the given type. + * @param {string} type The field type name as used in the JSON definition. + */ + function unregister(type: string): void; + + /** + * Construct a Field from a JSON arg object. + * Finds the appropriate registered field by the type name as registered using + * Blockly.fieldRegistry.register. + * @param {!Object} options A JSON object with a type and options specific + * to the field type. + * @return {Blockly.Field} The new field instance or null if a field wasn't + * found with the given type name + * @package + */ + function fromJson(options: Object): Blockly.Field; +} + + +declare module Blockly { + + class FieldTextInput extends FieldTextInput__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class FieldTextInput__Class extends Blockly.Field__Class { + + /** + * Class for an editable text field. + * @param {string=} opt_value The initial value of the field. Should cast to a + * string. Defaults to an empty string if null or undefined. + * @param {?Function=} opt_validator A function that is called to validate + * changes to the field's value. Takes in a string & returns a validated + * string, or null to abort the change. + * @param {Object=} opt_config A map of options used to configure the field. + * See the [field creation documentation]{@link https://developers.google.com/blockly/guides/create-custom-blocks/fields/built-in-fields/text-input#creation} + * for a list of properties this parameter supports. + * @extends {Blockly.Field} + * @constructor + */ + constructor(opt_value?: string, opt_validator?: Function, opt_config?: Object); + + /** + * Allow browser to spellcheck this field. + * @type {boolean} + * @protected + */ + spellcheck_: boolean; + + /** + * The HTML input element. + * @type {HTMLElement} + */ + htmlInput_: HTMLElement; + + /** + * Whether the field should consider the whole parent block to be its click + * target. + * @type {?boolean} + */ + fullBlockClickTarget_: boolean; + + /** + * Serializable fields are saved by the XML renderer, non-serializable fields + * are not. Editable fields should also be serializable. + * @type {boolean} + */ + SERIALIZABLE: boolean; + + /** + * Mouse cursor style when over the hotspot that initiates the editor. + */ + CURSOR: any /*missing*/; + + /** + * Ensure that the input value casts to a valid string. + * @param {*=} opt_newValue The input value. + * @return {*} A valid string, or null if invalid. + * @protected + */ + doClassValidation_(opt_newValue?: any): any; + + /** + * Called by setValue if the text input is not valid. If the field is + * currently being edited it reverts value of the field to the previous + * value while allowing the display text to be handled by the htmlInput_. + * @param {*} _invalidValue The input value that was determined to be invalid. + * This is not used by the text input because its display value is stored on + * the htmlInput_. + * @protected + */ + doValueInvalid_(_invalidValue: any): void; + + /** + * Called by setValue if the text input is valid. Updates the value of the + * field, and updates the text of the field if it is not currently being + * edited (i.e. handled by the htmlInput_). + * @param {*} newValue The value to be saved. The default validator guarantees + * that this is a string. + * @protected + */ + doValueUpdate_(newValue: any): void; + + /** + * Updates text field to match the colour/style of the block. + * @package + */ + applyColour(): void; + + /** + * Updates the colour of the htmlInput given the current validity of the + * field's value. + * @protected + */ + render_(): void; + + /** + * Set whether this field is spellchecked by the browser. + * @param {boolean} check True if checked. + */ + setSpellcheck(check: boolean): void; + + /** + * Show the inline free-text editor on top of the text. + * @param {Event=} _opt_e Optional mouse event that triggered the field to open, + * or undefined if triggered programatically. + * @param {boolean=} opt_quietInput True if editor should be created without + * focus. Defaults to false. + * @protected + */ + showEditor_(_opt_e?: Event, opt_quietInput?: boolean): void; + + /** + * Create the text input editor widget. + * @return {!HTMLElement} The newly created text input editor. + * @protected + */ + widgetCreate_(): HTMLElement; + + /** + * Bind handlers for user input on the text input field's editor. + * @param {!HTMLElement} htmlInput The htmlInput to which event + * handlers will be bound. + * @protected + */ + bindInputEvents_(htmlInput: HTMLElement): void; + + /** + * Handle key down to the editor. + * @param {!Event} e Keyboard event. + * @protected + */ + onHtmlInputKeyDown_(e: Event): void; + + /** + * Handle blur for the editor. + * @param {!Event} _e Focus event. + * @protected + */ + onHtmlInputBlur_(_e: Event): void; + + /** + * Set the html input value and the field's internal value. The difference + * between this and ``setValue`` is that this also updates the html input + * value whilst editing. + * @param {*} newValue New value. + * @protected + */ + setEditorValue_(newValue: any): void; + + /** + * Resize the editor to fit the text. + * @protected + */ + resizeEditor_(): void; + + /** + * Transform the provided value into a text to show in the html input. + * Override this method if the field's html input representation is different + * than the field's value. This should be coupled with an override of + * `getValueFromEditorText_`. + * @param {*} value The value stored in this field. + * @return {string} The text to show on the html input. + * @protected + */ + getEditorText_(value: any): string; + + /** + * Transform the text received from the html input into a value to store + * in this field. + * Override this method if the field's html input representation is different + * than the field's value. This should be coupled with an override of + * `getEditorText_`. + * @param {string} text Text received from the html input. + * @return {*} The value to store. + * @protected + */ + getValueFromEditorText_(text: string): any; + } + +} + +declare module Blockly.FieldTextInput { + + /** + * Construct a FieldTextInput from a JSON arg object, + * dereferencing any string table references. + * @param {!Object} options A JSON object with options (text, and spellcheck). + * @return {!Blockly.FieldTextInput} The new field instance. + * @package + * @nocollapse + */ + function fromJson(options: Object): Blockly.FieldTextInput; + + /** + * Pixel size of input border radius. + * Should match blocklyText's border-radius in CSS. + */ + var BORDERRADIUS: any /*missing*/; + + /** + * Ensure that only a number may be entered. + * @param {string} text The user's text. + * @return {?string} A string representing a valid number, or null if invalid. + * @deprecated + */ + function numberValidator(text: string): string; + + /** + * Ensure that only a non-negative integer may be entered. + * @param {string} text The user's text. + * @return {?string} A string representing a valid int, or null if invalid. + * @deprecated + */ + function nonnegativeIntegerValidator(text: string): string; +} + + +declare module Blockly { + + class FieldVariable extends FieldVariable__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class FieldVariable__Class extends Blockly.FieldDropdown__Class { + + /** + * 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_validator A function that is called to validate + * changes to the field's value. Takes in a variable ID & returns a + * validated variable ID, or null to abort the change. + * @param {Array.=} opt_variableTypes A list of the types of variables + * to include in the dropdown. + * @param {string=} opt_defaultType The type of variable to create if this + * field's value is not explicitly set. Defaults to ''. + * @param {Object=} opt_config A map of options used to configure the field. + * See the [field creation documentation]{@link https://developers.google.com/blockly/guides/create-custom-blocks/fields/built-in-fields/variable#creation} + * for a list of properties this parameter supports. + * @extends {Blockly.FieldDropdown} + * @constructor + */ + constructor(varName: string, opt_validator?: Function, opt_variableTypes?: string[], opt_defaultType?: string, opt_config?: Object); + + /** + * An array of options for a dropdown list, + * or a function which generates these options. + * @type {(!Array.| + * !function(this:Blockly.FieldDropdown): !Array.)} + * @protected + */ + menuGenerator_: any[][]|{ (): any[][] }; + + /** + * The initial variable name passed to this field's constructor, or an + * empty string if a name wasn't provided. Used to create the initial + * variable. + * @type {string} + */ + defaultVariableName: string; + + /** + * Serializable fields are saved by the XML renderer, non-serializable fields + * are not. Editable fields should also be serializable. + * @type {boolean} + */ + SERIALIZABLE: boolean; + + /** + * Configure the field based on the given map of options. + * @param {!Object} config A map of options to configure the field based on. + * @protected + */ + configure_(config: Object): void; + + /** + * Initialize the model for this field if it has not already been initialized. + * If the value has not been set to a variable by the first render, we make up a + * variable rather than let the value be invalid. + * @package + */ + initModel(): void; + + /** + * Initialize this field based on the given XML. + * @param {!Element} fieldElement The element containing information about the + * variable field's state. + */ + fromXml(fieldElement: Element): void; + + /** + * Serialize this field to XML. + * @param {!Element} fieldElement The element to populate with info about the + * field's state. + * @return {!Element} The element containing info about the field's state. + */ + toXml(fieldElement: Element): Element; + + /** + * Attach this field to a block. + * @param {!Blockly.Block} block The block containing this field. + */ + setSourceBlock(block: Blockly.Block): void; + + /** + * Get the variable's ID. + * @return {string} Current variable's ID. + */ + getValue(): string; + + /** + * Get the text from this field, which is the selected variable's name. + * @return {string} The selected variable's name, or the empty string if no + * variable is selected. + */ + getText(): string; + + /** + * Get the variable model for the selected variable. + * Not guaranteed to be in the variable map on the workspace (e.g. if accessed + * after the variable has been deleted). + * @return {Blockly.VariableModel} The selected variable, or null if none was + * selected. + * @package + */ + getVariable(): Blockly.VariableModel; + + /** + * Gets the validation function for this field, or null if not set. + * Returns null if the variable is not set, because validators should not + * run on the initial setValue call, because the field won't be attached to + * a block and workspace at that point. + * @return {Function} Validation function, or null. + */ + getValidator(): Function; + + /** + * Ensure that the id belongs to a valid variable of an allowed type. + * @param {*=} opt_newValue The id of the new variable to set. + * @return {?string} The validated id, or null if invalid. + * @protected + */ + doClassValidation_(opt_newValue?: any): string; + + /** + * Update the value of this variable field, as well as its variable and text. + * + * The variable ID should be valid at this point, but if a variable field + * validator returns a bad ID, this could break. + * @param {*} newId The value to be saved. + * @protected + */ + doValueUpdate_(newId: any): void; + + /** + * Refreshes the name of the variable by grabbing the name of the model. + * Used when a variable gets renamed, but the ID stays the same. Should only + * be called by the block. + * @package + */ + refreshVariableName(): void; + + /** + * Handle the selection of an item in the variable dropdown menu. + * Special case the 'Rename variable...' and 'Delete variable...' options. + * In the rename case, prompt the user for a new name. + * @param {!Blockly.Menu} menu The Menu component clicked. + * @param {!Blockly.MenuItem} menuItem The MenuItem selected within menu. + * @protected + */ + onItemSelected_(menu: Blockly.Menu, menuItem: Blockly.MenuItem): void; + } + +} + +declare module Blockly.FieldVariable { + + /** + * Construct a FieldVariable from a JSON arg object, + * dereferencing any string table references. + * @param {!Object} options A JSON object with options (variable, + * variableTypes, and defaultType). + * @return {!Blockly.FieldVariable} The new field instance. + * @package + * @nocollapse + */ + function fromJson(options: Object): Blockly.FieldVariable; + + /** + * Return a sorted list of variable names for variable dropdown menus. + * Include a special option at the end for creating a new variable name. + * @return {!Array.} Array of variable names/id tuples. + * @this {Blockly.FieldVariable} + */ + function dropdownCreate(): any[][]; +} + + +declare module Blockly { + + class Flyout extends Flyout__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Flyout__Class { + + /** + * Class for a flyout. + * @param {!Blockly.Options} workspaceOptions Dictionary of options for the + * workspace. + * @constructor + */ + constructor(workspaceOptions: Blockly.Options); + + /** + * @type {!Blockly.WorkspaceSvg} + * @protected + */ + workspace_: Blockly.WorkspaceSvg; + + /** + * Is RTL vs LTR. + * @type {boolean} + */ + RTL: boolean; + + /** + * Position of the toolbox and flyout relative to the workspace. + * @type {number} + * @protected + */ + toolboxPosition_: number; + + /** + * List of visible buttons. + * @type {!Array.} + * @protected + */ + buttons_: Blockly.FlyoutButton[]; + + /** + * Width of output tab. + * @type {number} + * @protected + * @const + */ + tabWidth_: number; + + /** + * Does the flyout automatically close when a block is created? + * @type {boolean} + */ + autoClose: boolean; + + /** + * Corner radius of the flyout background. + * @type {number} + * @const + */ + CORNER_RADIUS: number; + + /** + * Margin around the edges of the blocks in the flyout. + * @type {number} + * @const + */ + MARGIN: number; + + /** + * Gap between items in horizontal flyouts. Can be overridden with the "sep" + * element. + * @const {number} + */ + GAP_X: any /*missing*/; + + /** + * Gap between items in vertical flyouts. Can be overridden with the "sep" + * element. + * @const {number} + */ + GAP_Y: any /*missing*/; + + /** + * Top/bottom padding between scrollbar and edge of flyout background. + * @type {number} + * @const + */ + SCROLLBAR_PADDING: number; + + /** + * Width of flyout. + * @type {number} + * @protected + */ + width_: number; + + /** + * Height of flyout. + * @type {number} + * @protected + */ + height_: number; + + /** + * Range of a drag angle from a 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. + * + * This is used to know when to create a new block and when to scroll the + * flyout. Setting it to 360 means that all drags create a new block. + * @type {number} + * @protected + */ + dragAngleRange_: number; + + /** + * Creates the flyout's DOM. Only needs to be called once. The flyout can + * either exist as its own svg element or be a g element nested inside a + * separate svg element. + * @param {string} tagName The type of tag to put the flyout in. This + * should be or . + * @return {!SVGElement} The flyout's SVG group. + */ + createDom(tagName: string): SVGElement; + + /** + * Initializes the flyout. + * @param {!Blockly.WorkspaceSvg} targetWorkspace The workspace in which to + * create new blocks. + */ + init(targetWorkspace: Blockly.WorkspaceSvg): void; + + /** + * Dispose of this flyout. + * Unlink from all DOM elements to prevent memory leaks. + * @suppress {checkTypes} + */ + dispose(): void; + + /** + * Get the width of the flyout. + * @return {number} The width of the flyout. + */ + getWidth(): number; + + /** + * Get the height of the flyout. + * @return {number} The width of the flyout. + */ + getHeight(): number; + + /** + * Get the workspace inside the flyout. + * @return {!Blockly.WorkspaceSvg} The workspace inside the flyout. + * @package + */ + getWorkspace(): Blockly.WorkspaceSvg; + + /** + * Is the flyout visible? + * @return {boolean} True if visible. + */ + isVisible(): boolean; + + /** + * Set whether the flyout is visible. A value of true does not necessarily mean + * that the flyout is shown. It could be hidden because its container is hidden. + * @param {boolean} visible True if visible. + */ + setVisible(visible: boolean): void; + + /** + * Set whether this flyout's container is visible. + * @param {boolean} visible Whether the container is visible. + */ + setContainerVisible(visible: boolean): void; + + /** + * Update the view based on coordinates calculated in position(). + * @param {number} width The computed width of the flyout's SVG group + * @param {number} height The computed height of the flyout's SVG group. + * @param {number} x The computed x origin of the flyout's SVG group. + * @param {number} y The computed y origin of the flyout's SVG group. + * @protected + */ + positionAt_(width: number, height: number, x: number, y: number): void; + + /** + * Hide and empty the flyout. + */ + hide(): void; + + /** + * Show and populate the flyout. + * @param {!Array|!NodeList|string} xmlList List of blocks to show. + * Variables and procedures have a custom set of blocks. + */ + show(xmlList: any[]|NodeList|string): void; + + /** + * Add listeners to a block that has been added to the flyout. + * @param {!SVGElement} root The root node of the SVG group the block is in. + * @param {!Blockly.Block} block The block to add listeners for. + * @param {!SVGElement} rect The invisible rectangle under the block that acts + * as a mat for that block. + * @protected + */ + addBlockListeners_(root: SVGElement, block: Blockly.Block, rect: SVGElement): void; + + /** + * Does this flyout allow you to create a new instance of the given block? + * Used for deciding if a block can be "dragged out of" the flyout. + * @param {!Blockly.BlockSvg} block The block to copy from the flyout. + * @return {boolean} True if you can create a new instance of the block, false + * otherwise. + * @package + */ + isBlockCreatable_(block: Blockly.BlockSvg): boolean; + + /** + * Create a copy of this block on the workspace. + * @param {!Blockly.BlockSvg} originalBlock The block to copy from the flyout. + * @return {Blockly.BlockSvg} The newly created block, or null if something + * went wrong with deserialization. + * @package + */ + createBlock(originalBlock: Blockly.BlockSvg): Blockly.BlockSvg; + + /** + * Initialize the given button: move it to the correct location, + * add listeners, etc. + * @param {!Blockly.FlyoutButton} button The button to initialize and place. + * @param {number} x The x position of the cursor during this layout pass. + * @param {number} y The y position of the cursor during this layout pass. + * @protected + */ + initFlyoutButton_(button: Blockly.FlyoutButton, x: number, y: number): void; + + /** + * Create and place a rectangle corresponding to the given block. + * @param {!Blockly.Block} block The block to associate the rect to. + * @param {number} x The x position of the cursor during this layout pass. + * @param {number} y The y position of the cursor during this layout pass. + * @param {!{height: number, width: number}} blockHW The height and width of the + * block. + * @param {number} index The index into the mats list where this rect should be + * placed. + * @return {!SVGElement} Newly created SVG element for the rectangle behind the + * block. + * @protected + */ + createRect_(block: Blockly.Block, x: number, y: number, blockHW: { height: number; width: number }, index: number): SVGElement; + + /** + * Move a rectangle to sit exactly behind a block, taking into account tabs, + * hats, and any other protrusions we invent. + * @param {!SVGElement} rect The rectangle to move directly behind the block. + * @param {!Blockly.BlockSvg} block The block the rectangle should be behind. + * @protected + */ + moveRectToBlock_(rect: SVGElement, block: Blockly.BlockSvg): void; + + /** + * Reflow blocks and their mats. + */ + reflow(): void; + + /** + * @return {boolean} True if this flyout may be scrolled with a scrollbar or by + * dragging. + * @package + */ + isScrollable(): boolean; + + /** + * Handles the given action. + * This is only triggered when keyboard accessibility mode is enabled. + * @param {!Blockly.Action} action The action to be handled. + * @return {boolean} True if the flyout handled the action, false otherwise. + * @package + */ + onBlocklyAction(action: Blockly.Action): boolean; + } + +} + + +declare module Blockly { + + class FlyoutButton extends FlyoutButton__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class FlyoutButton__Class { + + /** + * Class for a button in the flyout. + * @param {!Blockly.WorkspaceSvg} workspace The workspace in which to place this + * button. + * @param {!Blockly.WorkspaceSvg} targetWorkspace The flyout's target workspace. + * @param {!Element} xml The XML specifying the label/button. + * @param {boolean} isLabel Whether this button should be styled as a label. + * @constructor + */ + constructor(workspace: Blockly.WorkspaceSvg, targetWorkspace: Blockly.WorkspaceSvg, xml: Element, isLabel: boolean); + + /** + * The width of the button's rect. + * @type {number} + */ + width: number; + + /** + * The height of the button's rect. + * @type {number} + */ + height: number; + + /** + * Create the button elements. + * @return {!SVGElement} The button's SVG group. + */ + createDom(): SVGElement; + + /** + * Correctly position the flyout button and make it visible. + */ + show(): void; + + /** + * Move the button to the given x, y coordinates. + * @param {number} x The new x coordinate. + * @param {number} y The new y coordinate. + */ + moveTo(x: number, y: number): void; + + /** + * Location of the button. + * @return {!Blockly.utils.Coordinate} x, y coordinates. + * @package + */ + getPosition(): Blockly.utils.Coordinate; + + /** + * Get the button's target workspace. + * @return {!Blockly.WorkspaceSvg} The target workspace of the flyout where this + * button resides. + */ + getTargetWorkspace(): Blockly.WorkspaceSvg; + + /** + * Dispose of this button. + */ + dispose(): void; + } + +} + +declare module Blockly.FlyoutButton { + + /** + * The margin around the text in the button. + */ + var MARGIN: any /*missing*/; +} + + +declare module Blockly { + + class FlyoutDragger extends FlyoutDragger__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class FlyoutDragger__Class extends Blockly.WorkspaceDragger__Class { + + /** + * Class for a flyout dragger. It moves a flyout workspace around when it is + * being dragged by a mouse or touch. + * Note that the workspace itself manages whether or not it has a drag surface + * and how to do translations based on that. This simply passes the right + * commands based on events. + * @param {!Blockly.Flyout} flyout The flyout to drag. + * @extends {Blockly.WorkspaceDragger} + * @constructor + */ + constructor(flyout: Blockly.Flyout); + + /** + * Move the flyout based on the most recent mouse movements. + * @param {!Blockly.utils.Coordinate} currentDragDeltaXY How far the pointer has + * moved from the position at the start of the drag, in pixel coordinates. + * @package + */ + drag(currentDragDeltaXY: Blockly.utils.Coordinate): void; + } + +} + + +declare module Blockly { + + class HorizontalFlyout extends HorizontalFlyout__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class HorizontalFlyout__Class extends Blockly.Flyout__Class { + + /** + * Class for a flyout. + * @param {!Blockly.Options} workspaceOptions Dictionary of options for the + * workspace. + * @extends {Blockly.Flyout} + * @constructor + */ + constructor(workspaceOptions: Blockly.Options); + + /** + * Move the flyout to the edge of the workspace. + */ + position(): void; + + /** + * Scroll the flyout to the top. + */ + scrollToStart(): void; + + /** + * Determine if a drag delta is toward the workspace, based on the position + * and orientation of the flyout. This is used in determineDragIntention_ to + * determine if a new block should be created or if the flyout should scroll. + * @param {!Blockly.utils.Coordinate} currentDragDeltaXY How far the pointer has + * moved from the position at mouse down, in pixel units. + * @return {boolean} True if the drag is toward the workspace. + * @package + */ + isDragTowardWorkspace(currentDragDeltaXY: Blockly.utils.Coordinate): boolean; + + /** + * Return the deletion rectangle for this flyout in viewport coordinates. + * @return {Blockly.utils.Rect} Rectangle in which to delete. + */ + getClientRect(): Blockly.utils.Rect; + } + +} + + +declare module Blockly { + + class VerticalFlyout extends VerticalFlyout__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class VerticalFlyout__Class extends Blockly.Flyout__Class { + + /** + * Class for a flyout. + * @param {!Blockly.Options} workspaceOptions Dictionary of options for the + * workspace. + * @extends {Blockly.Flyout} + * @constructor + */ + constructor(workspaceOptions: Blockly.Options); + + /** + * Move the flyout to the edge of the workspace. + */ + position(): void; + + /** + * Scroll the flyout to the top. + */ + scrollToStart(): void; + + /** + * Determine if a drag delta is toward the workspace, based on the position + * and orientation of the flyout. This is used in determineDragIntention_ to + * determine if a new block should be created or if the flyout should scroll. + * @param {!Blockly.utils.Coordinate} currentDragDeltaXY How far the pointer has + * moved from the position at mouse down, in pixel units. + * @return {boolean} True if the drag is toward the workspace. + * @package + */ + isDragTowardWorkspace(currentDragDeltaXY: Blockly.utils.Coordinate): boolean; + + /** + * Return the deletion rectangle for this flyout in viewport coordinates. + * @return {Blockly.utils.Rect} Rectangle in which to delete. + */ + getClientRect(): Blockly.utils.Rect; + } + +} + + +declare module Blockly { + + class Generator extends Generator__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Generator__Class { + + /** + * Class for a code generator that translates the blocks into a language. + * @param {string} name Language name of this generator. + * @constructor + */ + constructor(name: string); + + /** + * Arbitrary code to inject into locations that risk causing infinite loops. + * Any instances of '%1' will be replaced by the block ID that failed. + * E.g. ' checkTimeout(%1);\n' + * @type {?string} + */ + INFINITE_LOOP_TRAP: string; + + /** + * Arbitrary code to inject before every statement. + * Any instances of '%1' will be replaced by the block ID of the statement. + * E.g. 'highlight(%1);\n' + * @type {?string} + */ + STATEMENT_PREFIX: string; + + /** + * Arbitrary code to inject after every statement. + * Any instances of '%1' will be replaced by the block ID of the statement. + * E.g. 'highlight(%1);\n' + * @type {?string} + */ + STATEMENT_SUFFIX: string; + + /** + * The method of indenting. Defaults to two spaces, but language generators + * may override this to increase indent or change to tabs. + * @type {string} + */ + INDENT: string; + + /** + * Maximum length for a comment before wrapping. Does not account for + * indenting level. + * @type {number} + */ + COMMENT_WRAP: number; + + /** + * List of outer-inner pairings that do NOT require parentheses. + * @type {!Array.>} + */ + ORDER_OVERRIDES: number[][]; + + /** + * Generate code for all blocks in the workspace to the specified language. + * @param {Blockly.Workspace} workspace Workspace to generate code from. + * @return {string} Generated code. + */ + workspaceToCode(workspace: Blockly.Workspace): string; + + /** + * Prepend a common prefix onto each line of code. + * Intended for indenting code or adding comment markers. + * @param {string} text The lines of code. + * @param {string} prefix The common prefix. + * @return {string} The prefixed lines of code. + */ + prefixLines(text: string, prefix: string): string; + + /** + * Recursively spider a tree of blocks, returning all their comments. + * @param {!Blockly.Block} block The block from which to start spidering. + * @return {string} Concatenated list of comments. + */ + allNestedComments(block: Blockly.Block): string; + + /** + * Generate code for the specified block (and attached blocks). + * @param {Blockly.Block} block The block to generate code for. + * @param {boolean=} opt_thisOnly True to generate code for only this statement. + * @return {string|!Array} For statement blocks, the generated code. + * For value blocks, an array containing the generated code and an + * operator order value. Returns '' if block is null. + */ + blockToCode(block: Blockly.Block, opt_thisOnly?: boolean): string|any[]; + + /** + * Generate code representing the specified value input. + * @param {!Blockly.Block} block The block containing the input. + * @param {string} name The name of the input. + * @param {number} outerOrder The maximum binding strength (minimum order value) + * of any operators adjacent to "block". + * @return {string} Generated code or '' if no blocks are connected or the + * specified input does not exist. + */ + valueToCode(block: Blockly.Block, name: string, outerOrder: number): string; + + /** + * Generate a code string representing the blocks attached to the named + * statement input. Indent the code. + * This is mainly used in generators. When trying to generate code to evaluate + * look at using workspaceToCode or blockToCode. + * @param {!Blockly.Block} block The block containing the input. + * @param {string} name The name of the input. + * @return {string} Generated code or '' if no blocks are connected. + */ + statementToCode(block: Blockly.Block, name: string): string; + + /** + * Add an infinite loop trap to the contents of a loop. + * Add statement suffix at the start of the loop block (right after the loop + * statement executes), and a statement prefix to the end of the loop block + * (right before the loop statement executes). + * @param {string} branch Code for loop contents. + * @param {!Blockly.Block} block Enclosing block. + * @return {string} Loop contents, with infinite loop trap added. + */ + addLoopTrap(branch: string, block: Blockly.Block): string; + + /** + * Inject a block ID into a message to replace '%1'. + * Used for STATEMENT_PREFIX, STATEMENT_SUFFIX, and INFINITE_LOOP_TRAP. + * @param {string} msg Code snippet with '%1'. + * @param {!Blockly.Block} block Block which has an ID. + * @return {string} Code snippet with ID. + */ + injectId(msg: string, block: Blockly.Block): string; + + /** + * Comma-separated list of reserved words. + * @type {string} + * @protected + */ + RESERVED_WORDS_: string; + + /** + * Add one or more words to the list of reserved words for this language. + * @param {string} words Comma-separated list of words to add to the list. + * No spaces. Duplicates are ok. + */ + addReservedWords(words: string): void; + + /** + * This is used as a placeholder in functions defined using + * Blockly.Generator.provideFunction_. It must not be legal code that could + * legitimately appear in a function definition (or comment), and it must + * not confuse the regular expression parser. + * @type {string} + * @protected + */ + FUNCTION_NAME_PLACEHOLDER_: string; + + /** + * A dictionary of definitions to be printed before the code. + * @type {Object} + * @protected + */ + definitions_: Object; + + /** + * A dictionary mapping desired function names in definitions_ to actual + * function names (to avoid collisions with user functions). + * @type {Object} + * @protected + */ + functionNames_: Object; + + /** + * A database of variable names. + * @type {Blockly.Names} + * @protected + */ + variableDB_: Blockly.Names; + + /** + * Define a function to be included in the generated code. + * The first time this is called with a given desiredName, the code is + * saved and an actual name is generated. Subsequent calls with the + * same desiredName have no effect but have the same return value. + * + * It is up to the caller to make sure the same desiredName is not + * used for different code values. + * + * 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 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. + * @protected + */ + provideFunction_(desiredName: string, code: string[]): string; + + /** + * Hook for code to run before code generation starts. + * Subclasses may override this, e.g. to initialise the database of variable + * names. + * @param {!Blockly.Workspace} _workspace Workspace to generate code from. + */ + init(_workspace: Blockly.Workspace): void; + + /** + * Common tasks for generating code from blocks. This is called from + * blockToCode and is called on every block, not just top level blocks. + * Subclasses may override this, e.g. to generate code for statements following + * the block, or to handle comments for the specified block and any connected + * value blocks. + * @param {!Blockly.Block} _block The current block. + * @param {string} code The code created for this block. + * @param {boolean=} _opt_thisOnly True to generate code for only this + * statement. + * @return {string} Code with comments and subsequent blocks added. + * @protected + */ + scrub_(_block: Blockly.Block, code: string, _opt_thisOnly?: boolean): string; + + /** + * Hook for code to run at end of code generation. + * Subclasses may override this, e.g. to prepend the generated code with the + * variable definitions. + * @param {string} code Generated code. + * @return {string} Completed code. + */ + finish(code: string): string; + + /** + * Naked values are top-level blocks with outputs that aren't plugged into + * anything. + * Subclasses may override this, e.g. if their language does not allow + * naked values. + * @param {string} line Line of generated code. + * @return {string} Legal line of code. + */ + scrubNakedValue(line: string): string; + } + +} + +declare module Blockly.Generator { + + /** + * Category to separate generated function names from variables and procedures. + */ + var NAME_TYPE: any /*missing*/; +} + + +declare module Blockly { + + class Gesture extends Gesture__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Gesture__Class { + + /** + * Class for one gesture. + * @param {!Event} e The event that kicked off this gesture. + * @param {!Blockly.WorkspaceSvg} creatorWorkspace The workspace that created + * this gesture and has a reference to it. + * @constructor + */ + constructor(e: Event, creatorWorkspace: Blockly.WorkspaceSvg); + + /** + * The workspace that the gesture started on. There may be multiple + * workspaces on a page; this is more accurate than using + * Blockly.getMainWorkspace(). + * @type {Blockly.WorkspaceSvg} + * @protected + */ + startWorkspace_: Blockly.WorkspaceSvg; + + /** + * A handle to use to unbind a mouse move listener at the end of a drag. + * Opaque data returned from Blockly.bindEventWithChecks_. + * @type {?Blockly.EventData} + * @protected + */ + onMoveWrapper_: Blockly.EventData; + + /** + * A handle to use to unbind a mouse up listener at the end of a drag. + * Opaque data returned from Blockly.bindEventWithChecks_. + * @type {?Blockly.EventData} + * @protected + */ + onUpWrapper_: Blockly.EventData; + + /** + * Boolean used internally to break a cycle in disposal. + * @type {boolean} + * @protected + */ + isEnding_: boolean; + + /** + * Sever all links from this object. + * @package + */ + dispose(): void; + + /** + * Start a gesture: update the workspace to indicate that a gesture is in + * progress and bind mousemove and mouseup handlers. + * @param {!Event} e A mouse down or touch start event. + * @package + */ + doStart(e: Event): void; + + /** + * Bind gesture events. + * @param {!Event} e A mouse down or touch start event. + * @package + */ + bindMouseEvents(e: Event): void; + + /** + * Handle a mouse move or touch move event. + * @param {!Event} e A mouse move or touch move event. + * @package + */ + handleMove(e: Event): void; + + /** + * Handle a mouse up or touch end event. + * @param {!Event} e A mouse up or touch end event. + * @package + */ + handleUp(e: Event): void; + + /** + * Cancel an in-progress gesture. If a workspace or block drag is in progress, + * end the drag at the most recent location. + * @package + */ + cancel(): void; + + /** + * Handle a real or faked right-click event by showing a context menu. + * @param {!Event} e A mouse move or touch move event. + * @package + */ + handleRightClick(e: Event): void; + + /** + * Handle a mousedown/touchstart event on a workspace. + * @param {!Event} e A mouse down or touch start event. + * @param {!Blockly.WorkspaceSvg} ws The workspace the event hit. + * @package + */ + handleWsStart(e: Event, ws: Blockly.WorkspaceSvg): void; + + /** + * Handle a mousedown/touchstart event on a flyout. + * @param {!Event} e A mouse down or touch start event. + * @param {!Blockly.Flyout} flyout The flyout the event hit. + * @package + */ + handleFlyoutStart(e: Event, flyout: Blockly.Flyout): void; + + /** + * Handle a mousedown/touchstart event on a block. + * @param {!Event} e A mouse down or touch start event. + * @param {!Blockly.BlockSvg} block The block the event hit. + * @package + */ + handleBlockStart(e: Event, block: Blockly.BlockSvg): void; + + /** + * Handle a mousedown/touchstart event on a bubble. + * @param {!Event} e A mouse down or touch start event. + * @param {!Blockly.Bubble} bubble The bubble the event hit. + * @package + */ + handleBubbleStart(e: Event, bubble: Blockly.Bubble): void; + + /** + * Record the field that a gesture started on. + * @param {Blockly.Field} field The field the gesture started on. + * @package + */ + setStartField(field: Blockly.Field): void; + + /** + * Record the bubble that a gesture started on + * @param {Blockly.Bubble} bubble The bubble the gesture started on. + * @package + */ + setStartBubble(bubble: Blockly.Bubble): void; + + /** + * Record the block that a gesture started on, and set the target block + * appropriately. + * @param {Blockly.BlockSvg} block The block the gesture started on. + * @package + */ + setStartBlock(block: Blockly.BlockSvg): void; + + /** + * Whether this gesture is a drag of either a workspace or block. + * This function is called externally to block actions that cannot be taken + * mid-drag (e.g. using the keyboard to delete the selected blocks). + * @return {boolean} True if this gesture is a drag of a workspace or block. + * @package + */ + isDragging(): boolean; + + /** + * Whether this gesture has already been started. In theory every mouse down + * has a corresponding mouse up, but in reality it is possible to lose a + * mouse up, leaving an in-process gesture hanging. + * @return {boolean} Whether this gesture was a click on a workspace. + * @package + */ + hasStarted(): boolean; + + /** + * Get a list of the insertion markers that currently exist. Block drags have + * 0, 1, or 2 insertion markers. + * @return {!Array.} A possibly empty list of insertion + * marker blocks. + * @package + */ + getInsertionMarkers(): Blockly.BlockSvg[]; + } + +} + +declare module Blockly.Gesture { + + /** + * Is a drag or other gesture currently in progress on any workspace? + * @return {boolean} True if gesture is occurring. + */ + function inProgress(): boolean; +} + + +declare module Blockly { + + class Grid extends Grid__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Grid__Class { + + /** + * Class for a workspace's grid. + * @param {!SVGElement} pattern The grid's SVG pattern, created during + * injection. + * @param {!Object} options A dictionary of normalized options for the grid. + * See grid documentation: + * https://developers.google.com/blockly/guides/configure/web/grid + * @constructor + */ + constructor(pattern: SVGElement, options: Object); + + /** + * Dispose of this grid and unlink from the DOM. + * @package + * @suppress {checkTypes} + */ + dispose(): void; + + /** + * Whether blocks should snap to the grid, based on the initial configuration. + * @return {boolean} True if blocks should snap, false otherwise. + * @package + */ + shouldSnap(): boolean; + + /** + * Get the spacing of the grid points (in px). + * @return {number} The spacing of the grid points. + * @package + */ + getSpacing(): number; + + /** + * Get the id of the pattern element, which should be randomized to avoid + * conflicts with other Blockly instances on the page. + * @return {string} The pattern ID. + * @package + */ + getPatternId(): string; + + /** + * Update the grid with a new scale. + * @param {number} scale The new workspace scale. + * @package + */ + update(scale: number): void; + + /** + * Move the grid to a new x and y position, and make sure that change is + * visible. + * @param {number} x The new x position of the grid (in px). + * @param {number} y The new y position ofthe grid (in px). + * @package + */ + moveTo(x: number, y: number): void; + } + +} + +declare module Blockly.Grid { + + /** + * Create the DOM for the grid described by options. + * @param {string} rnd A random ID to append to the pattern's ID. + * @param {!Object} gridOptions The object containing grid configuration. + * @param {!SVGElement} defs The root SVG element for this workspace's defs. + * @return {!SVGElement} The SVG element for the grid pattern. + * @package + */ + function createDom(rnd: string, gridOptions: Object, defs: SVGElement): SVGElement; +} + + +declare module Blockly { + + class Icon extends Icon__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Icon__Class { + + /** + * Class for an icon. + * @param {Blockly.BlockSvg} block The block associated with this icon. + * @constructor + */ + constructor(block: Blockly.BlockSvg); + + /** + * The block this icon is attached to. + * @type {Blockly.BlockSvg} + * @protected + */ + block_: Blockly.BlockSvg; + + /** + * Does this icon get hidden when the block is collapsed. + */ + collapseHidden: any /*missing*/; + + /** + * Height and width of icons. + */ + SIZE: any /*missing*/; + + /** + * Bubble UI (if visible). + * @type {Blockly.Bubble} + * @protected + */ + bubble_: Blockly.Bubble; + + /** + * Absolute coordinate of icon's center. + * @type {Blockly.utils.Coordinate} + * @protected + */ + iconXY_: Blockly.utils.Coordinate; + + /** + * Create the icon on the block. + */ + createIcon(): void; + + /** + * Dispose of this icon. + */ + dispose(): void; + + /** + * Add or remove the UI indicating if this icon may be clicked or not. + */ + updateEditable(): void; + + /** + * Is the associated bubble visible? + * @return {boolean} True if the bubble is visible. + */ + isVisible(): boolean; + + /** + * Clicking on the icon toggles if the bubble is visible. + * @param {!Event} e Mouse click event. + * @protected + */ + iconClick_(e: Event): void; + + /** + * Change the colour of the associated bubble to match its block. + */ + applyColour(): void; + + /** + * Notification that the icon has moved. Update the arrow accordingly. + * @param {!Blockly.utils.Coordinate} xy Absolute location in workspace coordinates. + */ + setIconLocation(xy: Blockly.utils.Coordinate): void; + + /** + * Notification that the icon has moved, but we don't really know where. + * Recompute the icon's location from scratch. + */ + computeIconLocation(): void; + + /** + * Returns the center of the block's icon relative to the surface. + * @return {Blockly.utils.Coordinate} Object with x and y properties in + * workspace coordinates. + */ + getIconLocation(): Blockly.utils.Coordinate; + + /** + * Get the size of the icon as used for rendering. + * This differs from the actual size of the icon, because it bulges slightly + * out of its row rather than increasing the height of its row. + * @return {!Blockly.utils.Size} Height and width. + */ + getCorrectedSize(): Blockly.utils.Size; + } + +} + + +declare module Blockly { + + /** + * Inject a Blockly editor into the specified container element (usually a div). + * @param {Element|string} container Containing element, or its ID, + * or a CSS selector. + * @param {Blockly.BlocklyOptions=} opt_options Optional dictionary of options. + * @return {!Blockly.WorkspaceSvg} Newly created main workspace. + */ + function inject(container: Element|string, opt_options?: Blockly.BlocklyOptions): Blockly.WorkspaceSvg; +} + + +declare module Blockly { + + class Input extends Input__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Input__Class { + + /** + * Class for an input with an optional field. + * @param {number} type The type of the input. + * @param {string} name Language-neutral identifier which may used to find this + * input again. + * @param {!Blockly.Block} block The block containing this input. + * @param {Blockly.Connection} connection Optional connection for this input. + * @constructor + */ + constructor(type: number, name: string, block: Blockly.Block, connection: Blockly.Connection); + + /** @type {number} */ + type: number; + + /** @type {string} */ + name: string; + + /** @type {Blockly.Connection} */ + connection: Blockly.Connection; + + /** @type {!Array.} */ + fieldRow: Blockly.Field[]; + + /** + * Alignment of input's fields (left, right or centre). + * @type {number} + */ + align: number; + + /** + * Get the source block for this input. + * @return {Blockly.Block} The source block, or null if there is none. + */ + getSourceBlock(): Blockly.Block; + + /** + * Add a field (or label from string), and all prefix and suffix fields, to the + * end of the input's field row. + * @param {string|!Blockly.Field} 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). + */ + appendField(field: string|Blockly.Field, opt_name?: string): Blockly.Input; + + /** + * Inserts a field (or label from string), and all prefix and suffix fields, at + * the location of the input's field row. + * @param {number} index The index at which to insert field. + * @param {string|!Blockly.Field} 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 {number} The index following the last inserted field. + */ + insertFieldAt(index: number, field: string|Blockly.Field, opt_name?: string): number; + + /** + * Remove a field from this input. + * @param {string} name The name of the field. + * @throws {Error} if the field is not present. + */ + removeField(name: string): void; + + /** + * Gets whether this input is visible or not. + * @return {boolean} True if visible. + */ + isVisible(): boolean; + + /** + * Sets whether this input is visible or not. + * Should only be used to collapse/uncollapse a block. + * @param {boolean} visible True if visible. + * @return {!Array.} List of blocks to render. + * @package + */ + setVisible(visible: boolean): Blockly.Block[]; + + /** + * Mark all fields on this input as dirty. + * @package + */ + markDirty(): void; + + /** + * Change a connection's compatibility. + * @param {string|Array.|null} check Compatible value type or + * list of value types. Null if all types are compatible. + * @return {!Blockly.Input} The input being modified (to allow chaining). + */ + setCheck(check: string|string[]|any /*null*/): Blockly.Input; + + /** + * Change the alignment of the connection's field(s). + * @param {number} align One of Blockly.ALIGN_LEFT, ALIGN_CENTRE, ALIGN_RIGHT. + * In RTL mode directions are reversed, and ALIGN_RIGHT aligns to the left. + * @return {!Blockly.Input} The input being modified (to allow chaining). + */ + setAlign(align: number): Blockly.Input; + + /** + * Initialize the fields on this input. + */ + init(): void; + + /** + * Sever all links to this input. + * @suppress {checkTypes} + */ + dispose(): void; + } + +} + + +declare module Blockly { + + class InsertionMarkerManager extends InsertionMarkerManager__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class InsertionMarkerManager__Class { + + /** + * Class that controls updates to connections during drags. It is primarily + * responsible for finding the closest eligible connection and highlighting or + * unhiglighting it as needed during a drag. + * @param {!Blockly.BlockSvg} block The top block in the stack being dragged. + * @constructor + */ + constructor(block: Blockly.BlockSvg); + + /** + * Sever all links from this object. + * @package + */ + dispose(): void; + + /** + * Return whether the block would be deleted if dropped immediately, based on + * information from the most recent move event. + * @return {boolean} True if the block would be deleted if dropped immediately. + * @package + */ + wouldDeleteBlock(): boolean; + + /** + * Return whether the block would be connected if dropped immediately, based on + * information from the most recent move event. + * @return {boolean} True if the block would be connected if dropped + * immediately. + * @package + */ + wouldConnectBlock(): boolean; + + /** + * Connect to the closest connection and render the results. + * This should be called at the end of a drag. + * @package + */ + applyConnections(): void; + + /** + * Update highlighted connections based on the most recent move location. + * @param {!Blockly.utils.Coordinate} dxy Position relative to drag start, + * in workspace units. + * @param {?number} deleteArea One of {@link Blockly.DELETE_AREA_TRASH}, + * {@link Blockly.DELETE_AREA_TOOLBOX}, or {@link Blockly.DELETE_AREA_NONE}. + * @package + */ + update(dxy: Blockly.utils.Coordinate, deleteArea: number): void; + + /** + * Get a list of the insertion markers that currently exist. Drags have 0, 1, + * or 2 insertion markers. + * @return {!Array.} A possibly empty list of insertion + * marker blocks. + * @package + */ + getInsertionMarkers(): Blockly.BlockSvg[]; + } + +} + + +declare module Blockly { + + class MarkerManager extends MarkerManager__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class MarkerManager__Class { + + /** + * Class to manage the multiple markers and the cursor on a workspace. + * @param {!Blockly.WorkspaceSvg} workspace The workspace for the marker manager. + * @constructor + * @package + */ + constructor(workspace: Blockly.WorkspaceSvg); + + /** + * Register the marker by adding it to the map of markers. + * @param {string} id A unique identifier for the marker. + * @param {!Blockly.Marker} marker The marker to register. + */ + registerMarker(id: string, marker: Blockly.Marker): void; + + /** + * Unregister the marker by removing it from the map of markers. + * @param {string} id The id of the marker to unregister. + */ + unregisterMarker(id: string): void; + + /** + * Get the cursor for the workspace. + * @return {Blockly.Cursor} The cursor for this workspace. + */ + getCursor(): Blockly.Cursor; + + /** + * Get a single marker that corresponds to the given id. + * @param {string} id A unique identifier for the marker. + * @return {Blockly.Marker} The marker that corresponds to the given id, or null + * if none exists. + */ + getMarker(id: string): Blockly.Marker; + + /** + * Sets the cursor and initializes the drawer for use with keyboard navigation. + * @param {Blockly.Cursor} cursor The cursor used to move around this workspace. + */ + setCursor(cursor: Blockly.Cursor): void; + + /** + * Add the cursor svg to this workspace svg group. + * @param {SVGElement} cursorSvg The svg root of the cursor to be added to the + * workspace svg group. + * @package + */ + setCursorSvg(cursorSvg: SVGElement): void; + + /** + * Add the marker svg to this workspaces svg group. + * @param {SVGElement} markerSvg The svg root of the marker to be added to the + * workspace svg group. + * @package + */ + setMarkerSvg(markerSvg: SVGElement): void; + + /** + * Dispose of the marker manager. + * Go through and delete all markers associated with this marker manager. + * @suppress {checkTypes} + * @package + */ + dispose(): void; + } + +} + + +declare module Blockly { + + class Mutator extends Mutator__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Mutator__Class extends Blockly.Icon__Class { + + /** + * Class for a mutator dialog. + * @param {!Array.} quarkNames List of names of sub-blocks for flyout. + * @extends {Blockly.Icon} + * @constructor + */ + constructor(quarkNames: string[]); + + /** + * Set the block this mutator is associated with. + * @param {Blockly.BlockSvg} block The block associated with this mutator. + * @package + */ + setBlock(block: Blockly.BlockSvg): void; + + /** + * Returns the workspace inside this mutator icon's bubble. + * @return {Blockly.WorkspaceSvg} The workspace inside this mutator icon's + * bubble. + * @package + */ + getWorkspace(): Blockly.WorkspaceSvg; + + /** + * Add or remove the UI indicating if this icon may be clicked or not. + */ + updateEditable(): void; + + /** + * Show or hide the mutator bubble. + * @param {boolean} visible True if the bubble should be visible. + */ + setVisible(visible: boolean): void; + + /** + * Dispose of this mutator. + */ + dispose(): void; + + /** + * Update the styles on all blocks in the mutator. + * @public + */ + updateBlockStyle(): void; + } + +} + +declare module Blockly.Mutator { + + /** + * 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. + */ + function reconnect(connectionChild: Blockly.Connection, block: Blockly.Block, inputName: string): boolean; + + /** + * Get the parent workspace of a workspace that is inside a mutator, taking into + * account whether it is a flyout. + * @param {Blockly.Workspace} workspace The workspace that is inside a mutator. + * @return {Blockly.Workspace} The mutator's parent workspace or null. + * @public + */ + function findParentWs(workspace: Blockly.Workspace): Blockly.Workspace; +} + + +declare module Blockly { + + class Names extends Names__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Names__Class { + + /** + * Class for a database of entity names (variables, functions, etc). + * @param {string} reservedWords A comma-separated string of words that are + * illegal for use as names in a language (e.g. 'new,if,this,...'). + * @param {string=} opt_variablePrefix Some languages need a '$' or a namespace + * before all variable names. + * @constructor + */ + constructor(reservedWords: string, opt_variablePrefix?: string); + + /** + * Empty the database and start from scratch. The reserved words are kept. + */ + reset(): void; + + /** + * Set the variable map that maps from variable name to variable object. + * @param {!Blockly.VariableMap} map The map to track. + */ + setVariableMap(map: Blockly.VariableMap): void; + + /** + * Convert a Blockly entity name to a legal exportable entity name. + * @param {string} name The Blockly entity name (no constraints). + * @param {string} type The type of entity in Blockly + * ('VARIABLE', 'PROCEDURE', 'BUILTIN', etc...). + * @return {string} An entity name that is legal in the exported language. + */ + getName(name: string, type: string): string; + + /** + * Convert a Blockly entity name to a legal exportable entity name. + * Ensure that this is a new name not overlapping any previously defined name. + * Also check against list of reserved words for the current language and + * ensure name doesn't collide. + * @param {string} name The Blockly entity name (no constraints). + * @param {string} type The type of entity in Blockly + * ('VARIABLE', 'PROCEDURE', 'BUILTIN', etc...). + * @return {string} An entity name that is legal in the exported language. + */ + getDistinctName(name: string, type: string): string; + } + +} + +declare module Blockly.Names { + + /** + * Constant to separate developer variable names from user-defined variable + * names when running generators. + * A developer variable will be declared as a global in the generated code, but + * will never be shown to the user in the workspace or stored in the variable + * map. + */ + var DEVELOPER_VARIABLE_TYPE: any /*missing*/; + + /** + * Do the given two entity names refer to the same entity? + * Blockly names are case-insensitive. + * @param {string} name1 First name. + * @param {string} name2 Second name. + * @return {boolean} True if names are the same. + */ + function equals(name1: string, name2: string): boolean; +} + + +declare module Blockly { + + class Options extends Options__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Options__Class { + + /** + * Parse the user-specified options, using reasonable defaults where behaviour + * is unspecified. + * @param {!Blockly.BlocklyOptions} options Dictionary of options. + * Specification: https://developers.google.com/blockly/guides/get-started/web#configuration + * @constructor + */ + constructor(options: Blockly.BlocklyOptions); + + /** @deprecated January 2019 */ + hasScrollbars: any /*missing*/; + + /** + * The SVG element for the grid pattern. + * Created during injection. + * @type {!SVGElement} + */ + gridPattern: SVGElement; + + /** + * The parent of the current workspace, or null if there is no parent + * workspace. + * @type {Blockly.Workspace} + */ + parentWorkspace: Blockly.Workspace; + + /** + * If set, sets the translation of the workspace to match the scrollbars. + * @param {!Object} xyRatio Contains an x and/or y property which is a float + * between 0 and 1 specifying the degree of scrolling. + * @return {void} + */ + setMetrics(xyRatio: Object): void; + + /** + * Return an object with the metrics required to size the workspace. + * @return {!Object} Contains size and position metrics. + */ + getMetrics(): Object; + } + + + interface BlocklyOptions { + } +} + +declare module Blockly.Options { + + /** + * 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. + */ + function parseToolboxTree(tree: Node|string): Node; +} + + +declare module Blockly.Procedures { + + /** + * Constant to separate procedure names from variables and generated functions + * when running generators. + * @deprecated Use Blockly.PROCEDURE_CATEGORY_NAME + */ + var NAME_TYPE: any /*missing*/; + + /** + * The default argument for a procedures_mutatorarg block. + * @type {string} + */ + var DEFAULT_ARG: string; + + /** + * Procedure block type. + * @typedef {{ + * getProcedureCall: function():string, + * renameProcedure: function(string,string), + * getProcedureDef: function():!Array + * }} + */ + interface ProcedureBlock { + getProcedureCall: { (): string }; + renameProcedure: { (_0: string, _1: string): any /*missing*/ }; + getProcedureDef: { (): any[] } + } + + /** + * Find all user-created procedure definitions in a workspace. + * @param {!Blockly.Workspace} root Root workspace. + * @return {!Array.>} Pair of arrays, the + * first contains procedures without return variables, the second with. + * Each procedure is defined by a three-element list of name, parameter + * list, and return value boolean. + */ + function allProcedures(root: Blockly.Workspace): any[][][]; + + /** + * Ensure two identically-named procedures don't exist. + * Take the proposed procedure name, and return a legal name i.e. one that + * is not empty and doesn't collide with other procedures. + * @param {string} name Proposed procedure name. + * @param {!Blockly.Block} block Block to disambiguate. + * @return {string} Non-colliding name. + */ + function findLegalName(name: string, block: Blockly.Block): string; + + /** + * Return if the given name is already a procedure name. + * @param {string} name The questionable name. + * @param {!Blockly.Workspace} workspace The workspace to scan for collisions. + * @param {Blockly.Block=} opt_exclude Optional block to exclude from + * comparisons (one doesn't want to collide with oneself). + * @return {boolean} True if the name is used, otherwise return false. + */ + function isNameUsed(name: string, workspace: Blockly.Workspace, opt_exclude?: Blockly.Block): boolean; + + /** + * Rename a procedure. Called by the editable field. + * @param {string} name The proposed new name. + * @return {string} The accepted name. + * @this {Blockly.Field} + */ + function rename(name: string): string; + + /** + * Construct the blocks required by the flyout for the procedure category. + * @param {!Blockly.Workspace} workspace The workspace containing procedures. + * @return {!Array.} Array of XML block elements. + */ + function flyoutCategory(workspace: Blockly.Workspace): Element[]; + + /** + * Listens for when a procedure mutator is opened. Then it triggers a flyout + * update and adds a mutator change listener to the mutator workspace. + * @param {!Blockly.Events.Abstract} e The event that triggered this listener. + * @package + */ + function mutatorOpenListener(e: Blockly.Events.Abstract): void; + + /** + * Find all the callers of a named procedure. + * @param {string} name Name of procedure. + * @param {!Blockly.Workspace} workspace The workspace to find callers in. + * @return {!Array.} Array of caller blocks. + */ + function getCallers(name: string, workspace: Blockly.Workspace): Blockly.Block[]; + + /** + * When a procedure definition changes its parameters, find and edit all its + * callers. + * @param {!Blockly.Block} defBlock Procedure definition block. + */ + function mutateCallers(defBlock: Blockly.Block): void; + + /** + * Find the definition block for the named procedure. + * @param {string} name Name of procedure. + * @param {!Blockly.Workspace} workspace The workspace to search. + * @return {Blockly.Block} The procedure definition block, or null not found. + */ + function getDefinition(name: string, workspace: Blockly.Workspace): Blockly.Block; +} + + +declare module Blockly { + + class RenderedConnection extends RenderedConnection__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class RenderedConnection__Class extends Blockly.Connection__Class { + + /** + * Class for a connection between blocks that may be rendered on screen. + * @param {!Blockly.BlockSvg} source The block establishing this connection. + * @param {number} type The type of the connection. + * @extends {Blockly.Connection} + * @constructor + */ + constructor(source: Blockly.BlockSvg, type: number); + + /** + * Returns the distance between this connection and another connection in + * workspace units. + * @param {!Blockly.Connection} otherConnection The other connection to measure + * the distance to. + * @return {number} The distance between connections, in workspace units. + */ + distanceFrom(otherConnection: Blockly.Connection): number; + + /** + * 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. + * @package + */ + bumpAwayFrom(staticConnection: Blockly.Connection): void; + + /** + * Change the connection's coordinates. + * @param {number} x New absolute x coordinate, in workspace coordinates. + * @param {number} y New absolute y coordinate, in workspace coordinates. + */ + moveTo(x: number, y: number): void; + + /** + * Change the connection's coordinates. + * @param {number} dx Change to x coordinate, in workspace units. + * @param {number} dy Change to y coordinate, in workspace units. + */ + moveBy(dx: number, dy: number): void; + + /** + * Move this connection to the location given by its offset within the block and + * the location of the block's top left corner. + * @param {!Blockly.utils.Coordinate} blockTL The location of the top left + * corner of the block, in workspace coordinates. + */ + moveToOffset(blockTL: Blockly.utils.Coordinate): void; + + /** + * Set the offset of this connection relative to the top left of its block. + * @param {number} x The new relative x, in workspace units. + * @param {number} y The new relative y, in workspace units. + */ + setOffsetInBlock(x: number, y: number): void; + + /** + * Get the offset of this connection relative to the top left of its block. + * @return {!Blockly.utils.Coordinate} The offset of the connection. + * @package + */ + getOffsetInBlock(): Blockly.utils.Coordinate; + + /** + * Move the blocks on either side of this connection right next to each other. + * @package + */ + tighten(): void; + + /** + * Find the closest compatible connection to this connection. + * All parameters are in workspace units. + * @param {number} maxLimit The maximum radius to another connection. + * @param {!Blockly.utils.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. + */ + closest(maxLimit: number, dxy: Blockly.utils.Coordinate): { connection: Blockly.Connection; radius: number }; + + /** + * Add highlighting around this connection. + */ + highlight(): void; + + /** + * Remove the highlighting around this connection. + */ + unhighlight(): void; + + /** + * Set whether this connections is tracked in the database or not. + * @param {boolean} doTracking If true, start tracking. If false, stop tracking. + * @package + */ + setTracking(doTracking: boolean): void; + + /** + * Stop tracking this connection, as well as all down-stream connections on + * any block attached to this connection. This happens when a block is + * collapsed. + * + * Also closes down-stream icons/bubbles. + * @package + */ + stopTrackingAll(): void; + + /** + * Start tracking this connection, as well as all down-stream connections on + * any block attached to this connection. This happens when a block is expanded. + * @return {!Array.} List of blocks to render. + */ + startTrackingAll(): Blockly.Block[]; + + /** + * 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, in + * workspace units. + * @return {boolean} True if the connection is allowed, false otherwise. + */ + isConnectionAllowed(candidate: Blockly.Connection, maxRadius?: number): boolean; + + /** + * Behavior after a connection attempt fails. + * @param {!Blockly.Connection} otherConnection Connection that this connection + * failed to connect to. + * @package + */ + onFailedConnect(otherConnection: Blockly.Connection): void; + + /** + * 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, in + * workspace units. + * @return {!Array.} List of connections. + * @package + */ + neighbours(maxLimit: number): Blockly.Connection[]; + + /** + * Connect two connections together. This is the connection on the superior + * block. Rerender blocks as needed. + * @param {!Blockly.Connection} childConnection Connection on inferior block. + * @protected + */ + connect_(childConnection: Blockly.Connection): void; + + /** + * Function to be called when this connection's compatible types have changed. + * @protected + */ + onCheckChanged_(): void; + } + +} + +declare module Blockly.RenderedConnection { + + /** + * Enum for different kinds of tracked states. + * + * WILL_TRACK means that this connection will add itself to + * the db on the next moveTo call it receives. + * + * UNTRACKED means that this connection will not add + * itself to the database until setTracking(true) is explicitly called. + * + * TRACKED means that this connection is currently being tracked. + * @enum {number} + */ + enum TrackedState { WILL_TRACK, UNTRACKED, TRACKED } +} + + + +declare module Blockly { + + class ScrollbarPair extends ScrollbarPair__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class ScrollbarPair__Class { + + /** + * Class for a pair of scrollbars. Horizontal and vertical. + * @param {!Blockly.Workspace} workspace Workspace to bind the scrollbars to. + * @constructor + */ + constructor(workspace: Blockly.Workspace); + + /** + * Dispose of this pair of scrollbars. + * Unlink from all DOM elements to prevent memory leaks. + */ + dispose(): void; + + /** + * Recalculate both of the scrollbars' locations and lengths. + * Also reposition the corner rectangle. + */ + resize(): void; + + /** + * Set the handles of both scrollbars to be at a certain position in CSS pixels + * relative to their parents. + * @param {number} x Horizontal scroll value. + * @param {number} y Vertical scroll value. + */ + set(x: number, y: number): void; + + /** + * Set whether this scrollbar's container is visible. + * @param {boolean} visible Whether the container is visible. + */ + setContainerVisible(visible: boolean): void; + } + + + class Scrollbar extends Scrollbar__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Scrollbar__Class { + + /** + * Class for a pure SVG scrollbar. + * This technique offers a scrollbar that is guaranteed to work, but may not + * 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 scrollbar is part of a horiz/vert pair. + * @param {string=} opt_class A class to be applied to this scrollbar. + * @constructor + */ + constructor(workspace: Blockly.Workspace, horizontal: boolean, opt_pair?: boolean, opt_class?: string); + + /** + * Dispose of this scrollbar. + * Unlink from all DOM elements to prevent memory leaks. + */ + dispose(): void; + + /** + * Set the offset of the scrollbar's handle from the scrollbar's position, and + * change the SVG attribute accordingly. + * @param {number} newPosition The new scrollbar handle offset in CSS pixels. + */ + setHandlePosition(newPosition: number): void; + + /** + * Recalculate the scrollbar's location and its length. + * @param {Object=} opt_metrics A data structure of from the describing all the + * required dimensions. If not provided, it will be fetched from the host + * object. + */ + resize(opt_metrics?: Object): void; + + /** + * Recalculate a horizontal scrollbar's location on the screen and path length. + * This should be called when the layout or size of the window has changed. + * @param {!Object} hostMetrics A data structure describing all the + * required dimensions, possibly fetched from the host object. + */ + resizeViewHorizontal(hostMetrics: Object): void; + + /** + * Recalculate a horizontal scrollbar's location within its path and length. + * This should be called when the contents of the workspace have changed. + * @param {!Object} hostMetrics A data structure describing all the + * required dimensions, possibly fetched from the host object. + */ + resizeContentHorizontal(hostMetrics: Object): void; + + /** + * Recalculate a vertical scrollbar's location on the screen and path length. + * This should be called when the layout or size of the window has changed. + * @param {!Object} hostMetrics A data structure describing all the + * required dimensions, possibly fetched from the host object. + */ + resizeViewVertical(hostMetrics: Object): void; + + /** + * Recalculate a vertical scrollbar's location within its path and length. + * This should be called when the contents of the workspace have changed. + * @param {!Object} hostMetrics A data structure describing all the + * required dimensions, possibly fetched from the host object. + */ + resizeContentVertical(hostMetrics: Object): void; + + /** + * Is the scrollbar visible. Non-paired scrollbars disappear when they aren't + * needed. + * @return {boolean} True if visible. + */ + isVisible(): boolean; + + /** + * Set whether the scrollbar's container is visible and update + * display accordingly if visibility has changed. + * @param {boolean} visible Whether the container is visible + */ + setContainerVisible(visible: boolean): void; + + /** + * Set whether the scrollbar is visible. + * Only applies to non-paired scrollbars. + * @param {boolean} visible True if visible. + */ + setVisible(visible: boolean): void; + + /** + * Update visibility of scrollbar based on whether it thinks it should + * be visible and whether its containing workspace is visible. + * We cannot rely on the containing workspace being hidden to hide us + * because it is not necessarily our parent in the DOM. + */ + updateDisplay_(): void; + + /** + * Set the scrollbar handle's position. + * @param {number} value The distance from the top/left end of the bar, in CSS + * pixels. It may be larger than the maximum allowable position of the + * scrollbar handle. + */ + set(value: number): void; + + /** + * Record the origin of the workspace that the scrollbar is in, in pixels + * relative to the injection div origin. This is for times when the scrollbar is + * used in an object whose origin isn't the same as the main workspace + * (e.g. in a flyout.) + * @param {number} x The x coordinate of the scrollbar's origin, in CSS pixels. + * @param {number} y The y coordinate of the scrollbar's origin, in CSS pixels. + */ + setOrigin(x: number, y: number): void; + } + +} + +declare module Blockly.Scrollbar { + + /** + * Width of vertical scrollbar or height of horizontal scrollbar in CSS pixels. + * Scrollbars should be larger on touch devices. + */ + var scrollbarThickness: any /*missing*/; +} + + +declare module Blockly { + + class Theme extends Theme__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Theme__Class { + + /** + * Class for a theme. + * @param {string} name Theme name. + * @param {!Object.} blockStyles A map from + * style names (strings) to objects with style attributes for blocks. + * @param {!Object.} categoryStyles A map + * from style names (strings) to objects with style attributes for + * categories. + * @param {!Object.=} opt_componentStyles A map of Blockly component + * names to style value. + * @constructor + */ + constructor(name: string, blockStyles: { [key: string]: Blockly.Theme.BlockStyle }, categoryStyles: { [key: string]: Blockly.Theme.CategoryStyle }, opt_componentStyles?: { [key: string]: any }); + + /** + * The theme name. This can be used to reference a specific theme in CSS. + * @type {string} + * @package + */ + name: string; + + /** + * The block styles map. + * @type {!Object.} + * @package + */ + blockStyles: { [key: string]: Blockly.Theme.BlockStyle }; + + /** + * The category styles map. + * @type {!Object.} + * @package + */ + categoryStyles: { [key: string]: Blockly.Theme.CategoryStyle }; + + /** + * Gets the style for a given Blockly UI component. If the style value is a + * string, we attempt to find the value of any named references. + * @param {string} componentName The name of the component. + * @return {?string} The style value. + */ + getComponentStyle(componentName: string): string; + + /** + * Configure a specific Blockly UI component with a style value. + * @param {string} componentName The name of the component. + * @param {*} styleValue The style value. + */ + setComponentStyle(componentName: string, styleValue: any): void; + } + +} + +declare module Blockly.Theme { + + /** + * A block style. + * @typedef {{ + * colourPrimary:string, + * colourSecondary:string, + * colourTertiary:string, + * hat:string + * }} + */ + interface BlockStyle { + colourPrimary: string; + colourSecondary: string; + colourTertiary: string; + hat: string + } + + /** + * A category style. + * @typedef {{ + * colour:string + * }} + */ + interface CategoryStyle { + colour: string + } +} + + +declare module Blockly { + + class ThemeManager extends ThemeManager__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class ThemeManager__Class { + + /** + * Class for storing and updating a workspace's theme and UI components. + * @param {!Blockly.WorkspaceSvg} workspace The main workspace. + * @param {!Blockly.Theme} theme The workspace theme. + * @constructor + * @package + */ + constructor(workspace: Blockly.WorkspaceSvg, theme: Blockly.Theme); + + /** + * Get the workspace theme. + * @return {!Blockly.Theme} The workspace theme. + * @package + */ + getTheme(): Blockly.Theme; + + /** + * Set the workspace theme, and refresh the workspace and all components. + * @param {!Blockly.Theme} theme The workspace theme. + * @package + */ + setTheme(theme: Blockly.Theme): void; + + /** + * Subscribe a workspace to changes to the selected theme. If a new theme is + * set, the workspace is called to refresh its blocks. + * @param {!Blockly.Workspace} workspace The workspace to subscribe. + * @package + */ + subscribeWorkspace(workspace: Blockly.Workspace): void; + + /** + * Unsubscribe a workspace to changes to the selected theme. + * @param {!Blockly.Workspace} workspace The workspace to unsubscribe. + * @package + */ + unsubscribeWorkspace(workspace: Blockly.Workspace): void; + + /** + * Subscribe an element to changes to the selected theme. If a new theme is + * selected, the element's style is refreshed with the new theme's style. + * @param {!Element} element The element to subscribe. + * @param {string} componentName The name used to identify the component. This + * must be the same name used to configure the style in the Theme object. + * @param {string} propertyName The inline style property name to update. + * @package + */ + subscribe(element: Element, componentName: string, propertyName: string): void; + + /** + * Unsubscribe an element to changes to the selected theme. + * @param {Element} element The element to unsubscribe. + * @package + */ + unsubscribe(element: Element): void; + + /** + * Dispose of this theme manager. + * @package + * @suppress {checkTypes} + */ + dispose(): void; + } + +} + +declare module Blockly.ThemeManager { + + /** + * A Blockly UI component type. + * @typedef {{ + * element:!Element, + * propertyName:string + * }} + */ + interface Component { + element: Element; + propertyName: string + } +} + + +declare module Blockly { + + class Toolbox extends Toolbox__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Toolbox__Class { + + /** + * Class for a Toolbox. + * Creates the toolbox's DOM. + * @param {!Blockly.WorkspaceSvg} workspace The workspace in which to create new + * blocks. + * @constructor + */ + constructor(workspace: Blockly.WorkspaceSvg); + + /** + * Is RTL vs LTR. + * @type {boolean} + */ + RTL: boolean; + + /** + * Position of the toolbox and flyout relative to the workspace. + * @type {number} + */ + toolboxPosition: number; + + /** + * Width of the toolbox, which changes only in vertical layout. + * @type {number} + */ + width: number; + + /** + * Height of the toolbox, which changes only in horizontal layout. + * @type {number} + */ + height: number; + + /** + * Initializes the toolbox. + * @throws {Error} If missing a require for both `Blockly.HorizontalFlyout` and + * `Blockly.VerticalFlyout`. + */ + init(): void; + + /** + * HTML container for the Toolbox menu. + * @type {Element} + */ + HtmlDiv: Element; + + /** + * Fill the toolbox with categories and blocks. + * @param {Node} languageTree DOM tree of blocks. + * @package + */ + renderTree(languageTree: Node): void; + + /** + * Handles the given Blockly action on a toolbox. + * This is only triggered when keyboard accessibility mode is enabled. + * @param {!Blockly.Action} action The action to be handled. + * @return {boolean} True if the field handled the action, false otherwise. + * @package + */ + onBlocklyAction(action: Blockly.Action): boolean; + + /** + * Dispose of this toolbox. + */ + dispose(): void; + + /** + * Get the width of the toolbox. + * @return {number} The width of the toolbox. + */ + getWidth(): number; + + /** + * Get the height of the toolbox. + * @return {number} The width of the toolbox. + */ + getHeight(): number; + + /** + * Get the toolbox flyout. + * @return {Blockly.Flyout} The toolbox flyout. + */ + getFlyout(): Blockly.Flyout; + + /** + * Move the toolbox to the edge. + */ + position(): void; + + /** + * Updates the category colours and background colour of selected categories. + * @package + */ + updateColourFromTheme(): void; + + /** + * Unhighlight any previously specified option. + */ + clearSelection(): void; + + /** + * Adds a style on the toolbox. Usually used to change the cursor. + * @param {string} style The name of the class to add. + * @package + */ + addStyle(style: string): void; + + /** + * Removes a style from the toolbox. Usually used to change the cursor. + * @param {string} style The name of the class to remove. + * @package + */ + removeStyle(style: string): void; + + /** + * Return the deletion rectangle for this toolbox. + * @return {Blockly.utils.Rect} Rectangle in which to delete. + */ + getClientRect(): Blockly.utils.Rect; + + /** + * Update the flyout's contents without closing it. Should be used in response + * to a change in one of the dynamic categories, such as variables or + * procedures. + */ + refreshSelection(): void; + + /** + * Select the first toolbox category if no category is selected. + * @package + */ + selectFirstCategory(): void; + } + +} + +declare module Blockly.Toolbox { + + class TreeSeparator extends TreeSeparator__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class TreeSeparator__Class extends Blockly.tree.TreeNode__Class { + + /** + * A blank separator node in the tree. + * @param {!Blockly.tree.BaseNode.Config} config The configuration for the tree. + * @constructor + * @extends {Blockly.tree.TreeNode} + */ + constructor(config: Blockly.tree.BaseNode.Config); + } + +} + + +declare module Blockly.Tooltip { + + /** + * Is a tooltip currently showing? + */ + var visible: any /*missing*/; + + /** + * Maximum width (in characters) of a tooltip. + */ + var LIMIT: any /*missing*/; + + /** + * Horizontal offset between mouse cursor and tooltip. + */ + var OFFSET_X: any /*missing*/; + + /** + * Vertical offset between mouse cursor and tooltip. + */ + var OFFSET_Y: any /*missing*/; + + /** + * Radius mouse can move before killing tooltip. + */ + var RADIUS_OK: any /*missing*/; + + /** + * Delay before tooltip appears. + */ + var HOVER_MS: any /*missing*/; + + /** + * Horizontal padding between tooltip and screen edge. + */ + var MARGINS: any /*missing*/; + + /** + * The HTML container. Set once by Blockly.Tooltip.createDom. + * @type {Element} + */ + var DIV: Element; + + /** + * Create the tooltip div and inject it onto the page. + */ + function createDom(): void; + + /** + * Binds the required mouse events onto an SVG element. + * @param {!Element} element SVG element onto which tooltip is to be bound. + */ + function bindMouseEvents(element: Element): void; + + /** + * Hide the tooltip. + */ + function hide(): void; + + /** + * Hide any in-progress tooltips and block showing new tooltips until the next + * call to unblock(). + * @package + */ + function block(): void; + + /** + * Unblock tooltips: allow them to be scheduled and shown according to their own + * logic. + * @package + */ + function unblock(): void; +} + + +declare module Blockly.Touch { + + /** + * Whether touch is enabled in the browser. + * Copied from Closure's goog.events.BrowserFeature.TOUCH_ENABLED + */ + var TOUCH_ENABLED: any /*missing*/; + + /** + * The TOUCH_MAP lookup dictionary specifies additional touch events to fire, + * in conjunction with mouse events. + * @type {Object} + */ + var TOUCH_MAP: Object; + + /** + * Clear the touch identifier that tracks which touch stream to pay attention + * to. This ends the current drag/gesture and allows other pointers to be + * captured. + */ + function clearTouchIdentifier(): void; + + /** + * Decide whether Blockly should handle or ignore this event. + * Mouse and touch events require special checks because we only want to deal + * with one touch stream at a time. All other events should always be handled. + * @param {!Event} e The event to check. + * @return {boolean} True if this event should be passed through to the + * registered handler; false if it should be blocked. + */ + function shouldHandleEvent(e: Event): boolean; + + /** + * Get the touch identifier from the given event. If it was a mouse event, the + * identifier is the string 'mouse'. + * @param {!Event} e Mouse event or touch event. + * @return {string} The touch identifier from the first changed touch, if + * defined. Otherwise 'mouse'. + */ + function getTouchIdentifierFromEvent(e: Event): string; + + /** + * Check whether the touch identifier on the event matches the current saved + * identifier. If there is no identifier, that means it's a mouse event and + * we'll use the identifier "mouse". This means we won't deal well with + * multiple mice being used at the same time. That seems okay. + * If the current identifier was unset, save the identifier from the + * event. This starts a drag/gesture, during which touch events with other + * identifiers will be silently ignored. + * @param {!Event} e Mouse event or touch event. + * @return {boolean} Whether the identifier on the event matches the current + * saved identifier. + */ + function checkTouchIdentifier(e: Event): boolean; + + /** + * Set an event's clientX and clientY from its first changed touch. Use this to + * make a touch event work in a mouse event handler. + * @param {!Event} e A touch event. + */ + function setClientFromTouch(e: Event): void; + + /** + * Check whether a given event is a mouse or touch event. + * @param {!Event} e An event. + * @return {boolean} True if it is a mouse or touch event; false otherwise. + */ + function isMouseOrTouchEvent(e: Event): boolean; + + /** + * Check whether a given event is a touch event or a pointer event. + * @param {!Event} e An event. + * @return {boolean} True if it is a touch event; false otherwise. + */ + function isTouchEvent(e: Event): boolean; + + /** + * Split an event into an array of events, one per changed touch or mouse + * point. + * @param {!Event} e A mouse event or a touch event with one or more changed + * touches. + * @return {!Array.} An array of mouse or touch events. Each touch + * event will have exactly one changed touch. + */ + function splitEventByTouches(e: Event): Event[]; +} + +declare module Blockly { + + /** + * Context menus on touch devices are activated using a long-press. + * Unfortunately the contextmenu touch event is currently (2015) only supported + * by Chrome. This function is fired on any touchstart event, queues a task, + * which after about a second opens the context menu. The tasks is killed + * if the touch event terminates early. + * @param {!Event} e Touch start event. + * @param {Blockly.Gesture} gesture The gesture that triggered this longStart. + * @package + */ + function longStart(e: Event, gesture: Blockly.Gesture): void; + + /** + * Nope, that's not a long-press. Either touchend or touchcancel was fired, + * or a drag hath begun. Kill the queued long-press task. + * @package + */ + function longStop_(): void; +} + + +declare module Blockly { + + class TouchGesture extends TouchGesture__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class TouchGesture__Class extends Blockly.Gesture__Class { + + /** + * Class for one gesture. + * @param {!Event} e The event that kicked off this gesture. + * @param {!Blockly.WorkspaceSvg} creatorWorkspace The workspace that created + * this gesture and has a reference to it. + * @extends {Blockly.Gesture} + * @constructor + */ + constructor(e: Event, creatorWorkspace: Blockly.WorkspaceSvg); + + /** + * Start a gesture: update the workspace to indicate that a gesture is in + * progress and bind mousemove and mouseup handlers. + * @param {!Event} e A mouse down, touch start or pointer down event. + * @package + */ + doStart(e: Event): void; + + /** + * Bind gesture events. + * Overriding the gesture definition of this function, binding the same + * functions for onMoveWrapper_ and onUpWrapper_ but passing + * opt_noCaptureIdentifier. + * In addition, binding a second mouse down event to detect multi-touch events. + * @param {!Event} e A mouse down or touch start event. + * @package + */ + bindMouseEvents(e: Event): void; + + /** + * Handle a mouse down, touch start, or pointer down event. + * @param {!Event} e A mouse down, touch start, or pointer down event. + * @package + */ + handleStart(e: Event): void; + + /** + * Handle a mouse move, touch move, or pointer move event. + * @param {!Event} e A mouse move, touch move, or pointer move event. + * @package + */ + handleMove(e: Event): void; + + /** + * Handle a mouse up, touch end, or pointer up event. + * @param {!Event} e A mouse up, touch end, or pointer up event. + * @package + */ + handleUp(e: Event): void; + + /** + * Whether this gesture is part of a multi-touch gesture. + * @return {boolean} Whether this gesture is part of a multi-touch gesture. + * @package + */ + isMultiTouch(): boolean; + + /** + * Sever all links from this object. + * @package + */ + dispose(): void; + + /** + * Handle a touch start or pointer down event and keep track of current + * pointers. + * @param {!Event} e A touch start, or pointer down event. + * @package + */ + handleTouchStart(e: Event): void; + + /** + * Handle a touch move or pointer move event and zoom in/out if two pointers + * are on the screen. + * @param {!Event} e A touch move, or pointer move event. + * @package + */ + handleTouchMove(e: Event): void; + + /** + * Handle a touch end or pointer end event and end the gesture. + * @param {!Event} e A touch end, or pointer end event. + * @package + */ + handleTouchEnd(e: Event): void; + + /** + * Helper function returning the current touch point coordinate. + * @param {!Event} e A touch or pointer event. + * @return {Blockly.utils.Coordinate} The current touch point coordinate + * @package + */ + getTouchPoint(e: Event): Blockly.utils.Coordinate; + } + +} + +declare module Blockly.TouchGesture { + + /** + * A multiplier used to convert the gesture scale to a zoom in delta. + * @const + */ + var ZOOM_IN_MULTIPLIER: any /*missing*/; + + /** + * A multiplier used to convert the gesture scale to a zoom out delta. + * @const + */ + var ZOOM_OUT_MULTIPLIER: any /*missing*/; +} + + +declare module Blockly { + + class Trashcan extends Trashcan__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Trashcan__Class { + + /** + * Class for a trash can. + * @param {!Blockly.WorkspaceSvg} workspace The workspace to sit in. + * @constructor + */ + constructor(workspace: Blockly.WorkspaceSvg); + + /** + * The trashcan flyout. + * @type {Blockly.Flyout} + * @package + */ + flyout: Blockly.Flyout; + + /** + * Current open/close state of the lid. + * @type {boolean} + */ + isOpen: boolean; + + /** + * Create the trash can elements. + * @return {!SVGElement} The trash can's SVG group. + */ + createDom(): SVGElement; + + /** + * Initialize the trash can. + * @param {number} verticalSpacing Vertical distance from workspace edge to the + * same edge of the trashcan. + * @return {number} Vertical distance from workspace edge to the opposite + * edge of the trashcan. + */ + init(verticalSpacing: number): number; + + /** + * Dispose of this trash can. + * Unlink from all DOM elements to prevent memory leaks. + * @suppress {checkTypes} + */ + dispose(): void; + + /** + * Position the trashcan. + * It is positioned in the opposite corner to the corner the + * categories/toolbox starts at. + */ + position(): void; + + /** + * Return the deletion rectangle for this trash can. + * @return {Blockly.utils.Rect} Rectangle in which to delete. + */ + getClientRect(): Blockly.utils.Rect; + + /** + * Flip the lid open or shut. + * @param {boolean} state True if open. + * @package + */ + setOpen(state: boolean): void; + + /** + * Flip the lid shut. + * Called externally after a drag. + */ + close(): void; + + /** + * Inspect the contents of the trash. + */ + click(): void; + } + +} + + +declare module Blockly.Events { + + class Ui extends Ui__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Ui__Class extends Blockly.Events.Abstract__Class { + + /** + * Class for a UI event. + * UI events are events that don't need to be sent over the wire for multi-user + * editing to work (e.g. scrolling the workspace, zooming, opening toolbox + * categories). + * UI events do not undo or redo. + * @param {Blockly.Block} block The affected block. + * @param {string} element One of 'selected', 'comment', 'mutatorOpen', etc. + * @param {*} oldValue Previous value of element. + * @param {*} newValue New value of element. + * @extends {Blockly.Events.Abstract} + * @constructor + */ + constructor(block: Blockly.Block, element: string, oldValue: any, newValue: any); + + /** + * Type of this event. + * @type {string} + */ + type: string; + + /** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ + toJson(): Object; + + /** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ + fromJson(json: Object): void; + } + +} + + +declare module Blockly.utils.uiMenu { + + /** + * Get the size of a rendered goog.ui.Menu. + * @param {!Blockly.Menu} menu The menu to measure. + * @return {!Blockly.utils.Size} Object with width and height properties. + * @package + */ + function getSize(menu: Blockly.Menu): Blockly.utils.Size; + + /** + * Adjust the bounding boxes used to position the widget div to deal with RTL + * goog.ui.Menu positioning. In RTL mode the menu renders down and to the left + * of its start point, instead of down and to the right. Adjusting all of the + * bounding boxes accordingly allows us to use the same code for all widgets. + * This function in-place modifies the provided bounding boxes. + * @param {!Object} viewportBBox The bounding rectangle of the current viewport, + * in window coordinates. + * @param {!Object} anchorBBox The bounding rectangle of the anchor, in window + * coordinates. + * @param {!Blockly.utils.Size} menuSize The size of the menu that is inside the + * widget div, in window coordinates. + * @package + */ + function adjustBBoxesForRTL(viewportBBox: Object, anchorBBox: Object, menuSize: Blockly.utils.Size): void; +} + + +declare module Blockly.utils { + + /** + * Don't do anything for this event, just halt propagation. + * @param {!Event} e An event. + */ + function noEvent(e: Event): void; + + /** + * Is this event targeting a text input widget? + * @param {!Event} e An event. + * @return {boolean} True if text input. + */ + function isTargetInput(e: Event): boolean; + + /** + * Return the coordinates of the top-left corner of this element relative to + * its parent. Only for SVG elements and children (e.g. rect, g, path). + * @param {!Element} element SVG element to find the coordinates of. + * @return {!Blockly.utils.Coordinate} Object with .x and .y properties. + */ + function getRelativeXY(element: Element): Blockly.utils.Coordinate; + + /** + * Return the coordinates of the top-left corner of this element relative to + * the div Blockly was injected into. + * @param {!Element} element SVG element to find the coordinates of. If this is + * not a child of the div Blockly was injected into, the behaviour is + * undefined. + * @return {!Blockly.utils.Coordinate} Object with .x and .y properties. + */ + function getInjectionDivXY_(element: Element): Blockly.utils.Coordinate; + + /** + * Is this event a right-click? + * @param {!Event} e Mouse event. + * @return {boolean} True if right-click. + */ + function isRightButton(e: Event): boolean; + + /** + * Return the converted coordinates of the given mouse event. + * The origin (0,0) is the top-left corner of the Blockly SVG. + * @param {!Event} e Mouse event. + * @param {!Element} svg SVG element. + * @param {SVGMatrix} matrix Inverted screen CTM to use. + * @return {!SVGPoint} Object with .x and .y properties. + */ + function mouseToSvg(e: Event, svg: Element, matrix: SVGMatrix): SVGPoint; + + /** + * Get the scroll delta of a mouse event in pixel units. + * @param {!Event} e Mouse event. + * @return {{x: number, y: number}} Scroll delta object with .x and .y + * properties. + */ + function getScrollDeltaPixels(e: Event): { x: number; y: number }; + + /** + * Parse a string with any number of interpolation tokens (%1, %2, ...). + * It will also replace string table references (e.g., %{bky_my_msg} and + * %{BKY_MY_MSG} will both be replaced with the value in + * Blockly.Msg['MY_MSG']). Percentage sign characters '%' may be self-escaped + * (e.g., '%%'). + * @param {string} message Text which might contain string table references and + * interpolation tokens. + * @return {!Array.} Array of strings and numbers. + */ + function tokenizeInterpolation(message: string): string|number[]; + + /** + * Replaces string table references in a message, if the message is a string. + * For example, "%{bky_my_msg}" and "%{BKY_MY_MSG}" will both be replaced with + * the value in Blockly.Msg['MY_MSG']. + * @param {string|?} message Message, which may be a string that contains + * string table references. + * @return {string} String with message references replaced. + */ + function replaceMessageReferences(message: string|any): string; + + /** + * Validates that any %{MSG_KEY} references in the message refer to keys of + * the Blockly.Msg string table. + * @param {string} message Text which might contain string table references. + * @return {boolean} True if all message references have matching values. + * Otherwise, false. + */ + function checkMessageReferences(message: string): boolean; + + /** + * Generate a unique ID. This should be globally unique. + * 87 characters ^ 20 length > 128 bits (better than a UUID). + * @return {string} A globally unique ID string. + */ + function genUid(): string; + + /** + * Check if 3D transforms are supported by adding an element + * and attempting to set the property. + * @return {boolean} True if 3D transforms are supported. + */ + function is3dSupported(): boolean; + + /** + * Calls a function after the page has loaded, possibly immediately. + * @param {function()} fn Function to run. + * @throws Error Will throw if no global document can be found (e.g., Node.js). + */ + function runAfterPageLoad(fn: { (): any /*missing*/ }): void; + + /** + * Get the position of the current viewport in window coordinates. This takes + * scroll into account. + * @return {!Object} An object containing window width, height, and scroll + * position in window coordinates. + * @package + */ + function getViewportBBox(): Object; + + /** + * Removes the first occurrence of a particular value from an array. + * @param {!Array} arr Array from which to remove + * value. + * @param {*} obj Object to remove. + * @return {boolean} True if an element was removed. + * @package + */ + function arrayRemove(arr: any[], obj: any): boolean; + + /** + * Gets the document scroll distance as a coordinate object. + * Copied from Closure's goog.dom.getDocumentScroll. + * @return {!Blockly.utils.Coordinate} Object with values 'x' and 'y'. + */ + function getDocumentScroll(): Blockly.utils.Coordinate; + + /** + * Get a map of all the block's descendants mapping their type to the number of + * children with that type. + * @param {!Blockly.Block} block The block to map. + * @param {boolean=} opt_stripFollowing Optionally ignore all following + * statements (blocks that are not inside a value or statement input + * of the block). + * @return {!Object} Map of types to type counts for descendants of the bock. + */ + function getBlockTypeCounts(block: Blockly.Block, opt_stripFollowing?: boolean): Object; + + /** + * Converts screen coordinates to workspace coordinates. + * @param {Blockly.WorkspaceSvg} ws The workspace to find the coordinates on. + * @param {Blockly.utils.Coordinate} screenCoordinates The screen coordinates to + * be converted to workspace coordintaes + * @return {Blockly.utils.Coordinate} The workspace coordinates. + * @package + */ + function screenToWsCoordinates(ws: Blockly.WorkspaceSvg, screenCoordinates: Blockly.utils.Coordinate): Blockly.utils.Coordinate; + + /** + * Parse a block colour from a number or string, as provided in a block + * definition. + * @param {number|string} colour HSV hue value (0 to 360), #RRGGBB string, + * or a message reference string pointing to one of those two values. + * @return {{hue: ?number, hex: string}} An object containing the colour as + * a #RRGGBB string, and the hue if the input was an HSV hue value. + * @throws {Error} If the colour cannot be parsed. + */ + function parseBlockColour(colour: number|string): { hue: number; hex: string }; +} + + +declare module Blockly.Events { + + class VarBase extends VarBase__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class VarBase__Class extends Blockly.Events.Abstract__Class { + + /** + * Abstract class for a variable event. + * @param {Blockly.VariableModel} variable The variable this event corresponds + * to. + * @extends {Blockly.Events.Abstract} + * @constructor + */ + constructor(variable: Blockly.VariableModel); + + /** + * The variable id for the variable this event pertains to. + * @type {string} + */ + varId: string; + + /** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ + toJson(): Object; + + /** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ + fromJson(json: Object): void; + } + + + class VarCreate extends VarCreate__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class VarCreate__Class extends Blockly.Events.VarBase__Class { + + /** + * Class for a variable creation event. + * @param {Blockly.VariableModel} variable The created variable. + * Null for a blank event. + * @extends {Blockly.Events.VarBase} + * @constructor + */ + constructor(variable: Blockly.VariableModel); + + /** + * Type of this event. + * @type {string} + */ + type: string; + + /** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ + toJson(): Object; + + /** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ + fromJson(json: Object): void; + + /** + * Run a variable creation event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ + run(forward: boolean): void; + } + + + class VarDelete extends VarDelete__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class VarDelete__Class extends Blockly.Events.VarBase__Class { + + /** + * Class for a variable deletion event. + * @param {Blockly.VariableModel} variable The deleted variable. + * Null for a blank event. + * @extends {Blockly.Events.VarBase} + * @constructor + */ + constructor(variable: Blockly.VariableModel); + + /** + * Type of this event. + * @type {string} + */ + type: string; + + /** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ + toJson(): Object; + + /** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ + fromJson(json: Object): void; + + /** + * Run a variable deletion event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ + run(forward: boolean): void; + } + + + class VarRename extends VarRename__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class VarRename__Class extends Blockly.Events.VarBase__Class { + + /** + * Class for a variable rename event. + * @param {Blockly.VariableModel} variable The renamed variable. + * Null for a blank event. + * @param {string} newName The new name the variable will be changed to. + * @extends {Blockly.Events.VarBase} + * @constructor + */ + constructor(variable: Blockly.VariableModel, newName: string); + + /** + * Type of this event. + * @type {string} + */ + type: string; + + /** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ + toJson(): Object; + + /** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ + fromJson(json: Object): void; + + /** + * Run a variable rename event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ + run(forward: boolean): void; + } + +} + + +declare module Blockly { + + class VariableMap extends VariableMap__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class VariableMap__Class { + + /** + * Class for a variable map. This contains a dictionary data structure with + * variable types as keys and lists of variables as values. The list of + * variables are the type indicated by the key. + * @param {!Blockly.Workspace} workspace The workspace this map belongs to. + * @constructor + */ + constructor(workspace: Blockly.Workspace); + + /** + * The workspace this map belongs to. + * @type {!Blockly.Workspace} + */ + workspace: Blockly.Workspace; + + /** + * Clear the variable map. + */ + clear(): void; + + /** + * Rename the given variable by updating its name in the variable map. + * @param {!Blockly.VariableModel} variable Variable to rename. + * @param {string} newName New variable name. + * @package + */ + renameVariable(variable: Blockly.VariableModel, newName: string): void; + + /** + * Rename a variable by updating its name in the variable map. Identify the + * variable to rename with the given ID. + * @param {string} id ID of the variable to rename. + * @param {string} newName New variable name. + */ + renameVariableById(id: string, newName: string): void; + + /** + * Create a variable with a given name, optional type, and optional ID. + * @param {string} name The name of the variable. This must be unique across + * variables and procedures. + * @param {?string=} opt_type The type of the variable like 'int' or 'string'. + * Does not need to be unique. Field_variable can filter variables based on + * their type. This will default to '' which is a specific type. + * @param {?string=} opt_id The unique ID of the variable. This will default to + * a UUID. + * @return {!Blockly.VariableModel} The newly created variable. + */ + createVariable(name: string, opt_type?: string, opt_id?: string): Blockly.VariableModel; + + /** + * Delete a variable. + * @param {!Blockly.VariableModel} variable Variable to delete. + */ + deleteVariable(variable: Blockly.VariableModel): void; + + /** + * Delete a variables by the passed in ID and all of its uses from this + * workspace. May prompt the user for confirmation. + * @param {string} id ID of variable to delete. + */ + deleteVariableById(id: string): void; + + /** + * Deletes a variable and all of its uses from this workspace without asking the + * user for confirmation. + * @param {!Blockly.VariableModel} variable Variable to delete. + * @param {!Array.} uses An array of uses of the variable. + * @package + */ + deleteVariableInternal(variable: Blockly.VariableModel, uses: Blockly.Block[]): void; + + /** + * Find the variable by the given name and type and return it. Return null if + * it is not found. + * @param {string} name The name to check for. + * @param {?string=} opt_type The type of the variable. If not provided it + * defaults to the empty string, which is a specific type. + * @return {Blockly.VariableModel} The variable with the given name, or null if + * it was not found. + */ + getVariable(name: string, opt_type?: string): Blockly.VariableModel; + + /** + * Find the variable by the given ID and return it. Return null if it is not + * found. + * @param {string} id The ID to check for. + * @return {Blockly.VariableModel} The variable with the given ID. + */ + getVariableById(id: string): Blockly.VariableModel; + + /** + * Get a list containing all of the variables of a specified type. If type is + * null, return list of variables with empty string type. + * @param {?string} type Type of the variables to find. + * @return {!Array.} The sought after variables of the + * passed in type. An empty array if none are found. + */ + getVariablesOfType(type: string): Blockly.VariableModel[]; + + /** + * Return all variable and potential variable types. This list always contains + * the empty string. + * @param {?Blockly.Workspace} ws The workspace used to look for potential + * variables. This can be different than the workspace stored on this object + * if the passed in ws is a flyout workspace. + * @return {!Array.} List of variable types. + * @package + */ + getVariableTypes(ws: Blockly.Workspace): string[]; + + /** + * Return all variables of all types. + * @return {!Array.} List of variable models. + */ + getAllVariables(): Blockly.VariableModel[]; + + /** + * Returns all of the variable names of all types. + * @return {!Array} All of the variable names of all types. + */ + getAllVariableNames(): string[]; + + /** + * Find all the uses of a named variable. + * @param {string} id ID of the variable to find. + * @return {!Array.} Array of block usages. + */ + getVariableUsesById(id: string): Blockly.Block[]; + } + +} + + +declare module Blockly { + + class VariableModel extends VariableModel__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class VariableModel__Class { + + /** + * Class for a variable model. + * Holds information for the variable including name, ID, and type. + * @param {!Blockly.Workspace} workspace The variable's workspace. + * @param {string} name The name of the variable. This must be unique across + * variables and procedures. + * @param {string=} opt_type The type of the variable like 'int' or 'string'. + * Does not need to be unique. Field_variable can filter variables based on + * their type. This will default to '' which is a specific type. + * @param {string=} opt_id The unique ID of the variable. This will default to + * a UUID. + * @see {Blockly.FieldVariable} + * @constructor + */ + constructor(workspace: Blockly.Workspace, name: string, opt_type?: string, opt_id?: string); + + /** + * The workspace the variable is in. + * @type {!Blockly.Workspace} + */ + workspace: Blockly.Workspace; + + /** + * The name of the variable, typically defined by the user. It must be + * unique across all names used for procedures and variables. It may be + * changed by the user. + * @type {string} + */ + name: string; + + /** + * The type of the variable, such as 'int' or 'sound_effect'. This may be + * used to build a list of variables of a specific type. By default this is + * the empty string '', which is a specific type. + * @see {Blockly.FieldVariable} + * @type {string} + */ + type: string; + + /** + * @return {string} The ID for the variable. + */ + getId(): string; + } + +} + +declare module Blockly.VariableModel { + + /** + * A custom compare function for the VariableModel objects. + * @param {Blockly.VariableModel} var1 First variable to compare. + * @param {Blockly.VariableModel} var2 Second variable to compare. + * @return {number} -1 if name of var1 is less than name of var2, 0 if equal, + * and 1 if greater. + * @package + */ + function compareByName(var1: Blockly.VariableModel, var2: Blockly.VariableModel): number; +} + + +declare module Blockly.Variables { + + /** + * Constant to separate variable names from procedures and generated functions + * when running generators. + * @deprecated Use Blockly.VARIABLE_CATEGORY_NAME + */ + var NAME_TYPE: any /*missing*/; + + /** + * Find all user-created variables that are in use in the workspace. + * For use by generators. + * To get a list of all variables on a workspace, including unused variables, + * call Workspace.getAllVariables. + * @param {!Blockly.Workspace} ws The workspace to search for variables. + * @return {!Array.} Array of variable models. + */ + function allUsedVarModels(ws: Blockly.Workspace): Blockly.VariableModel[]; + + /** + * Find all user-created variables that are in use in the workspace and return + * only their names. + * For use by generators. + * To get a list of all variables on a workspace, including unused variables, + * call Workspace.getAllVariables. + * @deprecated January 2018 + */ + function allUsedVariables(): void; + + /** + * Find all developer variables used by blocks in the workspace. + * Developer variables are never shown to the user, but are declared as global + * variables in the generated code. + * To declare developer variables, define the getDeveloperVariables function on + * your block and return a list of variable names. + * For use by generators. + * @param {!Blockly.Workspace} workspace The workspace to search. + * @return {!Array.} A list of non-duplicated variable names. + */ + function allDeveloperVariables(workspace: Blockly.Workspace): string[]; + + /** + * Construct the elements (blocks and button) required by the flyout for the + * variable category. + * @param {!Blockly.Workspace} workspace The workspace containing variables. + * @return {!Array.} Array of XML elements. + */ + function flyoutCategory(workspace: Blockly.Workspace): Element[]; + + /** + * Construct the blocks required by the flyout for the variable category. + * @param {!Blockly.Workspace} workspace The workspace containing variables. + * @return {!Array.} Array of XML block elements. + */ + function flyoutCategoryBlocks(workspace: Blockly.Workspace): Element[]; + + /** + * Return a new variable name that is not yet being used. This will try to + * generate single letter variable names in the range 'i' to 'z' to start with. + * If no unique name is located it will try 'i' to 'z', 'a' to 'h', + * then 'i2' to 'z2' etc. Skip 'l'. + * @param {!Blockly.Workspace} workspace The workspace to be unique in. + * @return {string} New variable name. + */ + function generateUniqueName(workspace: Blockly.Workspace): string; + + /** + * Returns a unique name that is not present in the usedNames array. This + * will try to generate single letter names in the range a -> z (skip l). It + * will start with the character passed to startChar. + * @param {string} startChar The character to start the search at. + * @param {!Array} usedNames A list of all of the used names. + * @return {string} A unique name that is not present in the usedNames array. + */ + function generateUniqueNameFromOptions(startChar: string, usedNames: string[]): string; + + /** + * Handles "Create Variable" button in the default variables toolbox category. + * It will prompt the user for a variable name, including re-prompts if a name + * is already in use among the workspace's variables. + * + * Custom button handlers can delegate to this function, allowing variables + * types and after-creation processing. More complex customization (e.g., + * prompting for variable type) is beyond the scope of this function. + * + * @param {!Blockly.Workspace} workspace The workspace on which to create the + * variable. + * @param {function(?string=)=} opt_callback A callback. It will be passed an + * acceptable new variable name, or null if change is to be aborted (cancel + * button), or undefined if an existing variable was chosen. + * @param {string=} opt_type The type of the variable like 'int', 'string', or + * ''. This will default to '', which is a specific type. + */ + function createVariableButtonHandler(workspace: Blockly.Workspace, opt_callback?: { (_0: string): any /*missing*/ }, opt_type?: string): void; + + /** + * Original name of Blockly.Variables.createVariableButtonHandler(..). + * @deprecated Use Blockly.Variables.createVariableButtonHandler(..). + * + * @param {!Blockly.Workspace} workspace The workspace on which to create the + * variable. + * @param {function(?string=)=} opt_callback A callback. It will be passed an + * acceptable new variable name, or null if change is to be aborted (cancel + * button), or undefined if an existing variable was chosen. + * @param {string=} opt_type The type of the variable like 'int', 'string', or + * ''. This will default to '', which is a specific type. + */ + function createVariable(workspace: Blockly.Workspace, opt_callback?: { (_0: string): any /*missing*/ }, opt_type?: string): void; + + /** + * Rename a variable with the given workspace, variableType, and oldName. + * @param {!Blockly.Workspace} workspace The workspace on which to rename the + * variable. + * @param {Blockly.VariableModel} variable Variable to rename. + * @param {function(?string=)=} opt_callback A callback. It will + * be passed an acceptable new variable name, or null if change is to be + * aborted (cancel button), or undefined if an existing variable was chosen. + */ + function renameVariable(workspace: Blockly.Workspace, variable: Blockly.VariableModel, opt_callback?: { (_0: string): any /*missing*/ }): void; + + /** + * Prompt the user for a new variable name. + * @param {string} promptText The string of the prompt. + * @param {string} defaultText The default value to show in the prompt's field. + * @param {function(?string)} callback A callback. It will return the new + * variable name, or null if the user picked something illegal. + */ + function promptName(promptText: string, defaultText: string, callback: { (_0: string): any /*missing*/ }): void; + + /** + * Generate DOM objects representing a variable field. + * @param {!Blockly.VariableModel} variableModel The variable model to + * represent. + * @return {Element} The generated DOM. + * @public + */ + function generateVariableFieldDom(variableModel: Blockly.VariableModel): Element; + + /** + * Helper function to look up or create a variable on the given workspace. + * If no variable exists, creates and returns it. + * @param {!Blockly.Workspace} workspace The workspace to search for the + * variable. It may be a flyout workspace or main workspace. + * @param {?string} id The ID to use to look up or create the variable, or null. + * @param {string=} opt_name The string to use to look up or create the + * variable. + * @param {string=} opt_type The type to use to look up or create the variable. + * @return {!Blockly.VariableModel} The variable corresponding to the given ID + * or name + type combination. + */ + function getOrCreateVariablePackage(workspace: Blockly.Workspace, id: string, opt_name?: string, opt_type?: string): Blockly.VariableModel; + + /** + * Look up a variable on the given workspace. + * Always looks in the main workspace before looking in the flyout workspace. + * Always prefers lookup by ID to lookup by name + type. + * @param {!Blockly.Workspace} workspace The workspace to search for the + * variable. It may be a flyout workspace or main workspace. + * @param {?string} id The ID to use to look up the variable, or null. + * @param {string=} opt_name The string to use to look up the variable. + * Only used if lookup by ID fails. + * @param {string=} opt_type The type to use to look up the variable. + * Only used if lookup by ID fails. + * @return {Blockly.VariableModel} The variable corresponding to the given ID + * or name + type combination, or null if not found. + * @public + */ + function getVariable(workspace: Blockly.Workspace, id: string, opt_name?: string, opt_type?: string): Blockly.VariableModel; + + /** + * Helper function to get the list of variables that have been added to the + * workspace after adding a new block, using the given list of variables that + * were in the workspace before the new block was added. + * @param {!Blockly.Workspace} workspace The workspace to inspect. + * @param {!Array.} originalVariables The array of + * variables that existed in the workspace before adding the new block. + * @return {!Array.} The new array of variables that + * were freshly added to the workspace after creating the new block, + * or [] if no new variables were added to the workspace. + * @package + */ + function getAddedVariables(workspace: Blockly.Workspace, originalVariables: Blockly.VariableModel[]): Blockly.VariableModel[]; +} + + +declare module Blockly.VariablesDynamic { + + /** + * Construct the elements (blocks and button) required by the flyout for the + * variable category. + * @param {!Blockly.Workspace} workspace The workspace containing variables. + * @return {!Array.} Array of XML elements. + */ + function flyoutCategory(workspace: Blockly.Workspace): Element[]; + + /** + * Construct the blocks required by the flyout for the variable category. + * @param {!Blockly.Workspace} workspace The workspace containing variables. + * @return {!Array.} Array of XML block elements. + */ + function flyoutCategoryBlocks(workspace: Blockly.Workspace): Element[]; +} + + +declare module Blockly { + + class Warning extends Warning__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Warning__Class extends Blockly.Icon__Class { + + /** + * Class for a warning. + * @param {!Blockly.Block} block The block associated with this warning. + * @extends {Blockly.Icon} + * @constructor + */ + constructor(block: Blockly.Block); + + /** + * Does this icon get hidden when the block is collapsed. + */ + collapseHidden: any /*missing*/; + + /** + * Show or hide the warning bubble. + * @param {boolean} visible True if the bubble should be visible. + */ + setVisible(visible: boolean): void; + + /** + * Show the bubble. + * @package + */ + createBubble(): void; + + /** + * Dispose of the bubble and references to it. + * @package + */ + disposeBubble(): void; + + /** + * Set this warning's text. + * @param {string} text Warning text (or '' to delete). This supports + * linebreaks. + * @param {string} id An ID for this text entry to be able to maintain + * multiple warnings. + */ + setText(text: string, id: string): void; + + /** + * Get this warning's texts. + * @return {string} All texts concatenated into one string. + */ + getText(): string; + + /** + * Dispose of this warning. + */ + dispose(): void; + } + +} + + +declare module Blockly.WidgetDiv { + + /** + * Create the widget div and inject it onto the page. + */ + function createDom(): void; + + /** + * The HTML container for popup overlays (e.g. editor widgets). + * @type {!Element} + */ + var DIV: Element; + + /** + * 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. + */ + function show(newOwner: Object, rtl: boolean, dispose: Function): void; + + /** + * Destroy the widget and hide the div. + */ + function hide(): void; + + /** + * Is the container visible? + * @return {boolean} True if visible. + */ + function isVisible(): boolean; + + /** + * Destroy the widget and hide the div if it is being used by the specified + * object. + * @param {!Object} oldOwner The object that was using this container. + */ + function hideIfOwner(oldOwner: Object): void; + + /** + * Position the widget div based on an anchor rectangle. + * The widget should be placed adjacent to but not overlapping the anchor + * rectangle. The preferred position is directly below and aligned to the left + * (LTR) or right (RTL) side of the anchor. + * @param {!Object} viewportBBox The bounding rectangle of the current viewport, + * in window coordinates. + * @param {!Object} anchorBBox The bounding rectangle of the anchor, in window + * coordinates. + * @param {!Blockly.utils.Size} widgetSize The size of the widget that is inside the + * widget div, in window coordinates. + * @param {boolean} rtl Whether the workspace is in RTL mode. This determines + * horizontal alignment. + * @package + */ + function positionWithAnchor(viewportBBox: Object, anchorBBox: Object, widgetSize: Blockly.utils.Size, rtl: boolean): void; +} + + +declare module Blockly { + + class Workspace extends Workspace__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Workspace__Class { + + /** + * Class for a workspace. This is a data structure that contains blocks. + * There is no UI, and can be created headlessly. + * @param {!Blockly.Options=} opt_options Dictionary of options. + * @constructor + */ + constructor(opt_options?: Blockly.Options); + + /** @type {string} */ + id: string; + + /** @type {!Blockly.Options} */ + options: Blockly.Options; + + /** @type {boolean} */ + RTL: boolean; + + /** @type {boolean} */ + horizontalLayout: boolean; + + /** @type {number} */ + toolboxPosition: number; + + /** + * @type {!Array.} + * @protected + */ + undoStack_: Blockly.Events.Abstract[]; + + /** + * @type {!Array.} + * @protected + */ + redoStack_: Blockly.Events.Abstract[]; + + /** + * Returns `true` if the workspace is visible and `false` if it's headless. + * @type {boolean} + */ + rendered: boolean; + + /** + * Returns `true` if the workspace is currently in the process of a bulk clear. + * @type {boolean} + * @package + */ + isClearing: boolean; + + /** + * Maximum number of undo events in stack. `0` turns off undo, `Infinity` sets + * it to unlimited. + * @type {number} + */ + MAX_UNDO: number; + + /** + * Set of databases for rapid lookup of connection locations. + * @type {Array.} + */ + connectionDBList: Blockly.ConnectionDB[]; + + /** + * Dispose of this workspace. + * Unlink from all DOM elements to prevent memory leaks. + * @suppress {checkTypes} + */ + dispose(): void; + + /** + * Add a block to the list of top blocks. + * @param {!Blockly.Block} block Block to add. + */ + addTopBlock(block: Blockly.Block): void; + + /** + * Remove a block from the list of top blocks. + * @param {!Blockly.Block} block Block to remove. + */ + removeTopBlock(block: Blockly.Block): void; + + /** + * Finds the top-level blocks and returns them. Blocks are optionally sorted + * by position; top to bottom (with slight LTR or RTL bias). + * @param {boolean} ordered Sort the list if true. + * @return {!Array.} The top-level block objects. + */ + getTopBlocks(ordered: boolean): Blockly.Block[]; + + /** + * Add a block to the list of blocks keyed by type. + * @param {!Blockly.Block} block Block to add. + */ + addTypedBlock(block: Blockly.Block): void; + + /** + * Remove a block from the list of blocks keyed by type. + * @param {!Blockly.Block} block Block to remove. + */ + removeTypedBlock(block: Blockly.Block): void; + + /** + * Finds the blocks with the associated type and returns them. Blocks are + * optionally sorted by position; top to bottom (with slight LTR or RTL bias). + * @param {string} type The type of block to search for. + * @param {boolean} ordered Sort the list if true. + * @return {!Array.} The blocks of the given type. + */ + getBlocksByType(type: string, ordered: boolean): Blockly.Block[]; + + /** + * Add a comment to the list of top comments. + * @param {!Blockly.WorkspaceComment} comment comment to add. + * @package + */ + addTopComment(comment: Blockly.WorkspaceComment): void; + + /** + * Remove a comment from the list of top comments. + * @param {!Blockly.WorkspaceComment} comment comment to remove. + * @package + */ + removeTopComment(comment: Blockly.WorkspaceComment): void; + + /** + * Finds the top-level comments and returns them. Comments are optionally + * sorted by position; top to bottom (with slight LTR or RTL bias). + * @param {boolean} ordered Sort the list if true. + * @return {!Array.} The top-level comment objects. + * @package + */ + getTopComments(ordered: boolean): Blockly.WorkspaceComment[]; + + /** + * Find all blocks in workspace. Blocks are optionally sorted + * by position; top to bottom (with slight LTR or RTL bias). + * @param {boolean} ordered Sort the list if true. + * @return {!Array.} Array of blocks. + */ + getAllBlocks(ordered: boolean): Blockly.Block[]; + + /** + * Dispose of all blocks and comments in workspace. + */ + clear(): void; + + /** + * Rename a variable by updating its name in the variable map. Identify the + * variable to rename with the given ID. + * @param {string} id ID of the variable to rename. + * @param {string} newName New variable name. + */ + renameVariableById(id: string, newName: string): void; + + /** + * Create a variable with a given name, optional type, and optional ID. + * @param {string} name The name of the variable. This must be unique across + * variables and procedures. + * @param {?string=} opt_type The type of the variable like 'int' or 'string'. + * Does not need to be unique. Field_variable can filter variables based on + * their type. This will default to '' which is a specific type. + * @param {?string=} opt_id The unique ID of the variable. This will default to + * a UUID. + * @return {!Blockly.VariableModel} The newly created variable. + */ + createVariable(name: string, opt_type?: string, opt_id?: string): Blockly.VariableModel; + + /** + * Find all the uses of the given variable, which is identified by ID. + * @param {string} id ID of the variable to find. + * @return {!Array.} Array of block usages. + */ + getVariableUsesById(id: string): Blockly.Block[]; + + /** + * Delete a variables by the passed in ID and all of its uses from this + * workspace. May prompt the user for confirmation. + * @param {string} id ID of variable to delete. + */ + deleteVariableById(id: string): void; + + /** + * Check whether a variable exists with the given name. The check is + * case-insensitive. + * @param {string} _name The name to check for. + * @return {number} The index of the name in the variable list, or -1 if it is + * not present. + * @deprecated April 2017 + */ + variableIndexOf(_name: string): number; + + /** + * Find the variable by the given name and return it. Return null if it is not + * found. + * @param {string} name The name to check for. + * @param {string=} opt_type The type of the variable. If not provided it + * defaults to the empty string, which is a specific type. + * @return {Blockly.VariableModel} The variable with the given name. + */ + getVariable(name: string, opt_type?: string): Blockly.VariableModel; + + /** + * Find the variable by the given ID and return it. Return null if it is not + * found. + * @param {string} id The ID to check for. + * @return {Blockly.VariableModel} The variable with the given ID. + */ + getVariableById(id: string): Blockly.VariableModel; + + /** + * Find the variable with the specified type. If type is null, return list of + * variables with empty string type. + * @param {?string} type Type of the variables to find. + * @return {!Array.} The sought after variables of the + * passed in type. An empty array if none are found. + */ + getVariablesOfType(type: string): Blockly.VariableModel[]; + + /** + * Return all variable types. + * @return {!Array.} List of variable types. + * @package + */ + getVariableTypes(): string[]; + + /** + * Return all variables of all types. + * @return {!Array.} List of variable models. + */ + getAllVariables(): Blockly.VariableModel[]; + + /** + * Returns all variable names of all types. + * @return {!Array} List of all variable names of all types. + */ + getAllVariableNames(): string[]; + + /** + * Returns the horizontal offset of the workspace. + * Intended for LTR/RTL compatibility in XML. + * Not relevant for a headless workspace. + * @return {number} Width. + */ + getWidth(): number; + + /** + * 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 + * create a new ID. + * @return {!Blockly.Block} The created block. + */ + newBlock(prototypeName: string, opt_id?: string): Blockly.Block; + + /** + * The number of blocks that may be added to the workspace before reaching + * the maxBlocks. + * @return {number} Number of blocks left. + */ + remainingCapacity(): number; + + /** + * The number of blocks of the given type that may be added to the workspace + * before reaching the maxInstances allowed for that type. + * @param {string} type Type of block to return capacity for. + * @return {number} Number of blocks of type left. + */ + remainingCapacityOfType(type: string): number; + + /** + * Check if there is remaining capacity for blocks of the given counts to be + * created. If the total number of blocks represented by the map is more than + * the total remaining capacity, it returns false. If a type count is more + * than the remaining capacity for that type, it returns false. + * @param {!Object} typeCountsMap A map of types to counts (usually representing + * blocks to be created). + * @return {boolean} True if there is capacity for the given map, + * false otherwise. + */ + isCapacityAvailable(typeCountsMap: Object): boolean; + + /** + * Checks if the workspace has any limits on the maximum number of blocks, + * or the maximum number of blocks of specific types. + * @return {boolean} True if it has block limits, false otherwise. + */ + hasBlockLimits(): boolean; + + /** + * Undo or redo the previous action. + * @param {boolean} redo False if undo, true if redo. + */ + undo(redo: boolean): void; + + /** + * Clear the undo/redo stacks. + */ + clearUndo(): void; + + /** + * When something in this workspace changes, call a function. + * Note that there may be a few recent events already on the stack. Thus the + * new change listener might be called with events that occurred a few + * milliseconds before the change listener was added. + * @param {!Function} func Function to call. + * @return {!Function} Obsolete return value, ignore. + */ + addChangeListener(func: Function): Function; + + /** + * Stop listening for this workspace's changes. + * @param {Function} func Function to stop calling. + */ + removeChangeListener(func: Function): void; + + /** + * Fire a change event. + * @param {!Blockly.Events.Abstract} event Event to fire. + */ + fireChangeListener(event: Blockly.Events.Abstract): void; + + /** + * 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. + */ + getBlockById(id: string): Blockly.Block; + + /** + * Set a block on this workspace with the specified ID. + * @param {string} id ID of block to set. + * @param {Blockly.Block} block The block to set. + * @package + */ + setBlockById(id: string, block: Blockly.Block): void; + + /** + * Delete a block off this workspace with the specified ID. + * @param {string} id ID of block to delete. + * @package + */ + removeBlockById(id: string): void; + + /** + * Find the comment on this workspace with the specified ID. + * @param {string} id ID of comment to find. + * @return {Blockly.WorkspaceComment} The sought after comment, or null if not + * found. + * @package + */ + getCommentById(id: string): Blockly.WorkspaceComment; + + /** + * Checks whether all value and statement inputs in the workspace are filled + * with blocks. + * @param {boolean=} opt_shadowBlocksAreFilled An optional argument controlling + * whether shadow blocks are counted as filled. Defaults to true. + * @return {boolean} True if all inputs are filled, false otherwise. + */ + allInputsFilled(opt_shadowBlocksAreFilled?: boolean): boolean; + + /** + * Return the variable map that contains "potential" variables. + * These exist in the flyout but not in the workspace. + * @return {Blockly.VariableMap} The potential variable map. + * @package + */ + getPotentialVariableMap(): Blockly.VariableMap; + + /** + * Create and store the potential variable map for this workspace. + * @package + */ + createPotentialVariableMap(): void; + + /** + * Return the map of all variables on the workspace. + * @return {!Blockly.VariableMap} The variable map. + */ + getVariableMap(): Blockly.VariableMap; + + /** + * Set the map of all variables on the workspace. + * @param {!Blockly.VariableMap} variableMap The variable map. + * @package + */ + setVariableMap(variableMap: Blockly.VariableMap): void; + } + +} + +declare module Blockly.Workspace { + + /** + * Angle away from the horizontal to sweep for blocks. Order of execution is + * generally top to bottom, but a small angle changes the scan to give a bit of + * a left to right bias (reversed in RTL). Units are in degrees. + * See: https://tvtropes.org/pmwiki/pmwiki.php/Main/DiagonalBilling + */ + var SCAN_ANGLE: any /*missing*/; + + /** + * Find the workspace with the specified ID. + * @param {string} id ID of workspace to find. + * @return {Blockly.Workspace} The sought after workspace or null if not found. + */ + function getById(id: string): Blockly.Workspace; + + /** + * Find all workspaces. + * @return {!Array.} Array of workspaces. + */ + function getAll(): Blockly.Workspace[]; +} + + +declare module Blockly { + + class WorkspaceAudio extends WorkspaceAudio__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class WorkspaceAudio__Class { + + /** + * Class for loading, storing, and playing audio for a workspace. + * @param {Blockly.WorkspaceSvg} parentWorkspace The parent of the workspace + * this audio object belongs to, or null. + * @constructor + */ + constructor(parentWorkspace: Blockly.WorkspaceSvg); + + /** + * Dispose of this audio manager. + * @package + */ + dispose(): void; + + /** + * Load an audio file. Cache it, ready for instantaneous playing. + * @param {!Array.} filenames List of file types in decreasing order of + * preference (i.e. increasing size). E.g. ['media/go.mp3', 'media/go.wav'] + * Filenames include path from Blockly's root. File extensions matter. + * @param {string} name Name of sound. + */ + load(filenames: string[], name: string): void; + + /** + * Preload all the audio files so that they play quickly when asked for. + * @package + */ + preload(): void; + + /** + * Play a named sound at specified volume. If volume is not specified, + * use full volume (1). + * @param {string} name Name of sound. + * @param {number=} opt_volume Volume of sound (0-1). + */ + play(name: string, opt_volume?: number): void; + } + +} + + +declare module Blockly { + + class WorkspaceComment extends WorkspaceComment__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class WorkspaceComment__Class { + + /** + * Class for a workspace comment. + * @param {!Blockly.Workspace} workspace The block's workspace. + * @param {string} content The content of this workspace comment. + * @param {number} height Height of the comment. + * @param {number} width Width of the comment. + * @param {string=} opt_id Optional ID. Use this ID if provided, otherwise + * create a new ID. + * @constructor + */ + constructor(workspace: Blockly.Workspace, content: string, height: number, width: number, opt_id?: string); + + /** @type {string} */ + id: string; + + /** + * The comment's position in workspace units. (0, 0) is at the workspace's + * origin; scale does not change this value. + * @type {!Blockly.utils.Coordinate} + * @protected + */ + xy_: Blockly.utils.Coordinate; + + /** + * @type {!Blockly.Workspace} + */ + workspace: Blockly.Workspace; + + /** + * @protected + * @type {boolean} + */ + RTL: boolean; + + /** + * @protected + * @type {string} + */ + content_: string; + + /** + * @package + * @type {boolean} + */ + isComment: boolean; + + /** + * Dispose of this comment. + * @package + */ + dispose(): void; + + /** + * Get comment height. + * @return {number} Comment height. + * @package + */ + getHeight(): number; + + /** + * Set comment height. + * @param {number} height Comment height. + * @package + */ + setHeight(height: number): void; + + /** + * Get comment width. + * @return {number} Comment width. + * @package + */ + getWidth(): number; + + /** + * Set comment width. + * @param {number} width comment width. + * @package + */ + setWidth(width: number): void; + + /** + * Get stored location. + * @return {!Blockly.utils.Coordinate} The comment's stored location. + * This is not valid if the comment is currently being dragged. + * @package + */ + getXY(): Blockly.utils.Coordinate; + + /** + * Move a comment by a relative offset. + * @param {number} dx Horizontal offset, in workspace units. + * @param {number} dy Vertical offset, in workspace units. + * @package + */ + moveBy(dx: number, dy: number): void; + + /** + * Get whether this comment is deletable or not. + * @return {boolean} True if deletable. + * @package + */ + isDeletable(): boolean; + + /** + * Set whether this comment is deletable or not. + * @param {boolean} deletable True if deletable. + * @package + */ + setDeletable(deletable: boolean): void; + + /** + * Get whether this comment is movable or not. + * @return {boolean} True if movable. + * @package + */ + isMovable(): boolean; + + /** + * Set whether this comment is movable or not. + * @param {boolean} movable True if movable. + * @package + */ + setMovable(movable: boolean): void; + + /** + * Get whether this comment is editable or not. + * @return {boolean} True if editable. + */ + isEditable(): boolean; + + /** + * Set whether this comment is editable or not. + * @param {boolean} editable True if editable. + */ + setEditable(editable: boolean): void; + + /** + * Returns this comment's text. + * @return {string} Comment text. + * @package + */ + getContent(): string; + + /** + * Set this comment's content. + * @param {string} content Comment content. + * @package + */ + setContent(content: string): void; + + /** + * Encode a comment subtree as XML with XY coordinates. + * @param {boolean=} opt_noId True if the encoder should skip the comment ID. + * @return {!Element} Tree of XML elements. + * @package + */ + toXmlWithXY(opt_noId?: boolean): Element; + + /** + * Encode a comment subtree as XML, but don't serialize the XY coordinates. + * This method avoids some expensive metrics-related calls that are made in + * toXmlWithXY(). + * @param {boolean=} opt_noId True if the encoder should skip the comment ID. + * @return {!Element} Tree of XML elements. + * @package + */ + toXml(opt_noId?: boolean): Element; + } + +} + +declare module Blockly.WorkspaceComment { + + /** + * Fire a create event for the given workspace comment, if comments are enabled. + * @param {!Blockly.WorkspaceComment} comment The comment that was just created. + * @package + */ + function fireCreateEvent(comment: Blockly.WorkspaceComment): void; + + /** + * Decode an XML comment tag and create a comment on the workspace. + * @param {!Element} xmlComment XML comment element. + * @param {!Blockly.Workspace} workspace The workspace. + * @return {!Blockly.WorkspaceComment} The created workspace comment. + * @package + */ + function fromXml(xmlComment: Element, workspace: Blockly.Workspace): Blockly.WorkspaceComment; + + /** + * Decode an XML comment tag and return the results in an object. + * @param {!Element} xml XML comment element. + * @return {{w: number, h: number, x: number, y: number, content: string}} An + * object containing the id, size, position, and comment string. + * @package + */ + function parseAttributes(xml: Element): { w: number; h: number; x: number; y: number; content: string }; +} + + + +declare module Blockly { + + class WorkspaceCommentSvg extends WorkspaceCommentSvg__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class WorkspaceCommentSvg__Class extends Blockly.WorkspaceComment__Class { + + /** + * Class for a workspace comment's SVG representation. + * @param {!Blockly.Workspace} workspace The block's workspace. + * @param {string} content The content of this workspace comment. + * @param {number} height Height of the comment. + * @param {number} width Width of the comment. + * @param {string=} opt_id Optional ID. Use this ID if provided, otherwise + * create a new ID. + * @extends {Blockly.WorkspaceComment} + * @constructor + */ + constructor(workspace: Blockly.Workspace, content: string, height: number, width: number, opt_id?: string); + + /** + * Dispose of this comment. + * @package + */ + dispose(): void; + + /** + * Create and initialize the SVG representation of a workspace comment. + * May be called more than once. + * @package + */ + initSvg(): void; + + /** + * Show the context menu for this workspace comment. + * @param {!Event} e Mouse event. + * @package + */ + showContextMenu(e: Event): void; + + /** + * Select this comment. Highlight it visually. + * @package + */ + select(): void; + + /** + * Unselect this comment. Remove its highlighting. + * @package + */ + unselect(): void; + + /** + * Select this comment. Highlight it visually. + * @package + */ + addSelect(): void; + + /** + * Unselect this comment. Remove its highlighting. + * @package + */ + removeSelect(): void; + + /** + * Focus this comment. Highlight it visually. + * @package + */ + addFocus(): void; + + /** + * Unfocus this comment. Remove its highlighting. + * @package + */ + removeFocus(): void; + + /** + * Return the coordinates of the top-left corner of this comment relative to + * the drawing surface's origin (0,0), in workspace units. + * If the comment is on the workspace, (0, 0) is the origin of the workspace + * coordinate system. + * This does not change with workspace scale. + * @return {!Blockly.utils.Coordinate} Object with .x and .y properties in + * workspace coordinates. + * @package + */ + getRelativeToSurfaceXY(): Blockly.utils.Coordinate; + + /** + * Move a comment by a relative offset. + * @param {number} dx Horizontal offset, in workspace units. + * @param {number} dy Vertical offset, in workspace units. + * @package + */ + moveBy(dx: number, dy: number): void; + + /** + * Transforms a comment by setting the translation on the transform attribute + * of the block's SVG. + * @param {number} x The x coordinate of the translation in workspace units. + * @param {number} y The y coordinate of the translation in workspace units. + * @package + */ + translate(x: number, y: number): void; + + /** + * Move this comment to its workspace's drag surface, accounting for + * positioning. Generally should be called at the same time as + * setDragging(true). Does nothing if useDragSurface_ is false. + * @package + */ + moveToDragSurface(): void; + + /** + * Move this comment during a drag, taking into account whether we are using a + * drag surface to translate blocks. + * @param {Blockly.BlockDragSurfaceSvg} dragSurface The surface that carries + * rendered items during a drag, or null if no drag surface is in use. + * @param {!Blockly.utils.Coordinate} newLoc The location to translate to, in + * workspace coordinates. + * @package + */ + moveDuringDrag(dragSurface: Blockly.BlockDragSurfaceSvg, newLoc: Blockly.utils.Coordinate): void; + + /** + * Move the bubble group to the specified location in workspace coordinates. + * @param {number} x The x position to move to. + * @param {number} y The y position to move to. + * @package + */ + moveTo(x: number, y: number): void; + + /** + * Returns the coordinates of a bounding box describing the dimensions of this + * comment. + * Coordinate system: workspace coordinates. + * @return {!Blockly.utils.Rect} Object with coordinates of the bounding box. + * @package + */ + getBoundingRectangle(): Blockly.utils.Rect; + + /** + * Add or remove the UI indicating if this comment is movable or not. + * @package + */ + updateMovable(): void; + + /** + * Set whether this comment is movable or not. + * @param {boolean} movable True if movable. + * @package + */ + setMovable(movable: boolean): void; + + /** + * Set whether this comment is editable or not. + * @param {boolean} editable True if editable. + */ + setEditable(editable: boolean): void; + + /** + * Recursively adds or removes the dragging class to this node and its children. + * @param {boolean} adding True if adding, false if removing. + * @package + */ + setDragging(adding: boolean): void; + + /** + * Return the root node of the SVG or null if none exists. + * @return {SVGElement} The root SVG node (probably a group). + * @package + */ + getSvgRoot(): SVGElement; + + /** + * Returns this comment's text. + * @return {string} Comment text. + * @package + */ + getContent(): string; + + /** + * Set this comment's content. + * @param {string} content Comment content. + * @package + */ + setContent(content: string): void; + + /** + * Update the cursor over this comment by adding or removing a class. + * @param {boolean} enable True if the delete cursor should be shown, false + * otherwise. + * @package + */ + setDeleteStyle(enable: boolean): void; + + /** + * Encode a comment subtree as XML with XY coordinates. + * @param {boolean=} opt_noId True if the encoder should skip the comment ID. + * @return {!Element} Tree of XML elements. + * @package + */ + toXmlWithXY(opt_noId?: boolean): Element; + } + +} + +declare module Blockly.WorkspaceCommentSvg { + + /** + * The width and height to use to size a workspace comment when it is first + * added, before it has been edited by the user. + * @type {number} + * @package + */ + var DEFAULT_SIZE: number; + + /** + * Decode an XML comment tag and create a rendered comment on the workspace. + * @param {!Element} xmlComment XML comment element. + * @param {!Blockly.Workspace} workspace The workspace. + * @param {number=} opt_wsWidth The width of the workspace, which is used to + * position comments correctly in RTL. + * @return {!Blockly.WorkspaceCommentSvg} The created workspace comment. + * @package + */ + function fromXml(xmlComment: Element, workspace: Blockly.Workspace, opt_wsWidth?: number): Blockly.WorkspaceCommentSvg; +} + + +declare module Blockly { + + class WorkspaceDragSurfaceSvg extends WorkspaceDragSurfaceSvg__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class WorkspaceDragSurfaceSvg__Class { + + /** + * Blocks are moved into this SVG during a drag, improving performance. + * The entire SVG is translated using CSS transforms instead of SVG so the + * blocks are never repainted during drag improving performance. + * @param {!Element} container Containing element. + * @constructor + */ + constructor(container: Element); + + /** + * Dom structure when the workspace is being dragged. If there is no drag in + * progress, the SVG is empty and display: none. + * + * + * /g> + * + */ + SVG_: any /*missing*/; + + /** + * Create the drag surface and inject it into the container. + */ + createDom(): void; + + /** + * 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 + * @package + */ + translateSurface(x: number, y: number): void; + + /** + * Reports the surface translation in scaled workspace coordinates. + * Use this when finishing a drag to return blocks to the correct position. + * @return {!Blockly.utils.Coordinate} Current translation of the surface + * @package + */ + getSurfaceTranslation(): Blockly.utils.Coordinate; + + /** + * Move the blockCanvas and bubbleCanvas out of the surface SVG and on to + * newSurface. + * @param {SVGElement} newSurface The element to put the drag surface contents + * into. + * @package + */ + clearAndHide(newSurface: SVGElement): void; + + /** + * Set the SVG to have the block canvas and bubble canvas in it and then + * show the surface. + * @param {!SVGElement} blockCanvas The block canvas element from the + * workspace. + * @param {!SVGElement} bubbleCanvas The element that contains the bubbles. + * @param {Element} previousSibling The element to insert the block canvas and + bubble canvas after when it goes back in the DOM at the end of a drag. + * @param {number} width The width of the workspace SVG element. + * @param {number} height The height of the workspace SVG element. + * @param {number} scale The scale of the workspace being dragged. + * @package + */ + setContentsAndShow(blockCanvas: SVGElement, bubbleCanvas: SVGElement, previousSibling: Element, width: number, height: number, scale: number): void; + } + +} + + +declare module Blockly { + + class WorkspaceDragger extends WorkspaceDragger__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class WorkspaceDragger__Class { + + /** + * Class for a workspace dragger. It moves the workspace around when it is + * being dragged by a mouse or touch. + * Note that the workspace itself manages whether or not it has a drag surface + * and how to do translations based on that. This simply passes the right + * commands based on events. + * @param {!Blockly.WorkspaceSvg} workspace The workspace to drag. + * @constructor + */ + constructor(workspace: Blockly.WorkspaceSvg); + + /** + * The scroll position of the workspace at the beginning of the drag. + * Coordinate system: pixel coordinates. + * @type {!Blockly.utils.Coordinate} + * @protected + */ + startScrollXY_: Blockly.utils.Coordinate; + + /** + * Sever all links from this object. + * @package + * @suppress {checkTypes} + */ + dispose(): void; + + /** + * Start dragging the workspace. + * @package + */ + startDrag(): void; + + /** + * Finish dragging the workspace and put everything back where it belongs. + * @param {!Blockly.utils.Coordinate} currentDragDeltaXY How far the pointer has + * moved from the position at the start of the drag, in pixel coordinates. + * @package + */ + endDrag(currentDragDeltaXY: Blockly.utils.Coordinate): void; + + /** + * Move the workspace based on the most recent mouse movements. + * @param {!Blockly.utils.Coordinate} currentDragDeltaXY How far the pointer has + * moved from the position at the start of the drag, in pixel coordinates. + * @package + */ + drag(currentDragDeltaXY: Blockly.utils.Coordinate): void; + } + +} + + +declare module Blockly.Events { + + class FinishedLoading extends FinishedLoading__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class FinishedLoading__Class extends Blockly.Events.Abstract__Class { + + /** + * Class for a finished loading event. + * Used to notify the developer when the workspace has finished loading (i.e + * domToWorkspace). + * Finished loading events do not record undo or redo. + * @param {!Blockly.Workspace} workspace The workspace that has finished + * loading. + * @extends {Blockly.Events.Abstract} + * @constructor + */ + constructor(workspace: Blockly.Workspace); + + /** + * The workspace identifier for this event. + * @type {string} + */ + workspaceId: string; + + /** + * The event group ID for the group this event belongs to. Groups define + * events that should be treated as an single action from the user's + * perspective, and should be undone together. + * @type {string} + */ + group: string; + + /** + * Type of this event. + * @type {string} + */ + type: string; + + /** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ + toJson(): Object; + + /** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ + fromJson(json: Object): void; + } + +} + + +declare module Blockly { + + class WorkspaceSvg extends WorkspaceSvg__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class WorkspaceSvg__Class extends Blockly.Workspace__Class { + + /** + * Class for a workspace. This is an onscreen area with optional trashcan, + * scrollbars, bubbles, and dragging. + * @param {!Blockly.Options} options Dictionary of options. + * @param {Blockly.BlockDragSurfaceSvg=} opt_blockDragSurface Drag surface for + * blocks. + * @param {Blockly.WorkspaceDragSurfaceSvg=} opt_wsDragSurface Drag surface for + * the workspace. + * @extends {Blockly.Workspace} + * @constructor + */ + constructor(options: Blockly.Options, opt_blockDragSurface?: Blockly.BlockDragSurfaceSvg, opt_wsDragSurface?: Blockly.WorkspaceDragSurfaceSvg); + + /** @type {function():!Object} */ + getMetrics: { (): Object }; + + /** @type {function(!Object):void} */ + setMetrics: { (_0: Object): void }; + + /** + * Object in charge of storing and updating the workspace theme. + * @type {!Blockly.ThemeManager} + * @protected + */ + themeManager_: Blockly.ThemeManager; + + /** + * True if keyboard accessibility mode is on, false otherwise. + * @type {boolean} + * @package + */ + keyboardAccessibilityMode: boolean; + + /** + * The render status of an SVG workspace. + * Returns `false` for headless workspaces and true for instances of + * `Blockly.WorkspaceSvg`. + * @type {boolean} + */ + rendered: boolean; + + /** + * Is this workspace the surface for a flyout? + * @type {boolean} + */ + isFlyout: boolean; + + /** + * Is this workspace the surface for a mutator? + * @type {boolean} + * @package + */ + isMutator: boolean; + + /** + * Current horizontal scrolling offset in pixel units, relative to the + * workspace origin. + * + * It is useful to think about a view, and a canvas moving beneath that + * view. As the canvas moves right, this value becomes more positive, and + * the view is now "seeing" the left side of the canvas. As the canvas moves + * left, this value becomes more negative, and the view is now "seeing" the + * right side of the canvas. + * + * The confusing thing about this value is that it does not, and must not + * include the absoluteLeft offset. This is because it is used to calculate + * the viewLeft value. + * + * The viewLeft is relative to the workspace origin (although in pixel + * units). The workspace origin is the top-left corner of the workspace (at + * least when it is enabled). It is shifted from the top-left of the blocklyDiv + * so as not to be beneath the toolbox. + * + * When the workspace is enabled the viewLeft and workspace origin are at + * the same X location. As the canvas slides towards the right beneath the view + * this value (scrollX) becomes more positive, and the viewLeft becomes more + * negative relative to the workspace origin (imagine the workspace origin + * as a dot on the canvas sliding to the right as the canvas moves). + * + * So if the scrollX were to include the absoluteLeft this would in a way + * "unshift" the workspace origin. This means that the viewLeft would be + * representing the left edge of the blocklyDiv, rather than the left edge + * of the workspace. + * + * @type {number} + */ + scrollX: number; + + /** + * Current vertical scrolling offset in pixel units, relative to the + * workspace origin. + * + * It is useful to think about a view, and a canvas moving beneath that + * view. As the canvas moves down, this value becomes more positive, and the + * view is now "seeing" the upper part of the canvas. As the canvas moves + * up, this value becomes more negative, and the view is "seeing" the lower + * part of the canvas. + * + * This confusing thing about this value is that it does not, and must not + * include the absoluteTop offset. This is because it is used to calculate + * the viewTop value. + * + * The viewTop is relative to the workspace origin (although in pixel + * units). The workspace origin is the top-left corner of the workspace (at + * least when it is enabled). It is shifted from the top-left of the + * blocklyDiv so as not to be beneath the toolbox. + * + * When the workspace is enabled the viewTop and workspace origin are at the + * same Y location. As the canvas slides towards the bottom this value + * (scrollY) becomes more positive, and the viewTop becomes more negative + * relative to the workspace origin (image in the workspace origin as a dot + * on the canvas sliding downwards as the canvas moves). + * + * So if the scrollY were to include the absoluteTop this would in a way + * "unshift" the workspace origin. This means that the viewTop would be + * representing the top edge of the blocklyDiv, rather than the top edge of + * the workspace. + * + * @type {number} + */ + scrollY: number; + + /** + * Horizontal scroll value when scrolling started in pixel units. + * @type {number} + */ + startScrollX: number; + + /** + * Vertical scroll value when scrolling started in pixel units. + * @type {number} + */ + startScrollY: number; + + /** + * Current scale. + * @type {number} + */ + scale: number; + + /** @type {Blockly.Trashcan} */ + trashcan: Blockly.Trashcan; + + /** + * This workspace's scrollbars, if they exist. + * @type {Blockly.ScrollbarPair} + */ + scrollbar: Blockly.ScrollbarPair; + + /** + * Developers may define this function to add custom menu options to the + * workspace's context menu or edit the workspace-created set of menu options. + * @param {!Array.} options List of menu options to add to. + */ + configureContextMenu(options: Object[]): void; + + /** + * In a flyout, the target workspace where blocks should be placed after a drag. + * Otherwise null. + * @type {Blockly.WorkspaceSvg} + * @package + */ + targetWorkspace: Blockly.WorkspaceSvg; + + /** + * Get the marker manager for this workspace. + * @return {Blockly.MarkerManager} The marker manager. + */ + getMarkerManager(): Blockly.MarkerManager; + + /** + * Add the cursor svg to this workspaces svg group. + * @param {SVGElement} cursorSvg The svg root of the cursor to be added to the + * workspace svg group. + * @package + */ + setCursorSvg(cursorSvg: SVGElement): void; + + /** + * Add the marker svg to this workspaces svg group. + * @param {SVGElement} markerSvg The svg root of the marker to be added to the + * workspace svg group. + * @package + */ + setMarkerSvg(markerSvg: SVGElement): void; + + /** + * Get the marker with the given id. + * @param {string} id The id of the marker. + * @return {Blockly.Marker} The marker with the given id or null if no marker + * with the given id exists. + * @package + */ + getMarker(id: string): Blockly.Marker; + + /** + * The cursor for this workspace. + * @return {Blockly.Cursor} The cursor for the workspace. + */ + getCursor(): Blockly.Cursor; + + /** + * Get the block renderer attached to this workspace. + * @return {!Blockly.blockRendering.Renderer} The renderer attached to this workspace. + */ + getRenderer(): Blockly.blockRendering.Renderer; + + /** + * Get the theme manager for this workspace. + * @return {!Blockly.ThemeManager} The theme manager for this workspace. + * @package + */ + getThemeManager(): Blockly.ThemeManager; + + /** + * Get the workspace theme object. + * @return {!Blockly.Theme} The workspace theme object. + */ + getTheme(): Blockly.Theme; + + /** + * Set the workspace theme object. + * If no theme is passed, default to the `Blockly.Themes.Classic` theme. + * @param {Blockly.Theme} theme The workspace theme object. + */ + setTheme(theme: Blockly.Theme): void; + + /** + * Refresh all blocks on the workspace after a theme update. + * @package + */ + refreshTheme(): void; + + /** + * Getter for the inverted screen CTM. + * @return {SVGMatrix} The matrix to use in mouseToSvg + */ + getInverseScreenCTM(): SVGMatrix; + + /** + * Mark the inverse screen CTM as dirty. + */ + updateInverseScreenCTM(): void; + + /** + * Getter for isVisible + * @return {boolean} Whether the workspace is visible. + * False if the workspace has been hidden by calling `setVisible(false)`. + */ + isVisible(): boolean; + + /** + * Return the absolute coordinates of the top-left corner of this element, + * scales that after canvas SVG element, if it's a descendant. + * The origin (0,0) is the top-left corner of the Blockly SVG. + * @param {!SVGElement} element SVG element to find the coordinates of. + * @return {!Blockly.utils.Coordinate} Object with .x and .y properties. + * @package + */ + getSvgXY(element: SVGElement): Blockly.utils.Coordinate; + + /** + * Return the position of the workspace origin relative to the injection div + * origin in pixels. + * The workspace origin is where a block would render at position (0, 0). + * It is not the upper left corner of the workspace SVG. + * @return {!Blockly.utils.Coordinate} Offset in pixels. + * @package + */ + getOriginOffsetInPixels(): Blockly.utils.Coordinate; + + /** + * Return the injection div that is a parent of this workspace. + * Walks the DOM the first time it's called, then returns a cached value. + * Note: We assume this is only called after the workspace has been injected + * into the DOM. + * @return {!Element} The first parent div with 'injectionDiv' in the name. + * @package + */ + getInjectionDiv(): Element; + + /** + * Get the svg block canvas for the workspace. + * @return {SVGElement} The svg group for the workspace. + * @package + */ + getBlockCanvas(): SVGElement; + + /** + * Save resize handler data so we can delete it later in dispose. + * @param {!Array.} handler Data that can be passed to unbindEvent_. + */ + setResizeHandlerWrapper(handler: any[][]): void; + + /** + * Create the workspace DOM elements. + * @param {string=} opt_backgroundClass Either 'blocklyMainBackground' or + * 'blocklyMutatorBackground'. + * @return {!Element} The workspace's SVG group. + */ + createDom(opt_backgroundClass?: string): Element; + + /** + * + * + * [Trashcan and/or flyout may go here] + * + * + * + * @type {SVGElement} + */ + svgGroup_: SVGElement; + + /** @type {SVGElement} */ + svgBackground_: SVGElement; + + /** @type {SVGElement} */ + svgBlockCanvas_: SVGElement; + + /** @type {SVGElement} */ + svgBubbleCanvas_: SVGElement; + + /** + * Dispose of this workspace. + * Unlink from all DOM elements to prevent memory leaks. + * @suppress {checkTypes} + */ + dispose(): void; + + /** + * Add a trashcan. + * @package + */ + addTrashcan(): void; + + /** + * Add zoom controls. + * @package + */ + addZoomControls(): void; + + /** @type {Blockly.ZoomControls} */ + zoomControls_: Blockly.ZoomControls; + + /** + * Add a flyout element in an element with the given tag name. + * @param {string} tagName What type of tag the flyout belongs in. + * @return {!Element} The element containing the flyout DOM. + * @package + */ + addFlyout(tagName: string): Element; + + /** + * Getter for the flyout associated with this workspace. This flyout may be + * owned by either the toolbox or the workspace, depending on toolbox + * configuration. It will be null if there is no flyout. + * @param {boolean=} opt_own Only return the workspace's own flyout if True. + * @return {Blockly.Flyout} The flyout on this workspace. + * @package + */ + getFlyout(opt_own?: boolean): Blockly.Flyout; + + /** + * Getter for the toolbox associated with this workspace, if one exists. + * @return {Blockly.Toolbox} The toolbox on this workspace. + * @package + */ + getToolbox(): Blockly.Toolbox; + + /** + * If enabled, resize the parts of the workspace that change when the workspace + * contents (e.g. block positions) change. This will also scroll the + * workspace contents if needed. + * @package + */ + resizeContents(): void; + + /** + * Resize and reposition all of the workspace chrome (toolbox, + * trash, scrollbars etc.) + * This should be called when something changes that + * requires recalculating dimensions and positions of the + * trash, zoom, toolbox, etc. (e.g. window resize). + */ + resize(): void; + + /** + * Resizes and repositions workspace chrome if the page has a new + * scroll position. + * @package + */ + updateScreenCalculationsIfScrolled(): void; + + /** + * Get the SVG element that forms the drawing surface. + * @return {!SVGGElement} SVG group element. + */ + getCanvas(): SVGGElement; + + /** + * Get the SVG element that forms the bubble surface. + * @return {!SVGGElement} SVG group element. + */ + getBubbleCanvas(): SVGGElement; + + /** + * Get the SVG element that contains this workspace. + * Note: We assume this is only called after the workspace has been injected + * into the DOM. + * @return {!SVGElement} SVG element. + */ + getParentSvg(): SVGElement; + + /** + * Translate this workspace to new coordinates. + * @param {number} x Horizontal translation, in pixel units relative to the + * top left of the Blockly div. + * @param {number} y Vertical translation, in pixel units relative to the + * top left of the Blockly div. + */ + translate(x: number, y: number): void; + + /** + * Called at the end of a workspace drag to take the contents + * out of the drag surface and put them back into the workspace SVG. + * Does nothing if the workspace drag surface is not enabled. + * @package + */ + resetDragSurface(): void; + + /** + * Called at the beginning of a workspace drag to move contents of + * the workspace to the drag surface. + * Does nothing if the drag surface is not enabled. + * @package + */ + setupDragSurface(): void; + + /** + * @return {Blockly.BlockDragSurfaceSvg} This workspace's block drag surface, + * if one is in use. + * @package + */ + getBlockDragSurface(): Blockly.BlockDragSurfaceSvg; + + /** + * Returns the horizontal offset of the workspace. + * Intended for LTR/RTL compatibility in XML. + * @return {number} Width. + */ + getWidth(): number; + + /** + * Toggles the visibility of the workspace. + * Currently only intended for main workspace. + * @param {boolean} isVisible True if workspace should be visible. + */ + setVisible(isVisible: boolean): void; + + /** + * Render all blocks in workspace. + */ + render(): void; + + /** + * Was used back when block highlighting (for execution) and block selection + * (for editing) were the same thing. + * Any calls of this function can be deleted. + * @deprecated October 2016 + */ + traceOn(): void; + + /** + * Highlight or unhighlight a block in the workspace. Block highlighting is + * often used to visually mark blocks currently being executed. + * @param {?string} id ID of block to highlight/unhighlight, + * or null for no block (used to unhighlight all blocks). + * @param {boolean=} opt_state If undefined, highlight specified block and + * automatically unhighlight all others. If true or false, manually + * highlight/unhighlight the specified block. + */ + highlightBlock(id: string, opt_state?: boolean): void; + + /** + * Paste the provided block onto the workspace. + * @param {!Element} xmlBlock XML block element. + */ + paste(xmlBlock: Element): void; + + /** + * Refresh the toolbox unless there's a drag in progress. + * @package + */ + refreshToolboxSelection(): void; + + /** + * Rename a variable by updating its name in the variable map. Update the + * flyout to show the renamed variable immediately. + * @param {string} id ID of the variable to rename. + * @param {string} newName New variable name. + */ + renameVariableById(id: string, newName: string): void; + + /** + * Delete a variable by the passed in ID. Update the flyout to show + * immediately that the variable is deleted. + * @param {string} id ID of variable to delete. + */ + deleteVariableById(id: string): void; + + /** + * Create a new variable with the given name. Update the flyout to show the + * new variable immediately. + * @param {string} name The new variable's name. + * @param {?string=} opt_type The type of the variable like 'int' or 'string'. + * Does not need to be unique. Field_variable can filter variables based on + * their type. This will default to '' which is a specific type. + * @param {?string=} opt_id The unique ID of the variable. This will default to + * a UUID. + * @return {!Blockly.VariableModel} The newly created variable. + */ + createVariable(name: string, opt_type?: string, opt_id?: string): Blockly.VariableModel; + + /** + * Make a list of all the delete areas for this workspace. + */ + recordDeleteAreas(): void; + + /** + * Is the mouse event over a delete area (toolbox or non-closing flyout)? + * @param {!Event} e Mouse move event. + * @return {?number} Null if not over a delete area, or an enum representing + * which delete area the event is over. + */ + isDeleteArea(e: Event): number; + + /** + * Start tracking a drag of an object on this workspace. + * @param {!Event} e Mouse down event. + * @param {!Blockly.utils.Coordinate} xy Starting location of object. + */ + startDrag(e: Event, xy: Blockly.utils.Coordinate): void; + + /** + * Track a drag of an object on this workspace. + * @param {!Event} e Mouse move event. + * @return {!Blockly.utils.Coordinate} New location of object. + */ + moveDrag(e: Event): Blockly.utils.Coordinate; + + /** + * Is the user currently dragging a block or scrolling the flyout/workspace? + * @return {boolean} True if currently dragging or scrolling. + */ + isDragging(): boolean; + + /** + * Is this workspace draggable? + * @return {boolean} True if this workspace may be dragged. + */ + isDraggable(): boolean; + + /** + * Should the workspace have bounded content? Used to tell if the + * workspace's content should be sized so that it can move (bounded) or not + * (exact sizing). + * @return {boolean} True if the workspace should be bounded, false otherwise. + * @package + */ + isContentBounded(): boolean; + + /** + * Is this workspace movable? + * + * This means the user can reposition the X Y coordinates of the workspace + * through input. This can be through scrollbars, scroll wheel, dragging, or + * through zooming with the scroll wheel or pinch (since the zoom is centered on + * the mouse position). This does not include zooming with the zoom controls + * since the X Y coordinates are decided programmatically. + * @return {boolean} True if the workspace is movable, false otherwise. + */ + isMovable(): boolean; + + /** + * Calculate the bounding box for the blocks on the workspace. + * Coordinate system: workspace coordinates. + * + * @return {!Blockly.utils.Rect} Contains the position and size of the + * bounding box containing the blocks on the workspace. + */ + getBlocksBoundingBox(): Blockly.utils.Rect; + + /** + * Clean up the workspace by ordering all the blocks in a column. + */ + cleanUp(): void; + + /** + * Show the context menu for the workspace. + * @param {!Event} e Mouse event. + * @package + */ + showContextMenu(e: Event): void; + + /** + * Modify the block tree on the existing toolbox. + * @param {Node|string} tree DOM tree of blocks, or text representation of same. + */ + updateToolbox(tree: Node|string): void; + + /** + * Mark this workspace as the currently focused main workspace. + */ + markFocused(): void; + + /** + * Zooms the workspace in or out relative to/centered on the given (x, y) + * coordinate. + * @param {number} x X coordinate of center, in pixel units relative to the + * top-left corner of the parentSVG. + * @param {number} y Y coordinate of center, in pixel units relative to the + * top-left corner of the parentSVG. + * @param {number} amount Amount of zooming. The formula for the new scale + * is newScale = currentScale * (scaleSpeed^amount). scaleSpeed is set in + * the workspace options. Negative amount values zoom out, and positive + * amount values zoom in. + */ + zoom(x: number, y: number, amount: number): void; + + /** + * Zooming the blocks centered in the center of view with zooming in or out. + * @param {number} type Type of zooming (-1 zooming out and 1 zooming in). + */ + zoomCenter(type: number): void; + + /** + * Zoom the blocks to fit in the workspace if possible. + */ + zoomToFit(): void; + + /** + * Add a transition class to the block and bubble canvas, to animate any + * transform changes. + * @package + */ + beginCanvasTransition(): void; + + /** + * Remove transition class from the block and bubble canvas. + * @package + */ + endCanvasTransition(): void; + + /** + * Center the workspace. + */ + scrollCenter(): void; + + /** + * Scroll the workspace to center on the given block. + * @param {?string} id ID of block center on. + * @public + */ + centerOnBlock(id: string): void; + + /** + * Set the workspace's zoom factor. + * @param {number} newScale Zoom factor. Units: (pixels / workspaceUnit). + */ + setScale(newScale: number): void; + + /** + * Scroll the workspace to a specified offset (in pixels), keeping in the + * workspace bounds. See comment on workspaceSvg.scrollX for more detail on + * the meaning of these values. + * @param {number} x Target X to scroll to. + * @param {number} y Target Y to scroll to. + * @package + */ + scroll(x: number, y: number): void; + + /** + * Update whether this workspace has resizes enabled. + * If enabled, workspace will resize when appropriate. + * If disabled, workspace will not resize until re-enabled. + * Use to avoid resizing during a batch operation, for performance. + * @param {boolean} enabled Whether resizes should be enabled. + */ + setResizesEnabled(enabled: boolean): void; + + /** + * Dispose of all blocks in workspace, with an optimization to prevent resizes. + */ + clear(): void; + + /** + * Register a callback function associated with a given key, for clicks on + * buttons and labels in the flyout. + * For instance, a button specified by the XML + * + * should be matched by a call to + * registerButtonCallback("CREATE_VARIABLE", yourCallbackFunction). + * @param {string} key The name to use to look up this function. + * @param {function(!Blockly.FlyoutButton)} func The function to call when the + * given button is clicked. + */ + registerButtonCallback(key: string, func: { (_0: Blockly.FlyoutButton): any /*missing*/ }): void; + + /** + * Get the callback function associated with a given key, for clicks on buttons + * and labels in the flyout. + * @param {string} key The name to use to look up the function. + * @return {?function(!Blockly.FlyoutButton)} The function corresponding to the + * given key for this workspace; null if no callback is registered. + */ + getButtonCallback(key: string): { (_0: Blockly.FlyoutButton): any /*missing*/ }; + + /** + * Remove a callback for a click on a button in the flyout. + * @param {string} key The name associated with the callback function. + */ + removeButtonCallback(key: string): void; + + /** + * Register a callback function associated with a given key, for populating + * custom toolbox categories in this workspace. See the variable and procedure + * categories as an example. + * @param {string} key The name to use to look up this function. + * @param {function(!Blockly.Workspace):!Array.} func The function to + * call when the given toolbox category is opened. + */ + registerToolboxCategoryCallback(key: string, func: { (_0: Blockly.Workspace): Element[] }): void; + + /** + * Get the callback function associated with a given key, for populating + * custom toolbox categories in this workspace. + * @param {string} key The name to use to look up the function. + * @return {?function(!Blockly.Workspace):!Array.} The function + * corresponding to the given key for this workspace, or null if no function + * is registered. + */ + getToolboxCategoryCallback(key: string): { (_0: Blockly.Workspace): Element[] }; + + /** + * Remove a callback for a click on a custom category's name in the toolbox. + * @param {string} key The name associated with the callback function. + */ + removeToolboxCategoryCallback(key: string): void; + + /** + * Look up the gesture that is tracking this touch stream on this workspace. + * May create a new gesture. + * @param {!Event} e Mouse event or touch event. + * @return {Blockly.TouchGesture} The gesture that is tracking this touch + * stream, or null if no valid gesture exists. + * @package + */ + getGesture(e: Event): Blockly.TouchGesture; + + /** + * Clear the reference to the current gesture. + * @package + */ + clearGesture(): void; + + /** + * Cancel the current gesture, if one exists. + * @package + */ + cancelCurrentGesture(): void; + + /** + * Get the audio manager for this workspace. + * @return {!Blockly.WorkspaceAudio} The audio manager for this workspace. + */ + getAudioManager(): Blockly.WorkspaceAudio; + + /** + * Get the grid object for this workspace, or null if there is none. + * @return {Blockly.Grid} The grid object for this workspace. + * @package + */ + getGrid(): Blockly.Grid; + } + +} + + +declare module Blockly.Events { + + class CommentBase extends CommentBase__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class CommentBase__Class extends Blockly.Events.Abstract__Class { + + /** + * Abstract class for a comment event. + * @param {Blockly.WorkspaceComment} comment The comment this event corresponds + * to. + * @extends {Blockly.Events.Abstract} + * @constructor + */ + constructor(comment: Blockly.WorkspaceComment); + + /** + * The ID of the comment this event pertains to. + * @type {string} + */ + commentId: string; + + /** + * The workspace identifier for this event. + * @type {string} + */ + workspaceId: string; + + /** + * The event group id for the group this event belongs to. Groups define + * events that should be treated as an single action from the user's + * perspective, and should be undone together. + * @type {string} + */ + group: string; + + /** + * Sets whether the event should be added to the undo stack. + * @type {boolean} + */ + recordUndo: boolean; + + /** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ + toJson(): Object; + + /** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ + fromJson(json: Object): void; + } + + + class CommentChange extends CommentChange__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class CommentChange__Class extends Blockly.Events.CommentBase__Class { + + /** + * Class for a comment change event. + * @param {Blockly.WorkspaceComment} comment The comment that is being changed. + * Null for a blank event. + * @param {string} oldContents Previous contents of the comment. + * @param {string} newContents New contents of the comment. + * @extends {Blockly.Events.CommentBase} + * @constructor + */ + constructor(comment: Blockly.WorkspaceComment, oldContents: string, newContents: string); + + /** + * Type of this event. + * @type {string} + */ + type: string; + + /** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ + toJson(): Object; + + /** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ + fromJson(json: Object): void; + + /** + * Does this event record any change of state? + * @return {boolean} False if something changed. + */ + isNull(): boolean; + + /** + * Run a change event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ + run(forward: boolean): void; + } + + + class CommentCreate extends CommentCreate__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class CommentCreate__Class extends Blockly.Events.CommentBase__Class { + + /** + * Class for a comment creation event. + * @param {Blockly.WorkspaceComment} comment The created comment. + * Null for a blank event. + * @extends {Blockly.Events.CommentBase} + * @constructor + */ + constructor(comment: Blockly.WorkspaceComment); + + /** + * Type of this event. + * @type {string} + */ + type: string; + + /** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ + toJson(): Object; + + /** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ + fromJson(json: Object): void; + + /** + * Run a creation event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ + run(forward: boolean): void; + } + + + class CommentDelete extends CommentDelete__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class CommentDelete__Class extends Blockly.Events.CommentBase__Class { + + /** + * Class for a comment deletion event. + * @param {Blockly.WorkspaceComment} comment The deleted comment. + * Null for a blank event. + * @extends {Blockly.Events.CommentBase} + * @constructor + */ + constructor(comment: Blockly.WorkspaceComment); + + /** + * Type of this event. + * @type {string} + */ + type: string; + + /** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ + toJson(): Object; + + /** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ + fromJson(json: Object): void; + + /** + * Run a creation event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ + run(forward: boolean): void; + } + + + class CommentMove extends CommentMove__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class CommentMove__Class extends Blockly.Events.CommentBase__Class { + + /** + * Class for a comment move event. Created before the move. + * @param {Blockly.WorkspaceComment} comment The comment that is being moved. + * Null for a blank event. + * @extends {Blockly.Events.CommentBase} + * @constructor + */ + constructor(comment: Blockly.WorkspaceComment); + + /** + * The comment that is being moved. Will be cleared after recording the new + * location. + * @type {Blockly.WorkspaceComment} + */ + comment_: Blockly.WorkspaceComment; + + /** + * The location before the move, in workspace coordinates. + * @type {!Blockly.utils.Coordinate} + */ + oldCoordinate_: Blockly.utils.Coordinate; + + /** + * The location after the move, in workspace coordinates. + * @type {Blockly.utils.Coordinate} + */ + newCoordinate_: Blockly.utils.Coordinate; + + /** + * Record the comment's new location. Called after the move. Can only be + * called once. + */ + recordNew(): void; + + /** + * Type of this event. + * @type {string} + */ + type: string; + + /** + * Override the location before the move. Use this if you don't create the + * event until the end of the move, but you know the original location. + * @param {!Blockly.utils.Coordinate} xy The location before the move, + * in workspace coordinates. + */ + setOldCoordinate(xy: Blockly.utils.Coordinate): void; + + /** + * Encode the event as JSON. + * @return {!Object} JSON representation. + */ + toJson(): Object; + + /** + * Decode the JSON event. + * @param {!Object} json JSON representation. + */ + fromJson(json: Object): void; + + /** + * Does this event record any change of state? + * @return {boolean} False if something changed. + */ + isNull(): boolean; + + /** + * Run a move event. + * @param {boolean} forward True if run forward, false if run backward (undo). + */ + run(forward: boolean): void; + } + + + /** + * Helper function for Comment[Create|Delete] + * @param {!Blockly.Events.CommentCreate|!Blockly.Events.CommentDelete} event + * The event to run. + * @param {boolean} create if True then Create, if False then Delete + */ + function CommentCreateDeleteHelper(event: Blockly.Events.CommentCreate|Blockly.Events.CommentDelete, create: boolean): void; +} + + +declare module Blockly.Xml { + + /** + * Encode a block tree as XML. + * @param {!Blockly.Workspace} workspace The workspace containing blocks. + * @param {boolean=} opt_noId True if the encoder should skip the block IDs. + * @return {!Element} XML DOM element. + */ + function workspaceToDom(workspace: Blockly.Workspace, opt_noId?: boolean): Element; + + /** + * Encode a list of variables as XML. + * @param {!Array.} variableList List of all variable + * models. + * @return {!Element} Tree of XML elements. + */ + function variablesToDom(variableList: Blockly.VariableModel[]): Element; + + /** + * Encode a block subtree as XML with XY coordinates. + * @param {!Blockly.Block} block The root block to encode. + * @param {boolean=} opt_noId True if the encoder should skip the block ID. + * @return {!Element} Tree of XML elements. + */ + function blockToDomWithXY(block: Blockly.Block, opt_noId?: boolean): Element; + + /** + * Encode a block subtree as XML. + * @param {!Blockly.Block} block The root block to encode. + * @param {boolean=} opt_noId True if the encoder should skip the block ID. + * @return {!Element} Tree of XML elements. + */ + function blockToDom(block: Blockly.Block, opt_noId?: boolean): Element; + + /** + * Converts a DOM structure into plain text. + * Currently the text format is fairly ugly: all one line with no whitespace, + * unless the DOM itself has whitespace built-in. + * @param {!Node} dom A tree of XML nodes. + * @return {string} Text representation. + */ + function domToText(dom: Node): string; + + /** + * Converts a DOM structure into properly indented text. + * @param {!Node} dom A tree of XML elements. + * @return {string} Text representation. + */ + function domToPrettyText(dom: Node): string; + + /** + * Converts an XML string into a DOM structure. + * @param {string} text An XML string. + * @return {!Element} A DOM object representing the singular child of the + * document element. + * @throws if the text doesn't parse. + */ + function textToDom(text: string): Element; + + /** + * Clear the given workspace then decode an XML DOM and + * create blocks on the workspace. + * @param {!Element} xml XML DOM. + * @param {!Blockly.Workspace} workspace The workspace. + * @return {Array.} An array containing new block ids. + */ + function clearWorkspaceAndLoadFromXml(xml: Element, workspace: Blockly.Workspace): string[]; + + /** + * Decode an XML DOM and create blocks on the workspace. + * @param {!Element} xml XML DOM. + * @param {!Blockly.Workspace} workspace The workspace. + * @return {!Array.} An array containing new block IDs. + * @suppress {strictModuleDepCheck} Suppress module check while workspace + * comments are not bundled in. + */ + function domToWorkspace(xml: Element, workspace: Blockly.Workspace): string[]; + + /** + * Decode an XML DOM and create blocks on the workspace. Position the new + * blocks immediately below prior blocks, aligned by their starting edge. + * @param {!Element} xml The XML DOM. + * @param {!Blockly.Workspace} workspace The workspace to add to. + * @return {Array.} An array containing new block IDs. + */ + function appendDomToWorkspace(xml: Element, workspace: Blockly.Workspace): string[]; + + /** + * Decode an XML block tag and create a block (and possibly sub blocks) on the + * workspace. + * @param {!Element} xmlBlock XML block element. + * @param {!Blockly.Workspace} workspace The workspace. + * @return {!Blockly.Block} The root block created. + */ + function domToBlock(xmlBlock: Element, workspace: Blockly.Workspace): Blockly.Block; + + /** + * Decode an XML list of variables and add the variables to the workspace. + * @param {!Element} xmlVariables List of XML variable elements. + * @param {!Blockly.Workspace} workspace The workspace to which the variable + * should be added. + */ + function domToVariables(xmlVariables: Element, workspace: Blockly.Workspace): void; + + /** + * Remove any 'next' block (statements in a stack). + * @param {!Element} xmlBlock XML block element. + */ + function deleteNext(xmlBlock: Element): void; +} + + +declare module Blockly { + + class ZoomControls extends ZoomControls__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class ZoomControls__Class { + + /** + * Class for a zoom controls. + * @param {!Blockly.WorkspaceSvg} workspace The workspace to sit in. + * @constructor + */ + constructor(workspace: Blockly.WorkspaceSvg); + + /** + * Create the zoom controls. + * @return {!SVGElement} The zoom controls SVG group. + */ + createDom(): SVGElement; + + /** + * Initialize the zoom controls. + * @param {number} verticalSpacing Vertical distances from workspace edge to the + * same edge of the controls. + * @return {number} Vertical distance from workspace edge to the opposite + * edge of the controls. + */ + init(verticalSpacing: number): number; + + /** + * Dispose of this zoom controls. + * Unlink from all DOM elements to prevent memory leaks. + */ + dispose(): void; + + /** + * Position the zoom controls. + * It is positioned in the opposite corner to the corner the + * categories/toolbox starts at. + */ + position(): void; + } + +} + + +declare module Blockly { + + class Component extends Component__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Component__Class { + + /** + * Default implementation of a UI component. + * Similar to Closure's goog.ui.Component. + * + * @constructor + */ + constructor(); + + /** + * Gets the unique ID for the instance of this component. If the instance + * doesn't already have an ID, generates one on the fly. + * @return {string} Unique component ID. + * @package + */ + getId(): string; + + /** + * Gets the component's element. + * @return {Element} The element for the component. + * @package + */ + getElement(): Element; + + /** + * Sets the component's root element to the given element. Considered + * protected and final. + * + * This should generally only be called during createDom. Setting the element + * does not actually change which element is rendered, only the element that is + * associated with this UI component. + * + * This should only be used by subclasses and its associated renderers. + * + * @param {Element} element Root element for the component. + * @protected + */ + setElementInternal(element: Element): void; + + /** + * Sets the parent of this component to use for event bubbling. Throws an error + * if the component already has a parent or if an attempt is made to add a + * component to itself as a child. + * @param {Blockly.Component} parent The parent component. + * @protected + */ + setParent(parent: Blockly.Component): void; + + /** + * Returns the component's parent, if any. + * @return {?Blockly.Component} The parent component. + * @protected + */ + getParent(): Blockly.Component; + + /** + * Determines whether the component has been added to the document. + * @return {boolean} TRUE if rendered. Otherwise, FALSE. + * @protected + */ + isInDocument(): boolean; + + /** + * Creates the initial DOM representation for the component. The default + * implementation is to set this.element_ = div. + * @protected + */ + createDom(): void; + + /** + * Renders the component. If a parent element is supplied, the component's + * element will be appended to it. If there is no optional parent element and + * the element doesn't have a parentNode then it will be appended to the + * document body. + * + * If this component has a parent component, and the parent component is + * not in the document already, then this will not call `enterDocument` + * on this component. + * + * Throws an Error if the component is already rendered. + * + * @param {Element=} opt_parentElement Optional parent element to render the + * component into. + * @package + */ + render(opt_parentElement?: Element): void; + + /** + * Renders the component before another element. The other element should be in + * the document already. + * + * Throws an Error if the component is already rendered. + * + * @param {Node} sibling Node to render the component before. + * @protected + */ + renderBefore(sibling: Node): void; + + /** + * Called when the component's element is known to be in the document. Anything + * using document.getElementById etc. should be done at this stage. + * + * If the component contains child components, this call is propagated to its + * children. + * @protected + */ + enterDocument(): void; + + /** + * Called by dispose to clean up the elements and listeners created by a + * component, or by a parent component/application who has removed the + * component from the document but wants to reuse it later. + * + * If the component contains child components, this call is propagated to its + * children. + * + * It should be possible for the component to be rendered again once this method + * has been called. + * @protected + */ + exitDocument(): void; + + /** + * Disposes of the object. If the object hasn't already been disposed of, calls + * {@link #disposeInternal}. + * @package + */ + dispose(): void; + + /** + * Disposes of the component. Calls `exitDocument`, which is expected to + * remove event handlers and clean up the component. Propagates the call to + * the component's children, if any. Removes the component's DOM from the + * document. + * @protected + */ + disposeInternal(): void; + + /** + * Adds the specified component as the last child of this component. See + * {@link Blockly.Component#addChildAt} for detailed semantics. + * + * @see Blockly.Component#addChildAt + * @param {Blockly.Component} child The new child component. + * @param {boolean=} opt_render If true, the child component will be rendered + * into the parent. + * @package + */ + addChild(child: Blockly.Component, opt_render?: boolean): void; + + /** + * Adds the specified component as a child of this component at the given + * 0-based index. + * + * Both `addChild` and `addChildAt` assume the following contract + * between parent and child components: + *
        + *
      • the child component's element must be a descendant of the parent + * component's element, and + *
      • the DOM state of the child component must be consistent with the DOM + * state of the parent component (see `isInDocument`) in the + * steady state -- the exception is to addChildAt(child, i, false) and + * then immediately decorate/render the child. + *
      + * + * In particular, `parent.addChild(child)` will throw an error if the + * child component is already in the document, but the parent isn't. + * + * Clients of this API may call `addChild` and `addChildAt` with + * `opt_render` set to true. If `opt_render` is true, calling these + * methods will automatically render the child component's element into the + * parent component's element. If the parent does not yet have an element, then + * `createDom` will automatically be invoked on the parent before + * rendering the child. + * + * Invoking {@code parent.addChild(child, true)} will throw an error if the + * child component is already in the document, regardless of the parent's DOM + * state. + * + * If `opt_render` is true and the parent component is not already + * in the document, `enterDocument` will not be called on this component + * at this point. + * + * Finally, this method also throws an error if the new child already has a + * different parent, or the given index is out of bounds. + * + * @see Blockly.Component#addChild + * @param {Blockly.Component} child The new child component. + * @param {number} index 0-based index at which the new child component is to be + * added; must be between 0 and the current child count (inclusive). + * @param {boolean=} opt_render If true, the child component will be rendered + * into the parent. + * @protected + */ + addChildAt(child: Blockly.Component, index: number, opt_render?: boolean): void; + + /** + * Returns the DOM element into which child components are to be rendered, + * or null if the component itself hasn't been rendered yet. This default + * implementation returns the component's root element. Subclasses with + * complex DOM structures must override this method. + * @return {Element} Element to contain child elements (null if none). + * @protected + */ + getContentElement(): Element; + + /** + * Returns true if the component is rendered right-to-left, false otherwise. + * The first time this function is invoked, the right-to-left rendering property + * is set if it has not been already. + * @return {boolean} Whether the control is rendered right-to-left. + * @protected + */ + isRightToLeft(): boolean; + + /** + * Set is right-to-left. This function should be used if the component needs + * to know the rendering direction during DOM creation (i.e. before + * {@link #enterDocument} is called and is right-to-left is set). + * @param {boolean} rightToLeft Whether the component is rendered + * right-to-left. + * @package + */ + setRightToLeft(rightToLeft: boolean): void; + + /** + * Returns true if the component has children. + * @return {boolean} True if the component has children. + * @protected + */ + hasChildren(): boolean; + + /** + * Returns the number of children of this component. + * @return {number} The number of children. + * @protected + */ + getChildCount(): number; + + /** + * Returns the child with the given ID, or null if no such child exists. + * @param {string} id Child component ID. + * @return {?Blockly.Component} The child with the given ID; null if none. + * @protected + */ + getChild(id: string): Blockly.Component; + + /** + * Returns the child at the given index, or null if the index is out of bounds. + * @param {number} index 0-based index. + * @return {?Blockly.Component} The child at the given index; null if none. + * @protected + */ + getChildAt(index: number): Blockly.Component; + + /** + * Calls the given function on each of this component's children in order. If + * `opt_obj` is provided, it will be used as the 'this' object in the + * function when called. The function should take two arguments: the child + * component and its 0-based index. The return value is ignored. + * @param {function(this:T,?,number):?} f The function to call for every + * child component; should take 2 arguments (the child and its index). + * @param {T=} opt_obj Used as the 'this' object in f when called. + * @template T + * @protected + */ + forEachChild(f: { (_0: any, _1: number): any }, opt_obj?: T): void; + + /** + * Returns the 0-based index of the given child component, or -1 if no such + * child is found. + * @param {?Blockly.Component} child The child component. + * @return {number} 0-based index of the child component; -1 if not found. + * @protected + */ + indexOfChild(child: Blockly.Component): number; + } + +} + +declare module Blockly.Component { + + /** + * The default right to left value. + * @type {boolean} + * @package + */ + var defaultRightToLeft: boolean; + + /** + * Errors thrown by the component. + * @enum {string} + */ + enum Error { ALREADY_RENDERED, PARENT_UNABLE_TO_BE_SET, CHILD_INDEX_OUT_OF_BOUNDS } +} + + +declare module Blockly { + + class Action extends Action__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Action__Class { + + /** + * Class for a single action. + * An action describes user intent. (ex go to next or go to previous) + * @param {string} name The name of the action. + * @param {string} desc The description of the action. + * @constructor + */ + constructor(name: string, desc: string); + } + +} + + +declare module Blockly { + + class ASTNode extends ASTNode__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class ASTNode__Class { + + /** + * Class for an AST node. + * It is recommended that you use one of the createNode methods instead of + * creating a node directly. + * @param {string} type The type of the location. + * Must be in Bockly.ASTNode.types. + * @param {!(Blockly.Block|Blockly.Connection|Blockly.Field|Blockly.Workspace)} + * location The position in the AST. + * @param {!Object=} opt_params Optional dictionary of options. + * @constructor + */ + constructor(type: string, location: Blockly.Block|Blockly.Connection|Blockly.Field|Blockly.Workspace, opt_params?: Object); + + /** + * Gets the value pointed to by this node. + * It is the callers responsibility to check the node type to figure out what + * type of object they get back from this. + * @return {!(Blockly.Field|Blockly.Connection|Blockly.Block|Blockly.Workspace)} + * The current field, connection, workspace, or block the cursor is on. + */ + getLocation(): Blockly.Field|Blockly.Connection|Blockly.Block|Blockly.Workspace; + + /** + * The type of the current location. + * One of Blockly.ASTNode.types + * @return {string} The type of the location. + */ + getType(): string; + + /** + * The coordinate on the workspace. + * @return {Blockly.utils.Coordinate} The workspace coordinate or null if the + * location is not a workspace. + */ + getWsCoordinate(): Blockly.utils.Coordinate; + + /** + * Whether the node points to a connection. + * @return {boolean} [description] + * @package + */ + isConnection(): boolean; + + /** + * Finds the source block of the location of this node. + * @return {Blockly.Block} The source block of the location, or null if the node + * is of type workspace. + */ + getSourceBlock(): Blockly.Block; + + /** + * Find the element to the right of the current element in the AST. + * @return {Blockly.ASTNode} An AST node that wraps the next field, connection, + * block, or workspace. Or null if there is no node to the right. + */ + next(): Blockly.ASTNode; + + /** + * Find the element one level below and all the way to the left of the current + * location. + * @return {Blockly.ASTNode} An AST node that wraps the next field, connection, + * workspace, or block. Or null if there is nothing below this node. + */ + in(): Blockly.ASTNode; + + /** + * Find the element to the left of the current element in the AST. + * @return {Blockly.ASTNode} An AST node that wraps the previous field, + * connection, workspace or block. Or null if no node exists to the left. + * null. + */ + prev(): Blockly.ASTNode; + + /** + * Find the next element that is one position above and all the way to the left + * of the current location. + * @return {Blockly.ASTNode} An AST node that wraps the next field, connection, + * workspace or block. Or null if we are at the workspace level. + */ + out(): Blockly.ASTNode; + } + +} + +declare module Blockly.ASTNode { + + /** + * Object holding different types for an AST node. + * @enum {string} + */ + enum types { FIELD, BLOCK, INPUT, OUTPUT, NEXT, PREVIOUS, STACK, WORKSPACE } + + /** + * True to navigate to all fields. False to only navigate to clickable fields. + * @type {boolean} + */ + var NAVIGATE_ALL_FIELDS: boolean; + + /** + * Create an AST node pointing to a field. + * @param {Blockly.Field} field The location of the AST node. + * @return {Blockly.ASTNode} An AST node pointing to a field. + */ + function createFieldNode(field: Blockly.Field): Blockly.ASTNode; + + /** + * Creates an AST node pointing to a connection. If the connection has a parent + * input then create an AST node of type input that will hold the connection. + * @param {Blockly.Connection} connection This is the connection the node will + * point to. + * @return {Blockly.ASTNode} An AST node pointing to a connection. + */ + function createConnectionNode(connection: Blockly.Connection): Blockly.ASTNode; + + /** + * Creates an AST node pointing to an input. Stores the input connection as the + * location. + * @param {Blockly.Input} input The input used to create an AST node. + * @return {Blockly.ASTNode} An AST node pointing to a input. + */ + function createInputNode(input: Blockly.Input): Blockly.ASTNode; + + /** + * Creates an AST node pointing to a block. + * @param {Blockly.Block} block The block used to create an AST node. + * @return {Blockly.ASTNode} An AST node pointing to a block. + */ + function createBlockNode(block: Blockly.Block): Blockly.ASTNode; + + /** + * Create an AST node of type stack. A stack, represented by its top block, is + * the set of all blocks connected to a top block, including the top block. + * @param {Blockly.Block} topBlock A top block has no parent and can be found + * in the list returned by workspace.getTopBlocks(). + * @return {Blockly.ASTNode} An AST node of type stack that points to the top + * block on the stack. + */ + function createStackNode(topBlock: Blockly.Block): Blockly.ASTNode; + + /** + * Creates an AST node pointing to a workspace. + * @param {!Blockly.Workspace} workspace The workspace that we are on. + * @param {Blockly.utils.Coordinate} wsCoordinate The position on the workspace + * for this node. + * @return {Blockly.ASTNode} An AST node pointing to a workspace and a position + * on the workspace. + */ + function createWorkspaceNode(workspace: Blockly.Workspace, wsCoordinate: Blockly.utils.Coordinate): Blockly.ASTNode; +} + + +declare module Blockly { + + class BasicCursor extends BasicCursor__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class BasicCursor__Class extends Blockly.Cursor__Class { + + /** + * Class for a basic cursor. + * This will allow the user to get to all nodes in the AST by hitting next or + * previous. + * @constructor + * @extends {Blockly.Cursor} + */ + constructor(); + + /** + * Uses pre order traversal to navigate the Blockly AST. This will allow + * a user to easily navigate the entire Blockly AST without having to go in + * and out levels on the tree. + * @param {Blockly.ASTNode} node The current position in the AST. + * @param {!function(Blockly.ASTNode) : boolean} isValid A function true/false + * depending on whether the given node should be traversed. + * @return {Blockly.ASTNode} The next node in the traversal. + * @protected + */ + getNextNode_(node: Blockly.ASTNode, isValid: { (_0: Blockly.ASTNode): boolean }): Blockly.ASTNode; + + /** + * Reverses the pre order traversal in order to find the previous node. This will + * allow a user to easily navigate the entire Blockly AST without having to go in + * and out levels on the tree. + * @param {Blockly.ASTNode} node The current position in the AST. + * @param {!function(Blockly.ASTNode) : boolean} isValid A function true/false + * depending on whether the given node should be traversed. + * @return {Blockly.ASTNode} The previous node in the traversal or null if no + * previous node exists. + * @protected + */ + getPreviousNode_(node: Blockly.ASTNode, isValid: { (_0: Blockly.ASTNode): boolean }): Blockly.ASTNode; + + /** + * Decides what nodes to traverse and which ones to skip. Currently, it + * skips output, stack and workspace nodes. + * @param {Blockly.ASTNode} node The AST node to check whether it is valid. + * @return {boolean} True if the node should be visited, false otherwise. + * @protected + */ + validNode_(node: Blockly.ASTNode): boolean; + } + +} + + +declare module Blockly { + + class Cursor extends Cursor__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Cursor__Class extends Blockly.Marker__Class { + + /** + * Class for a cursor. + * A cursor controls how a user navigates the Blockly AST. + * @constructor + * @extends {Blockly.Marker} + */ + constructor(); + + /** + * Find the next connection, field, or block. + * @return {Blockly.ASTNode} The next element, or null if the current node is + * not set or there is no next value. + * @protected + */ + next(): Blockly.ASTNode; + + /** + * Find the in connection or field. + * @return {Blockly.ASTNode} The in element, or null if the current node is + * not set or there is no in value. + * @protected + */ + in(): Blockly.ASTNode; + + /** + * Find the previous connection, field, or block. + * @return {Blockly.ASTNode} The previous element, or null if the current node + * is not set or there is no previous value. + * @protected + */ + prev(): Blockly.ASTNode; + + /** + * Find the out connection, field, or block. + * @return {Blockly.ASTNode} The out element, or null if the current node is + * not set or there is no out value. + * @protected + */ + out(): Blockly.ASTNode; + + /** + * Handles the given action. + * This is only triggered when keyboard navigation is enabled. + * @param {!Blockly.Action} action The action to be handled. + * @return {boolean} True if the action has been handled, false otherwise. + */ + onBlocklyAction(action: Blockly.Action): boolean; + } + +} + + +declare module Blockly { + + class FlyoutCursor extends FlyoutCursor__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class FlyoutCursor__Class extends Blockly.Cursor__Class { + + /** + * Class for a flyout cursor. + * This controls how a user navigates blocks in the flyout. + * @constructor + * @extends {Blockly.Cursor} + */ + constructor(); + } + +} + + +declare module Blockly.user.keyMap { + + /** + * Object holding valid modifiers. + * @enum {string} + */ + enum modifierKeys { SHIFT, CONTROL, ALT, META } + + /** + * Update the key map to contain the new action. + * @param {string} keyCode The key code serialized by the serializeKeyEvent. + * @param {!Blockly.Action} action The action to be executed when the keys + * corresponding to the serialized key code is pressed. + */ + function setActionForKey(keyCode: string, action: Blockly.Action): void; + + /** + * Creates a new key map. + * @param {!Object} keyMap The object holding the key + * to action mapping. + */ + function setKeyMap(keyMap: { [key: string]: Blockly.Action }): void; + + /** + * Gets the current key map. + * @return {Object} The object holding the key to + * action mapping. + */ + function getKeyMap(): { [key: string]: Blockly.Action }; + + /** + * Get the action by the serialized key code. + * @param {string} keyCode The serialized key code. + * @return {Blockly.Action|undefined} The action holding the function to + * call when the given keyCode is used or undefined if no action exists. + */ + function getActionByKeyCode(keyCode: string): Blockly.Action|any /*undefined*/; + + /** + * Get the serialized key that corresponds to the action. + * @param {!Blockly.Action} action The action for which we want to get + * the key. + * @return {?string} The serialized key or null if the action does not have + * a key mapping. + */ + function getKeyByAction(action: Blockly.Action): string; + + /** + * Serialize the key event. + * @param {!Event} e A key up event holding the key code. + * @return {string} A string containing the serialized key event. + * @package + */ + function serializeKeyEvent(e: Event): string; + + /** + * Create the serialized key code that will be used in the key map. + * @param {number} keyCode Number code representing the key. + * @param {!Array.} modifiers List of modifiers to be used with the key. + * All valid modifiers can be found in the Blockly.user.keyMap.modifierKeys. + * @return {string} The serialized key code for the given modifiers and key. + */ + function createSerializedKey(keyCode: number, modifiers: string[]): string; + + /** + * Creates the default key map. + * @return {!Object} An object holding the default key + * to action mapping. + */ + function createDefaultKeyMap(): { [key: string]: Blockly.Action }; +} + + +declare module Blockly { + + class Marker extends Marker__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Marker__Class { + + /** + * Class for a marker. + * This is used in keyboard navigation to save a location in the Blockly AST. + * @constructor + */ + constructor(); + + /** + * The colour of the marker. + * @type {?string} + */ + colour: string; + + /** + * The type of the marker. + * @type {string} + */ + type: string; + + /** + * Sets the object in charge of drawing the marker. + * @param {Blockly.blockRendering.MarkerSvg} drawer The object in charge of + * drawing the marker. + */ + setDrawer(drawer: Blockly.blockRendering.MarkerSvg): void; + + /** + * Get the current drawer for the marker. + * @return {Blockly.blockRendering.MarkerSvg} The object in charge of drawing + * the marker. + */ + getDrawer(): Blockly.blockRendering.MarkerSvg; + + /** + * Gets the current location of the marker. + * @return {Blockly.ASTNode} The current field, connection, or block the marker + * is on. + */ + getCurNode(): Blockly.ASTNode; + + /** + * Set the location of the marker and call the update method. + * Setting isStack to true will only work if the newLocation is the top most + * output or previous connection on a stack. + * @param {Blockly.ASTNode} newNode The new location of the marker. + */ + setCurNode(newNode: Blockly.ASTNode): void; + + /** + * Redraw the current marker. + * @package + */ + draw(): void; + + /** + * Hide the marker SVG. + */ + hide(): void; + + /** + * Dispose of this marker. + */ + dispose(): void; + } + +} + + +declare module Blockly.navigation { + + /** + * A function to call to give feedback to the user about logs, warnings, and + * errors. You can override this to customize feedback (e.g. warning sounds, + * reading out the warning text, etc). + * Null by default. + * The first argument is one of 'log', 'warn', and 'error'. + * The second argument is the message. + * @type {?function(string, string)} + * @public + */ + var loggingCallback: { (_0: string, _1: string): any /*missing*/ }; + + /** + * State indicating focus is currently on the flyout. + * @type {number} + * @const + */ + var STATE_FLYOUT: number; + + /** + * State indicating focus is currently on the workspace. + * @type {number} + * @const + */ + var STATE_WS: number; + + /** + * State indicating focus is currently on the toolbox. + * @type {number} + * @const + */ + var STATE_TOOLBOX: number; + + /** + * The distance to move the cursor on the workspace. + * @type {number} + * @const + */ + var WS_MOVE_DISTANCE: number; + + /** + * Object holding default action names. + * @enum {string} + */ + enum actionNames { PREVIOUS, NEXT, IN, OUT, INSERT, MARK, DISCONNECT, TOOLBOX, EXIT, TOGGLE_KEYBOARD_NAV, MOVE_WS_CURSOR_UP, MOVE_WS_CURSOR_DOWN, MOVE_WS_CURSOR_LEFT, MOVE_WS_CURSOR_RIGHT } + + /** + * The name of the marker reserved for internal use. + * @type {string} + * @const + */ + var MARKER_NAME: string; + + /** + * Get the local marker. + * @return {!Blockly.Marker} The local marker for the main workspace. + */ + function getMarker(): Blockly.Marker; + + /** + * If there is a marked connection try connecting the block from the flyout to + * that connection. If no connection has been marked then inserting will place + * it on the workspace. + */ + function insertFromFlyout(): void; + + /** + * Tries to connect the given block to the destination connection, making an + * intelligent guess about which connection to use to on the moving block. + * @param {!Blockly.Block} block The block to move. + * @param {!Blockly.Connection} destConnection The connection to connect to. + * @return {boolean} Whether the connection was successful. + */ + function insertBlock(block: Blockly.Block, destConnection: Blockly.Connection): boolean; + + /** + * Set the current navigation state. + * @param {number} newState The new navigation state. + * @package + */ + function setState(newState: number): void; + + /** + * Gets the top node on a block. + * This is either the previous connection, output connection or the block. + * @param {!Blockly.Block} block The block to find the top most AST node on. + * @return {Blockly.ASTNode} The AST node holding the top most node on the + * block. + * @package + */ + function getTopNode(block: Blockly.Block): Blockly.ASTNode; + + /** + * Before a block is deleted move the cursor to the appropriate position. + * @param {!Blockly.Block} deletedBlock The block that is being deleted. + */ + function moveCursorOnBlockDelete(deletedBlock: Blockly.Block): void; + + /** + * When a block that the cursor is on is mutated move the cursor to the block + * level. + * @param {!Blockly.Block} mutatedBlock The block that is being mutated. + * @package + */ + function moveCursorOnBlockMutation(mutatedBlock: Blockly.Block): void; + + /** + * Enable accessibility mode. + */ + function enableKeyboardAccessibility(): void; + + /** + * Disable accessibility mode. + */ + function disableKeyboardAccessibility(): void; + + /** + * Handler for all the keyboard navigation events. + * @param {!Event} e The keyboard event. + * @return {boolean} True if the key was handled false otherwise. + */ + function onKeyPress(e: Event): boolean; + + /** + * Decides which actions to handle depending on keyboard navigation and readonly + * states. + * @param {!Blockly.Action} action The current action. + * @return {boolean} True if the action has been handled, false otherwise. + */ + function onBlocklyAction(action: Blockly.Action): boolean; + + /** + * The previous action. + * @type {!Blockly.Action} + */ + var ACTION_PREVIOUS: Blockly.Action; + + /** + * The out action. + * @type {!Blockly.Action} + */ + var ACTION_OUT: Blockly.Action; + + /** + * The next action. + * @type {!Blockly.Action} + */ + var ACTION_NEXT: Blockly.Action; + + /** + * The in action. + * @type {!Blockly.Action} + */ + var ACTION_IN: Blockly.Action; + + /** + * The action to try to insert a block. + * @type {!Blockly.Action} + */ + var ACTION_INSERT: Blockly.Action; + + /** + * The action to mark a certain location. + * @type {!Blockly.Action} + */ + var ACTION_MARK: Blockly.Action; + + /** + * The action to disconnect a block. + * @type {!Blockly.Action} + */ + var ACTION_DISCONNECT: Blockly.Action; + + /** + * The action to open the toolbox. + * @type {!Blockly.Action} + */ + var ACTION_TOOLBOX: Blockly.Action; + + /** + * The action to exit the toolbox or flyout. + * @type {!Blockly.Action} + */ + var ACTION_EXIT: Blockly.Action; + + /** + * The action to toggle keyboard navigation mode on and off. + * @type {!Blockly.Action} + */ + var ACTION_TOGGLE_KEYBOARD_NAV: Blockly.Action; + + /** + * The action to move the cursor to the keft on a worksapce. + * @type {!Blockly.Action} + */ + var ACTION_MOVE_WS_CURSOR_LEFT: Blockly.Action; + + /** + * The action to move the cursor to the right on a worksapce. + * @type {!Blockly.Action} + */ + var ACTION_MOVE_WS_CURSOR_RIGHT: Blockly.Action; + + /** + * The action to move the cursor up on a worksapce. + * @type {!Blockly.Action} + */ + var ACTION_MOVE_WS_CURSOR_UP: Blockly.Action; + + /** + * The action to move the cursor down on a worksapce. + * @type {!Blockly.Action} + */ + var ACTION_MOVE_WS_CURSOR_DOWN: Blockly.Action; + + /** + * List of actions that can be performed in read only mode. + * @type {!Array.} + */ + var READONLY_ACTION_LIST: Blockly.Action[]; +} + + +declare module Blockly { + + class TabNavigateCursor extends TabNavigateCursor__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class TabNavigateCursor__Class extends Blockly.BasicCursor__Class { + + /** + * A cursor for navigating between tab navigable fields. + * @constructor + * @extends {Blockly.BasicCursor} + */ + constructor(); + } + +} + + + + + + + + + +declare module Blockly.utils.aria { + + /** + * ARIA role values. + * Copied from Closure's goog.a11y.aria.Role + * @enum {string} + */ + enum Role { GRID, GRIDCELL, GROUP, LISTBOX, MENU, MENUITEM, MENUITEMCHECKBOX, OPTION, PRESENTATION, ROW, TREE, TREEITEM } + + /** + * ARIA states and properties. + * Copied from Closure's goog.a11y.aria.State + * @enum {string} + */ + enum State { ACTIVEDESCENDANT, COLCOUNT, EXPANDED, INVALID, LABEL, LABELLEDBY, LEVEL, ORIENTATION, POSINSET, ROWCOUNT, SELECTED, SETSIZE, VALUEMAX, VALUEMIN } + + /** + * Sets the role of an element. + * + * Similar to Closure's goog.a11y.aria + * + * @param {!Element} element DOM node to set role of. + * @param {!Blockly.utils.aria.Role} roleName Role name. + */ + function setRole(element: Element, roleName: Blockly.utils.aria.Role): void; + + /** + * Sets the state or property of an element. + * Copied from Closure's goog.a11y.aria + * @param {!Element} element DOM node where we set state. + * @param {!Blockly.utils.aria.State} stateName State attribute being set. + * Automatically adds prefix 'aria-' to the state name if the attribute is + * not an extra attribute. + * @param {string|boolean|number|!Array.} value Value + * for the state attribute. + */ + function setState(element: Element, stateName: Blockly.utils.aria.State, value: string|boolean|number|string[]): void; +} + + +declare module Blockly.utils.colour { + + /** + * Parses a colour from a string. + * .parse('red') -> '#ff0000' + * .parse('#f00') -> '#ff0000' + * .parse('#ff0000') -> '#ff0000' + * .parse('0xff0000') -> '#ff0000' + * .parse('rgb(255, 0, 0)') -> '#ff0000' + * @param {string|number} str Colour in some CSS format. + * @return {?string} A string containing a hex representation of the colour, + * or null if can't be parsed. + */ + function parse(str: string|number): string; + + /** + * Converts a colour from RGB to hex representation. + * @param {number} r Amount of red, int between 0 and 255. + * @param {number} g Amount of green, int between 0 and 255. + * @param {number} b Amount of blue, int between 0 and 255. + * @return {string} Hex representation of the colour. + */ + function rgbToHex(r: number, g: number, b: number): string; + + /** + * Converts a colour to RGB. + * @param {string} colour String representing colour in any + * colour format ('#ff0000', 'red', '0xff000', etc). + * @return {!Array.} RGB representation of the colour. + */ + function hexToRgb(colour: string): number[]; + + /** + * Converts an HSV triplet to hex representation. + * @param {number} h Hue value in [0, 360]. + * @param {number} s Saturation value in [0, 1]. + * @param {number} v Brightness in [0, 255]. + * @return {string} Hex representation of the colour. + */ + function hsvToHex(h: number, s: number, v: number): string; + + /** + * Blend two colours together, using the specified factor to indicate the + * weight given to the first colour. + * @param {string} colour1 First colour. + * @param {string} colour2 Second colour. + * @param {number} factor The weight to be given to colour1 over colour2. + * Values should be in the range [0, 1]. + * @return {?string} Combined colour represented in hex. + */ + function blend(colour1: string, colour2: string, factor: number): string; + + /** + * A map that contains the 16 basic colour keywords as defined by W3C: + * https://www.w3.org/TR/2018/REC-css-color-3-20180619/#html4 + * The keys of this map are the lowercase "readable" names of the colours, + * while the values are the "hex" values. + * + * @type {!Object} + */ + var names: { [key: string]: string }; +} + + +declare module Blockly.utils { + + class Coordinate extends Coordinate__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Coordinate__Class { + + /** + * Class for representing coordinates and positions. + * @param {number} x Left. + * @param {number} y Top. + * @struct + * @constructor + */ + constructor(x: number, y: number); + + /** + * X-value + * @type {number} + */ + x: number; + + /** + * Y-value + * @type {number} + */ + y: number; + + /** + * Scales this coordinate by the given scale factor. + * @param {number} s The scale factor to use for both x and y dimensions. + * @return {!Blockly.utils.Coordinate} This coordinate after scaling. + */ + scale(s: number): Blockly.utils.Coordinate; + + /** + * Translates this coordinate by the given offsets. + * respectively. + * @param {number} tx The value to translate x by. + * @param {number} ty The value to translate y by. + * @return {!Blockly.utils.Coordinate} This coordinate after translating. + */ + translate(tx: number, ty: number): Blockly.utils.Coordinate; + } + +} + +declare module Blockly.utils.Coordinate { + + /** + * Compares coordinates for equality. + * @param {Blockly.utils.Coordinate} a A Coordinate. + * @param {Blockly.utils.Coordinate} b A Coordinate. + * @return {boolean} True iff the coordinates are equal, or if both are null. + */ + function equals(a: Blockly.utils.Coordinate, b: Blockly.utils.Coordinate): boolean; + + /** + * Returns the distance between two coordinates. + * @param {!Blockly.utils.Coordinate} a A Coordinate. + * @param {!Blockly.utils.Coordinate} b A Coordinate. + * @return {number} The distance between `a` and `b`. + */ + function distance(a: Blockly.utils.Coordinate, b: Blockly.utils.Coordinate): number; + + /** + * Returns the magnitude of a coordinate. + * @param {!Blockly.utils.Coordinate} a A Coordinate. + * @return {number} The distance between the origin and `a`. + */ + function magnitude(a: Blockly.utils.Coordinate): number; + + /** + * Returns the difference between two coordinates as a new + * Blockly.utils.Coordinate. + * @param {!Blockly.utils.Coordinate|!SVGPoint} a An x/y coordinate. + * @param {!Blockly.utils.Coordinate|!SVGPoint} b An x/y coordinate. + * @return {!Blockly.utils.Coordinate} A Coordinate representing the difference + * between `a` and `b`. + */ + function difference(a: Blockly.utils.Coordinate|SVGPoint, b: Blockly.utils.Coordinate|SVGPoint): Blockly.utils.Coordinate; + + /** + * Returns the sum of two coordinates as a new Blockly.utils.Coordinate. + * @param {!Blockly.utils.Coordinate|!SVGPoint} a An x/y coordinate. + * @param {!Blockly.utils.Coordinate|!SVGPoint} b An x/y coordinate. + * @return {!Blockly.utils.Coordinate} A Coordinate representing the sum of + * the two coordinates. + */ + function sum(a: Blockly.utils.Coordinate|SVGPoint, b: Blockly.utils.Coordinate|SVGPoint): Blockly.utils.Coordinate; +} + + +declare module Blockly.utils.dom { + + /** + * Required name space for SVG elements. + * @const + */ + var SVG_NS: any /*missing*/; + + /** + * Required name space for HTML elements. + * @const + */ + var HTML_NS: any /*missing*/; + + /** + * Required name space for XLINK elements. + * @const + */ + var XLINK_NS: any /*missing*/; + + /** + * Node type constants. + * https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType + * @enum {number} + */ + enum Node { ELEMENT_NODE, TEXT_NODE, COMMENT_NODE, DOCUMENT_POSITION_CONTAINED_BY } + + /** + * Helper method for creating SVG elements. + * @param {string} name Element's tag name. + * @param {!Object} attrs Dictionary of attribute names and values. + * @param {Element} parent Optional parent on which to append the element. + * @return {!SVGElement} Newly created SVG element. + */ + function createSvgElement(name: string, attrs: Object, parent: Element): SVGElement; + + /** + * Add a CSS class to a element. + * Similar to Closure's goog.dom.classes.add, except it handles SVG elements. + * @param {!Element} element DOM element to add class to. + * @param {string} className Name of class to add. + * @return {boolean} True if class was added, false if already present. + */ + function addClass(element: Element, className: string): boolean; + + /** + * Remove a CSS class from a element. + * Similar to Closure's goog.dom.classes.remove, except it handles SVG elements. + * @param {!Element} element DOM element to remove class from. + * @param {string} className Name of class to remove. + * @return {boolean} True if class was removed, false if never present. + */ + function removeClass(element: Element, className: string): boolean; + + /** + * Checks if an element has the specified CSS class. + * Similar to Closure's goog.dom.classes.has, except it handles SVG elements. + * @param {!Element} element DOM element to check. + * @param {string} className Name of class to check. + * @return {boolean} True if class exists, false otherwise. + */ + function hasClass(element: Element, className: string): boolean; + + /** + * Removes a node from its parent. No-op if not attached to a parent. + * @param {Node} node The node to remove. + * @return {Node} The node removed if removed; else, null. + */ + function removeNode(node: Node): Node; + + /** + * Insert a node after a reference node. + * Contrast with node.insertBefore function. + * @param {!Element} newNode New element to insert. + * @param {!Element} refNode Existing element to precede new node. + */ + function insertAfter(newNode: Element, refNode: Element): void; + + /** + * Whether a node contains another node. + * @param {!Node} parent The node that should contain the other node. + * @param {!Node} descendant The node to test presence of. + * @return {boolean} Whether the parent node contains the descendant node. + */ + function containsNode(parent: Node, descendant: Node): boolean; + + /** + * Sets the CSS transform property on an element. This function sets the + * non-vendor-prefixed and vendor-prefixed versions for backwards compatibility + * with older browsers. See https://caniuse.com/#feat=transforms2d + * @param {!Element} element Element to which the CSS transform will be applied. + * @param {string} transform The value of the CSS `transform` property. + */ + function setCssTransform(element: Element, transform: string): void; + + /** + * Start caching text widths. Every call to this function MUST also call + * stopTextWidthCache. Caches must not survive between execution threads. + */ + function startTextWidthCache(): void; + + /** + * Stop caching field widths. Unless caching was already on when the + * corresponding call to startTextWidthCache was made. + */ + function stopTextWidthCache(): void; + + /** + * Gets the width of a text element, caching it in the process. + * @param {!Element} textElement An SVG 'text' element. + * @return {number} Width of element. + */ + function getTextWidth(textElement: Element): number; + + /** + * Gets the width of a text element using a faster method than `getTextWidth`. + * This method requires that we know the text element's font family and size in + * advance. Similar to `getTextWidth`, we cache the width we compute. + * @param {!Element} textElement An SVG 'text' element. + * @param {number} fontSize The font size to use. + * @param {string} fontWeight The font weight to use. + * @param {string} fontFamily The font family to use. + * @return {number} Width of element. + */ + function getFastTextWidth(textElement: Element, fontSize: number, fontWeight: string, fontFamily: string): number; +} + + +declare module Blockly.utils { + + /** + * Reference to the global object. + * + * More info on this implementation here: + * https://docs.google.com/document/d/1NAeW4Wk7I7FV0Y2tcUFvQdGMc89k2vdgSXInw8_nvCI/edit + */ + var global: any /*missing*/; +} + + +declare module Blockly.utils.IdGenerator { + + /** + * Gets the next unique ID. + * IDs are compatible with the HTML4 id attribute restrictions: + * Use only ASCII letters, digits, '_', '-' and '.' + * @return {string} The next unique identifier. + */ + function getNextUniqueId(): string; +} + + +declare module Blockly.utils { + + /** + * Key codes for common characters. + * + * Copied from Closure's goog.events.KeyCodes + * + * This list is not localized and therefore some of the key codes are not + * correct for non US keyboard layouts. See comments below. + * + * @enum {number} + */ + enum KeyCodes { WIN_KEY_FF_LINUX, MAC_ENTER, BACKSPACE, TAB, NUM_CENTER, ENTER, SHIFT, CTRL, ALT, PAUSE, CAPS_LOCK, ESC, SPACE, PAGE_UP, PAGE_DOWN, END, HOME, LEFT, UP, RIGHT, DOWN, PLUS_SIGN, PRINT_SCREEN, INSERT, DELETE, ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, FF_SEMICOLON, FF_EQUALS, FF_DASH, FF_HASH, QUESTION_MARK, AT_SIGN, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, META, WIN_KEY_RIGHT, CONTEXT_MENU, NUM_ZERO, NUM_ONE, NUM_TWO, NUM_THREE, NUM_FOUR, NUM_FIVE, NUM_SIX, NUM_SEVEN, NUM_EIGHT, NUM_NINE, NUM_MULTIPLY, NUM_PLUS, NUM_MINUS, NUM_PERIOD, NUM_DIVISION, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, NUMLOCK, SCROLL_LOCK, FIRST_MEDIA_KEY, LAST_MEDIA_KEY, SEMICOLON, DASH, EQUALS, COMMA, PERIOD, SLASH, APOSTROPHE, TILDE, SINGLE_QUOTE, OPEN_SQUARE_BRACKET, BACKSLASH, CLOSE_SQUARE_BRACKET, WIN_KEY, MAC_FF_META, MAC_WK_CMD_LEFT, MAC_WK_CMD_RIGHT, WIN_IME, VK_NONAME, PHANTOM } +} + + +declare module Blockly.utils.math { + + /** + * Converts degrees to radians. + * Copied from Closure's goog.math.toRadians. + * @param {number} angleDegrees Angle in degrees. + * @return {number} Angle in radians. + */ + function toRadians(angleDegrees: number): number; + + /** + * Converts radians to degrees. + * Copied from Closure's goog.math.toDegrees. + * @param {number} angleRadians Angle in radians. + * @return {number} Angle in degrees. + */ + function toDegrees(angleRadians: number): number; + + /** + * Clamp the provided number between the lower bound and the upper bound. + * @param {number} lowerBound The desired lower bound. + * @param {number} number The number to clamp. + * @param {number} upperBound The desired upper bound. + * @return {number} The clamped number. + */ + function clamp(lowerBound: number, number: number, upperBound: number): number; +} + + +declare module Blockly.utils.object { + + /** + * Inherit the prototype methods from one constructor into another. + * + * @param {!Function} childCtor Child class. + * @param {!Function} parentCtor Parent class. + * @suppress {strictMissingProperties} superClass_ is not defined on Function. + */ + function inherits(childCtor: Function, parentCtor: Function): void; + + /** + * Copies all the members of a source object to a target object. + * @param {!Object} target Target. + * @param {!Object} source Source. + */ + function mixin(target: Object, source: Object): void; + + /** + * Returns an array of a given object's own enumerable property values. + * @param {!Object} obj Object containing values. + * @return {!Array} Array of values. + */ + function values(obj: Object): any[]; +} + + +declare module Blockly.utils { + + class Rect extends Rect__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Rect__Class { + + /** + * Class for representing rectangular regions. + * @param {number} top Top. + * @param {number} bottom Bottom. + * @param {number} left Left. + * @param {number} right Right. + * @struct + * @constructor + */ + constructor(top: number, bottom: number, left: number, right: number); + + /** @type {number} */ + top: number; + + /** @type {number} */ + bottom: number; + + /** @type {number} */ + left: number; + + /** @type {number} */ + right: number; + + /** + * Tests whether this rectangle contains a x/y coordinate. + * + * @param {number} x The x coordinate to test for containment. + * @param {number} y The y coordinate to test for containment. + * @return {boolean} Whether this rectangle contains given coordinate. + */ + contains(x: number, y: number): boolean; + } + +} + + +declare module Blockly.utils { + + class Size extends Size__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Size__Class { + + /** + * Class for representing sizes consisting of a width and height. + * @param {number} width Width. + * @param {number} height Height. + * @struct + * @constructor + */ + constructor(width: number, height: number); + + /** + * Width + * @type {number} + */ + width: number; + + /** + * Height + * @type {number} + */ + height: number; + } + +} + +declare module Blockly.utils.Size { + + /** + * Compares sizes for equality. + * @param {Blockly.utils.Size} a A Size. + * @param {Blockly.utils.Size} b A Size. + * @return {boolean} True iff the sizes have equal widths and equal + * heights, or if both are null. + */ + function equals(a: Blockly.utils.Size, b: Blockly.utils.Size): boolean; +} + + +declare module Blockly.utils._string { + + /** + * Fast prefix-checker. + * Copied from Closure's goog.string.startsWith. + * @param {string} str The string to check. + * @param {string} prefix A string to look for at the start of `str`. + * @return {boolean} True if `str` begins with `prefix`. + */ + function startsWith(str: string, prefix: string): boolean; + + /** + * Given an array of strings, return the length of the shortest one. + * @param {!Array.} array Array of strings. + * @return {number} Length of shortest string. + */ + function shortestStringLength(array: string[]): number; + + /** + * Given an array of strings, return the length of the common prefix. + * Words may not be split. Any space after a word is included in the length. + * @param {!Array.} array Array of strings. + * @param {number=} opt_shortest Length of shortest string. + * @return {number} Length of common prefix. + */ + function commonWordPrefix(array: string[], opt_shortest?: number): number; + + /** + * Given an array of strings, return the length of the common suffix. + * Words may not be split. Any space after a word is included in the length. + * @param {!Array.} array Array of strings. + * @param {number=} opt_shortest Length of shortest string. + * @return {number} Length of common suffix. + */ + function commonWordSuffix(array: string[], opt_shortest?: number): number; + + /** + * Wrap text to the specified width. + * @param {string} text Text to wrap. + * @param {number} limit Width to wrap each line. + * @return {string} Wrapped text. + */ + function wrap(text: string, limit: number): string; +} + + +declare module Blockly.utils.style { + + /** + * Gets the height and width of an element. + * Similar to Closure's goog.style.getSize + * @param {!Element} element Element to get size of. + * @return {!Blockly.utils.Size} Object with width/height properties. + */ + function getSize(element: Element): Blockly.utils.Size; + + /** + * Retrieves a computed style value of a node. It returns empty string if the + * value cannot be computed (which will be the case in Internet Explorer) or + * "none" if the property requested is an SVG one and it has not been + * explicitly set (firefox and webkit). + * + * Copied from Closure's goog.style.getComputedStyle + * + * @param {!Element} element Element to get style of. + * @param {string} property Property to get (camel-case). + * @return {string} Style value. + */ + function getComputedStyle(element: Element, property: string): string; + + /** + * Gets the cascaded style value of a node, or null if the value cannot be + * computed (only Internet Explorer can do this). + * + * Copied from Closure's goog.style.getCascadedStyle + * + * @param {!Element} element Element to get style of. + * @param {string} style Property to get (camel-case). + * @return {string} Style value. + */ + function getCascadedStyle(element: Element, style: string): string; + + /** + * Returns a Coordinate object relative to the top-left of the HTML document. + * Similar to Closure's goog.style.getPageOffset + * @param {!Element} el Element to get the page offset for. + * @return {!Blockly.utils.Coordinate} The page offset. + */ + function getPageOffset(el: Element): Blockly.utils.Coordinate; + + /** + * Calculates the viewport coordinates relative to the document. + * Similar to Closure's goog.style.getViewportPageOffset + * @return {!Blockly.utils.Coordinate} The page offset of the viewport. + */ + function getViewportPageOffset(): Blockly.utils.Coordinate; + + /** + * Shows or hides an element from the page. Hiding the element is done by + * setting the display property to "none", removing the element from the + * rendering hierarchy so it takes up no space. To show the element, the default + * inherited display property is restored (defined either in stylesheets or by + * the browser's default style rules). + * Copied from Closure's goog.style.getViewportPageOffset + * + * @param {!Element} el Element to show or hide. + * @param {*} isShown True to render the element in its default style, + * false to disable rendering the element. + */ + function setElementShown(el: Element, isShown: any): void; + + /** + * Returns true if the element is using right to left (RTL) direction. + * Copied from Closure's goog.style.isRightToLeft + * + * @param {!Element} el The element to test. + * @return {boolean} True for right to left, false for left to right. + */ + function isRightToLeft(el: Element): boolean; + + /** + * Gets the computed border widths (on all sides) in pixels + * Copied from Closure's goog.style.getBorderBox + * @param {!Element} element The element to get the border widths for. + * @return {!Object} The computed border widths. + */ + function getBorderBox(element: Element): Object; + + /** + * Changes the scroll position of `container` with the minimum amount so + * that the content and the borders of the given `element` become visible. + * If the element is bigger than the container, its top left corner will be + * aligned as close to the container's top left corner as possible. + * Copied from Closure's goog.style.scrollIntoContainerView + * + * @param {!Element} element The element to make visible. + * @param {!Element} container The container to scroll. If not set, then the + * document scroll element will be used. + * @param {boolean=} opt_center Whether to center the element in the container. + * Defaults to false. + */ + function scrollIntoContainerView(element: Element, container: Element, opt_center?: boolean): void; + + /** + * Calculate the scroll position of `container` with the minimum amount so + * that the content and the borders of the given `element` become visible. + * If the element is bigger than the container, its top left corner will be + * aligned as close to the container's top left corner as possible. + * Copied from Closure's goog.style.getContainerOffsetToScrollInto + * + * @param {!Element} element The element to make visible. + * @param {!Element} container The container to scroll. If not set, then the + * document scroll element will be used. + * @param {boolean=} opt_center Whether to center the element in the container. + * Defaults to false. + * @return {!Blockly.utils.Coordinate} The new scroll position of the container, + * in form of goog.math.Coordinate(scrollLeft, scrollTop). + */ + function getContainerOffsetToScrollInto(element: Element, container: Element, opt_center?: boolean): Blockly.utils.Coordinate; +} + + +declare module Blockly.utils.svgPaths { + + /** + * Create a string representing the given x, y pair. It does not matter whether + * the coordinate is relative or absolute. The result has leading + * and trailing spaces, and separates the x and y coordinates with a comma but + * no space. + * @param {number} x The x coordinate. + * @param {number} y The y coordinate. + * @return {string} A string of the format ' x,y ' + * @public + */ + function point(x: number, y: number): string; + + /** + * Draw a curbic or quadratic curve. See + * developer.mozilla.org/en-US/docs/Web/SVG/Attribute/d#Cubic_B%C3%A9zier_Curve + * These coordinates are unitless and hence in the user coordinate system. + * @param {string} command The command to use. + * Should be one of: c, C, s, S, q, Q. + * @param {!Array.} points An array containing all of the points to pass to the + * curve command, in order. The points are represented as strings of the + * format ' x, y '. + * @return {string} A string defining one or more Bezier curves. See the MDN + * documentation for exact format. + * @public + */ + function curve(command: string, points: string[]): string; + + /** + * Move the cursor to the given position without drawing a line. + * The coordinates are absolute. + * These coordinates are unitless and hence in the user coordinate system. + * See developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths#Line_commands + * @param {number} x The absolute x coordinate. + * @param {number} y The absolute y coordinate. + * @return {string} A string of the format ' M x,y ' + * @public + */ + function moveTo(x: number, y: number): string; + + /** + * Move the cursor to the given position without drawing a line. + * Coordinates are relative. + * These coordinates are unitless and hence in the user coordinate system. + * See developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths#Line_commands + * @param {number} dx The relative x coordinate. + * @param {number} dy The relative y coordinate. + * @return {string} A string of the format ' m dx,dy ' + * @public + */ + function moveBy(dx: number, dy: number): string; + + /** + * Draw a line from the current point to the end point, which is the current + * point shifted by dx along the x-axis and dy along the y-axis. + * These coordinates are unitless and hence in the user coordinate system. + * See developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths#Line_commands + * @param {number} dx The relative x coordinate. + * @param {number} dy The relative y coordinate. + * @return {string} A string of the format ' l dx,dy ' + * @public + */ + function lineTo(dx: number, dy: number): string; + + /** + * Draw multiple lines connecting all of the given points in order. This is + * equivalent to a series of 'l' commands. + * These coordinates are unitless and hence in the user coordinate system. + * See developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths#Line_commands + * @param {!Array.} points An array containing all of the points to + * draw lines to, in order. The points are represented as strings of the + * format ' dx,dy '. + * @return {string} A string of the format ' l (dx,dy)+ ' + * @public + */ + function line(points: string[]): string; + + /** + * Draw a horizontal or vertical line. + * The first argument specifies the direction and whether the given position is + * relative or absolute. + * These coordinates are unitless and hence in the user coordinate system. + * See developer.mozilla.org/en-US/docs/Web/SVG/Attribute/d#LineTo_path_commands + * @param {string} command The command to prepend to the coordinate. This + * should be one of: V, v, H, h. + * @param {number} val The coordinate to pass to the command. It may be + * absolute or relative. + * @return {string} A string of the format ' command val ' + * @public + */ + function lineOnAxis(command: string, val: number): string; + + /** + * Draw an elliptical arc curve. + * These coordinates are unitless and hence in the user coordinate system. + * See developer.mozilla.org/en-US/docs/Web/SVG/Attribute/d#Elliptical_Arc_Curve + * @param {string} command The command string. Either 'a' or 'A'. + * @param {string} flags The flag string. See the MDN documentation for a + * description and examples. + * @param {number} radius The radius of the arc to draw. + * @param {string} point The point to move the cursor to after drawing the arc, + * specified either in absolute or relative coordinates depending on the + * command. + * @return {string} A string of the format 'command radius radius flags point' + * @public + */ + function arc(command: string, flags: string, radius: number, point: string): string; +} + + + +declare module Blockly.utils.xml { + + /** + * Namespace for Blockly's XML. + */ + var NAME_SPACE: any /*missing*/; + + /** + * Get the document object. This method is overridden in the Node.js build of + * Blockly. See gulpfile.js, package-blockly-node task. + * @return {!Document} The document object. + * @public + */ + function document(): Document; + + /** + * Create DOM element for XML. + * @param {string} tagName Name of DOM element. + * @return {!Element} New DOM element. + * @public + */ + function createElement(tagName: string): Element; + + /** + * Create text element for XML. + * @param {string} text Text content. + * @return {!Text} New DOM text node. + * @public + */ + function createTextNode(text: string): Text; + + /** + * Converts an XML string into a DOM tree. + * @param {string} text XML string. + * @return {Document} The DOM document. + * @throws if XML doesn't parse. + * @public + */ + function textToDomDocument(text: string): Document; + + /** + * Converts a DOM structure into plain text. + * Currently the text format is fairly ugly: all one line with no whitespace. + * @param {!Node} dom A tree of XML nodes. + * @return {string} Text representation. + * @public + */ + function domToText(dom: Node): string; +} + + +declare module Blockly.tree { + + class BaseNode extends BaseNode__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class BaseNode__Class extends Blockly.Component__Class { + + /** + * An abstract base class for a node in the tree. + * Similar to goog.ui.tree.BaseNode + * + * @param {string} content The content of the node label treated as + * plain-text and will be HTML escaped. + * @param {!Blockly.tree.BaseNode.Config} config The configuration for the tree. + * @constructor + * @extends {Blockly.Component} + */ + constructor(content: string, config: Blockly.tree.BaseNode.Config); + + /** + * @type {Blockly.tree.TreeControl} + * @protected + */ + tree: Blockly.tree.TreeControl; + + /** + * Adds roles and states. + * @protected + */ + initAccessibility(): void; + + /** + * Appends a node as a child to the current node. + * @param {Blockly.tree.BaseNode} child The child to add. + * @package + */ + add(child: Blockly.tree.BaseNode): void; + + /** + * Returns the tree. + * @return {?Blockly.tree.TreeControl} tree + * @protected + */ + getTree(): Blockly.tree.TreeControl; + + /** + * Returns the depth of the node in the tree. Should not be overridden. + * @return {number} The non-negative depth of this node (the root is zero). + * @protected + */ + getDepth(): number; + + /** + * Returns true if the node is a descendant of this node + * @param {Blockly.tree.BaseNode} node The node to check. + * @return {boolean} True if the node is a descendant of this node, false + * otherwise. + * @protected + */ + contains(node: Blockly.tree.BaseNode): boolean; + + /** + * This is re-defined here to indicate to the closure compiler the correct + * child return type. + * @param {number} index 0-based index. + * @return {Blockly.tree.BaseNode} The child at the given index; null if none. + * @protected + */ + getChildAt(index: number): Blockly.tree.BaseNode; + + /** + * Returns the children of this node. + * @return {!Array.} The children. + * @package + */ + getChildren(): Blockly.tree.BaseNode[]; + + /** + * @return {Blockly.tree.BaseNode} The first child of this node. + * @protected + */ + getFirstChild(): Blockly.tree.BaseNode; + + /** + * @return {Blockly.tree.BaseNode} The last child of this node. + * @protected + */ + getLastChild(): Blockly.tree.BaseNode; + + /** + * @return {Blockly.tree.BaseNode} The previous sibling of this node. + * @protected + */ + getPreviousSibling(): Blockly.tree.BaseNode; + + /** + * @return {Blockly.tree.BaseNode} The next sibling of this node. + * @protected + */ + getNextSibling(): Blockly.tree.BaseNode; + + /** + * @return {boolean} Whether the node is the last sibling. + * @protected + */ + isLastSibling(): boolean; + + /** + * @return {boolean} Whether the node is selected. + * @protected + */ + isSelected(): boolean; + + /** + * Selects the node. + * @protected + */ + select(): void; + + /** + * Selects the first node. + * @protected + */ + selectFirst(): void; + + /** + * Called from the tree to instruct the node change its selection state. + * @param {boolean} selected The new selection state. + * @protected + */ + setSelectedInternal(selected: boolean): void; + + /** + * @return {boolean} Whether the node is expanded. + * @protected + */ + getExpanded(): boolean; + + /** + * Sets the node to be expanded internally, without state change events. + * @param {boolean} expanded Whether to expand or close the node. + * @protected + */ + setExpandedInternal(expanded: boolean): void; + + /** + * Sets the node to be expanded. + * @param {boolean} expanded Whether to expand or close the node. + * @package + */ + setExpanded(expanded: boolean): void; + + /** + * Used to notify a node of that we have expanded it. + * Can be overidden by subclasses, see Blockly.tree.TreeNode. + * @protected + */ + doNodeExpanded(): void; + + /** + * Used to notify a node that we have collapsed it. + * Can be overidden by subclasses, see Blockly.tree.TreeNode. + * @protected + */ + doNodeCollapsed(): void; + + /** + * Toggles the expanded state of the node. + * @protected + */ + toggle(): void; + + /** + * @return {boolean} Whether the node is collapsible by user actions. + * @protected + */ + isUserCollapsible(): boolean; + + /** + * Creates HTML Element for the node. + * @return {!Element} HTML element + * @protected + */ + toDom(): Element; + + /** + * @return {!Element} The HTML element for the row. + * @protected + */ + getRowDom(): Element; + + /** + * @return {string} The class name for the row. + * @protected + */ + getRowClassName(): string; + + /** + * @return {!Element} The HTML element for the label. + * @protected + */ + getLabelDom(): Element; + + /** + * @return {!Element} The HTML for the icon. + * @protected + */ + getIconDom(): Element; + + /** + * Gets the calculated icon class. + * @protected + */ + getCalculatedIconClass(): void; + + /** + * @return {string} The background position style value. + * @protected + */ + getBackgroundPosition(): string; + + /** + * @return {Element} The row is the div that is used to draw the node without + * the children. + * @package + */ + getRowElement(): Element; + + /** + * @return {Element} The icon element. + * @protected + */ + getIconElement(): Element; + + /** + * @return {Element} The label element. + * @protected + */ + getLabelElement(): Element; + + /** + * @return {Element} The div containing the children. + * @protected + */ + getChildrenElement(): Element; + + /** + * Gets the icon class for the node. + * @return {string} s The icon source. + * @protected + */ + getIconClass(): string; + + /** + * Gets the icon class for when the node is expanded. + * @return {string} The class. + * @protected + */ + getExpandedIconClass(): string; + + /** + * Sets the text of the label. + * @param {string} s The plain text of the label. + * @protected + */ + setText(s: string): void; + + /** + * Returns the text of the label. If the text was originally set as HTML, the + * return value is unspecified. + * @return {string} The plain text of the label. + * @package + */ + getText(): string; + + /** + * Updates the row styles. + * @protected + */ + updateRow(): void; + + /** + * Updates the expand icon of the node. + * @protected + */ + updateExpandIcon(): void; + + /** + * Handles mouse down event. + * @param {!Event} e The browser event. + * @protected + */ + onMouseDown(e: Event): void; + + /** + * Handles a click event. + * @param {!Event} e The browser event. + * @protected + */ + onClick_(e: Event): void; + + /** + * Handles a key down event. + * @param {!Event} e The browser event. + * @return {boolean} The handled value. + * @protected + */ + onKeyDown(e: Event): boolean; + + /** + * Select the next node. + * @return {boolean} True if the action has been handled, false otherwise. + * @package + */ + selectNext(): boolean; + + /** + * Select the previous node. + * @return {boolean} True if the action has been handled, false otherwise. + * @package + */ + selectPrevious(): boolean; + + /** + * Select the parent node or collapse the current node. + * @return {boolean} True if the action has been handled, false otherwise. + * @package + */ + selectParent(): boolean; + + /** + * Expand the current node if it's not already expanded, or select the + * child node. + * @return {boolean} True if the action has been handled, false otherwise. + * @package + */ + selectChild(): boolean; + + /** + * @return {Blockly.tree.BaseNode} The last shown descendant. + * @protected + */ + getLastShownDescendant(): Blockly.tree.BaseNode; + + /** + * @return {Blockly.tree.BaseNode} The next node to show or null if there isn't + * a next node to show. + * @protected + */ + getNextShownNode(): Blockly.tree.BaseNode; + + /** + * @return {Blockly.tree.BaseNode} The previous node to show. + * @protected + */ + getPreviousShownNode(): Blockly.tree.BaseNode; + + /** + * @return {!Blockly.tree.BaseNode.Config} The configuration for the tree. + * @protected + */ + getConfig(): Blockly.tree.BaseNode.Config; + + /** + * Internal method that is used to set the tree control on the node. + * @param {Blockly.tree.TreeControl} tree The tree control. + * @protected + */ + setTreeInternal(tree: Blockly.tree.TreeControl): void; + } + +} + +declare module Blockly.tree.BaseNode { + + /** + * The config type for the tree. + * @typedef {{ + * indentWidth:number, + * cssRoot:string, + * cssHideRoot:string, + * cssTreeRow:string, + * cssItemLabel:string, + * cssTreeIcon:string, + * cssExpandedFolderIcon:string, + * cssCollapsedFolderIcon:string, + * cssFileIcon:string, + * cssSelectedRow:string + * }} + */ + interface Config { + indentWidth: number; + cssRoot: string; + cssHideRoot: string; + cssTreeRow: string; + cssItemLabel: string; + cssTreeIcon: string; + cssExpandedFolderIcon: string; + cssCollapsedFolderIcon: string; + cssFileIcon: string; + cssSelectedRow: string + } + + /** + * Map of nodes in existence. Needed to route events to the appropriate nodes. + * Nodes are added to the map at {@link #enterDocument} time and removed at + * {@link #exitDocument} time. + * @type {Object} + * @protected + */ + var allNodes: Object; +} + + +declare module Blockly.tree { + + class TreeControl extends TreeControl__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class TreeControl__Class extends Blockly.tree.BaseNode__Class { + + /** + * An extension of the TreeControl object in closure that provides + * a way to view a hierarchical set of data. + * Similar to Closure's goog.ui.tree.TreeControl + * + * @param {Blockly.Toolbox} toolbox The parent toolbox for this tree. + * @param {!Blockly.tree.BaseNode.Config} config The configuration for the tree. + * @constructor + * @extends {Blockly.tree.BaseNode} + */ + constructor(toolbox: Blockly.Toolbox, config: Blockly.tree.BaseNode.Config); + + /** + * Returns the associated toolbox. + * @return {Blockly.Toolbox} The toolbox. + * @package + */ + getToolbox(): Blockly.Toolbox; + + /** + * Get whether this tree has focus or not. + * @return {boolean} True if it has focus. + * @package + */ + hasFocus(): boolean; + + /** + * Sets the selected item. + * @param {Blockly.tree.BaseNode} node The item to select. + * @package + */ + setSelectedItem(node: Blockly.tree.BaseNode): void; + + /** + * Set the handler that's triggered before a node is selected. + * @param {function(Blockly.tree.BaseNode):boolean} fn The handler + * @package + */ + onBeforeSelected(fn: { (_0: Blockly.tree.BaseNode): boolean }): void; + + /** + * Set the handler that's triggered after a node is selected. + * @param {function( + * Blockly.tree.BaseNode, Blockly.tree.BaseNode):?} fn The handler + * @package + */ + onAfterSelected(fn: { (_0: Blockly.tree.BaseNode, _1: Blockly.tree.BaseNode): any }): void; + + /** + * Returns the selected item. + * @return {Blockly.tree.BaseNode} The currently selected item. + * @package + */ + getSelectedItem(): Blockly.tree.BaseNode; + + /** + * Creates a new tree node using the same config as the root. + * @param {string=} opt_content The content of the node label. + * @return {!Blockly.tree.TreeNode} The new item. + * @package + */ + createNode(opt_content?: string): Blockly.tree.TreeNode; + } + +} + + +declare module Blockly.tree { + + class TreeNode extends TreeNode__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class TreeNode__Class extends Blockly.tree.BaseNode__Class { + + /** + * A single node in the tree, customized for Blockly's UI. + * Similar to Closure's goog.ui.tree.TreeNode + * + * @param {Blockly.Toolbox} toolbox The parent toolbox for this tree. + * @param {string} content The content of the node label treated as + * plain-text and will be HTML escaped. + * @param {!Blockly.tree.BaseNode.Config} config The configuration for the tree. + * @constructor + * @extends {Blockly.tree.BaseNode} + */ + constructor(toolbox: Blockly.Toolbox, content: string, config: Blockly.tree.BaseNode.Config); + + /** + * Set the handler that's triggered when the size of node has changed. + * @param {function():?} fn The handler + * @package + */ + onSizeChanged(fn: { (): any }): void; + } + +} + + +declare module Blockly { + + class Menu extends Menu__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Menu__Class extends Blockly.Component__Class { + + /** + * A basic menu class. + * @constructor + * @extends {Blockly.Component} + */ + constructor(); + + /** + * Coordinates of the mousedown event that caused this menu to open. Used to + * prevent the consequent mouseup event due to a simple click from activating + * a menu item immediately. + * @type {?Blockly.utils.Coordinate} + * @package + */ + openingCoords: Blockly.utils.Coordinate; + + /** + * Focus the menu element. + * @package + */ + focus(): void; + + /** + * Blur the menu element. + * @package + */ + blur(): void; + + /** + * Set the menu accessibility role. + * @param {!Blockly.utils.aria.Role} roleName role name. + * @package + */ + setRole(roleName: Blockly.utils.aria.Role): void; + + /** + * Returns the child menuitem that owns the given DOM node, or null if no such + * menuitem is found. + * @param {Node} node DOM node whose owner is to be returned. + * @return {?Blockly.MenuItem} menuitem for which the DOM node belongs to. + * @protected + */ + getMenuItem(node: Node): Blockly.MenuItem; + + /** + * Unhighlight the current highlighted item. + * @protected + */ + unhighlightCurrent(): void; + + /** + * Clears the currently highlighted item. + * @protected + */ + clearHighlighted(): void; + + /** + * Returns the currently highlighted item (if any). + * @return {?Blockly.Component} Highlighted item (null if none). + * @protected + */ + getHighlighted(): Blockly.Component; + + /** + * Highlights the item at the given 0-based index (if any). If another item + * was previously highlighted, it is un-highlighted. + * @param {number} index Index of item to highlight (-1 removes the current + * highlight). + * @protected + */ + setHighlightedIndex(index: number): void; + + /** + * Highlights the given item if it exists and is a child of the container; + * otherwise un-highlights the currently highlighted item. + * @param {Blockly.MenuItem} item Item to highlight. + * @protected + */ + setHighlighted(item: Blockly.MenuItem): void; + + /** + * Highlights the next highlightable item (or the first if nothing is currently + * highlighted). + * @package + */ + highlightNext(): void; + + /** + * Highlights the previous highlightable item (or the last if nothing is + * currently highlighted). + * @package + */ + highlightPrevious(): void; + + /** + * Helper function that manages the details of moving the highlight among + * child menuitems in response to keyboard events. + * @param {function(this: Blockly.Component, number, number) : number} fn + * Function that accepts the current and maximum indices, and returns the + * next index to check. + * @param {number} startIndex Start index. + * @return {boolean} Whether the highlight has changed. + * @protected + */ + highlightHelper(fn: { (_0: number, _1: number): number }, startIndex: number): boolean; + + /** + * Returns whether the given item can be highlighted. + * @param {Blockly.MenuItem} item The item to check. + * @return {boolean} Whether the item can be highlighted. + * @protected + */ + canHighlightItem(item: Blockly.MenuItem): boolean; + + /** + * Attempts to handle a keyboard event, if the menuitem is enabled, by calling + * {@link handleKeyEventInternal}. Considered protected; should only be used + * within this package and by subclasses. + * @param {Event} e Key event to handle. + * @return {boolean} Whether the key event was handled. + * @protected + */ + handleKeyEvent(e: Event): boolean; + + /** + * Attempts to handle a keyboard event; returns true if the event was handled, + * false otherwise. If the container is enabled, and a child is highlighted, + * calls the child menuitem's `handleKeyEvent` method to give the menuitem + * a chance to handle the event first. + * @param {Event} e Key event to handle. + * @return {boolean} Whether the event was handled by the container (or one of + * its children). + * @protected + */ + handleKeyEventInternal(e: Event): boolean; + } + +} + + +declare module Blockly { + + class MenuItem extends MenuItem__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class MenuItem__Class extends Blockly.Component__Class { + + /** + * Class representing an item in a menu. + * + * @param {string} content Text caption to display as the content of + * the item. + * @param {string=} opt_value Data/model associated with the menu item. + * @constructor + * @extends {Blockly.Component} + */ + constructor(content: string, opt_value?: string); + + /** + * @return {Element} The HTML element for the checkbox. + * @protected + */ + getCheckboxDom(): Element; + + /** + * @return {!Element} The HTML for the content. + * @protected + */ + getContentDom(): Element; + + /** + * @return {!Element} The HTML for the content wrapper. + * @protected + */ + getContentWrapperDom(): Element; + + /** + * Sets the content associated with the menu item. + * @param {string} content Text caption to set as the + * menuitem's contents. + * @protected + */ + setContentInternal(content: string): void; + + /** + * Sets the value associated with the menu item. + * @param {*} value Value to be associated with the menu item. + * @package + */ + setValue(value: any): void; + + /** + * Gets the value associated with the menu item. + * @return {*} value Value associated with the menu item. + * @package + */ + getValue(): any; + + /** + * Set the menu accessibility role. + * @param {!Blockly.utils.aria.Role} roleName Role name. + * @package + */ + setRole(roleName: Blockly.utils.aria.Role): void; + + /** + * Sets the menu item to be checkable or not. Set to true for menu items + * that represent checkable options. + * @param {boolean} checkable Whether the menu item is checkable. + * @package + */ + setCheckable(checkable: boolean): void; + + /** + * Checks or unchecks the component. + * @param {boolean} checked Whether to check or uncheck the component. + * @package + */ + setChecked(checked: boolean): void; + + /** + * Highlights or unhighlights the component. + * @param {boolean} highlight Whether to highlight or unhighlight the component. + * @package + */ + setHighlighted(highlight: boolean): void; + + /** + * Returns true if the menu item is enabled, false otherwise. + * @return {boolean} Whether the menu item is enabled. + * @package + */ + isEnabled(): boolean; + + /** + * Enables or disables the menu item. + * @param {boolean} enabled Whether to enable or disable the menu item. + * @package + */ + setEnabled(enabled: boolean): void; + + /** + * Handles click events. If the component is enabled, trigger + * the action associated with this menu item. + * @param {Event} _e Mouse event to handle. + * @package + */ + handleClick(_e: Event): void; + + /** + * Performs the appropriate action when the menu item is activated + * by the user. + * @protected + */ + performActionInternal(): void; + + /** + * Set the handler that's triggered when the menu item is activated + * by the user. If `opt_obj` is provided, it will be used as the + * 'this' object in the function when called. + * @param {function(this:T,!Blockly.MenuItem):?} fn The handler. + * @param {T=} opt_obj Used as the 'this' object in f when called. + * @template T + * @package + */ + onAction(fn: { (_0: Blockly.MenuItem): any }, opt_obj?: T): void; + } + +} + + +declare module Blockly.blockRendering { + + /** + * Whether or not the debugger is turned on. + * @type {boolean} + * @package + */ + var useDebugger: boolean; + + /** + * Registers a new renderer. + * @param {string} name The name of the renderer. + * @param {!Function} rendererClass The new renderer class + * to register. + * @throws {Error} if a renderer with the same name has already been registered. + */ + function register(name: string, rendererClass: Function): void; + + /** + * Unregisters the renderer registered with the given name. + * @param {string} name The name of the renderer. + */ + function unregister(name: string): void; + + /** + * Turn on the blocks debugger. + * @package + */ + function startDebugger(): void; + + /** + * Turn off the blocks debugger. + * @package + */ + function stopDebugger(): void; + + /** + * Initialize anything needed for rendering (constants, etc). + * @param {!string} name Name of the renderer to initialize. + * @return {!Blockly.blockRendering.Renderer} The new instance of a renderer. + * Already initialized. + * @package + */ + function init(name: string): Blockly.blockRendering.Renderer; +} + + +declare module Blockly.blockRendering { + + class ConstantProvider extends ConstantProvider__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class ConstantProvider__Class { + + /** + * An object that provides constants for rendering blocks. + * @constructor + * @package + */ + constructor(); + + /** + * The size of an empty spacer. + * @type {number} + */ + NO_PADDING: number; + + /** + * The size of small padding. + * @type {number} + */ + SMALL_PADDING: number; + + /** + * The size of medium padding. + * @type {number} + */ + MEDIUM_PADDING: number; + + /** + * The size of medium-large padding. + * @type {number} + */ + MEDIUM_LARGE_PADDING: number; + + /** + * The size of large padding. + * @type {number} + */ + LARGE_PADDING: number; + + /** + * Offset from the top of the row for placing fields on inline input rows + * and statement input rows. + * Matches existing rendering (in 2019). + * @type {number} + */ + TALL_INPUT_FIELD_OFFSET_Y: number; + + /** + * The height of the puzzle tab used for input and output connections. + * @type {number} + */ + TAB_HEIGHT: number; + + /** + * The offset from the top of the block at which a puzzle tab is positioned. + * @type {number} + */ + TAB_OFFSET_FROM_TOP: number; + + /** + * Vertical overlap of the puzzle tab, used to make it look more like a puzzle + * piece. + * @type {number} + */ + TAB_VERTICAL_OVERLAP: number; + + /** + * The width of the puzzle tab used for input and output connections. + * @type {number} + */ + TAB_WIDTH: number; + + /** + * The width of the notch used for previous and next connections. + * @type {number} + */ + NOTCH_WIDTH: number; + + /** + * The height of the notch used for previous and next connections. + * @type {number} + */ + NOTCH_HEIGHT: number; + + /** + * The minimum width of the block. + * @type {number} + */ + MIN_BLOCK_WIDTH: number; + + /** + * The minimum height of a dummy input row. + * @type {number} + */ + DUMMY_INPUT_MIN_HEIGHT: number; + + /** + * The minimum height of a dummy input row in a shadow block. + * @type {number} + */ + DUMMY_INPUT_SHADOW_MIN_HEIGHT: number; + + /** + * Rounded corner radius. + * @type {number} + */ + CORNER_RADIUS: number; + + /** + * Offset from the left side of a block or the inside of a statement input to + * the left side of the notch. + * @type {number} + */ + NOTCH_OFFSET_LEFT: number; + + /** + * Additional offset added to the statement input's width to account for the + * notch. + * @type {number} + */ + STATEMENT_INPUT_NOTCH_OFFSET: number; + + /** + * Vertical padding between consecutive statement inputs. + * @type {number} + */ + BETWEEN_STATEMENT_PADDING_Y: number; + + /** + * The top row's minimum height. + * @type {number} + */ + TOP_ROW_MIN_HEIGHT: number; + + /** + * The top row's minimum height if it precedes a statement. + * @type {number} + */ + TOP_ROW_PRECEDES_STATEMENT_MIN_HEIGHT: number; + + /** + * The bottom row's minimum height. + * @type {number} + */ + BOTTOM_ROW_MIN_HEIGHT: number; + + /** + * The bottom row's minimum height if it follows a statement input. + * @type {number} + */ + BOTTOM_ROW_AFTER_STATEMENT_MIN_HEIGHT: number; + + /** + * Whether to add a 'hat' on top of all blocks with no previous or output + * connections. Can be overridden by 'hat' property on Theme.BlockStyle. + * @type {boolean} + */ + ADD_START_HATS: boolean; + + /** + * Height of the top hat. + * @type {number} + */ + START_HAT_HEIGHT: number; + + /** + * Width of the top hat. + * @type {number} + */ + START_HAT_WIDTH: number; + + /** + * The height of an empty inline input. + * @type {number} + */ + EMPTY_INLINE_INPUT_HEIGHT: number; + + /** + * The height of an empty statement input. Note that in the old rendering this + * varies slightly depending on whether the block has external or inline inputs. + * In the new rendering this is consistent. It seems unlikely that the old + * behaviour was intentional. + * @type {number} + */ + EMPTY_STATEMENT_INPUT_HEIGHT: number; + + /** + * Height of SVG path for jagged teeth at the end of collapsed blocks. + * @type {number} + */ + JAGGED_TEETH_HEIGHT: number; + + /** + * Width of SVG path for jagged teeth at the end of collapsed blocks. + * @type {number} + */ + JAGGED_TEETH_WIDTH: number; + + /** + * Point size of text. + * @type {number} + */ + FIELD_TEXT_FONTSIZE: number; + + /** + * Height of text. + * @type {number} + */ + FIELD_TEXT_HEIGHT: number; + + /** + * Text font weight. + * @type {string} + */ + FIELD_TEXT_FONTWEIGHT: string; + + /** + * Text font family. + * @type {string} + */ + FIELD_TEXT_FONTFAMILY: string; + + /** + * A field's border rect corner radius. + * @type {number} + */ + FIELD_BORDER_RECT_RADIUS: number; + + /** + * A field's border rect default height. + * @type {number} + */ + FIELD_BORDER_RECT_HEIGHT: number; + + /** + * A field's border rect X padding. + * @type {number} + */ + FIELD_BORDER_RECT_X_PADDING: number; + + /** + * A field's border rect Y padding. + * @type {number} + */ + FIELD_BORDER_RECT_Y_PADDING: number; + + /** + * The backing colour of a field's border rect. + * @type {string} + * @package + */ + FIELD_BORDER_RECT_COLOUR: string; + + /** + * Field text baseline. + * This is only used if `FIELD_TEXT_BASELINE_CENTER` is false. + * @type {number} + */ + FIELD_TEXT_BASELINE_Y: number; + + /** + * An text offset adjusting the Y position of text after positioning. + * @type {number} + */ + FIELD_TEXT_Y_OFFSET: number; + + /** + * A field's text element's dominant baseline. + * @type {boolean} + */ + FIELD_TEXT_BASELINE_CENTER: boolean; + + /** + * A dropdown field's border rect height. + * @type {number} + */ + FIELD_DROPDOWN_BORDER_RECT_HEIGHT: number; + + /** + * Whether or not a dropdown field should add a border rect when in a shadow + * block. + * @type {boolean} + */ + FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW: boolean; + + /** + * Whether or not a dropdown field's div should be coloured to match the + * block colours. + * @type {boolean} + */ + FIELD_DROPDOWN_COLOURED_DIV: boolean; + + /** + * Whether or not a dropdown field uses a text or SVG arrow. + * @type {boolean} + */ + FIELD_DROPDOWN_SVG_ARROW: boolean; + + /** + * A dropdown field's SVG arrow padding. + * @type {number} + */ + FIELD_DROPDOWN_SVG_ARROW_PADDING: number; + + /** + * A dropdown field's SVG arrow size. + * @type {number} + */ + FIELD_DROPDOWN_SVG_ARROW_SIZE: number; + + /** + * A dropdown field's SVG arrow datauri. + * @type {string} + */ + FIELD_DROPDOWN_SVG_ARROW_DATAURI: string; + + /** + * Whether or not to show a box shadow around the widget div. This is only a + * feature of full block fields. + * @type {boolean} + */ + FIELD_TEXTINPUT_BOX_SHADOW: boolean; + + /** + * Whether or not the colour field should display its colour value on the + * entire block. + * @type {boolean} + */ + FIELD_COLOUR_FULL_BLOCK: boolean; + + /** + * A colour field's default width. + * @type {number} + */ + FIELD_COLOUR_DEFAULT_WIDTH: number; + + /** + * A colour field's default height. + * @type {number} + */ + FIELD_COLOUR_DEFAULT_HEIGHT: number; + + /** + * A checkbox field's X offset. + * @type {number} + */ + FIELD_CHECKBOX_X_OFFSET: number; + + /** + * A checkbox field's Y offset. + * @type {number} + */ + FIELD_CHECKBOX_Y_OFFSET: number; + + /** + * A checkbox field's default width. + * @type {number} + */ + FIELD_CHECKBOX_DEFAULT_WIDTH: number; + + /** + * A random identifier used to ensure a unique ID is used for each + * filter/pattern for the case of multiple Blockly instances on a page. + * @type {string} + * @protected + */ + randomIdentifier_: string; + + /** + * The ID of the emboss filter, or the empty string if no filter is set. + * @type {string} + * @package + */ + embossFilterId: string; + + /** + * The ID of the disabled pattern, or the empty string if no pattern is set. + * @type {string} + * @package + */ + disabledPatternId: string; + + /** + * Cursor colour. + * @type {string} + * @package + */ + CURSOR_COLOUR: string; + + /** + * Immovable marker colour. + * @type {string} + * @package + */ + MARKER_COLOUR: string; + + /** + * Width of the horizontal cursor. + * @type {number} + * @package + */ + CURSOR_WS_WIDTH: number; + + /** + * Height of the horizontal cursor. + * @type {number} + * @package + */ + WS_CURSOR_HEIGHT: number; + + /** + * Padding around a stack. + * @type {number} + * @package + */ + CURSOR_STACK_PADDING: number; + + /** + * Padding around a block. + * @type {number} + * @package + */ + CURSOR_BLOCK_PADDING: number; + + /** + * Stroke of the cursor. + * @type {number} + * @package + */ + CURSOR_STROKE_WIDTH: number; + + /** + * Whether text input and colour fields fill up the entire source block. + * @type {boolean} + * @package + */ + FULL_BLOCK_FIELDS: boolean; + + /** + * Enum for connection shapes. + * @enum {number} + */ + SHAPES: any /*missing*/; + + /** + * Initialize shape objects based on the constants set in the constructor. + * @package + */ + init(): void; + + /** + * An object containing sizing and path information about collapsed block + * indicators. + * @type {!Object} + */ + JAGGED_TEETH: Object; + + /** + * An object containing sizing and path information about notches. + * @type {!Object} + */ + NOTCH: Object; + + /** + * An object containing sizing and path information about start hats + * @type {!Object} + */ + START_HAT: Object; + + /** + * An object containing sizing and path information about puzzle tabs. + * @type {!Object} + */ + PUZZLE_TAB: Object; + + /** + * An object containing sizing and path information about inside corners + * @type {!Object} + */ + INSIDE_CORNERS: Object; + + /** + * An object containing sizing and path information about outside corners. + * @type {!Object} + */ + OUTSIDE_CORNERS: Object; + + /** + * Refresh constants properties that depend on the theme. + * @param {!Blockly.Theme} theme The current workspace theme. + * @package + */ + refreshTheme(theme: Blockly.Theme): void; + + /** + * The block styles map. + * @type {Object.} + * @package + */ + blockStyles: { [key: string]: Blockly.Theme.BlockStyle }; + + /** + * Get or create a block style based on a single colour value. Generate a name + * for the style based on the colour. + * @param {string} colour #RRGGBB colour string. + * @return {{style: !Blockly.Theme.BlockStyle, name: string}} An object + * containing the style and an autogenerated name for that style. + * @package + */ + getBlockStyleForColour(colour: string): { style: Blockly.Theme.BlockStyle; name: string }; + + /** + * Gets the BlockStyle for the given block style name. + * @param {?string} blockStyleName The name of the block style. + * @return {!Blockly.Theme.BlockStyle} The named block style, or a default style + * if no style with the given name was found. + */ + getBlockStyle(blockStyleName: string): Blockly.Theme.BlockStyle; + + /** + * Create a block style object based on the given colour. + * @param {string} colour #RRGGBB colour string. + * @return {!Blockly.Theme.BlockStyle} A populated block style based on the + * given colour. + * @protected + */ + createBlockStyle_(colour: string): Blockly.Theme.BlockStyle; + + /** + * Get a full block style object based on the input style object. Populate + * any missing values. + * @param {{ + * colourPrimary:string, + * colourSecondary:(string|undefined), + * colourTertiary:(string|undefined), + * hat:(string|undefined) + * }} blockStyle A full or partial block style object. + + * @return {!Blockly.Theme.BlockStyle} A full block style object, with all + * required properties populated. + * @protected + */ + validatedBlockStyle_(blockStyle: { colourPrimary: string; colourSecondary: string|any /*undefined*/; colourTertiary: string|any /*undefined*/; hat: string|any /*undefined*/ }): Blockly.Theme.BlockStyle; + + /** + * Generate a secondary colour from the passed in primary colour. + * @param {string} colour Primary colour. + * @return {string} The generated secondary colour. + * @protected + */ + generateSecondaryColour_(colour: string): string; + + /** + * Generate a tertiary colour from the passed in primary colour. + * @param {string} colour Primary colour. + * @return {string} The generated tertiary colour. + * @protected + */ + generateTertiaryColour_(colour: string): string; + + /** + * Dispose of this constants provider. + * Delete all DOM elements that this provider created. + * @package + */ + dispose(): void; + + /** + * @return {!Object} An object containing sizing and path information about + * collapsed block indicators. + * @package + */ + makeJaggedTeeth(): Object; + + /** + * @return {!Object} An object containing sizing and path information about + * start hats. + * @package + */ + makeStartHat(): Object; + + /** + * @return {!Object} An object containing sizing and path information about + * puzzle tabs. + * @package + */ + makePuzzleTab(): Object; + + /** + * @return {!Object} An object containing sizing and path information about + * notches. + * @package + */ + makeNotch(): Object; + + /** + * @return {!Object} An object containing sizing and path information about + * inside corners. + * @package + */ + makeInsideCorners(): Object; + + /** + * @return {!Object} An object containing sizing and path information about + * outside corners. + * @package + */ + makeOutsideCorners(): Object; + + /** + * Get an object with connection shape and sizing information based on the type + * of the connection. + * @param {!Blockly.RenderedConnection} connection The connection to find a + * shape object for + * @return {!Object} The shape object for the connection. + * @package + */ + shapeFor(connection: Blockly.RenderedConnection): Object; + + /** + * Create any DOM elements that this renderer needs (filters, patterns, etc). + * @param {!SVGElement} svg The root of the workspace's SVG. + * @package + */ + createDom(svg: SVGElement): void; + + /** + * Inject renderer specific CSS into the page. + * @param {string} name Name of the renderer. + * @package + */ + injectCSS(name: string): void; + + /** + * Get any renderer specific CSS to inject when the renderer is initialized. + * @param {string} name Name of the renderer. + * @return {!Array.} Array of CSS strings. + * @protected + */ + getCSS_(name: string): string[]; + } + +} + + +declare module Blockly.blockRendering { + + class Debug extends Debug__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Debug__Class { + + /** + * An object that renders rectangles and dots for debugging rendering code. + * @package + * @constructor + */ + constructor(); + + /** + * Remove all elements the this object created on the last pass. + * @package + */ + clearElems(): void; + + /** + * Draw a debug rectangle for a spacer (empty) row. + * @param {!Blockly.blockRendering.Row} row The row to render. + * @param {number} cursorY The y position of the top of the row. + * @param {boolean} isRtl Whether the block is rendered RTL. + * @package + */ + drawSpacerRow(row: Blockly.blockRendering.Row, cursorY: number, isRtl: boolean): void; + + /** + * Draw a debug rectangle for a horizontal spacer. + * @param {!Blockly.blockRendering.InRowSpacer} elem The spacer to render. + * @param {number} rowHeight The height of the container row. + * @param {boolean} isRtl Whether the block is rendered RTL. + * @package + */ + drawSpacerElem(elem: Blockly.blockRendering.InRowSpacer, rowHeight: number, isRtl: boolean): void; + + /** + * Draw a debug rectangle for an in-row element. + * @param {!Blockly.blockRendering.Measurable} elem The element to render. + * @param {boolean} isRtl Whether the block is rendered RTL. + * @package + */ + drawRenderedElem(elem: Blockly.blockRendering.Measurable, isRtl: boolean): void; + + /** + * Draw a circle at the location of the given connection. Inputs and outputs + * share the same colours, as do previous and next. When positioned correctly + * a connected pair will look like a bullseye. + * @param {Blockly.RenderedConnection} conn The connection to circle. + * @suppress {visibility} Suppress visibility of conn.offsetInBlock_ since this + * is a debug module. + * @package + */ + drawConnection(conn: Blockly.RenderedConnection): void; + + /** + * Draw a debug rectangle for a non-empty row. + * @param {!Blockly.blockRendering.Row} row The non-empty row to render. + * @param {number} cursorY The y position of the top of the row. + * @param {boolean} isRtl Whether the block is rendered RTL. + * @package + */ + drawRenderedRow(row: Blockly.blockRendering.Row, cursorY: number, isRtl: boolean): void; + + /** + * Draw debug rectangles for a non-empty row and all of its subcomponents. + * @param {!Blockly.blockRendering.Row} row The non-empty row to render. + * @param {number} cursorY The y position of the top of the row. + * @param {boolean} isRtl Whether the block is rendered RTL. + * @package + */ + drawRowWithElements(row: Blockly.blockRendering.Row, cursorY: number, isRtl: boolean): void; + + /** + * Draw a debug rectangle around the entire block. + * @param {!Blockly.blockRendering.RenderInfo} info Rendering information about + * the block to debug. + * @package + */ + drawBoundingBox(info: Blockly.blockRendering.RenderInfo): void; + + /** + * Do all of the work to draw debug information for the whole block. + * @param {!Blockly.BlockSvg} block The block to draw debug information for. + * @param {!Blockly.blockRendering.RenderInfo} info Rendering information about + * the block to debug. + * @package + */ + drawDebug(block: Blockly.BlockSvg, info: Blockly.blockRendering.RenderInfo): void; + } + +} + +declare module Blockly.blockRendering.Debug { + + /** + * Configuration object containing booleans to enable and disable debug + * rendering of specific rendering components. + * @type {!Object.} + */ + var config: { [key: string]: boolean }; +} + + +declare module Blockly.blockRendering { + + class Drawer extends Drawer__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Drawer__Class { + + /** + * An object that draws a block based on the given rendering information. + * @param {!Blockly.BlockSvg} block The block to render. + * @param {!Blockly.blockRendering.RenderInfo} info An object containing all + * information needed to render this block. + * @package + * @constructor + */ + constructor(block: Blockly.BlockSvg, info: Blockly.blockRendering.RenderInfo); + + /** + * The renderer's constant provider. + * @type {!Blockly.blockRendering.ConstantProvider} + * @protected + */ + constants_: Blockly.blockRendering.ConstantProvider; + + /** + * Draw the block to the workspace. Here "drawing" means setting SVG path + * elements and moving fields, icons, and connections on the screen. + * + * The pieces of the paths are pushed into arrays of "steps", which are then + * joined with spaces and set directly on the block. This guarantees that + * the steps are separated by spaces for improved readability, but isn't + * required. + * @package + */ + draw(): void; + + /** + * Save sizing information back to the block + * Most of the rendering information can be thrown away at the end of the + * render. Anything that needs to be kept around should be set in this function. + * @protected + */ + recordSizeOnBlock_(): void; + + /** + * Hide icons that were marked as hidden. + * @protected + */ + hideHiddenIcons_(): void; + + /** + * Create the outline of the block. This is a single continuous path. + * @protected + */ + drawOutline_(): void; + + /** + * Add steps for the top corner of the block, taking into account + * details such as hats and rounded corners. + * @protected + */ + drawTop_(): void; + + /** + * Add steps for the jagged edge of a row on a collapsed block. + * @param {!Blockly.blockRendering.Row} row The row to draw the side of. + * @protected + */ + drawJaggedEdge_(row: Blockly.blockRendering.Row): void; + + /** + * Add steps for an external value input, rendered as a notch in the side + * of the block. + * @param {!Blockly.blockRendering.Row} row The row that this input + * belongs to. + * @protected + */ + drawValueInput_(row: Blockly.blockRendering.Row): void; + + /** + * Add steps for a statement input. + * @param {!Blockly.blockRendering.Row} row The row that this input + * belongs to. + * @protected + */ + drawStatementInput_(row: Blockly.blockRendering.Row): void; + + /** + * Add steps for the right side of a row that does not have value or + * statement input connections. + * @param {!Blockly.blockRendering.Row} row The row to draw the + * side of. + * @protected + */ + drawRightSideRow_(row: Blockly.blockRendering.Row): void; + + /** + * Add steps for the bottom edge of a block, possibly including a notch + * for the next connection + * @protected + */ + drawBottom_(): void; + + /** + * Add steps for the left side of the block, which may include an output + * connection + * @protected + */ + drawLeft_(): void; + + /** + * Draw the internals of the block: inline inputs, fields, and icons. These do + * not depend on the outer path for placement. + * @protected + */ + drawInternals_(): void; + + /** + * Push a field or icon's new position to its SVG root. + * @param {!Blockly.blockRendering.Icon|!Blockly.blockRendering.Field} fieldInfo + * The rendering information for the field or icon. + * @protected + */ + layoutField_(fieldInfo: Blockly.blockRendering.Icon|Blockly.blockRendering.Field): void; + + /** + * Add steps for an inline input. + * @param {!Blockly.blockRendering.InlineInput} input The information about the + * input to render. + * @protected + */ + drawInlineInput_(input: Blockly.blockRendering.InlineInput): void; + + /** + * Position the connection on an inline value input, taking into account + * RTL and the small gap between the parent block and child block which lets the + * parent block's dark path show through. + * @param {Blockly.blockRendering.InlineInput} input The information about + * the input that the connection is on. + * @protected + */ + positionInlineInputConnection_(input: Blockly.blockRendering.InlineInput): void; + + /** + * Position the connection on a statement input, taking into account + * RTL and the small gap between the parent block and child block which lets the + * parent block's dark path show through. + * @param {!Blockly.blockRendering.Row} row The row that the connection is on. + * @protected + */ + positionStatementInputConnection_(row: Blockly.blockRendering.Row): void; + + /** + * Position the connection on an external value input, taking into account + * RTL and the small gap between the parent block and child block which lets the + * parent block's dark path show through. + * @param {!Blockly.blockRendering.Row} row The row that the connection is on. + * @protected + */ + positionExternalValueConnection_(row: Blockly.blockRendering.Row): void; + + /** + * Position the previous connection on a block. + * @protected + */ + positionPreviousConnection_(): void; + + /** + * Position the next connection on a block. + * @protected + */ + positionNextConnection_(): void; + + /** + * Position the output connection on a block. + * @protected + */ + positionOutputConnection_(): void; + } + +} + + +declare module Blockly.blockRendering { + + interface IPathObject { + + /** + * Set the path generated by the renderer onto the respective SVG element. + * @param {string} pathString The path. + * @package + */ + setPath(pathString: string): void; + + /** + * Apply the stored colours to the block's path, taking into account whether + * the paths belong to a shadow block. + * @param {!Blockly.Block} block The source block. + * @package + */ + applyColour(block: Blockly.Block): void; + + /** + * Update the style. + * @param {!Blockly.Theme.BlockStyle} blockStyle The block style to use. + * @package + */ + setStyle(blockStyle: Blockly.Theme.BlockStyle): void; + + /** + * Flip the SVG paths in RTL. + * @package + */ + flipRTL: any /*missing*/; + + /** + * Add the cursor svg to this block's svg group. + * @param {SVGElement} cursorSvg The svg root of the cursor to be added to the + * block svg group. + * @package + */ + setCursorSvg(cursorSvg: SVGElement): void; + + /** + * Add the marker svg to this block's svg group. + * @param {SVGElement} markerSvg The svg root of the marker to be added to the + * block svg group. + * @package + */ + setMarkerSvg(markerSvg: SVGElement): void; + + /** + * Set whether the block shows a highlight or not. Block highlighting is + * often used to visually mark blocks currently being executed. + * @param {boolean} highlighted True if highlighted. + * @package + */ + updateHighlighted(highlighted: boolean): void; + + /** + * Add or remove styling showing that a block is selected. + * @param {boolean} enable True if selection is enabled, false otherwise. + * @package + */ + updateSelected(enable: boolean): void; + + /** + * Add or remove styling showing that a block is dragged over a delete area. + * @param {boolean} enable True if the block is being dragged over a delete + * area, false otherwise. + * @package + */ + updateDraggingDelete(enable: boolean): void; + + /** + * Add or remove styling showing that a block is an insertion marker. + * @param {boolean} enable True if the block is an insertion marker, false + * otherwise. + * @package + */ + updateInsertionMarker(enable: boolean): void; + + /** + * Add or remove styling showing that a block is movable. + * @param {boolean} enable True if the block is movable, false otherwise. + * @package + */ + updateMovable(enable: boolean): void; + + /** + * Add or remove styling that shows that if the dragging block is dropped, this + * block will be replaced. If a shadow block, it will disappear. Otherwise it + * will bump. + * @param {boolean} enable True if styling should be added. + * @package + */ + updateReplacementHighlight(enable: boolean): void; + } +} + + +declare module Blockly.blockRendering { + + class RenderInfo extends RenderInfo__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class RenderInfo__Class { + + /** + * An object containing all sizing information needed to draw this block. + * + * This measure pass does not propagate changes to the block (although fields + * may choose to rerender when getSize() is called). However, calling it + * repeatedly may be expensive. + * + * @param {!Blockly.blockRendering.Renderer} renderer The renderer in use. + * @param {!Blockly.BlockSvg} block The block to measure. + * @constructor + * @package + */ + constructor(renderer: Blockly.blockRendering.Renderer, block: Blockly.BlockSvg); + + /** + * The block renderer in use. + * @type {!Blockly.blockRendering.Renderer} + * @protected + */ + renderer_: Blockly.blockRendering.Renderer; + + /** + * The renderer's constant provider. + * @type {!Blockly.blockRendering.ConstantProvider} + * @protected + */ + constants_: Blockly.blockRendering.ConstantProvider; + + /** + * A measurable representing the output connection if the block has one. + * Otherwise null. + * @type {Blockly.blockRendering.OutputConnection} + */ + outputConnection: Blockly.blockRendering.OutputConnection; + + /** + * Whether the block should be rendered as a single line, either because it's + * inline or because it has been collapsed. + * @type {boolean} + */ + isInline: boolean; + + /** + * Whether the block is collapsed. + * @type {boolean} + */ + isCollapsed: boolean; + + /** + * Whether the block is an insertion marker. Insertion markers are the same + * shape as normal blocks, but don't show fields. + * @type {boolean} + */ + isInsertionMarker: boolean; + + /** + * True if the block should be rendered right-to-left. + * @type {boolean} + */ + RTL: boolean; + + /** + * The height of the rendered block, including child blocks. + * @type {number} + */ + height: number; + + /** + * The width of the rendered block, including child blocks. + * @type {number} + */ + widthWithChildren: number; + + /** + * The width of the rendered block, excluding child blocks. This is the right + * edge of the block when rendered LTR. + * @type {number} + */ + width: number; + + /** + * + * @type {number} + */ + statementEdge: number; + + /** + * An array of Row objects containing sizing information. + * @type {!Array.} + */ + rows: Blockly.blockRendering.Row[]; + + /** + * The total number of input rows added onto the block. + * @type {number} + * @protected + */ + inputRowNum_: number; + + /** + * An array of measurable objects containing hidden icons. + * @type {!Array.} + */ + hiddenIcons: Blockly.blockRendering.Icon[]; + + /** + * An object with rendering information about the top row of the block. + * @type {!Blockly.blockRendering.TopRow} + */ + topRow: Blockly.blockRendering.TopRow; + + /** + * An object with rendering information about the bottom row of the block. + * @type {!Blockly.blockRendering.BottomRow} + */ + bottomRow: Blockly.blockRendering.BottomRow; + + /** + * Get the block renderer in use. + * @return {!Blockly.blockRendering.Renderer} The block renderer in use. + * @package + */ + getRenderer(): Blockly.blockRendering.Renderer; + + /** + * Populate and return an object containing all sizing information needed to + * draw this block. + * + * This measure pass does not propagate changes to the block (although fields + * may choose to rerender when getSize() is called). However, calling it + * repeatedly may be expensive. + * + * @package + */ + measure(): void; + + /** + * Create rows of Measurable objects representing all renderable parts of the + * block. + * @protected + */ + createRows_(): void; + + /** + * Create all non-spacer elements that belong on the top row. + * @package + */ + populateTopRow_(): void; + + /** + * Create all non-spacer elements that belong on the bottom row. + * @package + */ + populateBottomRow_(): void; + + /** + * Add an input element to the active row, if needed, and record the type of the + * input on the row. + * @param {!Blockly.Input} input The input to record information about. + * @param {!Blockly.blockRendering.Row} activeRow The row that is currently being + * populated. + * @protected + */ + addInput_(input: Blockly.Input, activeRow: Blockly.blockRendering.Row): void; + + /** + * Decide whether to start a new row between the two Blockly.Inputs. + * @param {!Blockly.Input} input The first input to consider + * @param {Blockly.Input} lastInput The input that follows. + * @return {boolean} True if the next input should be rendered on a new row. + * @protected + */ + shouldStartNewRow_(input: Blockly.Input, lastInput: Blockly.Input): boolean; + + /** + * Add horizontal spacing between and around elements within each row. + * @protected + */ + addElemSpacing_(): void; + + /** + * Calculate the width of a spacer element in a row based on the previous and + * next elements in that row. For instance, extra padding is added between two + * editable fields. + * @param {Blockly.blockRendering.Measurable} prev The element before the + * spacer. + * @param {Blockly.blockRendering.Measurable} next The element after the spacer. + * @return {number} The size of the spacing between the two elements. + * @protected + */ + getInRowSpacing_(prev: Blockly.blockRendering.Measurable, next: Blockly.blockRendering.Measurable): number; + + /** + * Figure out where the right edge of the block and right edge of statement inputs + * should be placed. + * @protected + */ + computeBounds_(): void; + + /** + * Extra spacing may be necessary to make sure that the right sides of all + * rows line up. This can only be calculated after a first pass to calculate + * the sizes of all rows. + * @protected + */ + alignRowElements_(): void; + + /** + * Calculate the desired width of an input row. + * @param {!Blockly.blockRendering.Row} _row The input row. + * @return {number} The desired width of the input row. + * @protected + */ + getDesiredRowWidth_(_row: Blockly.blockRendering.Row): number; + + /** + * Modify the given row to add the given amount of padding around its fields. + * The exact location of the padding is based on the alignment property of the + * last input in the field. + * @param {Blockly.blockRendering.Row} row The row to add padding to. + * @param {number} missingSpace How much padding to add. + * @protected + */ + addAlignmentPadding_(row: Blockly.blockRendering.Row, missingSpace: number): void; + + /** + * Align the elements of a statement row based on computed bounds. + * Unlike other types of rows, statement rows add space in multiple places. + * @param {!Blockly.blockRendering.InputRow} row The statement row to resize. + * @protected + */ + alignStatementRow_(row: Blockly.blockRendering.InputRow): void; + + /** + * Add spacers between rows and set their sizes. + * @protected + */ + addRowSpacing_(): void; + + /** + * Create a spacer row to go between prev and next, and set its size. + * @param {!Blockly.blockRendering.Row} prev The previous row. + * @param {!Blockly.blockRendering.Row} next The next row. + * @return {!Blockly.blockRendering.SpacerRow} The newly created spacer row. + * @protected + */ + makeSpacerRow_(prev: Blockly.blockRendering.Row, next: Blockly.blockRendering.Row): Blockly.blockRendering.SpacerRow; + + /** + * Calculate the width of a spacer row. + * @param {!Blockly.blockRendering.Row} _prev The row before the spacer. + * @param {!Blockly.blockRendering.Row} _next The row after the spacer. + * @return {number} The desired width of the spacer row between these two rows. + * @protected + */ + getSpacerRowWidth_(_prev: Blockly.blockRendering.Row, _next: Blockly.blockRendering.Row): number; + + /** + * Calculate the height of a spacer row. + * @param {!Blockly.blockRendering.Row} _prev The row before the spacer. + * @param {!Blockly.blockRendering.Row} _next The row after the spacer. + * @return {number} The desired height of the spacer row between these two rows. + * @protected + */ + getSpacerRowHeight_(_prev: Blockly.blockRendering.Row, _next: Blockly.blockRendering.Row): number; + + /** + * Calculate the centerline of an element in a rendered row. + * This base implementation puts the centerline at the middle of the row + * vertically, with no special cases. You will likely need extra logic to + * handle (at minimum) top and bottom rows. + * @param {!Blockly.blockRendering.Row} row The row containing the element. + * @param {!Blockly.blockRendering.Measurable} elem The element to place. + * @return {number} The desired centerline of the given element, as an offset + * from the top left of the block. + * @protected + */ + getElemCenterline_(row: Blockly.blockRendering.Row, elem: Blockly.blockRendering.Measurable): number; + + /** + * Record final position information on elements on the given row, for use in + * drawing. At minimum this records xPos and centerline on each element. + * @param {!Blockly.blockRendering.Row} row The row containing the elements. + * @protected + */ + recordElemPositions_(row: Blockly.blockRendering.Row): void; + + /** + * Make any final changes to the rendering information object. In particular, + * store the y position of each row, and record the height of the full block. + * @protected + */ + finalize_(): void; + } + +} + + +declare module Blockly.blockRendering { + + class MarkerSvg extends MarkerSvg__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class MarkerSvg__Class { + + /** + * Class for a marker. + * @param {!Blockly.WorkspaceSvg} workspace The workspace the marker belongs to. + * @param {!Blockly.blockRendering.ConstantProvider} constants The constants for + * the renderer. + * @param {!Blockly.Marker} marker The marker to draw. + * @constructor + */ + constructor(workspace: Blockly.WorkspaceSvg, constants: Blockly.blockRendering.ConstantProvider, marker: Blockly.Marker); + + /** + * The constants necessary to draw the marker. + * @type {Blockly.blockRendering.ConstantProvider} + * @protected + */ + constants_: Blockly.blockRendering.ConstantProvider; + + /** + * The current SVG element for the marker. + * @type {Element} + */ + currentMarkerSvg: Element; + + /** + * The colour of the marker. + * @type {string} + */ + colour_: string; + + /** + * Return the root node of the SVG or null if none exists. + * @return {SVGElement} The root SVG node. + */ + getSvgRoot(): SVGElement; + + /** + * True if the marker should be drawn as a cursor, false otherwise. + * A cursor is drawn as a flashing line. A marker is drawn as a solid line. + * @return {boolean} True if the marker is a cursor, false otherwise. + */ + isCursor(): boolean; + + /** + * Create the DOM element for the marker. + * @return {!SVGElement} The marker controls SVG group. + * @package + */ + createDom(): SVGElement; + + /** + * Attaches the SVG root of the marker to the SVG group of the parent. + * @param {!Blockly.WorkspaceSvg|!Blockly.Field|!Blockly.BlockSvg} newParent + * The workspace, field, or block that the marker SVG element should be + * attached to. + * @protected + */ + setParent_(newParent: Blockly.WorkspaceSvg|Blockly.Field|Blockly.BlockSvg): void; + + /** + * Show the marker as a combination of the previous connection and block, + * the output connection and block, or just the block. + * @param {Blockly.BlockSvg} block The block the marker is currently on. + * @protected + */ + showWithBlockPrevOutput_(block: Blockly.BlockSvg): void; + + /** + * Show the visual representation of a workspace coordinate. + * This is a horizontal line. + * @param {!Blockly.ASTNode} curNode The node that we want to draw the marker for. + * @protected + */ + showWithCoordinates_(curNode: Blockly.ASTNode): void; + + /** + * Show the visual representation of a field. + * This is a box around the field. + * @param {!Blockly.ASTNode} curNode The node that we want to draw the marker for. + * @protected + */ + showWithField_(curNode: Blockly.ASTNode): void; + + /** + * Show the visual representation of an input. + * This is a puzzle piece. + * @param {!Blockly.ASTNode} curNode The node that we want to draw the marker for. + * @protected + */ + showWithInput_(curNode: Blockly.ASTNode): void; + + /** + * Show the visual representation of a next connection. + * This is a horizontal line. + * @param {!Blockly.ASTNode} curNode The node that we want to draw the marker for. + * @protected + */ + showWithNext_(curNode: Blockly.ASTNode): void; + + /** + * Show the visual representation of a stack. + * This is a box with extra padding around the entire stack of blocks. + * @param {!Blockly.ASTNode} curNode The node that we want to draw the marker for. + * @protected + */ + showWithStack_(curNode: Blockly.ASTNode): void; + + /** + * Show the current marker. + * @protected + */ + showCurrent_(): void; + + /** + * Move and show the marker at the specified coordinate in workspace units. + * Displays a horizontal line. + * @param {number} x The new x, in workspace units. + * @param {number} y The new y, in workspace units. + * @param {number} width The new width, in workspace units. + * @protected + */ + positionLine_(x: number, y: number, width: number): void; + + /** + * Move and show the marker at the specified coordinate in workspace units. + * Displays a filled in rectangle. + * @param {number} x The new x, in workspace units. + * @param {number} y The new y, in workspace units. + * @param {number} width The new width, in workspace units. + * @param {number} height The new height, in workspace units. + * @protected + */ + positionRect_(x: number, y: number, width: number, height: number): void; + + /** + * Hide the marker. + * @package + */ + hide(): void; + + /** + * Update the marker. + * @param {Blockly.ASTNode} oldNode The previous node the marker was on or null. + * @param {Blockly.ASTNode} curNode The node that we want to draw the marker for. + * @package + */ + draw(oldNode: Blockly.ASTNode, curNode: Blockly.ASTNode): void; + + /** + * Update the marker's visible state based on the type of curNode.. + * @param {Blockly.ASTNode} curNode The node that we want to draw the marker for. + * @protected + */ + showAtLocation_(curNode: Blockly.ASTNode): void; + + /** + * Get the properties to make a marker blink. + * @return {!Object} The object holding attributes to make the marker blink. + * @protected + */ + getBlinkProperties_(): Object; + + /** + * Create the marker SVG. + * @return {Element} The SVG node created. + * @protected + */ + createDomInternal_(): Element; + + /** + * Dispose of this marker. + * @package + */ + dispose(): void; + } + +} + +declare module Blockly.blockRendering.MarkerSvg { + + /** + * The name of the CSS class for a cursor. + * @const {string} + */ + var CURSOR_CLASS: any /*missing*/; + + /** + * The name of the CSS class for a marker. + * @const {string} + */ + var MARKER_CLASS: any /*missing*/; + + /** + * What we multiply the height by to get the height of the marker. + * Only used for the block and block connections. + * @type {number} + * @const + */ + var HEIGHT_MULTIPLIER: number; +} + + +declare module Blockly.blockRendering { + + class PathObject extends PathObject__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class PathObject__Class implements Blockly.blockRendering.IPathObject { + + /** + * An object that handles creating and setting each of the SVG elements + * used by the renderer. + * @param {!SVGElement} root The root SVG element. + * @param {!Blockly.Theme.BlockStyle} style The style object to use for + * colouring. + * @param {!Blockly.blockRendering.ConstantProvider} constants The renderer's + * constants. + * @constructor + * @implements {Blockly.blockRendering.IPathObject} + * @package + */ + constructor(root: SVGElement, style: Blockly.Theme.BlockStyle, constants: Blockly.blockRendering.ConstantProvider); + + /** + * The renderer's constant provider. + * @type {!Blockly.blockRendering.ConstantProvider} + * @protected + */ + constants_: Blockly.blockRendering.ConstantProvider; + + /** + * The primary path of the block. + * @type {SVGElement} + * @package + */ + svgPath: SVGElement; + + /** + * The style object to use when colouring block paths. + * @type {!Blockly.Theme.BlockStyle} + * @package + */ + style: Blockly.Theme.BlockStyle; + + /** + * Set the path generated by the renderer onto the respective SVG element. + * @param {string} pathString The path. + * @package + */ + setPath(pathString: string): void; + + /** + * Flip the SVG paths in RTL. + * @package + */ + flipRTL(): void; + + /** + * Add the cursor svg to this block's svg group. + * @param {SVGElement} cursorSvg The svg root of the cursor to be added to the + * block svg group. + * @package + */ + setCursorSvg(cursorSvg: SVGElement): void; + + /** + * Add the marker svg to this block's svg group. + * @param {SVGElement} markerSvg The svg root of the marker to be added to the + * block svg group. + * @package + */ + setMarkerSvg(markerSvg: SVGElement): void; + + /** + * Apply the stored colours to the block's path, taking into account whether + * the paths belong to a shadow block. + * @param {!Blockly.Block} block The source block. + * @package + */ + applyColour(block: Blockly.Block): void; + + /** + * Set the style. + * @param {!Blockly.Theme.BlockStyle} blockStyle The block style to use. + * @package + */ + setStyle(blockStyle: Blockly.Theme.BlockStyle): void; + + /** + * Add or remove the given CSS class on the path object's root SVG element. + * @param {string} className The name of the class to add or remove + * @param {boolean} add True if the class should be added. False if it should + * be removed. + * @protected + */ + setClass_(className: string, add: boolean): void; + + /** + * Set whether the block shows a highlight or not. Block highlighting is + * often used to visually mark blocks currently being executed. + * @param {boolean} enable True if highlighted. + * @package + */ + updateHighlighted(enable: boolean): void; + + /** + * Updates the look of the block to reflect a shadow state. + * @param {boolean} shadow True if the block is a shadow block. + * @protected + */ + updateShadow_(shadow: boolean): void; + + /** + * Updates the look of the block to reflect a disabled state. + * @param {boolean} disabled True if disabled. + * @protected + */ + updateDisabled_(disabled: boolean): void; + + /** + * Add or remove styling showing that a block is selected. + * @param {boolean} enable True if selection is enabled, false otherwise. + * @package + */ + updateSelected(enable: boolean): void; + + /** + * Add or remove styling showing that a block is dragged over a delete area. + * @param {boolean} enable True if the block is being dragged over a delete + * area, false otherwise. + * @package + */ + updateDraggingDelete(enable: boolean): void; + + /** + * Add or remove styling showing that a block is an insertion marker. + * @param {boolean} enable True if the block is an insertion marker, false + * otherwise. + * @package + */ + updateInsertionMarker(enable: boolean): void; + + /** + * Add or remove styling showing that a block is movable. + * @param {boolean} enable True if the block is movable, false otherwise. + * @package + */ + updateMovable(enable: boolean): void; + + /** + * Add or remove styling that shows that if the dragging block is dropped, this + * block will be replaced. If a shadow block, it will disappear. Otherwise it + * will bump. + * @param {boolean} enable True if styling should be added. + * @package + */ + updateReplacementHighlight(enable: boolean): void; + + /** + * Add or remove styling that shows that if the dragging block is dropped, this + * block will be connected to the input. + * @param {Blockly.Connection} _conn The connection on the input to highlight. + * @param {boolean} _enable True if styling should be added. + * @package + */ + updateShapeForInputHighlight(_conn: Blockly.Connection, _enable: boolean): void; + } + +} + + +declare module Blockly.blockRendering { + + class Renderer extends Renderer__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Renderer__Class { + + /** + * The base class for a block renderer. + * @param {string} name The renderer name. + * @package + * @constructor + */ + constructor(name: string); + + /** + * The renderer name. + * @type {string} + * @package + */ + name: string; + + /** + * Initialize the renderer. + * @package + */ + init(): void; + + /** + * Create a new instance of the renderer's constant provider. + * @return {!Blockly.blockRendering.ConstantProvider} The constant provider. + * @protected + */ + makeConstants_(): Blockly.blockRendering.ConstantProvider; + + /** + * Create a new instance of the renderer's render info object. + * @param {!Blockly.BlockSvg} block The block to measure. + * @return {!Blockly.blockRendering.RenderInfo} The render info object. + * @protected + */ + makeRenderInfo_(block: Blockly.BlockSvg): Blockly.blockRendering.RenderInfo; + + /** + * Create a new instance of the renderer's drawer. + * @param {!Blockly.BlockSvg} block The block to render. + * @param {!Blockly.blockRendering.RenderInfo} info An object containing all + * information needed to render this block. + * @return {!Blockly.blockRendering.Drawer} The drawer. + * @protected + */ + makeDrawer_(block: Blockly.BlockSvg, info: Blockly.blockRendering.RenderInfo): Blockly.blockRendering.Drawer; + + /** + * Create a new instance of the renderer's debugger. + * @return {!Blockly.blockRendering.Debug} The renderer debugger. + * @suppress {strictModuleDepCheck} Debug renderer only included in playground. + * @protected + */ + makeDebugger_(): Blockly.blockRendering.Debug; + + /** + * Create a new instance of the renderer's marker drawer. + * @param {!Blockly.WorkspaceSvg} workspace The workspace the marker belongs to. + * @param {!Blockly.Marker} marker The marker. + * @return {!Blockly.blockRendering.MarkerSvg} The object in charge of drawing + * the marker. + * @package + */ + makeMarkerDrawer(workspace: Blockly.WorkspaceSvg, marker: Blockly.Marker): Blockly.blockRendering.MarkerSvg; + + /** + * Create a new instance of a renderer path object. + * @param {!SVGElement} root The root SVG element. + * @param {!Blockly.Theme.BlockStyle} style The style object to use for + * colouring. + * @return {!Blockly.blockRendering.IPathObject} The renderer path object. + * @package + */ + makePathObject(root: SVGElement, style: Blockly.Theme.BlockStyle): Blockly.blockRendering.IPathObject; + + /** + * Get the current renderer's constant provider. We assume that when this is + * called, the renderer has already been initialized. + * @return {!Blockly.blockRendering.ConstantProvider} The constant provider. + * @package + */ + getConstants(): Blockly.blockRendering.ConstantProvider; + + /** + * Determine whether or not to highlight a connection. + * @param {Blockly.Connection} _conn The connection to determine whether or not + * to highlight. + * @return {boolean} True if we should highlight the connection. + * @package + */ + shouldHighlightConnection(_conn: Blockly.Connection): boolean; + + /** + * Determine whether or not to insert a dragged block into a stack. + * @param {!Blockly.Block} block The target block. + * @param {!Blockly.Connection} conn The closest connection. + * @return {boolean} True if we should insert the dragged block into the stack. + * @package + */ + shouldInsertDraggedBlock(block: Blockly.Block, conn: Blockly.Connection): boolean; + + /** + * Render the block. + * @param {!Blockly.BlockSvg} block The block to render. + * @package + */ + render(block: Blockly.BlockSvg): void; + } + +} + + +declare module Blockly.blockRendering { + + class Measurable extends Measurable__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Measurable__Class { + + /** + * The base class to represent a part of a block that takes up space during + * rendering. The constructor for each non-spacer Measurable records the size + * of the block element (e.g. field, statement input). + * @param {!Blockly.blockRendering.ConstantProvider} constants The rendering + * constants provider. + * @package + * @constructor + */ + constructor(constants: Blockly.blockRendering.ConstantProvider); + + /** + * The renderer's constant provider. + * @type {!Blockly.blockRendering.ConstantProvider} + * @protected + */ + constants_: Blockly.blockRendering.ConstantProvider; + } + +} + + +declare module Blockly.blockRendering { + + class Connection extends Connection__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Connection__Class extends Blockly.blockRendering.Measurable__Class { + + /** + * The base class to represent a connection and the space that it takes up on + * the block. + * @param {!Blockly.blockRendering.ConstantProvider} constants The rendering + * constants provider. + * @param {!Blockly.RenderedConnection} connectionModel The connection object on + * the block that this represents. + * @package + * @constructor + * @extends {Blockly.blockRendering.Measurable} + */ + constructor(constants: Blockly.blockRendering.ConstantProvider, connectionModel: Blockly.RenderedConnection); + } + + + class OutputConnection extends OutputConnection__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class OutputConnection__Class extends Blockly.blockRendering.Connection__Class { + + /** + * An object containing information about the space an output connection takes + * up during rendering. + * @param {!Blockly.blockRendering.ConstantProvider} constants The rendering + * constants provider. + * @param {Blockly.RenderedConnection} connectionModel The connection object on + * the block that this represents. + * @package + * @constructor + * @extends {Blockly.blockRendering.Connection} + */ + constructor(constants: Blockly.blockRendering.ConstantProvider, connectionModel: Blockly.RenderedConnection); + } + + + class PreviousConnection extends PreviousConnection__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class PreviousConnection__Class extends Blockly.blockRendering.Connection__Class { + + /** + * An object containing information about the space a previous connection takes + * up during rendering. + * @param {!Blockly.blockRendering.ConstantProvider} constants The rendering + * constants provider. + * @param {Blockly.RenderedConnection} connectionModel The connection object on + * the block that this represents. + * @package + * @constructor + * @extends {Blockly.blockRendering.Connection} + */ + constructor(constants: Blockly.blockRendering.ConstantProvider, connectionModel: Blockly.RenderedConnection); + } + + + class NextConnection extends NextConnection__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class NextConnection__Class extends Blockly.blockRendering.Connection__Class { + + /** + * An object containing information about the space a next connection takes + * up during rendering. + * @param {!Blockly.blockRendering.ConstantProvider} constants The rendering + * constants provider. + * @param {Blockly.RenderedConnection} connectionModel The connection object on + * the block that this represents. + * @package + * @constructor + * @extends {Blockly.blockRendering.Connection} + */ + constructor(constants: Blockly.blockRendering.ConstantProvider, connectionModel: Blockly.RenderedConnection); + } + +} + + +declare module Blockly.blockRendering { + + class InputConnection extends InputConnection__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class InputConnection__Class extends Blockly.blockRendering.Connection__Class { + + /** + * The base class to represent an input that takes up space on a block + * during rendering + * @param {!Blockly.blockRendering.ConstantProvider} constants The rendering + * constants provider. + * @param {!Blockly.Input} input The input to measure and store information for. + * @package + * @constructor + * @extends {Blockly.blockRendering.Connection} + */ + constructor(constants: Blockly.blockRendering.ConstantProvider, input: Blockly.Input); + } + + + class InlineInput extends InlineInput__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class InlineInput__Class extends Blockly.blockRendering.InputConnection__Class { + + /** + * An object containing information about the space an inline input takes up + * during rendering + * @param {!Blockly.blockRendering.ConstantProvider} constants The rendering + * constants provider. + * @param {!Blockly.Input} input The inline input to measure and store + * information for. + * @package + * @constructor + * @extends {Blockly.blockRendering.InputConnection} + */ + constructor(constants: Blockly.blockRendering.ConstantProvider, input: Blockly.Input); + } + + + class StatementInput extends StatementInput__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class StatementInput__Class extends Blockly.blockRendering.InputConnection__Class { + + /** + * An object containing information about the space a statement input takes up + * during rendering + * @param {!Blockly.blockRendering.ConstantProvider} constants The rendering + * constants provider. + * @param {!Blockly.Input} input The statement input to measure and store + * information for. + * @package + * @constructor + * @extends {Blockly.blockRendering.InputConnection} + */ + constructor(constants: Blockly.blockRendering.ConstantProvider, input: Blockly.Input); + } + + + class ExternalValueInput extends ExternalValueInput__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class ExternalValueInput__Class extends Blockly.blockRendering.InputConnection__Class { + + /** + * An object containing information about the space an external value input + * takes up during rendering + * @param {!Blockly.blockRendering.ConstantProvider} constants The rendering + * constants provider. + * @param {!Blockly.Input} input The external value input to measure and store + * information for. + * @package + * @constructor + * @extends {Blockly.blockRendering.InputConnection} + */ + constructor(constants: Blockly.blockRendering.ConstantProvider, input: Blockly.Input); + } + +} + + +declare module Blockly.blockRendering { + + class Icon extends Icon__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Icon__Class extends Blockly.blockRendering.Measurable__Class { + + /** + * An object containing information about the space an icon takes up during + * rendering + * @param {!Blockly.blockRendering.ConstantProvider} constants The rendering + * constants provider. + * @param {!Blockly.Icon} icon The icon to measure and store information for. + * @package + * @constructor + * @extends {Blockly.blockRendering.Measurable} + */ + constructor(constants: Blockly.blockRendering.ConstantProvider, icon: Blockly.Icon); + } + + + class JaggedEdge extends JaggedEdge__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class JaggedEdge__Class extends Blockly.blockRendering.Measurable__Class { + + /** + * An object containing information about the jagged edge of a collapsed block + * takes up during rendering + * @param {!Blockly.blockRendering.ConstantProvider} constants The rendering + * constants provider. + * @package + * @constructor + * @extends {Blockly.blockRendering.Measurable} + */ + constructor(constants: Blockly.blockRendering.ConstantProvider); + } + + + class Field extends Field__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Field__Class extends Blockly.blockRendering.Measurable__Class { + + /** + * An object containing information about the space a field takes up during + * rendering + * @param {!Blockly.blockRendering.ConstantProvider} constants The rendering + * constants provider. + * @param {!Blockly.Field} field The field to measure and store information for. + * @param {!Blockly.Input} parentInput The parent input for the field. + * @package + * @constructor + * @extends {Blockly.blockRendering.Measurable} + */ + constructor(constants: Blockly.blockRendering.ConstantProvider, field: Blockly.Field, parentInput: Blockly.Input); + } + + + class Hat extends Hat__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Hat__Class extends Blockly.blockRendering.Measurable__Class { + + /** + * An object containing information about the space a hat takes up during + * rendering. + * @param {!Blockly.blockRendering.ConstantProvider} constants The rendering + * constants provider. + * @package + * @constructor + * @extends {Blockly.blockRendering.Measurable} + */ + constructor(constants: Blockly.blockRendering.ConstantProvider); + } + + + class SquareCorner extends SquareCorner__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class SquareCorner__Class extends Blockly.blockRendering.Measurable__Class { + + /** + * An object containing information about the space a square corner takes up + * during rendering. + * @param {!Blockly.blockRendering.ConstantProvider} constants The rendering + * constants provider. + * @param {string=} opt_position The position of this corner. + * @package + * @constructor + * @extends {Blockly.blockRendering.Measurable} + */ + constructor(constants: Blockly.blockRendering.ConstantProvider, opt_position?: string); + } + + + class RoundCorner extends RoundCorner__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class RoundCorner__Class extends Blockly.blockRendering.Measurable__Class { + + /** + * An object containing information about the space a rounded corner takes up + * during rendering. + * @param {!Blockly.blockRendering.ConstantProvider} constants The rendering + * constants provider. + * @param {string=} opt_position The position of this corner. + * @package + * @constructor + * @extends {Blockly.blockRendering.Measurable} + */ + constructor(constants: Blockly.blockRendering.ConstantProvider, opt_position?: string); + } + + + class InRowSpacer extends InRowSpacer__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class InRowSpacer__Class extends Blockly.blockRendering.Measurable__Class { + + /** + * An object containing information about a spacer between two elements on a + * row. + * @param {!Blockly.blockRendering.ConstantProvider} constants The rendering + * constants provider. + * @param {number} width The width of the spacer. + * @package + * @constructor + * @extends {Blockly.blockRendering.Measurable} + */ + constructor(constants: Blockly.blockRendering.ConstantProvider, width: number); + } + +} + + +declare module Blockly.blockRendering { + + class Row extends Row__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class Row__Class { + + /** + * An object representing a single row on a rendered block and all of its + * subcomponents. + * @param {!Blockly.blockRendering.ConstantProvider} constants The rendering + * constants provider. + * @package + * @constructor + */ + constructor(constants: Blockly.blockRendering.ConstantProvider); + + /** + * The type of this rendering object. + * @package + * @type {number} + */ + type: number; + + /** + * An array of elements contained in this row. + * @package + * @type {!Array.} + */ + elements: Blockly.blockRendering.Measurable[]; + + /** + * The height of the row. + * @package + * @type {number} + */ + height: number; + + /** + * The width of the row, from the left edge of the block to the right. + * Does not include child blocks unless they are inline. + * @package + * @type {number} + */ + width: number; + + /** + * The minimum height of the row. + * @package + * @type {number} + */ + minHeight: number; + + /** + * The minimum width of the row, from the left edge of the block to the right. + * Does not include child blocks unless they are inline. + * @package + * @type {number} + */ + minWidth: number; + + /** + * The width of the row, from the left edge of the block to the edge of the + * block or any connected child blocks. + * @package + * @type {number} + */ + widthWithConnectedBlocks: number; + + /** + * The Y position of the row relative to the origin of the block's svg group. + * @package + * @type {number} + */ + yPos: number; + + /** + * The X position of the row relative to the origin of the block's svg group. + * @package + * @type {number} + */ + xPos: number; + + /** + * Whether the row has any external inputs. + * @package + * @type {boolean} + */ + hasExternalInput: boolean; + + /** + * Whether the row has any statement inputs. + * @package + * @type {boolean} + */ + hasStatement: boolean; + + /** + * Whether the row has any inline inputs. + * @package + * @type {boolean} + */ + hasInlineInput: boolean; + + /** + * Whether the row has any dummy inputs. + * @package + * @type {boolean} + */ + hasDummyInput: boolean; + + /** + * Whether the row has a jagged edge. + * @package + * @type {boolean} + */ + hasJaggedEdge: boolean; + + /** + * The renderer's constant provider. + * @type {!Blockly.blockRendering.ConstantProvider} + * @protected + */ + constants_: Blockly.blockRendering.ConstantProvider; + + /** + * Alignment of the row. + * @package + * @type {?number} + */ + align: number; + + /** + * Inspect all subcomponents and populate all size properties on the row. + * @package + */ + measure(): void; + + /** + * Get the last input on this row, if it has one. + * @return {Blockly.blockRendering.InputConnection} The last input on the row, + * or null. + * @package + */ + getLastInput(): Blockly.blockRendering.InputConnection; + + /** + * Determines whether this row should start with an element spacer. + * @return {boolean} Whether the row should start with a spacer. + * @package + */ + startsWithElemSpacer(): boolean; + + /** + * Determines whether this row should end with an element spacer. + * @return {boolean} Whether the row should end with a spacer. + * @package + */ + endsWithElemSpacer(): boolean; + + /** + * Convenience method to get the first spacer element on this row. + * @return {Blockly.blockRendering.InRowSpacer} The first spacer element on + * this row. + * @package + */ + getFirstSpacer(): Blockly.blockRendering.InRowSpacer; + + /** + * Convenience method to get the last spacer element on this row. + * @return {Blockly.blockRendering.InRowSpacer} The last spacer element on + * this row. + * @package + */ + getLastSpacer(): Blockly.blockRendering.InRowSpacer; + } + + + class TopRow extends TopRow__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class TopRow__Class extends Blockly.blockRendering.Row__Class { + + /** + * An object containing information about what elements are in the top row of a + * block as well as sizing information for the top row. + * Elements in a top row can consist of corners, hats, spacers, and previous + * connections. + * After this constructor is called, the row will contain all non-spacer + * elements it needs. + * @param {!Blockly.blockRendering.ConstantProvider} constants The rendering + * constants provider. + * @package + * @constructor + * @extends {Blockly.blockRendering.Row} + */ + constructor(constants: Blockly.blockRendering.ConstantProvider); + + /** + * The starting point for drawing the row, in the y direction. + * This allows us to draw hats and similar shapes that don't start at the + * origin. Must be non-negative (see #2820). + * @package + * @type {number} + */ + capline: number; + + /** + * How much the row extends up above its capline. + * @type {number} + */ + ascenderHeight: number; + + /** + * Whether the block has a previous connection. + * @package + * @type {boolean} + */ + hasPreviousConnection: boolean; + + /** + * The previous connection on the block, if any. + * @type {Blockly.blockRendering.PreviousConnection} + */ + connection: Blockly.blockRendering.PreviousConnection; + + /** + * Returns whether or not the top row has a left square corner. + * @param {!Blockly.BlockSvg} block The block whose top row this represents. + * @return {boolean} Whether or not the top row has a left square corner. + */ + hasLeftSquareCorner(block: Blockly.BlockSvg): boolean; + + /** + * Returns whether or not the top row has a right square corner. + * @param {!Blockly.BlockSvg} _block The block whose top row this represents. + * @return {boolean} Whether or not the top row has a right square corner. + */ + hasRightSquareCorner(_block: Blockly.BlockSvg): boolean; + } + + + class BottomRow extends BottomRow__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class BottomRow__Class extends Blockly.blockRendering.Row__Class { + + /** + * An object containing information about what elements are in the bottom row of + * a block as well as spacing information for the top row. + * Elements in a bottom row can consist of corners, spacers and next + * connections. + * @param {!Blockly.blockRendering.ConstantProvider} constants The rendering + * constants provider. + * @package + * @constructor + * @extends {Blockly.blockRendering.Row} + */ + constructor(constants: Blockly.blockRendering.ConstantProvider); + + /** + * Whether this row has a next connection. + * @package + * @type {boolean} + */ + hasNextConnection: boolean; + + /** + * The next connection on the row, if any. + * @package + * @type {Blockly.blockRendering.NextConnection} + */ + connection: Blockly.blockRendering.NextConnection; + + /** + * The amount that the bottom of the block extends below the horizontal edge, + * e.g. because of a next connection. Must be non-negative (see #2820). + * @package + * @type {number} + */ + descenderHeight: number; + + /** + * The Y position of the bottom edge of the block, relative to the origin + * of the block rendering. + * @type {number} + */ + baseline: number; + + /** + * Returns whether or not the bottom row has a left square corner. + * @param {!Blockly.BlockSvg} block The block whose bottom row this represents. + * @return {boolean} Whether or not the bottom row has a left square corner. + */ + hasLeftSquareCorner(block: Blockly.BlockSvg): boolean; + + /** + * Returns whether or not the bottom row has a right square corner. + * @param {!Blockly.BlockSvg} _block The block whose bottom row this represents. + * @return {boolean} Whether or not the bottom row has a right square corner. + */ + hasRightSquareCorner(_block: Blockly.BlockSvg): boolean; + } + + + class SpacerRow extends SpacerRow__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class SpacerRow__Class extends Blockly.blockRendering.Row__Class { + + /** + * An object containing information about a spacer between two rows. + * @param {!Blockly.blockRendering.ConstantProvider} constants The rendering + * constants provider. + * @param {number} height The height of the spacer. + * @param {number} width The width of the spacer. + * @package + * @constructor + * @extends {Blockly.blockRendering.Row} + */ + constructor(constants: Blockly.blockRendering.ConstantProvider, height: number, width: number); + } + + + class InputRow extends InputRow__Class { } + /** Fake class which should be extended to avoid inheriting static properties */ + class InputRow__Class extends Blockly.blockRendering.Row__Class { + + /** + * An object containing information about a row that holds one or more inputs. + * @param {!Blockly.blockRendering.ConstantProvider} constants The rendering + * constants provider. + * @package + * @constructor + * @extends {Blockly.blockRendering.Row} + */ + constructor(constants: Blockly.blockRendering.ConstantProvider); + + /** + * The total width of all blocks connected to this row. + * @type {number} + * @package + */ + connectedBlockWidths: number; + + /** + * Inspect all subcomponents and populate all size properties on the row. + * @package + */ + measure(): void; + } + +} + + +declare module Blockly.blockRendering { + + /** + * Types of rendering elements. + * @enum {number} + */ + enum Types { NONE, FIELD, HAT, ICON, SPACER, BETWEEN_ROW_SPACER, IN_ROW_SPACER, EXTERNAL_VALUE_INPUT, INPUT, INLINE_INPUT, STATEMENT_INPUT, CONNECTION, PREVIOUS_CONNECTION, NEXT_CONNECTION, OUTPUT_CONNECTION, CORNER, LEFT_SQUARE_CORNER, LEFT_ROUND_CORNER, RIGHT_SQUARE_CORNER, RIGHT_ROUND_CORNER, JAGGED_EDGE, ROW, TOP_ROW, BOTTOM_ROW, INPUT_ROW } +} + +declare module Blockly.blockRendering.Types { + + /** + * A Left Corner Union Type. + * @type {number} + * @const + * @package + */ + var LEFT_CORNER: number; + + /** + * A Right Corner Union Type. + * @type {number} + * @const + * @package + */ + var RIGHT_CORNER: number; + + /** + * Get the enum flag value of an existing type or register a new type. + * @param {!string} type The name of the type. + * @return {!number} The enum flag value assosiated with that type. + * @package + */ + function getType(type: string): number; + + /** + * Whether a measurable stores information about a field. + * @param {!Blockly.blockRendering.Measurable} elem The element to check. + * @return {number} 1 if the object stores information about a field. + * @package + */ + function isField(elem: Blockly.blockRendering.Measurable): number; + + /** + * Whether a measurable stores information about a hat. + * @param {!Blockly.blockRendering.Measurable} elem The element to check. + * @return {number} 1 if the object stores information about a hat. + * @package + */ + function isHat(elem: Blockly.blockRendering.Measurable): number; + + /** + * Whether a measurable stores information about an icon. + * @param {!Blockly.blockRendering.Measurable} elem The element to check. + * @return {number} 1 if the object stores information about an icon. + * @package + */ + function isIcon(elem: Blockly.blockRendering.Measurable): number; + + /** + * Whether a measurable stores information about a spacer. + * @param {!Blockly.blockRendering.Measurable|!Blockly.blockRendering.Row} elem + * The element to check. + * @return {number} 1 if the object stores information about a spacer. + * @package + */ + function isSpacer(elem: Blockly.blockRendering.Measurable|Blockly.blockRendering.Row): number; + + /** + * Whether a measurable stores information about an in-row spacer. + * @param {!Blockly.blockRendering.Measurable} elem The element to check. + * @return {number} 1 if the object stores information about an + * in-row spacer. + * @package + */ + function isInRowSpacer(elem: Blockly.blockRendering.Measurable): number; + + /** + * Whether a measurable stores information about an input. + * @param {!Blockly.blockRendering.Measurable} elem The element to check. + * @return {number} 1 if the object stores information about an input. + * @package + */ + function isInput(elem: Blockly.blockRendering.Measurable): number; + + /** + * Whether a measurable stores information about an external input. + * @param {!Blockly.blockRendering.Measurable} elem The element to check. + * @return {number} 1 if the object stores information about an + * external input. + * @package + */ + function isExternalInput(elem: Blockly.blockRendering.Measurable): number; + + /** + * Whether a measurable stores information about an inline input. + * @param {!Blockly.blockRendering.Measurable} elem The element to check. + * @return {number} 1 if the object stores information about an + * inline input. + * @package + */ + function isInlineInput(elem: Blockly.blockRendering.Measurable): number; + + /** + * Whether a measurable stores information about a statement input. + * @param {!Blockly.blockRendering.Measurable} elem The element to check. + * @return {number} 1 if the object stores information about a + * statement input. + * @package + */ + function isStatementInput(elem: Blockly.blockRendering.Measurable): number; + + /** + * Whether a measurable stores information about a previous connection. + * @param {!Blockly.blockRendering.Measurable} elem The element to check. + * @return {number} 1 if the object stores information about a + * previous connection. + * @package + */ + function isPreviousConnection(elem: Blockly.blockRendering.Measurable): number; + + /** + * Whether a measurable stores information about a next connection. + * @param {!Blockly.blockRendering.Measurable} elem The element to check. + * @return {number} 1 if the object stores information about a + * next connection. + * @package + */ + function isNextConnection(elem: Blockly.blockRendering.Measurable): number; + + /** + * Whether a measurable stores information about a previous or next connection. + * @param {!Blockly.blockRendering.Measurable} elem The element to check. + * @return {number} 1 if the object stores information about a previous or + * next connection. + * @package + */ + function isPreviousOrNextConnection(elem: Blockly.blockRendering.Measurable): number; + + /** + * Whether a measurable stores information about a left round corner. + * @param {!Blockly.blockRendering.Measurable} elem The element to check. + * @return {number} 1 if the object stores information about a + * left round corner. + * @package + */ + function isLeftRoundedCorner(elem: Blockly.blockRendering.Measurable): number; + + /** + * Whether a measurable stores information about a right round corner. + * @param {!Blockly.blockRendering.Measurable} elem The element to check. + * @return {number} 1 if the object stores information about a + * right round corner. + * @package + */ + function isRightRoundedCorner(elem: Blockly.blockRendering.Measurable): number; + + /** + * Whether a measurable stores information about a left square corner. + * @param {!Blockly.blockRendering.Measurable} elem The element to check. + * @return {number} 1 if the object stores information about a + * left square corner. + * @package + */ + function isLeftSquareCorner(elem: Blockly.blockRendering.Measurable): number; + + /** + * Whether a measurable stores information about a right square corner. + * @param {!Blockly.blockRendering.Measurable} elem The element to check. + * @return {number} 1 if the object stores information about a + * right square corner. + * @package + */ + function isRightSquareCorner(elem: Blockly.blockRendering.Measurable): number; + + /** + * Whether a measurable stores information about a corner. + * @param {!Blockly.blockRendering.Measurable} elem The element to check. + * @return {number} 1 if the object stores information about a + * corner. + * @package + */ + function isCorner(elem: Blockly.blockRendering.Measurable): number; + + /** + * Whether a measurable stores information about a jagged edge. + * @param {!Blockly.blockRendering.Measurable} elem The element to check. + * @return {number} 1 if the object stores information about a jagged edge. + * @package + */ + function isJaggedEdge(elem: Blockly.blockRendering.Measurable): number; + + /** + * Whether a measurable stores information about a row. + * @param {!Blockly.blockRendering.Row} row The row to check. + * @return {number} 1 if the object stores information about a row. + * @package + */ + function isRow(row: Blockly.blockRendering.Row): number; + + /** + * Whether a measurable stores information about a between-row spacer. + * @param {!Blockly.blockRendering.Row} row The row to check. + * @return {number} 1 if the object stores information about a + * between-row spacer. + * @package + */ + function isBetweenRowSpacer(row: Blockly.blockRendering.Row): number; + + /** + * Whether a measurable stores information about a top row. + * @param {!Blockly.blockRendering.Row} row The row to check. + * @return {number} 1 if the object stores information about a top row. + * @package + */ + function isTopRow(row: Blockly.blockRendering.Row): number; + + /** + * Whether a measurable stores information about a bottom row. + * @param {!Blockly.blockRendering.Row} row The row to check. + * @return {number} 1 if the object stores information about a bottom row. + * @package + */ + function isBottomRow(row: Blockly.blockRendering.Row): number; + + /** + * Whether a measurable stores information about a top or bottom row. + * @param {!Blockly.blockRendering.Row} row The row to check. + * @return {number} 1 if the object stores information about a top or + * bottom row. + * @package + */ + function isTopOrBottomRow(row: Blockly.blockRendering.Row): number; + + /** + * Whether a measurable stores information about an input row. + * @param {!Blockly.blockRendering.Row} row The row to check. + * @return {number} 1 if the object stores information about an input row. + * @package + */ + function isInputRow(row: Blockly.blockRendering.Row): number; +} + + +declare module Blockly.Msg { + + /** @type {string} */ + var LOGIC_HUE: string; + + /** @type {string} */ + var LOOPS_HUE: string; + + /** @type {string} */ + var MATH_HUE: string; + + /** @type {string} */ + var TEXTS_HUE: string; + + /** @type {string} */ + var LISTS_HUE: string; + + /** @type {string} */ + var COLOUR_HUE: string; + + /** @type {string} */ + var VARIABLES_HUE: string; + + /** @type {string} */ + var VARIABLES_DYNAMIC_HUE: string; + + /** @type {string} */ + var PROCEDURES_HUE: string; + + /** @type {string} */ + var VARIABLES_DEFAULT_NAME: string; + + /** @type {string} */ + var UNNAMED_KEY: string; + + /** @type {string} */ + var TODAY: string; + + /** @type {string} */ + var DUPLICATE_BLOCK: string; + + /** @type {string} */ + var ADD_COMMENT: string; + + /** @type {string} */ + var REMOVE_COMMENT: string; + + /** @type {string} */ + var DUPLICATE_COMMENT: string; + + /** @type {string} */ + var EXTERNAL_INPUTS: string; + + /** @type {string} */ + var INLINE_INPUTS: string; + + /** @type {string} */ + var DELETE_BLOCK: string; + + /** @type {string} */ + var DELETE_X_BLOCKS: string; + + /** @type {string} */ + var DELETE_ALL_BLOCKS: string; + + /** @type {string} */ + var CLEAN_UP: string; + + /** @type {string} */ + var COLLAPSE_BLOCK: string; + + /** @type {string} */ + var COLLAPSE_ALL: string; + + /** @type {string} */ + var EXPAND_BLOCK: string; + + /** @type {string} */ + var EXPAND_ALL: string; + + /** @type {string} */ + var DISABLE_BLOCK: string; + + /** @type {string} */ + var ENABLE_BLOCK: string; + + /** @type {string} */ + var HELP: string; + + /** @type {string} */ + var UNDO: string; + + /** @type {string} */ + var REDO: string; + + /** @type {string} */ + var CHANGE_VALUE_TITLE: string; + + /** @type {string} */ + var RENAME_VARIABLE: string; + + /** @type {string} */ + var RENAME_VARIABLE_TITLE: string; + + /** @type {string} */ + var NEW_VARIABLE: string; + + /** @type {string} */ + var NEW_STRING_VARIABLE: string; + + /** @type {string} */ + var NEW_NUMBER_VARIABLE: string; + + /** @type {string} */ + var NEW_COLOUR_VARIABLE: string; + + /** @type {string} */ + var NEW_VARIABLE_TYPE_TITLE: string; + + /** @type {string} */ + var NEW_VARIABLE_TITLE: string; + + /** @type {string} */ + var VARIABLE_ALREADY_EXISTS: string; + + /** @type {string} */ + var VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE: string; + + /** @type {string} */ + var DELETE_VARIABLE_CONFIRMATION: string; + + /** @type {string} */ + var CANNOT_DELETE_VARIABLE_PROCEDURE: string; + + /** @type {string} */ + var DELETE_VARIABLE: string; + + /** @type {string} */ + var COLOUR_PICKER_HELPURL: string; + + /** @type {string} */ + var COLOUR_PICKER_TOOLTIP: string; + + /** @type {string} */ + var COLOUR_RANDOM_HELPURL: string; + + /** @type {string} */ + var COLOUR_RANDOM_TITLE: string; + + /** @type {string} */ + var COLOUR_RANDOM_TOOLTIP: string; + + /** @type {string} */ + var COLOUR_RGB_HELPURL: string; + + /** @type {string} */ + var COLOUR_RGB_TITLE: string; + + /** @type {string} */ + var COLOUR_RGB_RED: string; + + /** @type {string} */ + var COLOUR_RGB_GREEN: string; + + /** @type {string} */ + var COLOUR_RGB_BLUE: string; + + /** @type {string} */ + var COLOUR_RGB_TOOLTIP: string; + + /** @type {string} */ + var COLOUR_BLEND_HELPURL: string; + + /** @type {string} */ + var COLOUR_BLEND_TITLE: string; + + /** @type {string} */ + var COLOUR_BLEND_COLOUR1: string; + + /** @type {string} */ + var COLOUR_BLEND_COLOUR2: string; + + /** @type {string} */ + var COLOUR_BLEND_RATIO: string; + + /** @type {string} */ + var COLOUR_BLEND_TOOLTIP: string; + + /** @type {string} */ + var CONTROLS_REPEAT_HELPURL: string; + + /** @type {string} */ + var CONTROLS_REPEAT_TITLE: string; + + /** @type {string} */ + var CONTROLS_REPEAT_INPUT_DO: string; + + /** @type {string} */ + var CONTROLS_REPEAT_TOOLTIP: string; + + /** @type {string} */ + var CONTROLS_WHILEUNTIL_HELPURL: string; + + /** @type {string} */ + var CONTROLS_WHILEUNTIL_INPUT_DO: string; + + /** @type {string} */ + var CONTROLS_WHILEUNTIL_OPERATOR_WHILE: string; + + /** @type {string} */ + var CONTROLS_WHILEUNTIL_OPERATOR_UNTIL: string; + + /** @type {string} */ + var CONTROLS_WHILEUNTIL_TOOLTIP_WHILE: string; + + /** @type {string} */ + var CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL: string; + + /** @type {string} */ + var CONTROLS_FOR_HELPURL: string; + + /** @type {string} */ + var CONTROLS_FOR_TOOLTIP: string; + + /** @type {string} */ + var CONTROLS_FOR_TITLE: string; + + /** @type {string} */ + var CONTROLS_FOR_INPUT_DO: string; + + /** @type {string} */ + var CONTROLS_FOREACH_HELPURL: string; + + /** @type {string} */ + var CONTROLS_FOREACH_TITLE: string; + + /** @type {string} */ + var CONTROLS_FOREACH_INPUT_DO: string; + + /** @type {string} */ + var CONTROLS_FOREACH_TOOLTIP: string; + + /** @type {string} */ + var CONTROLS_FLOW_STATEMENTS_HELPURL: string; + + /** @type {string} */ + var CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK: string; + + /** @type {string} */ + var CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE: string; + + /** @type {string} */ + var CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK: string; + + /** @type {string} */ + var CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE: string; + + /** @type {string} */ + var CONTROLS_FLOW_STATEMENTS_WARNING: string; + + /** @type {string} */ + var CONTROLS_IF_HELPURL: string; + + /** @type {string} */ + var CONTROLS_IF_TOOLTIP_1: string; + + /** @type {string} */ + var CONTROLS_IF_TOOLTIP_2: string; + + /** @type {string} */ + var CONTROLS_IF_TOOLTIP_3: string; + + /** @type {string} */ + var CONTROLS_IF_TOOLTIP_4: string; + + /** @type {string} */ + var CONTROLS_IF_MSG_IF: string; + + /** @type {string} */ + var CONTROLS_IF_MSG_ELSEIF: string; + + /** @type {string} */ + var CONTROLS_IF_MSG_ELSE: string; + + /** @type {string} */ + var CONTROLS_IF_MSG_THEN: string; + + /** @type {string} */ + var CONTROLS_IF_IF_TITLE_IF: string; + + /** @type {string} */ + var CONTROLS_IF_IF_TOOLTIP: string; + + /** @type {string} */ + var CONTROLS_IF_ELSEIF_TITLE_ELSEIF: string; + + /** @type {string} */ + var CONTROLS_IF_ELSEIF_TOOLTIP: string; + + /** @type {string} */ + var CONTROLS_IF_ELSE_TITLE_ELSE: string; + + /** @type {string} */ + var CONTROLS_IF_ELSE_TOOLTIP: string; + + /** @type {string} */ + var IOS_OK: string; + + /** @type {string} */ + var IOS_CANCEL: string; + + /** @type {string} */ + var IOS_ERROR: string; + + /** @type {string} */ + var IOS_PROCEDURES_INPUTS: string; + + /** @type {string} */ + var IOS_PROCEDURES_ADD_INPUT: string; + + /** @type {string} */ + var IOS_PROCEDURES_ALLOW_STATEMENTS: string; + + /** @type {string} */ + var IOS_PROCEDURES_DUPLICATE_INPUTS_ERROR: string; + + /** @type {string} */ + var IOS_VARIABLES_ADD_VARIABLE: string; + + /** @type {string} */ + var IOS_VARIABLES_ADD_BUTTON: string; + + /** @type {string} */ + var IOS_VARIABLES_RENAME_BUTTON: string; + + /** @type {string} */ + var IOS_VARIABLES_DELETE_BUTTON: string; + + /** @type {string} */ + var IOS_VARIABLES_VARIABLE_NAME: string; + + /** @type {string} */ + var IOS_VARIABLES_EMPTY_NAME_ERROR: string; + + /** @type {string} */ + var LOGIC_COMPARE_HELPURL: string; + + /** @type {string} */ + var LOGIC_COMPARE_TOOLTIP_EQ: string; + + /** @type {string} */ + var LOGIC_COMPARE_TOOLTIP_NEQ: string; + + /** @type {string} */ + var LOGIC_COMPARE_TOOLTIP_LT: string; + + /** @type {string} */ + var LOGIC_COMPARE_TOOLTIP_LTE: string; + + /** @type {string} */ + var LOGIC_COMPARE_TOOLTIP_GT: string; + + /** @type {string} */ + var LOGIC_COMPARE_TOOLTIP_GTE: string; + + /** @type {string} */ + var LOGIC_OPERATION_HELPURL: string; + + /** @type {string} */ + var LOGIC_OPERATION_TOOLTIP_AND: string; + + /** @type {string} */ + var LOGIC_OPERATION_AND: string; + + /** @type {string} */ + var LOGIC_OPERATION_TOOLTIP_OR: string; + + /** @type {string} */ + var LOGIC_OPERATION_OR: string; + + /** @type {string} */ + var LOGIC_NEGATE_HELPURL: string; + + /** @type {string} */ + var LOGIC_NEGATE_TITLE: string; + + /** @type {string} */ + var LOGIC_NEGATE_TOOLTIP: string; + + /** @type {string} */ + var LOGIC_BOOLEAN_HELPURL: string; + + /** @type {string} */ + var LOGIC_BOOLEAN_TRUE: string; + + /** @type {string} */ + var LOGIC_BOOLEAN_FALSE: string; + + /** @type {string} */ + var LOGIC_BOOLEAN_TOOLTIP: string; + + /** @type {string} */ + var LOGIC_NULL_HELPURL: string; + + /** @type {string} */ + var LOGIC_NULL: string; + + /** @type {string} */ + var LOGIC_NULL_TOOLTIP: string; + + /** @type {string} */ + var LOGIC_TERNARY_HELPURL: string; + + /** @type {string} */ + var LOGIC_TERNARY_CONDITION: string; + + /** @type {string} */ + var LOGIC_TERNARY_IF_TRUE: string; + + /** @type {string} */ + var LOGIC_TERNARY_IF_FALSE: string; + + /** @type {string} */ + var LOGIC_TERNARY_TOOLTIP: string; + + /** @type {string} */ + var MATH_NUMBER_HELPURL: string; + + /** @type {string} */ + var MATH_NUMBER_TOOLTIP: string; + + /** @type {string} */ + var MATH_ADDITION_SYMBOL: string; + + /** @type {string} */ + var MATH_SUBTRACTION_SYMBOL: string; + + /** @type {string} */ + var MATH_DIVISION_SYMBOL: string; + + /** @type {string} */ + var MATH_MULTIPLICATION_SYMBOL: string; + + /** @type {string} */ + var MATH_POWER_SYMBOL: string; + + /** @type {string} */ + var MATH_TRIG_SIN: string; + + /** @type {string} */ + var MATH_TRIG_COS: string; + + /** @type {string} */ + var MATH_TRIG_TAN: string; + + /** @type {string} */ + var MATH_TRIG_ASIN: string; + + /** @type {string} */ + var MATH_TRIG_ACOS: string; + + /** @type {string} */ + var MATH_TRIG_ATAN: string; + + /** @type {string} */ + var MATH_ARITHMETIC_HELPURL: string; + + /** @type {string} */ + var MATH_ARITHMETIC_TOOLTIP_ADD: string; + + /** @type {string} */ + var MATH_ARITHMETIC_TOOLTIP_MINUS: string; + + /** @type {string} */ + var MATH_ARITHMETIC_TOOLTIP_MULTIPLY: string; + + /** @type {string} */ + var MATH_ARITHMETIC_TOOLTIP_DIVIDE: string; + + /** @type {string} */ + var MATH_ARITHMETIC_TOOLTIP_POWER: string; + + /** @type {string} */ + var MATH_SINGLE_HELPURL: string; + + /** @type {string} */ + var MATH_SINGLE_OP_ROOT: string; + + /** @type {string} */ + var MATH_SINGLE_TOOLTIP_ROOT: string; + + /** @type {string} */ + var MATH_SINGLE_OP_ABSOLUTE: string; + + /** @type {string} */ + var MATH_SINGLE_TOOLTIP_ABS: string; + + /** @type {string} */ + var MATH_SINGLE_TOOLTIP_NEG: string; + + /** @type {string} */ + var MATH_SINGLE_TOOLTIP_LN: string; + + /** @type {string} */ + var MATH_SINGLE_TOOLTIP_LOG10: string; + + /** @type {string} */ + var MATH_SINGLE_TOOLTIP_EXP: string; + + /** @type {string} */ + var MATH_SINGLE_TOOLTIP_POW10: string; + + /** @type {string} */ + var MATH_TRIG_HELPURL: string; + + /** @type {string} */ + var MATH_TRIG_TOOLTIP_SIN: string; + + /** @type {string} */ + var MATH_TRIG_TOOLTIP_COS: string; + + /** @type {string} */ + var MATH_TRIG_TOOLTIP_TAN: string; + + /** @type {string} */ + var MATH_TRIG_TOOLTIP_ASIN: string; + + /** @type {string} */ + var MATH_TRIG_TOOLTIP_ACOS: string; + + /** @type {string} */ + var MATH_TRIG_TOOLTIP_ATAN: string; + + /** @type {string} */ + var MATH_CONSTANT_HELPURL: string; + + /** @type {string} */ + var MATH_CONSTANT_TOOLTIP: string; + + /** @type {string} */ + var MATH_IS_EVEN: string; + + /** @type {string} */ + var MATH_IS_ODD: string; + + /** @type {string} */ + var MATH_IS_PRIME: string; + + /** @type {string} */ + var MATH_IS_WHOLE: string; + + /** @type {string} */ + var MATH_IS_POSITIVE: string; + + /** @type {string} */ + var MATH_IS_NEGATIVE: string; + + /** @type {string} */ + var MATH_IS_DIVISIBLE_BY: string; + + /** @type {string} */ + var MATH_IS_TOOLTIP: string; + + /** @type {string} */ + var MATH_CHANGE_HELPURL: string; + + /** @type {string} */ + var MATH_CHANGE_TITLE: string; + + /** @type {string} */ + var MATH_CHANGE_TITLE_ITEM: string; + + /** @type {string} */ + var MATH_CHANGE_TOOLTIP: string; + + /** @type {string} */ + var MATH_ROUND_HELPURL: string; + + /** @type {string} */ + var MATH_ROUND_TOOLTIP: string; + + /** @type {string} */ + var MATH_ROUND_OPERATOR_ROUND: string; + + /** @type {string} */ + var MATH_ROUND_OPERATOR_ROUNDUP: string; + + /** @type {string} */ + var MATH_ROUND_OPERATOR_ROUNDDOWN: string; + + /** @type {string} */ + var MATH_ONLIST_HELPURL: string; + + /** @type {string} */ + var MATH_ONLIST_OPERATOR_SUM: string; + + /** @type {string} */ + var MATH_ONLIST_TOOLTIP_SUM: string; + + /** @type {string} */ + var MATH_ONLIST_OPERATOR_MIN: string; + + /** @type {string} */ + var MATH_ONLIST_TOOLTIP_MIN: string; + + /** @type {string} */ + var MATH_ONLIST_OPERATOR_MAX: string; + + /** @type {string} */ + var MATH_ONLIST_TOOLTIP_MAX: string; + + /** @type {string} */ + var MATH_ONLIST_OPERATOR_AVERAGE: string; + + /** @type {string} */ + var MATH_ONLIST_TOOLTIP_AVERAGE: string; + + /** @type {string} */ + var MATH_ONLIST_OPERATOR_MEDIAN: string; + + /** @type {string} */ + var MATH_ONLIST_TOOLTIP_MEDIAN: string; + + /** @type {string} */ + var MATH_ONLIST_OPERATOR_MODE: string; + + /** @type {string} */ + var MATH_ONLIST_TOOLTIP_MODE: string; + + /** @type {string} */ + var MATH_ONLIST_OPERATOR_STD_DEV: string; + + /** @type {string} */ + var MATH_ONLIST_TOOLTIP_STD_DEV: string; + + /** @type {string} */ + var MATH_ONLIST_OPERATOR_RANDOM: string; + + /** @type {string} */ + var MATH_ONLIST_TOOLTIP_RANDOM: string; + + /** @type {string} */ + var MATH_MODULO_HELPURL: string; + + /** @type {string} */ + var MATH_MODULO_TITLE: string; + + /** @type {string} */ + var MATH_MODULO_TOOLTIP: string; + + /** @type {string} */ + var MATH_CONSTRAIN_HELPURL: string; + + /** @type {string} */ + var MATH_CONSTRAIN_TITLE: string; + + /** @type {string} */ + var MATH_CONSTRAIN_TOOLTIP: string; + + /** @type {string} */ + var MATH_RANDOM_INT_HELPURL: string; + + /** @type {string} */ + var MATH_RANDOM_INT_TITLE: string; + + /** @type {string} */ + var MATH_RANDOM_INT_TOOLTIP: string; + + /** @type {string} */ + var MATH_RANDOM_FLOAT_HELPURL: string; + + /** @type {string} */ + var MATH_RANDOM_FLOAT_TITLE_RANDOM: string; + + /** @type {string} */ + var MATH_RANDOM_FLOAT_TOOLTIP: string; + + /** @type {string} */ + var MATH_ATAN2_HELPURL: string; + + /** @type {string} */ + var MATH_ATAN2_TITLE: string; + + /** @type {string} */ + var MATH_ATAN2_TOOLTIP: string; + + /** @type {string} */ + var TEXT_TEXT_HELPURL: string; + + /** @type {string} */ + var TEXT_TEXT_TOOLTIP: string; + + /** @type {string} */ + var TEXT_JOIN_HELPURL: string; + + /** @type {string} */ + var TEXT_JOIN_TITLE_CREATEWITH: string; + + /** @type {string} */ + var TEXT_JOIN_TOOLTIP: string; + + /** @type {string} */ + var TEXT_CREATE_JOIN_TITLE_JOIN: string; + + /** @type {string} */ + var TEXT_CREATE_JOIN_TOOLTIP: string; + + /** @type {string} */ + var TEXT_CREATE_JOIN_ITEM_TITLE_ITEM: string; + + /** @type {string} */ + var TEXT_CREATE_JOIN_ITEM_TOOLTIP: string; + + /** @type {string} */ + var TEXT_APPEND_HELPURL: string; + + /** @type {string} */ + var TEXT_APPEND_TITLE: string; + + /** @type {string} */ + var TEXT_APPEND_VARIABLE: string; + + /** @type {string} */ + var TEXT_APPEND_TOOLTIP: string; + + /** @type {string} */ + var TEXT_LENGTH_HELPURL: string; + + /** @type {string} */ + var TEXT_LENGTH_TITLE: string; + + /** @type {string} */ + var TEXT_LENGTH_TOOLTIP: string; + + /** @type {string} */ + var TEXT_ISEMPTY_HELPURL: string; + + /** @type {string} */ + var TEXT_ISEMPTY_TITLE: string; + + /** @type {string} */ + var TEXT_ISEMPTY_TOOLTIP: string; + + /** @type {string} */ + var TEXT_INDEXOF_HELPURL: string; + + /** @type {string} */ + var TEXT_INDEXOF_TOOLTIP: string; + + /** @type {string} */ + var TEXT_INDEXOF_TITLE: string; + + /** @type {string} */ + var TEXT_INDEXOF_OPERATOR_FIRST: string; + + /** @type {string} */ + var TEXT_INDEXOF_OPERATOR_LAST: string; + + /** @type {string} */ + var TEXT_CHARAT_HELPURL: string; + + /** @type {string} */ + var TEXT_CHARAT_TITLE: string; + + /** @type {string} */ + var TEXT_CHARAT_FROM_START: string; + + /** @type {string} */ + var TEXT_CHARAT_FROM_END: string; + + /** @type {string} */ + var TEXT_CHARAT_FIRST: string; + + /** @type {string} */ + var TEXT_CHARAT_LAST: string; + + /** @type {string} */ + var TEXT_CHARAT_RANDOM: string; + + /** @type {string} */ + var TEXT_CHARAT_TAIL: string; + + /** @type {string} */ + var TEXT_CHARAT_TOOLTIP: string; + + /** @type {string} */ + var TEXT_GET_SUBSTRING_TOOLTIP: string; + + /** @type {string} */ + var TEXT_GET_SUBSTRING_HELPURL: string; + + /** @type {string} */ + var TEXT_GET_SUBSTRING_INPUT_IN_TEXT: string; + + /** @type {string} */ + var TEXT_GET_SUBSTRING_START_FROM_START: string; + + /** @type {string} */ + var TEXT_GET_SUBSTRING_START_FROM_END: string; + + /** @type {string} */ + var TEXT_GET_SUBSTRING_START_FIRST: string; + + /** @type {string} */ + var TEXT_GET_SUBSTRING_END_FROM_START: string; + + /** @type {string} */ + var TEXT_GET_SUBSTRING_END_FROM_END: string; + + /** @type {string} */ + var TEXT_GET_SUBSTRING_END_LAST: string; + + /** @type {string} */ + var TEXT_GET_SUBSTRING_TAIL: string; + + /** @type {string} */ + var TEXT_CHANGECASE_HELPURL: string; + + /** @type {string} */ + var TEXT_CHANGECASE_TOOLTIP: string; + + /** @type {string} */ + var TEXT_CHANGECASE_OPERATOR_UPPERCASE: string; + + /** @type {string} */ + var TEXT_CHANGECASE_OPERATOR_LOWERCASE: string; + + /** @type {string} */ + var TEXT_CHANGECASE_OPERATOR_TITLECASE: string; + + /** @type {string} */ + var TEXT_TRIM_HELPURL: string; + + /** @type {string} */ + var TEXT_TRIM_TOOLTIP: string; + + /** @type {string} */ + var TEXT_TRIM_OPERATOR_BOTH: string; + + /** @type {string} */ + var TEXT_TRIM_OPERATOR_LEFT: string; + + /** @type {string} */ + var TEXT_TRIM_OPERATOR_RIGHT: string; + + /** @type {string} */ + var TEXT_PRINT_HELPURL: string; + + /** @type {string} */ + var TEXT_PRINT_TITLE: string; + + /** @type {string} */ + var TEXT_PRINT_TOOLTIP: string; + + /** @type {string} */ + var TEXT_PROMPT_HELPURL: string; + + /** @type {string} */ + var TEXT_PROMPT_TYPE_TEXT: string; + + /** @type {string} */ + var TEXT_PROMPT_TYPE_NUMBER: string; + + /** @type {string} */ + var TEXT_PROMPT_TOOLTIP_NUMBER: string; + + /** @type {string} */ + var TEXT_PROMPT_TOOLTIP_TEXT: string; + + /** @type {string} */ + var TEXT_COUNT_MESSAGE0: string; + + /** @type {string} */ + var TEXT_COUNT_HELPURL: string; + + /** @type {string} */ + var TEXT_COUNT_TOOLTIP: string; + + /** @type {string} */ + var TEXT_REPLACE_MESSAGE0: string; + + /** @type {string} */ + var TEXT_REPLACE_HELPURL: string; + + /** @type {string} */ + var TEXT_REPLACE_TOOLTIP: string; + + /** @type {string} */ + var TEXT_REVERSE_MESSAGE0: string; + + /** @type {string} */ + var TEXT_REVERSE_HELPURL: string; + + /** @type {string} */ + var TEXT_REVERSE_TOOLTIP: string; + + /** @type {string} */ + var LISTS_CREATE_EMPTY_HELPURL: string; + + /** @type {string} */ + var LISTS_CREATE_EMPTY_TITLE: string; + + /** @type {string} */ + var LISTS_CREATE_EMPTY_TOOLTIP: string; + + /** @type {string} */ + var LISTS_CREATE_WITH_HELPURL: string; + + /** @type {string} */ + var LISTS_CREATE_WITH_TOOLTIP: string; + + /** @type {string} */ + var LISTS_CREATE_WITH_INPUT_WITH: string; + + /** @type {string} */ + var LISTS_CREATE_WITH_CONTAINER_TITLE_ADD: string; + + /** @type {string} */ + var LISTS_CREATE_WITH_CONTAINER_TOOLTIP: string; + + /** @type {string} */ + var LISTS_CREATE_WITH_ITEM_TITLE: string; + + /** @type {string} */ + var LISTS_CREATE_WITH_ITEM_TOOLTIP: string; + + /** @type {string} */ + var LISTS_REPEAT_HELPURL: string; + + /** @type {string} */ + var LISTS_REPEAT_TOOLTIP: string; + + /** @type {string} */ + var LISTS_REPEAT_TITLE: string; + + /** @type {string} */ + var LISTS_LENGTH_HELPURL: string; + + /** @type {string} */ + var LISTS_LENGTH_TITLE: string; + + /** @type {string} */ + var LISTS_LENGTH_TOOLTIP: string; + + /** @type {string} */ + var LISTS_ISEMPTY_HELPURL: string; + + /** @type {string} */ + var LISTS_ISEMPTY_TITLE: string; + + /** @type {string} */ + var LISTS_ISEMPTY_TOOLTIP: string; + + /** @type {string} */ + var LISTS_INLIST: string; + + /** @type {string} */ + var LISTS_INDEX_OF_HELPURL: string; + + /** @type {string} */ + var LISTS_INDEX_OF_INPUT_IN_LIST: string; + + /** @type {string} */ + var LISTS_INDEX_OF_FIRST: string; + + /** @type {string} */ + var LISTS_INDEX_OF_LAST: string; + + /** @type {string} */ + var LISTS_INDEX_OF_TOOLTIP: string; + + /** @type {string} */ + var LISTS_GET_INDEX_HELPURL: string; + + /** @type {string} */ + var LISTS_GET_INDEX_GET: string; + + /** @type {string} */ + var LISTS_GET_INDEX_GET_REMOVE: string; + + /** @type {string} */ + var LISTS_GET_INDEX_REMOVE: string; + + /** @type {string} */ + var LISTS_GET_INDEX_FROM_START: string; + + /** @type {string} */ + var LISTS_GET_INDEX_FROM_END: string; + + /** @type {string} */ + var LISTS_GET_INDEX_FIRST: string; + + /** @type {string} */ + var LISTS_GET_INDEX_LAST: string; + + /** @type {string} */ + var LISTS_GET_INDEX_RANDOM: string; + + /** @type {string} */ + var LISTS_GET_INDEX_TAIL: string; + + /** @type {string} */ + var LISTS_GET_INDEX_INPUT_IN_LIST: string; + + /** @type {string} */ + var LISTS_INDEX_FROM_START_TOOLTIP: string; + + /** @type {string} */ + var LISTS_INDEX_FROM_END_TOOLTIP: string; + + /** @type {string} */ + var LISTS_GET_INDEX_TOOLTIP_GET_FROM: string; + + /** @type {string} */ + var LISTS_GET_INDEX_TOOLTIP_GET_FIRST: string; + + /** @type {string} */ + var LISTS_GET_INDEX_TOOLTIP_GET_LAST: string; + + /** @type {string} */ + var LISTS_GET_INDEX_TOOLTIP_GET_RANDOM: string; + + /** @type {string} */ + var LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM: string; + + /** @type {string} */ + var LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST: string; + + /** @type {string} */ + var LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST: string; + + /** @type {string} */ + var LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM: string; + + /** @type {string} */ + var LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM: string; + + /** @type {string} */ + var LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST: string; + + /** @type {string} */ + var LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST: string; + + /** @type {string} */ + var LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM: string; + + /** @type {string} */ + var LISTS_SET_INDEX_HELPURL: string; + + /** @type {string} */ + var LISTS_SET_INDEX_INPUT_IN_LIST: string; + + /** @type {string} */ + var LISTS_SET_INDEX_SET: string; + + /** @type {string} */ + var LISTS_SET_INDEX_INSERT: string; + + /** @type {string} */ + var LISTS_SET_INDEX_INPUT_TO: string; + + /** @type {string} */ + var LISTS_SET_INDEX_TOOLTIP_SET_FROM: string; + + /** @type {string} */ + var LISTS_SET_INDEX_TOOLTIP_SET_FIRST: string; + + /** @type {string} */ + var LISTS_SET_INDEX_TOOLTIP_SET_LAST: string; + + /** @type {string} */ + var LISTS_SET_INDEX_TOOLTIP_SET_RANDOM: string; + + /** @type {string} */ + var LISTS_SET_INDEX_TOOLTIP_INSERT_FROM: string; + + /** @type {string} */ + var LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST: string; + + /** @type {string} */ + var LISTS_SET_INDEX_TOOLTIP_INSERT_LAST: string; + + /** @type {string} */ + var LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM: string; + + /** @type {string} */ + var LISTS_GET_SUBLIST_HELPURL: string; + + /** @type {string} */ + var LISTS_GET_SUBLIST_INPUT_IN_LIST: string; + + /** @type {string} */ + var LISTS_GET_SUBLIST_START_FROM_START: string; + + /** @type {string} */ + var LISTS_GET_SUBLIST_START_FROM_END: string; + + /** @type {string} */ + var LISTS_GET_SUBLIST_START_FIRST: string; + + /** @type {string} */ + var LISTS_GET_SUBLIST_END_FROM_START: string; + + /** @type {string} */ + var LISTS_GET_SUBLIST_END_FROM_END: string; + + /** @type {string} */ + var LISTS_GET_SUBLIST_END_LAST: string; + + /** @type {string} */ + var LISTS_GET_SUBLIST_TAIL: string; + + /** @type {string} */ + var LISTS_GET_SUBLIST_TOOLTIP: string; + + /** @type {string} */ + var LISTS_SORT_HELPURL: string; + + /** @type {string} */ + var LISTS_SORT_TITLE: string; + + /** @type {string} */ + var LISTS_SORT_TOOLTIP: string; + + /** @type {string} */ + var LISTS_SORT_ORDER_ASCENDING: string; + + /** @type {string} */ + var LISTS_SORT_ORDER_DESCENDING: string; + + /** @type {string} */ + var LISTS_SORT_TYPE_NUMERIC: string; + + /** @type {string} */ + var LISTS_SORT_TYPE_TEXT: string; + + /** @type {string} */ + var LISTS_SORT_TYPE_IGNORECASE: string; + + /** @type {string} */ + var LISTS_SPLIT_HELPURL: string; + + /** @type {string} */ + var LISTS_SPLIT_LIST_FROM_TEXT: string; + + /** @type {string} */ + var LISTS_SPLIT_TEXT_FROM_LIST: string; + + /** @type {string} */ + var LISTS_SPLIT_WITH_DELIMITER: string; + + /** @type {string} */ + var LISTS_SPLIT_TOOLTIP_SPLIT: string; + + /** @type {string} */ + var LISTS_SPLIT_TOOLTIP_JOIN: string; + + /** @type {string} */ + var LISTS_REVERSE_HELPURL: string; + + /** @type {string} */ + var LISTS_REVERSE_MESSAGE0: string; + + /** @type {string} */ + var LISTS_REVERSE_TOOLTIP: string; + + /** @type {string} */ + var ORDINAL_NUMBER_SUFFIX: string; + + /** @type {string} */ + var VARIABLES_GET_HELPURL: string; + + /** @type {string} */ + var VARIABLES_GET_TOOLTIP: string; + + /** @type {string} */ + var VARIABLES_GET_CREATE_SET: string; + + /** @type {string} */ + var VARIABLES_SET_HELPURL: string; + + /** @type {string} */ + var VARIABLES_SET: string; + + /** @type {string} */ + var VARIABLES_SET_TOOLTIP: string; + + /** @type {string} */ + var VARIABLES_SET_CREATE_GET: string; + + /** @type {string} */ + var PROCEDURES_DEFNORETURN_HELPURL: string; + + /** @type {string} */ + var PROCEDURES_DEFNORETURN_TITLE: string; + + /** @type {string} */ + var PROCEDURES_DEFNORETURN_PROCEDURE: string; + + /** @type {string} */ + var PROCEDURES_BEFORE_PARAMS: string; + + /** @type {string} */ + var PROCEDURES_CALL_BEFORE_PARAMS: string; + + /** @type {string} */ + var PROCEDURES_DEFNORETURN_DO: string; + + /** @type {string} */ + var PROCEDURES_DEFNORETURN_TOOLTIP: string; + + /** @type {string} */ + var PROCEDURES_DEFNORETURN_COMMENT: string; + + /** @type {string} */ + var PROCEDURES_DEFRETURN_HELPURL: string; + + /** @type {string} */ + var PROCEDURES_DEFRETURN_TITLE: string; + + /** @type {string} */ + var PROCEDURES_DEFRETURN_PROCEDURE: string; + + /** @type {string} */ + var PROCEDURES_DEFRETURN_DO: string; + + /** @type {string} */ + var PROCEDURES_DEFRETURN_COMMENT: string; + + /** @type {string} */ + var PROCEDURES_DEFRETURN_RETURN: string; + + /** @type {string} */ + var PROCEDURES_DEFRETURN_TOOLTIP: string; + + /** @type {string} */ + var PROCEDURES_ALLOW_STATEMENTS: string; + + /** @type {string} */ + var PROCEDURES_DEF_DUPLICATE_WARNING: string; + + /** @type {string} */ + var PROCEDURES_CALLNORETURN_HELPURL: string; + + /** @type {string} */ + var PROCEDURES_CALLNORETURN_TOOLTIP: string; + + /** @type {string} */ + var PROCEDURES_CALLRETURN_HELPURL: string; + + /** @type {string} */ + var PROCEDURES_CALLRETURN_TOOLTIP: string; + + /** @type {string} */ + var PROCEDURES_MUTATORCONTAINER_TITLE: string; + + /** @type {string} */ + var PROCEDURES_MUTATORCONTAINER_TOOLTIP: string; + + /** @type {string} */ + var PROCEDURES_MUTATORARG_TITLE: string; + + /** @type {string} */ + var PROCEDURES_MUTATORARG_TOOLTIP: string; + + /** @type {string} */ + var PROCEDURES_HIGHLIGHT_DEF: string; + + /** @type {string} */ + var PROCEDURES_CREATE_DO: string; + + /** @type {string} */ + var PROCEDURES_IFRETURN_TOOLTIP: string; + + /** @type {string} */ + var PROCEDURES_IFRETURN_HELPURL: string; + + /** @type {string} */ + var PROCEDURES_IFRETURN_WARNING: string; + + /** @type {string} */ + var WORKSPACE_COMMENT_DEFAULT_TEXT: string; + + /** @type {string} */ + var WORKSPACE_ARIA_LABEL: string; + + /** @type {string} */ + var COLLAPSED_WARNINGS_WARNING: string; +} diff --git a/js/typings/parts/blockly-header.d.ts b/js/typings/parts/blockly-header.d.ts new file mode 100644 index 0000000..df41033 --- /dev/null +++ b/js/typings/parts/blockly-header.d.ts @@ -0,0 +1,23 @@ +/** + * @license + * Copyright 2019 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Type definitions for Blockly. + * @author samelh@google.com (Sam El-Husseini) + */ + +export = Blockly; \ No newline at end of file diff --git a/js/typings/parts/blockly-interfaces.d.ts b/js/typings/parts/blockly-interfaces.d.ts new file mode 100644 index 0000000..31fa80f --- /dev/null +++ b/js/typings/parts/blockly-interfaces.d.ts @@ -0,0 +1,68 @@ + +declare module Blockly { + + interface BlocklyOptions { + toolbox?: HTMLElement | string; + readOnly?: boolean; + trashcan?: boolean; + maxTrashcanContents?: number; + collapse?: boolean; + comments?: boolean; + disable?: boolean; + sounds?: boolean; + rtl?: boolean; + horizontalLayout?: boolean; + toolboxPosition?: string; + css?: boolean; + oneBasedIndex?: boolean; + media?: string; + theme?: Blockly.Theme | BlocklyThemeOptions; + move?: { + scrollbars?: boolean; + drag?: boolean; + wheel?: boolean; + }; + grid?: { + spacing?: number; + colour?: string; + length?: number; + snap?: boolean; + }; + zoom?: { + controls?: boolean; + wheel?: boolean; + startScale?: number; + maxScale?: number; + minScale?: number; + scaleSpeed?: number; + }; + renderer?: string; + } + + interface BlocklyThemeOptions { + blockStyles?: {[blocks: string]: Blockly.Theme.BlockStyle;}; + categoryStyles?: {[category: string]: Blockly.Theme.CategoryStyle;}; + componentStyles?: {[component: string]: any;}; + } + + interface Metrics { + absoluteLeft: number; + absoluteTop: number; + contentHeight: number; + contentLeft: number; + contentTop: number; + contentWidth: number; + viewHeight: number; + viewLeft: number; + viewTop: number; + viewWidth: number; + } + + /** + * Set the Blockly locale. + * Note: this method is only available in the npm release of Blockly. + * @param {!Object} msg An object of Blockly message strings in the desired + * language. + */ + function setLocale(msg: {[key: string]: string;}): void; +} diff --git a/js/typings/tsconfig.json b/js/typings/tsconfig.json new file mode 100644 index 0000000..7647424 --- /dev/null +++ b/js/typings/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "dom", + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": false, + "strictFunctionTypes": true, + "baseUrl": "../", + "typeRoots": [ + "../node_modules/@types" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "blockly.d.ts" + ] +} \ No newline at end of file
      Test nameOldNewDiff